请教EBP的应用.

willflyz 2008-03-10 11:48:34
如下,为何SS会在[ebp-$04],
如果我再加一个string的变量并赋值给它,那它的地址是什么?
如果再加一个integer的变量并赋值给它,那它的地址是什么?
以上请高手帮忙解答,谢谢!
//
procedure TForm1.Button1Click(Sender: TObject);
var ss: string;
begin
ss := 'TEST';
asm
mov eax,[ebp-$04]
call showmessage
end;
end;
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-03-11
  • 打赏
  • 举报
回复
自己把代码写出来,反汇编看一下不就知道了。
willflyz 2008-03-11
  • 打赏
  • 举报
回复
哈哈,没关系,我也喜欢鲁伊.科斯塔,定位球技术很好。

刚才看了一下程式,如果是字串EBP就向后推算,如果是数值类型的会直接放在寄存器当中。
dongyi940333 2008-03-11
  • 打赏
  • 举报
回复
对不起LZ,贴子回错了,^_^,LZ的问题也在学习中
dongyi940333 2008-03-11
  • 打赏
  • 举报
回复
暂留程序有两种,这取决于程序文件使用的扩展名(COM或EXE).COM程序是未经修改的机器语言程序的二进制映像,MS-DOS会把COM程序加载到最低可用的段地址,并在偏移0-处创建一个256字节的PSP,(程序段前缀)代码从偏移100H处开始(所以ORG 100H),数据区紧接在代码区后,堆栈区在段的最底端.

LZ可以参考INTEL汇编语言程序设计第四版(第16章)

不对之处请原谅!!!
willflyz 2008-03-11
  • 打赏
  • 举报
回复
谢谢楼上的,好早啊!
大概明白了,不过如果是好几个局部变量呢,
是按变量定义的顺序及所占字节数往后推算嘛?
zara 2008-03-11
  • 打赏
  • 举报
回复
用堆栈来传递参数和开拓局部变量的存放空间时, 往往在函数的开始处有如下的指令:
push ebp
mov ebp, esp
sub esp, xx ; 这里就是为局部变量在堆栈中留出空间来
所以, ebp 就是局部变量和函数参数间的基址了. ebp-?? 就是局部变量; ebp+?? 则可以访问到参数.
willflyz 2008-03-11
  • 打赏
  • 举报
回复
Debug了一下确实是这样,谢谢zara.
zara 2008-03-11
  • 打赏
  • 举报
回复
"如果是数值类型的会直接放在寄存器当中", 这个不完全对的. 寄存器能够提供出来作为变量, 其个数是很有限的. 现在的 Win32 一般是 esi, edi 和 ebx 三个 32 位的寄存器, 有的连 ebx 都不会用到. 如果函数里的数值类型的变量多于 3 个, 还是要自堆栈里占用空间的.

21,459

社区成员

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

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