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