注册 登录
编程论坛 汇编论坛

理解调用子程序入栈方式

onepc 发布于 2009-09-08 16:12, 1336 次点击
先说不带参数。直接局部变量存取的说明[对比书的举例]
程序代码:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
.code
odtest proc
     local @a:BYTE   ;这里是一个字节 8位
     local @aa:DWORD ;双字 四个字节
     local @aaa ;双字四个字节    ;注:32位默认是双字对齐的,这时存取最快
   
     mov al,@a
     mov eax,@aa
     mov eax,@aaa
    ret
odtest endp
start:
 call odtest
 invoke ExitProcess,NULL
end start
上面的反汇编代码
程序代码:
00401000  /$  55            push    ebp
00401001  |.  8BEC          mov     ebp, esp
00401003  |.  83C4 F4       add     esp, -0C
00401006  |.  8A45 FF       mov     al, byte ptr [ebp-1]
00401009  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
0040100C  |.  8B45 F4       mov     eax, dword ptr [ebp-C]
0040100F  |.  C9            leave
00401010  \.  C3            retn
00401011 >/$  E8 EAFFFFFF   call    00401000  ;程序入口在这里 call上面的地址
00401016  |.  6A 00         push    0                                ; /ExitCode = 0
00401018  \.  E8 01000000   call    <jmp.&kernel32.ExitProcess>      ; \ExitProcess
0040101D      CC            int3
0040101E   .- FF25 00204000 jmp     dword ptr [<&kernel32.ExitProces>;  kernel32.ExitProcess

||
||
||
||

2 回复
#2
东海一鱼2009-09-09 08:51
不明白你想说甚莫?上面代码没有问题啊。
#3
非虫2009-09-14 11:01
他的意思是为什么要分配0ch的空间吧,不要忘了,汇编传参数都是DWORD的!就算是BYTE也要分配一个DWORD,也是为了字节对齐。
1