Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly addq和movl之间的差异,然后是addq_Assembly_X86 64 - Fatal编程技术网

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寄存器作为宏参数。