Что означает кронштейн в `movl ( %eax), %eax`?
Вопрос
Я достаточно гуглил, но не мог понять, что такое кронштейн ()
означает. Кроме того, я вижу какой -то синтаксис как movl 8(%ebp), %eax
Может ли кто -то предложить мне хорошую ссылку? Я не смог найти в первых 20 результатах Google.
Решение
%eax
is Register eax; (%eax)
это местоположение памяти, адрес которого содержится в Register Eax; 8(%eax)
это местоположение памяти, адрес которого - значение EAX Plus 8.
Другие советы
http://web.archive.org/web/20080215230650/http://sig9.com/articles/att-syntax быстрое введение в синтаксис ASM Unix (AT & T). Гуглил мимо at&t asm syntax
.
Пост "AT & T Синтаксис сборки" от Vivek (http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek), 2003-09-01. Есть основная информация об AT & T от него:
Например, общий формат базовой инструкции по перемещению данных в Intel-Syntax-это,
mnemonic destination, source
Принимая во внимание, что в случае AT & T общий формат
mnemonic source, destination
(Я помню, что этот порядок называл AT & T ASM как настоящий Unix ASM, так что это Правильно один, и это течет данных вправо; В то время как синтаксис Intel был основан на некотором неправильном DOC, который явно не подходит для Unix World, они оставил и данные течет влево)
Все названия регистра архитектуры IA-32 должны быть предварительно профиксированы с помощью знака «%», например. %al, %bx, %ds, %cr0 и т. Д.
Все буквальные значения должны быть предварительно профиксированы с помощью знака «$». Например,
mov $100, %bx mov $A, %al
Первая инструкция перемещает значение 100 в AX регистрации, а вторая перемещает числовое значение ASCII A в регистр AL.
В синтаксисе AT & T память ссылается следующим образом,
segment-override:signed-offset(base,index,scale)
Части которых можно пропустить в зависимости от адреса, который вы хотите.>%ES: 100 (%EAX,%EBX, 2)
Обратите внимание, что смещения и шкала не должны быть предварительно профиксированы с помощью '$'. Еще несколько примеров с их эквивалентным NASM-Syntax, должны сделать вещи более ясными,
GAS memory operand NASM memory operand ------------------ ------------------- 100 [100] %es:100 [es:100] (%eax) [eax] (%eax,%ebx) [eax+ebx] (%ecx,%ebx,2) [ecx+ebx*2] (,%ebx,2) [ebx*2] -10(%eax) [eax-10] %ds:-10(%ebp) [ds:ebp-10] Example instructions, mov %ax, 100 mov %eax, -100(%eax)
Операционные размеры. Время от времени, особенно при перемещении буквальных значений в память, становится необходимым указать размер переноса или размер операнда. Например, инструкция,
mov $10, 100
Только указывает, что значение 10 должно быть перемещено в смещение памяти 100, но не размер передачи. В NASM это делается путем добавления ключевого слова Casting Byte/Word/DWORD и т. Д. В любом из операндов. В синтаксисе AT & T это делается путем добавления суффикса - B/W/L - к инструкции. Например,
movb $10, %es:(%eax)
перемещает значение байта 10 в местоположение памяти [EA: EAX], тогда как,
movl $10, %es:(%eax)
Перемещает длинное значение (dword) 10 в то же место.
JMP, Call, RET и т. Д., Инструкции передают элемент управления из одной части программы в другую. Они могут быть классифицированы как управляющие передачи в тот же сегмент кода (рядом) или в разные сегменты кода (FAR). Возможными типами адресации филиала являются - относительное смещение (метка), регистр, операнд памяти и указатели с сегментами.
Относительные смещения указаны с использованием метков, как показано ниже.
label1: . . jmp label1
Обращение к филиалам с использованием регистров или операндов памяти должно быть префикс с помощью '*'. Чтобы указать «далекие» управляющие трансферы, должен быть префикс, как в «LJMP», «Lcall» и т. Д. Например,
GAS syntax NASM syntax ========== =========== jmp *100 jmp near [100] call *100 call near [100] jmp *%eax jmp near eax jmp *%ecx call near ecx jmp *(%eax) jmp near [eax] call *(%ebx) call near [ebx] ljmp *100 jmp far [100] lcall *100 call far [100] ljmp *(%eax) jmp far [eax] lcall *(%ebx) call far [ebx] ret retn lret retf lret $0x100 retf 0x100
Указатели сегментного вывода указаны с использованием следующего формата:
jmp $segment, $offset
Он также рекомендует GNU как (газо) документы: http://web.archive.org/web/20080313132324/http://sourceware.org/binutils/docs-2.16/as/index.html
Они шаг Инструкции, перемещение данных из одного места в другое - в этих случаях, от памяти в регистр:
register_eax = *(unsigned long *)register_eax;
Другой ваш пример - что -то вроде:
register_eax = *(unsigned long *)(register_ebp + 8);