- 論壇徽章:
- 0
|
0默認(rèn)為int型,占用4個(gè)字節(jié),存儲(chǔ)為0x00000000
~0的存儲(chǔ)值為0xffffffff
轉(zhuǎn)換為unsigned char后存儲(chǔ)為0xff,其值為255
>>1就是除以2,存儲(chǔ)為0111 1111, 所以為255/2 = 127
很長(zhǎng)時(shí)間沒(méi)接觸匯編了,也不知道解釋的對(duì)不對(duì):
注意第(7)句填寫(xiě)了值127
其他的%esp的變化也不是很清楚了,呵呵
.file "testhuibian.c"
.text
.globl main
.type main,@function
main:
pushl %ebp (1)
movl %esp, %ebp (2) # 這兩行是為了保存main函數(shù)的frame指針到%ebp
subl $8, %esp (3) # 當(dāng)前frame中留出8個(gè)字節(jié)空間
andl $-16, %esp (4) # -16的十六進(jìn)制表示為0xfffffff0
這里讓%esp的值以對(duì)齊8位字節(jié)邊界
正常情況下可以假設(shè)%esp的值沒(méi)有變化,
movl $0, %eax (5)
subl %eax, %esp (6) # %esp的值沒(méi)有變化
movl $127, -4(%ebp) (7) # 注意這里的尋址方式
subl $12, %esp (8)
pushl $0 (9)
call exit (10) # 這兩句是來(lái)調(diào)用exit(0)的
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
函數(shù)frame # 這里假設(shè)棧的增長(zhǎng)是從高地址到低地址的
-------- HighAddr
%ebp
------- <--- %ebp,%esp (1)(2)句執(zhí)行結(jié)果
4個(gè)字節(jié) 0x000000ff = 127 <--- (7)的執(zhí)行結(jié)果
--------
4個(gè)字節(jié)
-------- <--- %esp (3)的執(zhí)行結(jié)果
4個(gè)字節(jié)
--------
4個(gè)字節(jié)
--------
4個(gè)字節(jié)
-------- <--- %esp (8)的執(zhí)行結(jié)果
LowAddr
==================================================================
有本書(shū)《Professional Assembly Language》可以翻翻,
其中文版叫《匯編語(yǔ)言程序設(shè)計(jì)》 |
|