Assembly addq和movl之间的差异,然后是addq
两者的功能区别是什么Assembly addq和movl之间的差异,然后是addq,assembly,x86-64,Assembly,X86 64,两者的功能区别是什么 addq(%rbx),%rax 及 movl(%rbx),%ecx 添加%rcx,%rax 装配中 我认为它们做的是相同的事情,但功能上的区别是什么 第一个从位置rbx的内存中取出一个完整的四字(64位),并将其添加到rax寄存器中 第二个从同一位置提取一个长字(仅32位),并将其存储到ecx(将rcx的上半部分归零)。然后将rcx添加到rax 因此,我想说的主要区别是,第二个代码片段并没有在内存中将完整的四字添加到rax,而是添加了长字 第一个(一行代码)代码示例更类似
addq(%rbx),%rax
及
movl(%rbx),%ecx
添加%rcx,%rax
装配中
我认为它们做的是相同的事情,但功能上的区别是什么 第一个从位置rbx
的内存中取出一个完整的四字(64位),并将其添加到rax
寄存器中
第二个从同一位置提取一个长字(仅32位),并将其存储到ecx
(将rcx
的上半部分归零)。然后将rcx
添加到rax
因此,我想说的主要区别是,第二个代码片段并没有在内存中将完整的四字添加到rax
,而是添加了长字
第一个(一行代码)代码示例更类似于:
movq (%rbx), %rcx
addq %rcx, %rax
尽管由于它改变了rcx,所以它也不是完全相同的。为了使其更接近匹配,您可以将保存和恢复rcx
作为过程的一部分:
push %rcx
movq (%rbx), %rcx
addq %rcx, %rax
pop %rcx
不过,当然,您已经更改了rsp(虽然是暂时的),并且它要求您实际设置一个堆栈(很可能,但并非绝对如此),因此您最好只使用一行:-)第二个示例更改了ECX,第一个示例没有。如果您在GNU C内联asm中这样做,push/pop将使编译器崩溃,并且没有办法告诉编译器您想要这样做。因此,只需使用一行程序并告诉编译器有关寄存器阻塞的信息,而不是保存/恢复您自己@Peter,你可能是对的,我没有研究这方面,主要是因为OP没有提到在C中使用
asm
关键字-我假设,基于问题和标记,这是纯汇编。对,我也是这么想的。但作为对其他环境的一般建议,它是相关的。也许您正在编写一个汇编宏:对宏来说,删除红色区域是一个令人讨厌的副作用,并且比删除寄存器更难调试。如果需要,最好将tmp寄存器作为宏参数。