我不理解乘法代码周围的寄存器值

时间:2017-09-04 03:44:21

标签: assembly nasm

我一直在使用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。谢谢。

1 个答案:

答案 0 :(得分:5)

代码

    mov al, num1
    mov dl, num2
    imul dl

表示将num1的地址移动到al,将num2的地址移动到dl。错误是因为这些变量的地址不适合8位寄存器。

您真正想要做的是移动值:

    mov al, [num1]
    mov dl, [num2]