我一直在学习NASM几个星期。一切进展顺利 - 我现在一直专注于64位。推送寄存器纯粹用于短期保存可以吗?
早些时候我注意到rdx
寄存器在我执行mul
指令时被搞乱了。
基本上,该代码是与此类似:
; Code using RDX is up here
mov rax,2
mov rbx,10
mul rbx
; Code using RDX again is down here .. but the value is now zero
所以,很显然RDX有事情做与mul
。为了解决这个问题,我改变了代码,以这样的:
push rdx
mov rax,2
mov rbx,10
mul rbx
pop rdx
基本上,我保留之前mul
指令与它弄乱堆栈中的寄存器...然后弹出回来之后(因为我不不在乎rdx
中的值。我希望它成为我想要的值)。
我的问题是:这可以吗?这是常见的吗?我没有这么做很久......但感觉有点奇怪。
我可以改为使用局部变量来进行一些计算而不是寄存器..这可能会解决这个问题,而无需在短时间内将它推入栈中......但问题依然存在。
奖金问题:是否有某个地方可以全面了解这些指令在64位环境中的作用?我似乎无法找到一个参考,它实际上告诉我用简单的英语在mul
指令后rdx
寄存器中发生了什么。
n×n乘有2n结果。这种类型的push/pop是告诉机器代码是由人类而不是机器编写的方式:)它看起来像解决问题的天真的方式,事实并非如此。堆栈内存访问有3个周期延迟。机器将寻找一种方法将值存储在另一个寄存器中,如r9-r15或xmm0-15。或者考虑使用SIMD指令的可能性,以便同时得到4个乘积:) – 2015-01-21 12:13:45
是的,这是我的小脑子现在正在实现的东西:)我试图远离附加寄存器('r9'等) ),这样我就可以轻松地把它移植到32位的时候。我发现有很多原因可能不是一个好主意 - 所以我会重新访问我的注册使用情况。谢谢:) – 2015-01-21 21:43:10