1

本当に良い変更を加えてくれた皆さんに感謝しますが、間違っていることがわかっている最初の値のセットに対して、5ではなく+4198498の答えが返されます。何か間違ったものをプッシュしましたか、それともregを正しくポップしませんでしたか?次の呼び出しのためにスタックをクリーンアップする必要があるret8を使用して、スタックを正しくクリーンアップしました。

これが私がこれまでに持っているものです:

TITLE MASM GCD                      (GCD.asm)


; Description:GCD recursive
; 
; Revision date:

INCLUDE Irvine32.inc
.data
myMessage BYTE "Assignment 7 GCD Recursive style",0dh,0ah,0
myMess2   BYTE "GCD = " ,0dh,0ah,0


;first set of nums
val1 DWORD  5
val2 DWORD  20

;second set of nums
val3 DWORD  24
val4 DWORD  18

;3rd set
val5 DWORD  11
val6 DWORD  7

;4th set
val7 DWORD  432
val8 DWORD  226

;5th set
val9 DWORD  26
val10 DWORD  13

.code
main PROC
    call Clrscr  

    mov  edx,offset myMessage
    call WriteString        ;write message
    call Crlf               ;new line
    push val1
    push val2
    call GCD

    exit
main ENDP

;------------------------------------------------
GCD PROC,
; This finds GCD
; Gets values from stored values
;returns NA

;------------------------------------------------

        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 GCD             ;no: call GCD agian
    L1:
        mov eax,ebx          ;move the divisor into eax for printing i.e GCD    
        mov  edx,offset myMess2
        call WriteString
        call WriteInt        ;Display GCD WriteInt uses EAX = qutent
        call crlf
        ret 8                ;clean up the stack
GCD ENDP

END main
4

2 に答える 2

0

私が見るいくつかのこと(計算が正しいかどうかを無視して):

    mov edx,dividend            ;this is value 1    
    mov ebx,divisor         ;this is the divider make sure its smaller number!    
    div ebx                  ;divide int1 by int2

DIV ebxで割るので、配当をに移動してクリアする必要がEDX:EAXあります。EBXEAXEDX

    cmp  edx,0               ;does remainder = 0 ?
    je   L1                  ;yes: quit

    call GCD             ;no: call GCD agian

この呼び出しのパラメータをどこに設定しますか?

  L1:
    mov eax,ebx          ;EAX = GCD

ここで商を除数で上書きしますが、それは意図的なものですか?

    pop edx
    pop ebx

これらのレジスタをどこにプッシュするかわかりません。それはMASMによって自動的に行われますか?そうでない場合は、それらをプッシュする必要があります。

于 2011-10-23T12:57:54.623 に答える
0

まず、いくつかのエラーと悪い習慣があります。

GCD PROC,
    dividend:DWORD,
    divisor:DWORD

プロシージャのローカル変数を宣言することは、私の意見では悪い習慣です。(高級言語からの結果)

それをデータセグメントに入れる必要があります。さらに、構文エラーがあります。dwordは初期化されていないため、次のように宣言する必要があります。

.DATA ?
dividend  dword ?
divisor dword ?

div命令のレジスタにも問題があります。

xor edx,edx
mov eax,xxx ;dividend
mov ebx,yyy ;divisor
div ebx     ;eax/ebx
cmp  edx,0  ;remainder in edx

次に、値のセットを使用してそれらを分割するために、さまざまな選択肢があります。

1-レジスタ内で手動で1つずつ移動します

mov eax,dword ptr[val01] ;dividend
mov ebx,dword ptr[val02] ;divisor

2-スタックに直接プッシュします(関数パラメーターのように)

push val01
push val02
call GDC

;in GDC proc
mov eax,dword ptr[esp+8]
mov ebx,dword ptr[esp+4]

3-それらを「配列」に入れてループします

exercise for you
于 2011-10-23T13:47:45.640 に答える