汇编中的 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 的输出的主要内容,如果未能解决你的问题,请参考以下文章

从线程/ GCD/完成处理程序返回

iOS GCD的使用

GCD中的dispatch_semaphore的语法与作用

嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)

嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)

嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)