源程式如下:
#include
int main()
通過vc++6.0
的反彙編檢視,**如下
1:#include
2:int main() 3:
0040102a
popedi;
彈出值,放入
edi暫存器中,
esp-4
0040102bpopesi;
彈出值,放入
esi暫存器中,
esp-4
0040102c
popebx;
彈出值,放入
ebx暫存器中,
esp-4
0040102dmovesp,ebp:
恢復棧頂
0040102f
popebp;
彈出值,放入
ebp暫存器中,
esp-4
00401030ret
下面針對上面的**及注釋進行分析:
1、紅色部分為原
c語言程式,不做解釋; 2、
其他為反彙編** ①、
彙編**中的
edi,
esi,
ebx,
esp,
ebp為
32位彙編指令,同
16位彙編指令
,di,si,bx,sp,bp。②、
push ebp
把ebp
暫存器中的內容放到堆疊中,同時
esp暫存器中存放的位址減少四個位元組;
③、mov ebp,esp
把棧頂指標賦給
ebp暫存器;
④、sub esp,40h
將esp
暫存器內位址減去
64,用以存放區域性變數;
⑤、push ebx
和push esi
和push edi
向堆疊中插入暫存器中資料;
⑥、lea edi,[ebp-40h]
,首先,
ebp-40h
指的是棧頂指標減去
64,即存放區域性變數那段資料的低位址段,現在
edi中存放
ebp-40h;⑦、
下面三行,將
10h即
16賦給
ecx,然後將
0cccccccch
賦給eax
(隨機),(這就是有時候除錯時,目標位址以為的地方為
cc的原因了)
rep stos dword ptr[edi]
將重複填充存放區域性變數的那段區間,重複次數為
ecx內容
10h,即
16次,存放資料為
eax內容,並且每次
edi增加四個位元組,剛好
64個位元組即
40h;
⑧、xor eax,eax
所有的返回值均存放在
eax中,此指令將
eax清零;
⑨、下面就是出棧了,直到
mov esp,ebp
將ebp
暫存器中儲存的棧頂指標賦給
esp;然後彈出
ebp,
ret返回。
最最簡單的c語言函式彙編分析
xp vc6.0 int plus int x,int y 以下是vc6.0的反彙編視窗 1 int plus int x,int y 2 0040103a pop edi 0040103b pop esi 0040103c pop ebx 0040103d mov esp,ebp 0040103f...
彙編1 最簡單的彙編小程式
section data sesion text globl start start movl 1,eax movel 4 ebx int 0x80 解析 section data 開頭的名稱並不是指令的助記符,不會被翻譯成機器指令,而是給彙編器一些特殊指示,稱為彙編指示 assembler dir...
簡單的匯程式設計序分析
section data section text globl start start movl 1,eax movl 4,ebx int 0x80 將這段程式儲存為hello.s,然後用彙編器as把匯程式設計序中的助記符翻譯成機器指令 彙編指令與機器指令是對應的 生成目標檔案hello.o。然後用...