我不理解包含乘法代码的寄存器值

问题描述:

我一直在使用教程点指南学习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也试过。谢谢。

+1

读取系统调用返回的字符输入,而不是数字。您应该为您希望用户键入的字符(包括换行符)提供足够的空间,因此两个字节太小,除非您只希望一位数字。 然后,您需要将字符串转换为数字才能执行算术运算。 – prl

+1

我忘了提及您还需要将乘法结果转换回字符串以便打印。 – prl

+0

@prl我怎么去增加更多的空间数字?我尝试将resb更改为resw来保留两个单词,但是当我输入两位数字时,程序会吐出垃圾字符 –

代码

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