gpt4 book ai didi

assembly - 有没有一种简单的方法可以在 AT&T 程序集 : %eax * %ebx = %ecx 中将两个寄存器相乘

转载 作者:行者123 更新时间:2023-12-02 21:41:57 25 4
gpt4 key购买 nike

我正在尝试使用 AT&T/GAS 语法将此 for 循环从 C 语言转换为汇编语言:

for(int j = i; i*j < N; j++) {
A[i*j] = 0;
}

我将i存储在%eax中,并将j存储在%ebx中。我遇到的问题是实际上将 ij 相乘,如指令 imul "reg32", "reg32" 将结果存储在第二个寄存器中,这显然是我不想要的。我真正想要的是能够将结果存储在另一个寄存器中,例如 %ecx,然后使用它来访问数组中索引 i*j 处的值。

当我查找指令imul的用法时,似乎没有办法实际将两个寄存器相乘并将结果存储在第三个寄存器中。当然,我可以做一个循环并做一些加法等等,但这似乎无效,而且不是解决这个问题的方法。请注意,我对汇编完全陌生(只使用了几天),因为我们刚刚开始学习计算机科学类(class)的基础知识。

TL;DR

将两个寄存器中存储的值相乘的最佳方法是什么:%eax * %ebx = %ecx?

最佳答案

x86 是一种双操作数架构,其中大多数指令采用两个操作数,并覆盖其中一个。如果要将结果写入第三个操作数而不是覆盖源操作数之一,标准解决方案是首先将其中一个操作数移动到目标,然后将目标与两个操作数指令一起使用。例如,要将 eaxebx 相乘,并将结果放入 ecx,您需要这样做

mov %ebx, %ecx
imul %eax, %ecx

尽管正如其他人指出的那样,对于您的循环,最好完全放弃乘法,而认识到您可以使用加法。你的循环

for (int j = i; i*j < N; j++) {
A[i*j] = 0;
}

可以重写为

A_ = A + i * i;
N_ = N - i * i;
for (j = 0; j < N_; j += i)
A_[j] = 0;

循环内不需要乘法。

关于assembly - 有没有一种简单的方法可以在 AT&T 程序集 : %eax * %ebx = %ecx 中将两个寄存器相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com