2017-09-04 3 views
1

私はNASMアセンブリを学習するためのtutorialspointガイドを使用して自分自身を教えていますが、ユーザー入力の2つの数値を乗算するコードを書くときにいくつかの問題があります。私はエラーに遭遇しています。これは、レジスタ、スタック、およびデータセグメントに関してアセンブリアーキテクチャがどのように機能するかを完全に理解していないという問題でもあると思います。私が助けを受けることができれば、まず自分のコードに何が原因であるのかを理解してから、アセンブリをよりよく把握するためのリソースを見つけたら、とても感謝しています。私は乗算コードを取り囲むレジスタ値を理解していません

は、ここに私のコードです:

write equ 4 
    read equ 3 
    stdout equ 1 
    stdin equ 0 


    section .text 
     global _start 

    _start: 
     mov eax, write 
     mov ebx, stdout 
     mov ecx, msg1 
     mov edx, len1 
     int 80h 

     mov eax, read 
     mov ebx, stdin 
     mov ecx, num1 
     mov edx, 2 
     int 80h 

     mov eax, write 
     mov ebx, stdout 
     mov ecx, msg2 
     mov edx, len2 
     int 80h 

     mov eax, read 
     mov ebx, stdin 
     mov ecx, num2 
     mov edx, 2 
     int 80h 

     mov al, num1 
     mov dl, num2 
     imul dl 

     mov [res], al 

     mov eax, write 
     mov ebx, stdout 
     mov ecx, res 
     mov edx, 4 
     int 80h 

     mov eax, 1 
     int 80h 

    section .bss 
     num1 resb 2 
     num2 resb 2 
     res resb 4 

    section .data 
     msg1 db "Please input your first value: " 
     len1 equ $-msg1 
     msg2 db "Please input your second value: " 
     len2 equ $-msg2 

と、ここで私が受けていますエラーです:

main.o: In function `_start':                                               

    main.asm:(.text+0x59): relocation truncated to fit: R_386_8 against `.bss'                                    

    main.asm:(.text+0x5b): relocation truncated to fit: R_386_8 against `.bss' 

私もimulの代わりにmulを使用して試してみました。ありがとうございました。

+1

readシステムコール番号を、入力された文字を返しません。改行を含めて、ユーザーが入力すると予想される文字のための十分なスペースを提供する必要があります。したがって、1桁の数字しか期待しない限り、2バイトが小さすぎます。 次に、演算を実行するために文字列を数値に変換する必要があります。 – prl

+1

私は、それを印刷するために乗算の結果を文字列に変換する必要があることを忘れていました。 – prl

+0

@prl数字のスペースを増やすにはどうすればいいですか?私は2つの単語を予約するためresbを変更しようとしましたが、2桁の数字を入力するとガベージ文字が吐き出されます –

答えて

5

コード

mov al, num1 
    mov dl, num2 
    imul dl 

は、DLへのAlとNUM2のアドレスにNUM1のアドレスを移動させると言います。エラーは、これらの変数のアドレスが8ビットレジスタに収まらないためです。

あなたが実際にやりたいことは値を移動している:

mov al, [num1] 
    mov dl, [num2] 
+0

ありがとう、これは実際に私がレジスタについて持っていたいくつかの質問を明確にします。すなわち、レジスタ値対レジスタアドレス –

+1

のalとdlはレジスタです。彼らには住所がありません。 num1とnum2はアドレ​​スと値を持つメモリ位置です。 – prl

関連する問題