我一直在使用tutorialspoint指南来学习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'
我也尝试使用mul
代替imul
。谢谢。
答案 0 :(得分:5)
代码
mov al, num1
mov dl, num2
imul dl
表示将num1的地址移动到al,将num2的地址移动到dl。错误是因为这些变量的地址不适合8位寄存器。
您真正想要做的是移动值:
mov al, [num1]
mov dl, [num2]