我不理解包含乘法代码的寄存器值
问题描述:
我一直在使用教程点指南学习NASM程序集,但是在尝试编写将两个用户输入的数字相乘的代码时遇到了一些问题。我遇到了错误,我认为这也可能是一个不完全理解程序集体系结构如何处理寄存器,堆栈和数据段的问题。如果我能得到帮助,首先要了解是什么导致了我的代码中的错误,然后找到了更好地掌握nasm汇编的资源,我将非常感激。我不理解包含乘法代码的寄存器值
这里是我的代码:
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
也试过。谢谢。
答
代码
mov al, num1
mov dl, num2
imul dl
说要NUM1的地址进入人与NUM2到DL的地址。错误是因为这些变量的地址不适合8位寄存器。
你真正想要做的是移动值:
mov al, [num1]
mov dl, [num2]
+0
谢谢,这实际上澄清了我对寄存器的一些问题。即寄存器值与寄存器地址 –
+1
al和dl是寄存器。他们没有地址。 num1和num2是具有地址和值的存储位置。 – prl
读取系统调用返回的字符输入,而不是数字。您应该为您希望用户键入的字符(包括换行符)提供足够的空间,因此两个字节太小,除非您只希望一位数字。 然后,您需要将字符串转换为数字才能执行算术运算。 – prl
我忘了提及您还需要将乘法结果转换回字符串以便打印。 – prl
@prl我怎么去增加更多的空间数字?我尝试将resb更改为resw来保留两个单词,但是当我输入两位数字时,程序会吐出垃圾字符 –