assembly note

gcc -g -o hello.exe hello.s // -g 加入訊息方便debug

gdb 用法

gdb -q hello

break *main //亦可 b *main

run  //亦可

print/x $eax //印出 16進位 的 register 內容
print $eax //印出 10進位 的 register 內容

print *(&array+1) //印出array[1]之值

----

dword : 4 bytes
word : 2 bytes

mov ax,BUFF #把BUFF(in memory) 的 value 放入ax register
lea ax,BUFF #把BUFF(in memory) 的 address 放入ax register

LEA EAX,DWORD PTR SS:[ESP+4C]

---------
values: .int 10, 15, 20
等於 x[] = {10,15,20};
---------
把指標存入 register。變數前加 $ 符號,

movl $values, %edi ## 把 value 的位址存入 edi

# 這和下面這一行有何不同 ?
movl values, %edi

# 以 C 來做比喻
# edi = &value;
# 和
# edi = value;
#
--------------------
The format of the expression is
base(offset, index, size)

The data value retrieved is located at
base_address+ offset_address + index * size

---------------------

  問題:為什麽用xorl來設置eax的值? 
    註意到優化後的代碼中,eax返回值的設置由 movl $0,%eax 變為 xorl %eax,%eax ,這是因為IA32指令中,xorl比movl有更高的運行速度。

 -------------

(gdb) x/20x $esp                      $esp=0x28fef0 ,印出20項esp所指的位置之值

0x28fef0: 0x0028ff0b 0xc97ca1c9 0xfffffffe 0x76c81162
0x28ff00: 0x76cd5bc4 0x00401864 0x0028ff28 0x004018c2
0x28ff10: 0x00401864 0x004a3ef8 0x0028ff28 0x004013ba
0x28ff20: 0x00000000 0x7efde000 0x0028ff68 0x004010b9
0x28ff30: 0x00000001 0x00702b78 0x00701960 0xffffffff

 

 

posted @ 2012-09-28 00:36  jeremyatchina  阅读(281)  评论(0编辑  收藏  举报