私は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
を使用して試してみました。ありがとうございました。
readシステムコール番号を、入力された文字を返しません。改行を含めて、ユーザーが入力すると予想される文字のための十分なスペースを提供する必要があります。したがって、1桁の数字しか期待しない限り、2バイトが小さすぎます。 次に、演算を実行するために文字列を数値に変換する必要があります。 – prl
私は、それを印刷するために乗算の結果を文字列に変換する必要があることを忘れていました。 – prl
@prl数字のスペースを増やすにはどうすればいいですか?私は2つの単語を予約するためresbを変更しようとしましたが、2桁の数字を入力するとガベージ文字が吐き出されます –