有关于AT&T 汇编
本帖最后由 catch 于 2014-1-4 16:41 编辑.type count_chars,@function// 定义函数
.globl count_chars//全局
.equ ST_STRING_START_ADDRESS,8 // ST_STRING_START_ADDRESS 赋值为8
count_chars:
pushl %ebp //ebp 压入栈
movl %esp,%ebp //esp 和ebp 同时指向栈顶
movl $0,%ecx //计数
movl ST_STRING_START_ADDRESS(%ebp),%edx
这一句话是什么意思?%ebp 本来指向栈顶,由于pushl %ebp,此时,ebp 相当于指向ebp-4,ST_STRING_START_ADDRESS(%ebp) 相当于 %ebp+8 ,这样他不就越界了吗?望高手指点~
movl %esp,%ebp这句话 是用esp的值修改ebp的值AT&T风格和你8086 80836的汇编语法是反的! ebp+8 貌似是运行过程中栈顶修改吧 movl ST_STRING_START_ADDRESS(%ebp),%edx 这句话的意思是ebp寄存器加8 然后内存里边的数值 赋给edx寄存器 duzhongjieqiji 发表于 2014-1-5 10:23 static/image/common/back.gif
ebp+8 貌似是运行过程中栈顶修改吧 movl ST_STRING_START_ADDRESS(%ebp),%edx 这句话的意思是ebp寄存器加 ...
但是现在ebp已经指向栈顶(前面有 movl %esp,%ebp),ebp+8 这不是越界吗? duzhongjieqiji 发表于 2014-1-5 10:45 static/image/common/back.gif
movl %esp,%ebp这句话 是用esp的值修改ebp的值AT&T风格和你8086 80836的汇编语法是反的!
是的,esp的值修改ebp的值以后,esp 和 ebp同时指向栈顶,那么ebp+8不就越界了吗? esp是堆栈指针 ebp是基址指针 这句话执行之后 只是把栈顶 提高 这时栈顶和基址都被加了8 (操作系统会根据你的程序分配足够的空间,所以不必担心的)!只是这个函数在内存占据的位置 升高了 函数执行完pop回去 就完事了!事实上 操作系统分配给你的内存会比你需要的大一些(即使不大),也不会出现问题的! 你所谓的越界 只是你的感觉 感觉设置完ebp,esp你的函数占用内存就固定了 其实不是的!会动态调整的!当然这只是我的理解!
duzhongjieqiji 发表于 2014-1-5 11:04 static/image/common/back.gif
esp是堆栈指针 ebp是基址指针 这句话执行之后 只是把栈顶 提高 这时栈顶和基址都被加了8 (操作系统会根 ...
movl ST_STRING_START_ADDRESS(%ebp),%edx 这句话是把 ebp+8处的值赋给edx,此时栈中并没有指定数据,随意赋给edx? 你发的代码 是全部代码吗? 把 修改玩的栈顶 存在edx中啊! duzhongjieqiji 发表于 2014-1-5 11:12 static/image/common/back.gif
把 修改玩的栈顶 存在edx中啊!
好像有一些明白了~ {:7_146:}咱们码农有力量,嘿{:7_146:}
页:
[1]