汇编中的 GCD 程序不显示 gcd 的输出
Posted
技术标签:
【中文标题】汇编中的 GCD 程序不显示 gcd 的输出【英文标题】:GCD Program in Assembly doesn't show the output of gcd 【发布时间】:2015-05-11 05:13:02 【问题描述】:这构建成功,输入整数没有任何问题。但是,我看不到 gcd 的结果,并且调试器运行时没有任何东西。是因为无限循环吗?我完全迷失在这里。谁能弄清楚我在这里缺少什么?请帮我看看这是什么问题?
INCLUDE Irvine32.inc
.data
strA BYTE "Enter an integer A: ",0
strB BYTE "Enter an integer B: ",0
temp DWORD ?
finalStr BYTE "GCD of the two integers is: ",0
.code
main PROC
call Clrscr
mainLoop:
mov edx,OFFSET strA
call WriteString
call ReadInt
mov temp, eax
call Crlf
mov edx, OFFSET strB
call WriteString
call ReadInt
mov ebx, eax
mov eax, temp
call Crlf
call GCD
mov edx, OFFSET finalStr
call WriteString
call WriteInt
call WaitMsg
jmp mainLoop
main ENDP
abs PROC
cmp eax, 0 ; see if we have a negative number
jge done
neg eax
done:
ret
abs ENDP
gcd PROC
call abs ;takes absolute value of both registers
mov temp, eax
mov eax, ebx
call abs
mov ebx, eax
mov eax, temp
cmp eax, ebx ; making sure we divide the bigger number by the smaller
jz DONE ; if numbers are equal, GCD is eax either way
jc SWITCH ;swaps if ebx is larger then eax
mov edx, 0
SWITCH: ;swaps values so eax is larger then ebx
mov temp, eax
mov eax, ebx
mov ebx, temp
mov edx, 0
jmp L1
L1: ;divides until remainder is 0, then eax is GCD
div ebx
cmp edx, 0
jz DONE
mov eax, edx
jmp L1
DONE:
gcd ENDP
END main
【问题讨论】:
【参考方案1】:您的GCD
函数缺少返回指令:
DONE: <-- There should be a RET after the DONE label
gcd ENDP
【讨论】:
【参考方案2】:我会直接告诉你该代码有问题的一件事(可能还有其他问题,这只是立即弹出的问题):
jc SWITCH ;swaps if ebx is larger then eax
mov edx, 0
SWITCH: ;swaps values so eax is larger then ebx
mov temp, eax
mov eax, ebx
mov ebx, temp
mov edx, 0
jmp L1
L1: ;divides until remainder is 0, then eax is GCD
这将切换寄存器无论如何,因为无论进位标志的状态如何,您都可以在SWITCH
运行代码。要么你明确地跳到那里,要么你掉到那里。
我怀疑jmp L1
(在当前位置是多余的,原因与jump if carry
相同)应该紧跟在jc SWITCH
之后,这样整个事情要么交换要么不交换。
换句话说,类似于:
jnc L1 ; skip swap unless ebx > eax.
SWITCH: push eax ; don't need temp at all, use stack.
push ebx
pop eax
pop ebx
L1:
mov edx, 0 ; carry on.
【讨论】:
所以我把jmp L1
放在jc SWITCH
之后。现在它说一个错误:整数溢出。我该怎么办...
没有问题,@user4852500,但请确保您查看迈克尔的答案,这可能是您 立即 问题的原因,因为您开始跑步而跑到仙境由于缺少退货而导致的非代码。如果是这样,你应该接受他的回答。以上是关于汇编中的 GCD 程序不显示 gcd 的输出的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)
嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)
嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)