【问题标题】:GCD program x86 assemble languageGCD 程序 x86 汇编语言
【发布时间】:2014-03-07 23:57:15
【问题描述】:
INCLUDE Irvine32.inc

.data   
        heading     BYTE    "This is a program for GCD.........", 0
        inputX      BYTE    "Enter an integer X: ", 0
        inputY      BYTE    "Enter an integer Y: ", 0
        ansGCD      BYTE    "The value of GCD is: ", 0
        valX        DWORD   ?
        valY        DWORD   ?       

.code
main PROC       
        mov edx, OFFSET heading         ;print header
        call WriteString
        call Crlf

        mov edx, OFFSET inputX          ;input X
        call WriteString
        call ReadDec
        mov valX, eax
        call Crlf

        mov edx, OFFSET inputY          ;inputY
        call WriteString
        call ReadDec
        mov valY, eax
        call Crlf

        mov eax,DWORD ptr[valX]     ;dividend
        mov ebx,DWORD ptr[valY]     ;divisor
        push valY                       ;pushing values into stack
        push valX
        call CalcGdcI
        call Dumpregs

        exit
main ENDP


CalcGdcI PROC
        xor edx, edx
        mov eax, DWORD ptr[esp+8]       ;dividend
        mov ebx, DWORD ptr[esp+4]       ;divisor
        div ebx                         ;eax/ebx
        cmp edx, 0                      ;remainder in edx
        je L1                           ;yes: quit
        call CalcGdcI                   ;no: call CalcGdcI again
L1:
        mov eax, ebx                    ;move the divisor into eax to print
        mov edx, OFFSET ansGCD
        call WriteString
        call WriteDec                   ;Display GCD WriteInt
        call Crlf
        ret 8                           ;clean up the stack
CalcGdcI ENDP

END main

如果数字不能完全整除,例如 (54,24) 但与 (10,100) 类似,我会得到错误的答案...谢谢

【问题讨论】:

  • 太糟糕了...我们应该为您调试它吗?
  • 不,不是真的……只是想要一些帮助……

标签: assembly masm irvine32


【解决方案1】:

我认为你应该写一些类似的东西(我已经写了很多年汇编):

CalcGdcI PROC
    xor edx, edx
    mov eax, DWORD ptr[esp+8]       ;dividend
    mov ebx, DWORD ptr[esp+4]       ;divisor
loop:
    div ebx                         ;eax/ebx
    cmp edx, 0                      ;remainder in edx
    je L1                           ;yes: quit
    mov eax, ebx                    ;restart with eax = ebx
    mov ebx, edx                    ;and          ebx = edx
    jmp loop
l1: 
    ...

【讨论】:

  • 好吧还有 1 件事....我们如何在汇编中绝对值?我的意思是,它将接受一个整数输入,如果是 neg 那么它将绝对它以供进一步计算
  • 程序应该比较两个输入值并使用较大的值作为初始除数,较小的值作为初始除数。使用 GCD 处理负数很棘手,因为需要有奇数个因子才能以负数结束。例如,9 和 -9 的 GCD 或 9 和 -18 的 GCD 是多少?
  • @transformerX : 由于您是新用户:请阅读stackoverflow.com/help/someone-answers
猜你喜欢
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2017-01-03
相关资源
最近更新 更多