Assembly I';我不理解乘法码周围的寄存器值
我一直在使用《学习NASM汇编教程点指南》自学汇编,但在尝试编写将两个用户输入的数字相乘的代码时遇到了一些问题。我遇到了一些错误,我认为这可能也是一个问题,即不能完全理解汇编体系结构在寄存器、堆栈和数据段方面是如何工作的。如果我能得到帮助,首先了解代码中错误的原因,然后找到更好地掌握nasm汇编的资源,我将非常感激 这是我的密码:Assembly I';我不理解乘法码周围的寄存器值,assembly,nasm,Assembly,Nasm,我一直在使用《学习NASM汇编教程点指南》自学汇编,但在尝试编写将两个用户输入的数字相乘的代码时遇到了一些问题。我遇到了一些错误,我认为这可能也是一个问题,即不能完全理解汇编体系结构在寄存器、堆栈和数据段方面是如何工作的。如果我能得到帮助,首先了解代码中错误的原因,然后找到更好地掌握nasm汇编的资源,我将非常感激 这是我的密码: write equ 4 read equ 3 stdout equ 1 stdin equ 0 section .text
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
。谢谢。代码
mov al, num1
mov dl, num2
imul dl
表示将num1的地址移到al中,将num2的地址移到dl中。错误是因为这些变量的地址不适合8位寄存器
实际上,您要做的是移动值:
mov al, [num1]
mov dl, [num2]
代码
mov al, num1
mov dl, num2
imul dl
表示将num1的地址移到al中,将num2的地址移到dl中。错误是因为这些变量的地址不适合8位寄存器
实际上,您要做的是移动值:
mov al, [num1]
mov dl, [num2]
read系统调用返回键入的字符,而不是数字。您应该为希望用户键入的字符(包括换行符)提供足够的空间,因此两个字节太小,除非您只希望输入一位数字。然后,您需要将字符串转换为数字才能执行算术。我忘了提到,您还需要将乘法结果转换回字符串才能打印出来。@prl如何为数字添加更多空间?我尝试将resb改为resw以保留两个字,但当我输入两位数时,程序会抛出垃圾字符垃圾字符是因为乘法的结果不是ASCII字符。您需要阅读有关数字的ASCII转换。@prl我按照您的建议,在算术之前减去“0”,然后在结果中添加“0”。现在,它可以处理任何产生一位数结果但在结果为两位数时给出随机字符的情况。读取系统调用返回键入的字符,而不是数字。您应该为希望用户键入的字符(包括换行符)提供足够的空间,因此两个字节太小,除非您只希望输入一位数字。然后,您需要将字符串转换为数字才能执行算术。我忘了提到,您还需要将乘法结果转换回字符串才能打印出来。@prl如何为数字添加更多空间?我尝试将resb改为resw以保留两个字,但当我输入两位数时,程序会抛出垃圾字符垃圾字符是因为乘法的结果不是ASCII字符。您需要阅读有关数字的ASCII转换。@prl我按照您的建议,在算术之前减去“0”,然后在结果中添加“0”。它现在可以处理任何产生一个一位数结果,但当结果是两位数时会给出一个随机字符的东西。谢谢,这实际上澄清了我关于寄存器的一些问题。也就是说,寄存器值与寄存器地址sal和dl是寄存器。他们没有地址。num1和num2是内存位置,有地址和值。谢谢,这实际上澄清了我关于寄存器的一些问题。也就是说,寄存器值与寄存器地址sal和dl是寄存器。他们没有地址。num1和num2是内存位置,具有地址和值。