0

次の疑似コードを使用して、2 つの数値を入力して最大公約数を取得するプログラムを作成します。

Euclid(a, b)
while (b != 0)
{
r = a mod b
a = b
b = r
}
return a

これは私の現在のバージョンで、エラー:52:オペコードとオペランドの無効な組み合わせが表示されます。

%include "asm_io.inc"

segment .data
prompt1 db    "Enter a number: ", 0       
prompt2 db    "Enter another number: ", 0

segment .bss
input1  resd 1
input2  resd 1

segment .text
    global  asm_main
asm_main:
    enter   0,0               ; setup routine
    pusha

    mov     eax, prompt1      
    call    print_string
    call    read_int   
    push eax       

    mov     eax, prompt2       
    call    print_string
    call    read_int    
    push eax      


    call euclid

    call print_int



    popa
    mov     eax, 0            ; return back to C
    leave                     
    ret


    ; Function euclid

    euclid:
         push ebp
         mov ebp, esp

         mov ebx, [ebp+8]
         mov ecx, [ebp+12]



         _while: 
            div ecx,ebx
            mov ebx,ecx
            mov ecx,edx
            cmp ecx,0
            jz _end
            jmp _while
         _end: 
            mov eax,ebx

        pop ebp
        ret

私はアセンブリと nasm にまったく慣れていません。エラーまたは誤った構文を見つけるのを手伝ってくれることを願っています。

4

3 に答える 3

1

div ecx,ebx指示はありません。ecx/を実行したい場合は、指定されたオペランドによって形成された 64 ビット量を除算する形式をebx使用する必要があります。そのため、32 ビットの被除数をゼロにする (または符号付き演算には符号拡張命令を使用する)ように注意する必要があります。コードは次のようになります。div r/m32edxeaxedxcdq

xor edx, edx
mov eax, ecx
div ebx  ; eax = ecx / ebx, remainder in edx

疑問がある場合は、命令セットのリファレンスを使用してください。

コードに論理エラーがある可能性があります。私はあなたが尋ねた質問にのみ答えました。

于 2013-06-03T20:27:56.820 に答える
0

コードのエラーはロジックです。「a」ではなく「r」を返す必要があります。また、「while ループ」では、「a mod b」の値をゼロと比較し、「b」の値とゼロを比較しないでください。また、最初の整数が 2 番目の整数よりも小さい場合や大きい場合など、2 つの整数の比較が原因で発生するケースが他にもあります。アルゴリズムでは、これらの比較も考慮する必要があります。nasm やアセンブリについてはまったくわかりませんが、以下の疑似コードを試してみてください。「min(a,b)」は、「a」と「b」の最小値を返す関数です。nasm やアセンブリの構文はわかりませんが、ロジックはうまく機能するはずです。

 Euclid(a,b)

       if(min(a,b)==a){
             while (b mod a != 0) { 
                r = b mod a
                b = a
                a = r
             }
             return r
          }

        else{
               while(a mod b!=0){
                  r = a mod b
                  a = b
                  b = r
              }
               return r
          }
于 2013-08-04T18:47:48.460 に答える