如何在汇编中正确编写字节数组?

3

我需要写入一个字节数组,但我不太理解,只有 [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 呢? - David C. Rankin
嗯,matrix times 8 db 0是什么? - user3697569
嗯,让我处理一下,然后再留个便条。我会找到pcasm asm_io.inc文件并在gdb中运行它,看看发生了什么。 - David C. Rankin
嘿,@FrerichRaabe,你删掉了有用的答案!谢谢,它起作用了!你能再回答这个问题吗?对其他人可能有用。 - user3697569
@DiggaDiggaMigga 已完成,但我认为如果有人能弄清楚为什么使用 byte 而不是 dword 会有帮助的话就更好了(也许可以用一些 ASCII 艺术来展示内存中正在发生的事情)。我删除了我的答案,并将其重新发布为评论,因为它更像是一个“有根据的猜测”。 - Frerich Raabe
显示剩余5条评论
1个回答

3

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

  mov dword [matrix], 3

更希望成为类似于

  mov byte [matrix], 3

为了避免常量3被视为32位值,应该怎么做?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接