当我尝试用循环写入地址 1 字节时,它会破坏变量 asm

问题描述 投票:0回答:1

我试图在 NASM 中做一个循环,它简单地写入一个变量 1 然后再做一次,但是在变量上增加 1 个字节...我想出了这个设计

    mov ebx, 0
    mov rax, 1
    test_loop:
    cmp ebx, 4
    je test_loop_end
    mov [numbet_to_text + ebx], al
    inc ebx
    jmp test_loop
    test_loop_end:

但是当我用这个检查它时,它不会调用:

    mov ebx, [numbet_to_text]
    cmp ebx, 1111
    je teste

检查 gdb 发现当我在写入其中一个字节后写入一个字节时它被损坏了所以......
写入字节 0 ---> 1 ok,但是当我写入 byte up 时我会得到 字节 0----> 随机值.. 和字节 1 ----> 1

一些 GDB 截图来更好地解释我自己: 打印 1 打印 2

正如你在打印件上看到的那样,当我写入 0x40201b 时,我得到一个 1...没关系...但是当我写一个字节时,我会得到 0x40201c 1...好的,但在这种情况下 0x40201b 会得到一个随机值257 我不明白为什么

assembly x86-64 nasm
1个回答
1
投票
mov ebx, [numbet_to_text]
cmp ebx, 1111
je teste

numbet_to_text 处的内存中写入 4 个连续的 bytes 后,您可以预期的值为 0x01010101。当然不是十进制数 1111.

0x40201B contains byte 0x01
0x40201C contains byte 0x01
0x40201D contains byte 0x01
0x40201E contains byte 0x01

第一次写入 0x40201B 后显示 0x00000001 (1)
第二次写入 0x40201B 后显示 0x00000101 (257)
第三次写入 0x40201B 后显示 0x00010101 (65793)
第 4 次写入 0x40201B 后显示 0x01010101


mov rax, 1
mov [numbet_to_text + ebx], al

如果这有可能是 64 位代码,那么最好写:

mov [numbet_to_text + rbx], al
© www.soinside.com 2019 - 2024. All rights reserved.