首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

C语言编译成汇编乘积运算有关问题

2012-10-15 
C语言编译成汇编乘积运算问题C语言代码如下:void main(unsigned long long* a,unsigned b,unsigned long l

C语言编译成汇编乘积运算问题
C语言代码如下:
void main(unsigned long long* a,unsigned b,unsigned long long c)
{
*a=b*c;
}

编译后的汇编如下(去掉链接用的标记):
main:
pushl%ebp
movl%esp, %ebp
andl$-8, %esp
movl12(%ebp), %eax
movl20(%ebp), %ecx
imull%eax, %ecx
mull16(%ebp)
addl%ecx, %edx
movl8(%ebp), %ecx
movl%eax, (%ecx)
movl%edx, 4(%ecx)
leave
ret
第4句把b放进eax,第5句把c的高4个字节放进ecx,然后两者相乘乘积放在edx:eax中,然后把这个乘积再乘以c的低是个字节,这不就成了b*c(高4字节)*c(低4字节)

这个相乘是什么情况呢?

[解决办法]
imull %eax, %ecx 相乘的结果只在 %ecx ,不是在 edx:eax ;这个是双参数 imull 指令的规定。eax 还是 b ,所以接着是 b*loWord(c) 结果在 edx:eax 中(单个参数乘法指令的规定)。

热点排行