Assembly 将多个寄存器移到单个变量中

Assembly 将多个寄存器移到单个变量中,assembly,x86,nasm,32-bit,Assembly,X86,Nasm,32 Bit,我在eax中存储了一个32位数字,在ebx中存储了一个32位数字。我想把它们合并成一个64位的数字,在section.bss中定义为finalNum,但我不知道如何组合。我试过了 mov esi, finalNum mov [esi], eax add esi, 32 mov [esi], ebx 但由于某种原因,当我试图打印出最终结果时,打印不正确,所以我假设这4行中存在问题。这也是32位nasm 编辑: 所以我试过了 mov esi, finalNum mov [esi+0

我在eax中存储了一个32位数字,在ebx中存储了一个32位数字。我想把它们合并成一个64位的数字,在section.bss中定义为finalNum,但我不知道如何组合。我试过了

mov esi, finalNum
mov [esi], eax
add esi, 32
mov [esi], ebx
但由于某种原因,当我试图打印出最终结果时,打印不正确,所以我假设这4行中存在问题。这也是32位nasm

编辑:

所以我试过了

    mov esi, finalNum
    mov [esi+0], eax
    mov [esi+4], ebx
但是,仍然有一些奇怪的指纹,我宣布finalNum为

    finalNum:   resb 8
你认为这可能是个问题吗

编辑:

正如你所看到的,当我乘法并打印出来时,我得到了一个奇怪的字符

编辑: 用于打印结果的代码

    mov     eax, SYSCALL_WRITE ; write message
    mov     ebx, STDOUT
    mov     ecx, msg7
    mov     edx, len7
    int     080h

    mov     eax, SYSCALL_WRITE ; write user input
    mov     ebx, STDOUT
    mov     ecx, finalNum
    mov     edx, BUFLENFINAL
    int     080h

BUFLENFINAL=8顺便说一句,64位数字的低位字位于
finalNum
的低位4字节,高位字位于
finalNum
的高位4字节:

mov esi, finalNum   ; Load address of where to store 64-bit number
mov [esi+0], eax    ; Store low 32 bits
mov [esi+4], ebx    ; Store high 32 bits

64位数字的低位字位于
finalNum
的低位4字节,高位字位于
finalNum
的高位4字节:

mov esi, finalNum   ; Load address of where to store 64-bit number
mov [esi+0], eax    ; Store low 32 bits
mov [esi+4], ebx    ; Store high 32 bits

64位数字的低位字位于
finalNum
的低位4字节,高位字位于
finalNum
的高位4字节:

mov esi, finalNum   ; Load address of where to store 64-bit number
mov [esi+0], eax    ; Store low 32 bits
mov [esi+4], ebx    ; Store high 32 bits

64位数字的低位字位于
finalNum
的低位4字节,高位字位于
finalNum
的高位4字节:

mov esi, finalNum   ; Load address of where to store 64-bit number
mov [esi+0], eax    ; Store low 32 bits
mov [esi+4], ebx    ; Store high 32 bits
另一种选择:

  finalNum:  qword  0

    ....

   mov  dword ptr finalNum, eax
   mov  dword ptr finalNum+4, ebx
另一种选择:

  finalNum:  qword  0

    ....

   mov  dword ptr finalNum, eax
   mov  dword ptr finalNum+4, ebx
另一种选择:

  finalNum:  qword  0

    ....

   mov  dword ptr finalNum, eax
   mov  dword ptr finalNum+4, ebx
另一种选择:

  finalNum:  qword  0

    ....

   mov  dword ptr finalNum, eax
   mov  dword ptr finalNum+4, ebx



它没有完全起作用,所以我添加了一个编辑,也许你可以签出我会写“movesi,offset finalNum”以便汇编器清楚地知道你想要的地址。使用movesi,offset finalNum时,我得到错误,错误:逗号、冒号或预期的行尾:(在此之后,您如何将其打印为一个数字?它不完全起作用,因此我添加了一个编辑,也许您可以签出我会写“movesi,offset finalNum”,以便汇编器清楚地知道您想要的地址。当使用movesi,offset finalNum时,我得到错误,错误:逗号、冒号或预期的行尾:(在此之后,您如何将其打印为一个数字?它不完全起作用,因此我添加了一个编辑,也许您可以签出我会写“movesi,offset finalNum”,以便汇编器清楚地知道您想要的地址。当使用movesi,offset finalNum时,我得到错误,错误:逗号、冒号或预期的行尾:(在此之后,您如何将其打印为一个数字?它不完全起作用,因此我添加了一个编辑,也许您可以签出我会写“movesi,offset finalNum”,以便汇编器清楚地知道您想要的地址。当使用movesi,offset finalNum时,我得到错误,错误:逗号、冒号或预期的行尾:(在“奇怪的打印”之后,您如何将其打印为单个数字可能有很多问题。请发布相关的错误消息,因为您提供的代码看起来是有效的。您是否看过NASM手册,或在线查看了NASM示例?您要打印的代码是什么
finalNum
?在过去8个多小时里,我在线查找了大量示例,试图修复它,但没有找到一个有效的示例针对我的情况,添加了代码来打印finalNumA“怪异打印”可能有很多问题。请发布相关的错误消息,因为您提供的代码看起来是有效的。您是否看过NASM手册,或在线查看了NASM示例?您要打印的代码是什么
finalNum
?在过去8个多小时里,我在线查找了大量示例,试图修复它,但没有找到一个有效的示例针对我的情况,添加了代码来打印finalNumA“怪异打印”可能有很多问题。请发布相关的错误消息,因为您提供的代码看起来是有效的。您是否看过NASM手册,或在线查看了NASM示例?您要打印的代码是什么
finalNum
?在过去8个多小时里,我在线查找了大量示例,试图修复它,但没有找到一个有效的示例针对我的情况,添加了代码来打印finalNumA“怪异打印”可能有很多问题。请发布相关的错误消息,因为您提供的代码看起来是有效的。您是否看过NASM手册,或在线查看了NASM示例?您要打印的代码是什么
finalNum
?在过去8个多小时里,我在线查找了大量示例,试图修复它,但没有找到一个有效的示例就我的情况来说。打印最终版本的附加代码qword是64位的,不是吗?是的,qword的意思是“64位值”.这正是你说的你想要的finalNum,那么就这样声明吧。@Alex:你在使用NASM。我习惯使用MASM;对于直接操作数,指令的语法可能不同。我可能只是增加了你的困惑,“偏移量”我在Nayuki的答案中指出,NASM可能是错误的。我在这里写的答案是针对MASM语法的,可能不适用于NASM。是的,但我在一个32位汇编程序中,只能使用双字SMAS32是一个32位汇编程序。它有声明QWORDS的方法。我不知道NASM。qword是64位的,不是吗?是的,qword的意思是“64位值”.这正是你说的你想要的finalNum,那么就这样声明吧。@Alex:你在使用NASM。我习惯使用MASM;对于直接操作数,指令的语法可能不同。我可能只是增加了你的困惑,“偏移量”我在Nayuki的答案中指出,NASM可能是错误的。我在这里写的答案是针对MASM语法的,可能不适用于NASM。是的,但我在一个32位汇编程序中,只能使用双字SMAS32是一个32位汇编程序。它有声明QWORDS的方法。我不知道NASM。qword是64位的,不是吗?是的,qword的意思是“64位值”.这正是你说的你想要的finalNum,那么就这么说吧。@Alex:你在使用NASM。我习惯于使用MASM;对于直接操作数,指令的语法可能不同。我可能只是增加了你的困惑;我在Nayuki的回答中提到的“偏移量”可能是错误的