汇编的问题

0x8048430<triangle>:push%ebp0x8048431<triangle+1>:mov%esp,%ebp0x8048433<triangle+3>:p... 0x8048430 <triangle>: push %ebp
0x8048431 <triangle+1>: mov %esp, %ebp
0x8048433 <triangle+3>: push %edi
0x8048434 <triangle+4>: push %esi
0x8048435 <triangle+5>: sub $0x30,%esp
0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi
0x804843b <triangle+11>: mov $0x8049508,%esi
0x8048440 <triangle+16>: cld
0x8048441 <triangle+17>: mov $0x30,%esp
0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi)
0x8048448 <triangle+24>: mov 0x8(%ebp),%eax
0x804844b <triangle+27>: mov %eax,%edx
0x804844d <triangle+29>: imul 0xc(%ebp),%edx
0x8048451 <triangle+33>: mov %edx,%eax
0x8048453 <triangle+35>: sar $0x1f,%eax
0x8048456 <triangle+38>: shr $0x1f,%eax
0x8048459 <triangle+41>: lea (%eax, %edx, 1), %eax
0x804845c <triangle+44>: sar %eax
0x804845e <triangle+46>: mov %eax,0xffffffd4(%ebp)
0x8048461 <triangle+49>: mov 0xffffffd4(%ebp),%eax
0x8048464 <triangle+52>: mov %eax,%eax
0x8048466 <triangle+54>: add $0x30,%esp
0x8048469 <triangle+57>: pop %esi
0x804846a <triangle+58>: pop %edi
0x804846b <triangle+59> pop %ebp
0x804846c <triangle+60>: ret
以上代码中为何寄存器前要加% 第6行0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi 中的0xffffffd8(%ebp)是什么意思?为何要在寄存器前加括号?第10行0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi)
看不懂,能否解释一下?谢谢~ 不求快,只求详细解释,谢谢~
展开
 我来答
mengshijie2007
2007-06-03 · 超过45用户采纳过TA的回答
知道答主
回答量:170
采纳率:0%
帮助的人:0
展开全部
上面的语句大概是调试窗口或者是编译器生成的一些代码,不是纯粹的汇编代码,因为有很多修饰,具体解释如下:
0x8048438 <triangle+8>: lea 0xffffffd8(%ebp), %edi

0x8048438是lea 0xffffffd8(%ebp), %edi指令的内存地址。<triangle+8>是源代码中用标号一类的的东西表示的地址。lea 0xffffffd8(%ebp), %edi中的%用于说明其后内容是寄存器,其他的%功能也是如此。这条指令的作用是把edi的内容拷贝到ebp中。此指令诣在加载偏移地址,edi的内容是偏移地址,dbp是目的操作数。0xffffffd8的意思不是十分容易理解。
0x8048446 <triangle+22>: repz movsl %ds:( %esi), %es:( %edi)
该语句的实际内容是:repz movsl ds:esi, es:edi
意思是当CX>0时,且零标志位被设置时,循环执行movsl ds:esi, es:edi语句,该语句的意思很是显而易见,只是movsl不是MASM语法标准的汇编指令,故此很难确定移动指令MOV的具体操作细节。
意法半导体(中国)投资有限公司
2023-06-12 广告
单片机汇编程序是用汇编语言编写的程序,用于控制单片机的操作。汇编语言是一种比较接近计算机硬件语言的低级语言,相对于高级语言来说更容易理解和实现。下面是单片机汇编程序的基本步骤:1. 将代码和数据汇编到规定的段中。2. 在存储器中用未初始化的... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
郁闷的小沙子
2007-05-29
知道答主
回答量:24
采纳率:0%
帮助的人:0
展开全部
据我观察:代码前加的不是% 而是%e。但不知道为什么要加这个???这可能是某专用程序来看寄存器内部数据的吧?代码去掉%e似乎可以看明白点。
0x8048430 <triangle>: push bp
0x8048431 <triangle+1>: mov sp, bp
0x8048433 <triangle+3>: push di
0x8048434 <triangle+4>: push si
0x8048435 <triangle+5>: sub 0x30,sp
0x8048438 <triangle+8>: lea 0xffffffd8(bp), di
0x804843b <triangle+11>: mov 0x8049508,si
0x8048440 <triangle+16>: cld
0x8048441 <triangle+17>: mov 0x30,sp
0x8048446 <triangle+22>: repz movsl ds:( si), es:( di)
0x8048448 <triangle+24>: mov 0x8(bp),ax
0x804844b <triangle+27>: mov ax,dx
0x804844d <triangle+29>: mul 0xc(bp),dx ;无符号乘法
0x8048451 <triangle+33>: mov dx,ax
0x8048453 <triangle+35>: sar 0x1f,ax
0x8048456 <triangle+38>: shr 0x1f,ax
0x8048459 <triangle+41>: lea (ax, dx, 1), ax
0x804845c <triangle+44>: sar ax
0x804845e <triangle+46>: mov ax,0xffffffd4(bp)
0x8048461 <triangle+49>: mov 0xffffffd4(bp),ax
0x8048464 <triangle+52>: mov ax,ax
0x8048466 <triangle+54>: add 0x30,sp
0x8048469 <triangle+57>: pop si
0x804846a <triangle+58>: pop di
0x804846b <triangle+59> pop bp
0x804846c <triangle+60>: ret
个人意见,只做参考~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
roberts99
2007-05-29 · TA获得超过211个赞
知道小有建树答主
回答量:498
采纳率:0%
帮助的人:316万
展开全部
eax之类的是16位ax扩展成32位的结果吧。
百分号是不应该有的,也许是你将这些语句打印出来的时候自动加上的便于辨认哪些是寄存器。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
343445313
2007-05-29
知道答主
回答量:41
采纳率:0%
帮助的人:0
展开全部
什么东西 一点眉目都没有??????
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
286429205
2007-06-03
知道答主
回答量:34
采纳率:0%
帮助的人:0
展开全部

参考资料:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式