【问题标题】:How to properly write an array of bytes in Assembly?如何在 Assembly 中正确写入字节数组?
【发布时间】:2014-12-14 20:27:30
【问题描述】:

我需要写一个字节数组但我不明白,只写了[matrix + 0][matrix + 1](我的意思是,EAX 应该等于0301070F),我做错了什么?

这是我的代码:

%include "asm_io.inc"
segment .data
    matrix times 4 db 0

segment .bss

segment .text

  global asm_main

asm_main:
    enter 0,0
    pusha
    mov eax, 0

    mov dword [matrix + 3], 15
    mov dword [matrix], 3
    mov dword [matrix + 1], 1
    mov dword [matrix + 2], 7

    mov ah, [matrix]
    mov al, [matrix + 1]
    rol eax, 16
    mov ah, [matrix + 2]
    mov al, [matrix + 3]

    dump_regs 1

  popa
  mov eax, 0
  leave
  ret

这是dump_regs 1的输出:

Register Dump # 1
EAX = 03010000 EBX = B774FFF4 ECX = BFF7C924 EDX = BFF7C8B4
ESI = 00000000 EDI = 00000000 EBP = BFF7C868 ESP = BFF7C848
EIP = 080484D8 FLAGS = 0282       SF   

调用者是一个简单的C程序:

int main() {
  int ret_status;
  ret_status = asm_main();
  return ret_status;
}

编辑: 我在这里发现了问题,如果我执行此代码,一切正常:

    mov dword [matrix], 3
    mov dword [matrix + 1], 1
    mov dword [matrix + 2], 7
    mov dword [matrix + 3], 15

但如果我执行此操作,则不起作用:

    mov dword [matrix + 3], 15
    mov dword [matrix], 3
    mov dword [matrix + 1], 1
    mov dword [matrix + 2], 7

为什么?

【问题讨论】:

  • 为什么matrix 是一个字节?您打算在matrix 地址之外的数据段中寻址什么?为什么不matrix times 8 db 0
  • 嗯,matrix times 8 db 0 是什么?
  • matrix db 0,0,0,0,0,0,0,0一样,是创建times n长度标签的便捷方式。
  • 哦,很好,抱歉我不知道。但我有同样的问题,EAX = 03010000 应该是EAX = 0301070F
  • 嗯。让我处理它,我会回信。我会追踪 pcasm asm_io.inc 并在gdb 中运行它,看看发生了什么。

标签: c arrays assembly nasm


【解决方案1】:

已经有一段时间了,但不应该

  mov dword [matrix], 3

更像是

  mov byte [matrix], 3

要避免常量3 被视为 32 位值?

【讨论】:

    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多