【问题标题】:Move multiple registers into a single variable将多个寄存器移动到一个变量中
【发布时间】:2015-07-23 23:39:00
【问题描述】:

我有一个存储在 eax 中的 32 位数字和一个存储在 ebx 中的 32 位数字。我想将它们组合成一个在 .bss 部分中定义为 finalNum 的 64 位数字,但我不确定如何。我试过了

mov esi, finalNum
mov [esi], eax
add esi, 32
mov [esi], ebx

但是由于某种原因,当我尝试打印出 finalNum 时,它没有正确打印出来,所以我认为这 4 行有问题。这也是 32 位 nasm。

编辑:

所以我尝试了

    mov esi, finalNum
    mov [esi+0], eax
    mov [esi+4], ebx

但是,仍然想出一些奇怪的打印,我将 finalNum 声明为

    finalNum:   resb 8

你认为这可能是个问题吗?

编辑:

    Enter first number to multiply:
    34567
    Enter second number to multiply:
    76543
    First Num: 34567
    Second Num: 76543
    Addition: 111110
    Multiply:
    ▒EAX : 0
    EBX : -1649105415

正如你所见,当我乘以打印出来时,我得到了一个奇怪的字符。

编辑: 打印结果的代码

    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

【问题讨论】:

  • 一个“奇怪的印刷品”可以是很多东西。请发布相关错误消息,因为您提供的代码看起来有效。
  • 您看过 NASM 手册,还是在线查看 NASM 示例?
  • 你的打印代码是什么finalNum
  • 过去 8 多小时,我在网上查找了大量示例,试图修复它,但找不到适合我情况的示例。
  • 添加了打印 finalNum 的代码

标签: assembly x86 nasm 32-bit


【解决方案1】:

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

【讨论】:

  • 它没有完全工作,所以我添加了一个编辑也许你可以检查一下
  • 我会写“mov esi,offset finalNum”,以便汇编器清楚你想要的地址。
  • 当使用 mov esi, offset finalNum 我得到错误,错误:逗号,冒号或行尾预期:(
  • 在此之后如何将其打印为单个数字
【解决方案2】:

另一种选择:

  finalNum:  qword  0

    ....

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

【讨论】:

  • qword 不是 64 位的吗?
  • 是的,qword 表示“64位值”。这正是你所说的你想要的 finalNum,所以这样声明。
  • @Alex:你正在使用 NASM。我习惯使用 MASM;对于立即操作数,指令的语法可能不同。我可能只是增加了您的困惑;我在 Nayuki 的回答中提到的“偏移”对于 NASM 可能是错误的。我在这里写的答案是针对 MASM 语法的,可能不适用于 NASM。
  • 是的,但我是 32 位汇编器,只能使用双字
  • MASM32 是一个 32 位汇编器。它有声明 QWORDS 的方法。我不知道 NASM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2019-08-14
  • 2017-01-25
  • 2011-06-29
相关资源
最近更新 更多