LINUX.ORG.RU

виды адресации Ассемблер

 


0

1

здрасьте здрасьте люди добрые.

тысячу извинений, прошу понять и не гневаться на простые вопросы.

но я немного запутался в видах адресации.

пожалуйста поправте. что я понимаю:

есть прямая адресация и косвенная.

прямая делится на относительнопрямую адресацию и абсолютно прямую адресацию.

не понимаю, что такое поле смещение

абсолютно прямая

mov P, %rax; в %rax вместо метки поместится адрес. 

относительно прямая


mov P(bp+ ip), %rax; в регистр %rax поместиться адрес со смещением.

что -то мне подсказывает , что я неправ.

далее косвенная.

косвенно базовая или регистровая.
mov (%rax), %r15;  пройдет по адресу что лежит в регистре %rax, возмет оттуда значение и поместит в %r15;




косвеннобазовая со смещением.

mov 4(%rax), %r15; возмет адрес с rax прибавит к нему 4 и пройдет по этому новому адресу возьмет оттуда значение и поместит в %15


непонятно что есть косвенно-индексная и косвеннобазово-индексная адресация.

пожалуйста поправьте и дополните



Последнее исправление: Assembler (всего исправлений: 2)

Вот что бывает, если человек пытается продраться сквозь AT&T синтаксис. Возьми синтаксис от Интела. Твой мозг тебе еще пригодится.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Тяжёлое наследие i8086 даёт о себе знать.

Твоя метка при ассемблировании всегда превращается в постоянное число, которое является адресом «переменной».

Скобочки являются своего рода оператором «разыменования», то бишь вместо адреса будет использоваться содержание памяти, на которое указывает значение в скобках (плюс сдвиг, указанный снаружи).

Я предлагаю тебе написать формулу для каждого случая на C, авось так будет проще понять.

luke ★★★★★
()
Ответ на: комментарий от luke


mov $rax, point;  это прямая адресация. 

но она делится на абсолютно прямую и  относительно прямую.
видимо  $rax, point; это абсолютно прямая. 

mov $rax, point(%eip);  видимо это относительная прямая.

правильно?
Assembler
() автор топика
Ответ на: комментарий от Assembler

Отсюда: https://www.geeksforgeeks.org/addressing-modes-8086-microprocessor/

Displacement or direct mode: In this type of addressing mode the effective address is directly given in the instruction as displacement

movq disp, %rax
movq 0x0500, %rax

Based mode: In this the effective address is the sum of base register and displacement.

movb 0x0100(%rbp), %al

Для понимания AT&T и Intel синтаксиса лучше почитать вот здесь: https://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory

An Intel syntax indirect memory reference of the form

section:[base + index*scale + disp]

is translated into the AT&T syntax

section:disp(base, index, scale)
luke ★★★★★
()
Ответ на: комментарий от luke

какое же днище этот at&t, даже при том, что интел не эталон. чё его так утки форсят

anonymous
()
Ответ на: комментарий от luke

спасибо за ссылки. но как вы понимаете? это можно считать за относительную адресацию?

[code] mov $rax, point(%eip) [/code]

Assembler
() автор топика
Ответ на: комментарий от Assembler

По смыслу да, а уж какое определение «относительной адресации» ты используешь я не знаю. Хоть горшком назови, только в печку не суй.

luke ★★★★★
()

не понимаю, что такое поле смещение

Просто константа которая задаётся в самой команде (специальное поле в машинном коде) и добавляется к результату вычисления адреса. Когда такая константа в команде есть, адресация называется относительной. Под относительной прямой адресацией понимают смещение заданное относительно текущего адреса (ip).

непонятно что есть косвенно-индексная и косвеннобазово-индексная адресация.

