为什么加入局部变量后,获得变量的地址多了8个字节?

dongyi940333 2006-10-19 10:44:56
;我用的是MASM6.15+WINDOWSXP

.386
.MODEL flat, stdcall
.STACK 4096
ExitProcess PROTO, dwExitCode:DWORD



.code
main PROC


push 11 ;压入参数11

push 12 ;压入参数12

call Gcd ;调用Gcd过程

INVOKE ExitProcess, 0

main ENDP



;------------------------------------------------------------------------------------------
; Name: Gcd
;-----------------------------------------------------------------------------------------
Gcd PROC
;LOCAL temp : DWORD

push ebp

mov ebp, esp



;如果没有定义局部变量temp

;这时堆栈应该是:
; N
; M
; return address
; ebp
;对不对?????

mov ecx, [ebp+4] ;get return address

mov ebx, [ebp+8] ;get m = 12

mov eax, [ebp+12] ;get n = 11



;如果定义了局部变量temp

;这时堆栈应该是:
; N
; M
; return address
; ebp
; temp
;对不对?????

mov temp, 0AAAAAAAAh

mov edx, [ebp-4] ;get temp value

;为什么定义了局部变量tmep后,这里要多加8个字节才能得到压入的参数

;也就是说此时的堆栈是:
; N
; M
; return address
; ? 这个值是0012FFF0 调试的时候看到的
; ? 这个值是77F764A6 调试的时候看到的
; ebp
; temp
;这是怎么回事

mov ecx, [ebp+12] ;get address

mov ebx, [ebp+16] ;get m

mov eax, [ebp+20] ;get n



pop ebp

ret 8

Gcd ENDP

END main
...全文
340 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2006-10-26
  • 打赏
  • 举报
回复
1 一般情况下不需要你手动构建子函数(子过程)框架,masm32会自动帮你做

2 特殊情况下可以自己手动构建框架,比如在HLA中就可以用特殊的指令告诉编译
器我自己来建框架,这是 proc 中没有任何东西,需要你手动添加代码。
dongyi940333 2006-10-26
  • 打赏
  • 举报
回复

你好,我是dongyi940333,谢谢你的解答.我按照你说的在定义局部变量的情况下将
push ebp
mov ebp, esp
这两条语句去掉后就行到了正确的结果.

我现在的问题是

1、
你回答的意思是不是说我在定义局部变量后,编译器会自动插入
push ebp
mov ebp, esp
这两行代码,不需要我手动的输入这两行代码.

此时堆栈是不是
; N
; M
; return address
; ebp
;temp
; ebp <-----EBP,ESP (第二次push ebp)

如果是这样的话为什么temp的值是mov edx, [ebp-4].而不是[ebp+4]


而如果我没有定义局部变量的话,必须要手动的输入这两行代码.


2、它的返汇编的代码是不是在.lst列表文件中,我打开此文件后看到的是:

0000003C 2 55 push ebp

0000003D 2 8B EC mov ebp, esp

0000003F 2 C7 45 FC mov temp, 0AAAAAAAAh
AAAAAAAA

00000046 4 8B 55 FC mov edx, [ebp-4] ;get temp value

00000049 4 8B 4D 0C mov ecx, [ebp+12] ;get address

0000004C 4 8B 5D 10 mov ebx, [ebp+16] ;get m

0000004F 4 8B 45 14 mov eax, [ebp+20] ;get n

00000052 7m E8 00000000 E call DumpRegs

00000057 4 5D pop ebp

ret 8
00000059 10m C2 0008
Gcd ENDP
0000005C
END main
怎么看不到你说的两次呀.

我每次是用TextPad这个文本编辑器输入源代码,然后在XP的命令提示符下对程序进行编译的.
谢谢
blue_yxt 2006-10-23
  • 打赏
  • 举报
回复
mydo(侯佩|hopy)的论述有误:

;如果定义了局部变量temp

;这时堆栈应该是:
; N
; M
; return address
; temp
; ebp

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

dongyi940333 (科斯塔) 说的才是对的
大熊猫侯佩 2006-10-23
  • 打赏
  • 举报
回复
是啊,我前面说我看错了,:(
大熊猫侯佩 2006-10-19
  • 打赏
  • 举报
回复
看错,你前面为什么要再写 

push ebp
mov ebp, esp

你有没看过返汇编后的代码他生成的是:

00401010 55 push ebp
00401011 8BEC mov ebp,esp
00401013 83C4 FC add esp,-4
00401016 55 push ebp
00401017 8BEC mov ebp,esp

注意作了两次
大熊猫侯佩 2006-10-19
  • 打赏
  • 举报
回复
;如果定义了局部变量temp

;这时堆栈应该是:
; N
; M
; return address
; temp
; ebp

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