catch 发表于 2014-1-4 16:28:32

有关于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 ,这样他不就越界了吗?望高手指点~

duzhongjieqiji 发表于 2014-1-4 16:28:33

movl %esp,%ebp这句话 是用esp的值修改ebp的值AT&T风格和你8086 80836的汇编语法是反的!

duzhongjieqiji 发表于 2014-1-5 10:23:09

ebp+8 貌似是运行过程中栈顶修改吧 movl ST_STRING_START_ADDRESS(%ebp),%edx   这句话的意思是ebp寄存器加8 然后内存里边的数值 赋给edx寄存器   

catch 发表于 2014-1-5 10:34:23

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 这不是越界吗?

catch 发表于 2014-1-5 10:52:02

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不就越界了吗?

duzhongjieqiji 发表于 2014-1-5 11:04:54

esp是堆栈指针   ebp是基址指针 这句话执行之后 只是把栈顶 提高 这时栈顶和基址都被加了8 (操作系统会根据你的程序分配足够的空间,所以不必担心的)!只是这个函数在内存占据的位置 升高了 函数执行完pop回去 就完事了!事实上 操作系统分配给你的内存会比你需要的大一些(即使不大),也不会出现问题的! 你所谓的越界 只是你的感觉 感觉设置完ebp,esp你的函数占用内存就固定了 其实不是的!会动态调整的!当然这只是我的理解!

catch 发表于 2014-1-5 11:07:49

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?

duzhongjieqiji 发表于 2014-1-5 11:10:19

你发的代码 是全部代码吗?

duzhongjieqiji 发表于 2014-1-5 11:12:57

把 修改玩的栈顶 存在edx中啊!

catch 发表于 2014-1-5 12:06:42

duzhongjieqiji 发表于 2014-1-5 11:12 static/image/common/back.gif
把 修改玩的栈顶 存在edx中啊!

好像有一些明白了~

智商是硬伤 发表于 2015-8-17 11:01:27

{:7_146:}咱们码农有力量,嘿{:7_146:}
页: [1]
查看完整版本: 有关于AT&T 汇编