assembly - 在没有外部变量的汇编中查找n个数组的GCD
问题描述
我有一个关于在汇编中查找 n 个数字的数组的 GCD(我在 Visual Studio 2017 中使用 asm)而不在 C 中使用外部变量的作业。我得到的唯一变量是 n 数组的长度数字。我在找到数组的前两个数字的 GCD 时没有问题,但我不确定如何创建一个循环,在这个循环中我不断用数组的下一个数字更新我的寄存器,因为 GCD 是 3 个数字,b,c 是 GCD(GCD(a,b),c)。我希望能得到一些帮助。
#include <stdio.h>
void main()
{
unsigned int intArray[] = {12,24,3};
int num = sizeof(intArray) / sizeof(intArray[0]);
unsigned int MCD;
__asm
{
xor ebx,ebx
xor edx,edx
xor eax,eax
mov eax, intArray[0]
mov ebx, intArray[1]
jmp major
zerob:
mov MCD, eax
jmp fine
major:
cmp eax,ebx
jg nextstep
xchg eax,ebx
jmp major
nextstep:
cmp ebx,0
je zerob
jne modulus
modulus:
div ebx
mov MCD,edx
mov eax,ebx
mov ebx,MCD
jmp nextstep
fine:
}
printf("M.C.D.: %d \n", MCD);
getchar();
}
解决方案
第 1 步,清理和更正
删除冗余指令,重新安排代码以减少跳转,如果使用 2 个相同的数字,则删除潜在的无限循环,并EDX
在每次除法之前归零:
mov eax, intArray[0]
mov ebx, intArray[1]
major:
cmp eax, ebx
jg nextstep
xchg eax, ebx
nextstep:
cmp ebx, 0
je zerob
modulus:
xor edx, edx
div ebx
mov eax, ebx
mov ebx, edx
jmp nextstep
zerob:
mov MCD, eax
fine:
第二步,创建循环
使用num中的元素数,通过指针 in 获取数字ESI
并将内部循环转换为 DO-WHILE 循环(有条件地跳转到顶部):
mov ecx, num ;Number of elements
lea esi, intArray[0]
lodsd ;First number in array
dec ecx
jz DONE
AGAIN:
mov ebx, [esi] ;Next number in array
add esi, 4
major:
cmp eax, ebx
jg nextstep
xchg eax, ebx
jmp nextstep
modulus: ;Inner loop
xor edx, edx
div ebx
mov eax, ebx
mov ebx, edx
nextstep:
test ebx, ebx
jnz modulus
dec ecx
jnz AGAIN
DONE:
mov MCD, eax
fine:
推荐阅读
- reactjs - 在使用登录模板时设置背景图像
- python - 从 Dash Datatable 下载的文件正在导出 HTML 而不是数据框
- shell - 在 GCP 中,当我单击 Cloud Shell 访问控制台时,它只显示一个白框
- r - 使用 R 中的特定月份和年份使用 ARIMA 模型进行预测?
- node.js - 如何在 TS-Node 中声明初始化全局变量?
- spotify - 在Spotify中拉艺术家的专辑时,如何增加默认限制20
- python - 计算熊猫数据帧的增长率
- javascript - 单个复选框在反应组件中不起作用
- r - 使用 mutate_at 将 R 中的缺失值替换为从列名中获得的值(如果不缺失)
- flutter - 如何在颤动中使用设备日历获取事件