Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly I';我不理解乘法码周围的寄存器值_Assembly_Nasm - Fatal编程技术网

Assembly I';我不理解乘法码周围的寄存器值

Assembly I';我不理解乘法码周围的寄存器值,assembly,nasm,Assembly,Nasm,我一直在使用《学习NASM汇编教程点指南》自学汇编,但在尝试编写将两个用户输入的数字相乘的代码时遇到了一些问题。我遇到了一些错误,我认为这可能也是一个问题,即不能完全理解汇编体系结构在寄存器、堆栈和数据段方面是如何工作的。如果我能得到帮助,首先了解代码中错误的原因,然后找到更好地掌握nasm汇编的资源,我将非常感激 这是我的密码: write equ 4 read equ 3 stdout equ 1 stdin equ 0 section .text

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

代码

    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是内存位置,具有地址和值。