Вопрос

Я достаточно гуглил, но не мог понять, что такое кронштейн () означает. Кроме того, я вижу какой -то синтаксис как 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top