【问题标题】:x86 Asm copy value from registerx86 Asm 从寄存器复制值
【发布时间】:2022-01-13 01:43:25
【问题描述】:

我有这样的代码:

mov eax, 0
mov [left], eax
mov eax, [len]
dec eax
mov [right], eax

我需要在left 中获得0,在right 中获得len - 1。但不知何故,left 得到 0 并且在 line 之后也得到 len - 1。我尝试为right 使用另一个寄存器,但结果相同。

mov eax, 0
mov [left], eax
mov ebx, [len]
dec ebx
mov [right], ebx

所以,它给出了相同的结果。

完整代码:

section .data
    len dd 10
section .bss
    left  resd 0
    right resd 0
section .text
    global main
push rbp
mov rbp, rsp
    mov eax, 0
    mov [left], eax
    mov eax, [len]
    dec eax
    mov [right], eax

在这一行我已经遇到了问题

【问题讨论】:

  • len, left, right 是如何定义的?它们是双字(每个 32 位 / 4 字节)吗?这种令人困惑的行为通常是由于指令大小不匹配造成的。
  • @NateEldredge 是的,是 dd
  • 好的,那么请minimal reproducible example。您发布的代码看起来不错,所以问题一定出在程序的其他地方。另请说明您如何检查结果(打印语句、调试器等),因为该过程可能存在问题。
  • @NateEldredge 在 gdb 中检查它
  • @NateEldredge 忘记了,修复

标签: assembly x86-64 nasm


【解决方案1】:

来自 NASM 手册:

RESB、RESW、RESD、RESQ、REST、RESO、RESY 和 RESZ 设计用于模块的 BSS 部分:它们声明未初始化的存储空间。每个都接受一个操作数,即字节数、字数、双字数或要保留的任何内容。

所以你的

    left  resd 0
    right resd 0

leftright 保留0 个双字,即完全没有内存。因此,它们最终会出现在同一个地址,您会发现写一个地址似乎也写另一个地址。

你可能想要left resd 1

您可能一直认为 0 作为初始化值,例如 dd,但 resd 的全部意义在于您无法指定初始值;在.bss 部分,它自动归零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多