2012-05-16 1 views
2

Когда я прочитал какой-то код разборки, поскольку я не включен в AT & T синтаксис, я не знаю, что означает некоторый код (% esp, 1).о синтаксисе сборки AT & T (% esp, 1)

11  printf("%x", a); 
0x401386  <main+182>: movl $0x1,0x4(%esp,1) 
0x40138e  <main+190>: movl $0x40300d,(%esp,1) 
0x401395  <main+197>: call 0x401810 <printf> 

Может кто-нибудь сказать, что это значит? Спасибо!

+1

'0x4 (% особ, 1)' такое же как '[ESP * 1 + 0x4]' в Intel синтаксис. –

+0

Но ... похоже, что [esp + 0x4 * 1] чаще встречается? - Извините за моего бедного английского. 0x4 (% esp, 2) не имеет практического значения? – runningair

+0

В общем, что-то вроде '[esp + eax * 4 + 16]' (в котором 'eax' является индексом 32-разрядного целочисленного массива, расположенного в' esp + 16'). Вот почему в режиме адресации существует «масштаб». –

ответ

2

Это wikibook, кажется, есть некоторая информация о ассемблере GNU и его AT & T синтаксис:

http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax

I также нашли эти два источника документации по газу, но они, по-видимому, не очень ясны или полезны:

  1. http://webster.cs.ucr.edu/AsmTools/Gas/GasDoc/as_toc.html
  2. http://sourceware.org/binutils/docs-2.17/as/index.html
2
       ; Decompiled, sort of, back to C 
           ; ============================== 
    movl $0x1,0x4(%esp,1) ; %esp[1] = 1 (the "1" really means, "add 4") 
    movl $0x40300d,(%esp,1) ; %esp[0] = "%x" 
    call 0x401810 <printf> ; push return address and branch to printf 

Кажется, что компилятор знает, что равно , и что он уже настроил указатель стека вниз, чтобы освободить место для аргументов. Возможно, он объединил пространство в стек с функцией пролога.

В общем, режимы адресации похожи ...

r ; register 
(r) ; memory, register contains the address 
8(r) ; memory, displacement of 8 off the register 
+0

Спасибо! Но ... ", 1" бесполезно? – runningair

+0

x86 имеет индексированные режимы адресации, «1» не требуется, но может быть, 2 или 4, если функция индекса использовалась. Это просто дизассемблер, который не влюбился. – DigitalRoss

+0

Итак, 0x4 (% esp, 2) означает * (% esp + 2 * 0x4), 0x4 (% esp, 4) означает * (% esp + 4 * 0x4) и 0x4 (% esp, 3) запрещено? – runningair