Это одно и тоже. Иногда ещё называют базово-индексной. Понятие «косвенная», более общее, а понятие «базовая» характеризует конкретный способ реализации косвенности через базовые регистры (в общем случае в качестве базового можно использовать не любые, а только некоторые или вообще специальные регистры). В общем в команде задаётся регистр из которого берётся адрес. Индексная адресация означает, что к адресу добавляется ещё значение из индексного (опять же, могут быть специальные) регистра. И не забывай что можно добавить ещё константное смещение, т.о. получаются адресации (косвенно-)базовая со смещением и (косвенно-)базово-индексная со смещением.

no-such-file ★★★★★
()
Ответ на: комментарий от luke

молодцы. я не какой смысл не вкладываю в определение относительная адресация. я пытаюсь его понять. но без успеха. поэтому прошу помочь вас.

Assembler
() автор топика
Ответ на: комментарий от no-such-file

Просто константа ребята, раз уж заговорили о понятиях, то они говорят, о числе. не о константе. да, число тоже константа, но константа, включает в себя число, и не исчерпывается числом. число же наоборот.

так будет ли метка считаться полем смещения, или же поле смещение число? вот из-за переводов и не понимания авторов статей, приходится молить о помощи на форумах. надо понимать, я еще не понял. не понял, поле смещение это только число, как пишут авторы учебников, или это константа.

Assembler
() автор топика
Ответ на: комментарий от luke

не учебник, а учебники. я же написал, авторы учебников. да все что найду, то и читаю . что все перечислять?

Assembler
() автор топика
Ответ на: комментарий от Assembler

Я же тебе скинул документацию, там всё довольно ясно изложено.

luke ★★★★★
()
Ответ на: комментарий от Assembler

то они говорят, о числе. не о константе. да

Как насчёт того, чтобы не умничать, а слушать что тебе говорят? Сказано тебе константа, значит константа.

будет ли метка считаться полем смещения, или же поле смещение число

Смешались в кучу люди, метки… Поле смещения - это поле смещения, именно битовое поле в машинной команде. Ассемблер, когда ассембляет, использует метки, чтобы вычислить нужное смещение и вставить в поле команды (если команда предполагает такой вариант адресации). И это будет именно константа, т.к. полученный машинный код неизменяемо задаёт адрес. Т.е. это константа в смысле что не переменная, а не в смысле «постоянная Больцмана».

вот из-за переводов и не понимания авторов статей

Твоя проблема не в переводах, ты фундаментально не понимаешь что ты читаешь. Не знаю что тебе посоветовать, чтобы было актуально и при этом на пальцах как для детей. Попробуй какие-нибудь мурзилки по простым микроконтроллерам, типа avr.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

да, это правда. я не понимаю. чтобы понимать, нужно хоть что-то знать. у меня огромные пробелы. мы кроме блок-схем программ, это где квадратики и ромбики, и презинтаций ничго не проходили. может смогу освоить, а может нет. не знаю.

Assembler
() автор топика
Ответ на: комментарий от Assembler

я очень уважаю вас. но наши учителя также объясняют. поле смещения -это поле смещения. и после говорят: ну что тебе не понятно? тебе все объяснили. сказали же дураку: поле смещения -это поле.

Assembler
() автор топика
Ответ на: комментарий от Assembler

поле смещения -это поле смещения. и после говорят: ну что тебе не понятно?

Божечки мои, ну ок, процессор понимает команды - машинный код. Каждая команда кода представляет собой последовательность бит. В этой последовательности есть часть (поле) которая задаёт собственно команду (код операции) и есть части (поля) которые задают параметры команды - регистры, константы, флаги и т.п.

PS: вспомнил, что можно тебе порекомендовать. Книжки и статьи Криса Касперски. Они конечно тоже подустарели, но хоть что-то. Например структура команд

no-such-file ★★★★★
()
Ответ на: комментарий от Assembler

ничего не обговоренно. я думал изначально, что поле смещение, -это как числовое поле в математике. а тут , я думал, поле смещение имеет , что-то схожее. потом я вдруг решил, что поле смещение, это просто часть машинной команды, которое состоит из таких полей. думал, что я один не понимаю. но……

Assembler
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.