我正在尝试使用AT&T/GAS语法将这个C语言for循环翻译成汇编:
for(int j = i; i*j < N; j++) {
A[i*j] = 0;
}
我将 i 存储在 %eax 中,将 j 存储在 %ebx 中。我的问题是如何实际上将 i 和 j 相乘,因为指令 imul "reg32", "reg32" 将结果存储在第二个寄存器中,显然我不想要这个。我想要的是能够将结果存储在另一个寄存器中,比如说 %ecx,然后使用它来访问数组中索引为 i*j 的值。
当我查看指令 imul 的用法时,似乎没有办法将两个寄存器相乘并将结果存储在第三个寄存器中。当然,我可以制作一个循环并进行一些加法等操作,但这似乎是低效的并且不是解决问题的正确方式。请注意,我完全是汇编新手(只用了几天),因为我们刚刚开始学习基础知识。
TL;DR
有什么最好的方法可以像这样相乘存储在两个寄存器中的值:%eax * %ebx = %ecx?
imul%eax,%ebx
,然后,如果需要在%ecx
中获得结果,则可以执行mov%eax,%ecx
。如果需要保留%eax
中的值,则可以保存它(例如,在堆栈上)。当我查找指令imul的用法时,似乎没有办法实际上将两个寄存器相乘并将结果存储在第三个寄存器中。这是真的。但是绕过它并不麻烦。 - lurker