NASM 从内存移动到寄存器并返回未按预期执行

NASM moving from memory to register and back not performing as expected

我是装配新手。简而言之,我不知道我在做什么,也不知道为什么这个东西会这样反应。我正在使用 nasm,但是我不允许使用任何 c 函数。这具有针对英特尔 x86 64 位的联合编译和 运行 使用 nasm 程序集。这是一些代码:

    section .data

    x: dd 0

section .text
    global _start

_start:
    mov eax,0
    mov edi,0
    mov rsi,x
    mov edx,1
    syscall

    mov r9,x ;My problem was here, should be mov r9,[x]
    mov word [x],r9w 

    mov eax,1
    mov edi,1
    mov rsi,x
    mov edx,1
    syscall

    mov eax,1            ; The system call for exit (sys_exit)
    mov ebx,0            ; Exit with return code of 0 (no error)
    int 80h;

所以我在这里所做的就是从控制台读取输入,并将其保存在 x 中。然后将其移至寄存器 r9,然后返回 x。

input 5

.

output 

我试过执行正常的异或运算和 mov r9,0。我可以看到,如果我加 200,它确实有一个值 ass,它给我的输出是

U

我这样做的唯一目标是尝试更深入地了解它的工作原理。 谢谢。

I am trying to store the value within x in x

那么您是要加载 x 的值然后将其原封不动地存储回去吗?

IDK 如果您了解 "x's value" 存储在标有标签 x.

的内存地址中的内容

无论如何,还要注意您在地址 x 处保留了 4 个字节(使用 dd)。您将该地址传递给 sys_read(0, x, 1) 以使内核存储来自标准输入的最多 1 个字节的输入。

然后你把x的地址和mov r9, x一起放到R9中。 (我想你打算做 mov rsi, [x],这将是一个 8 字节的负载。)

然后用`mov [x], r9w

将R9的低16位存入x

然后你把x的地址传给sys_write,写一个字节到stdout。

所以我知道你希望在这里完成什么,但这也许有助于解释你的代码实际做了什么。

要了解更多信息,在调试器(如 gdb)中单步执行并观察寄存器值的变化。请参阅 标签 wiki 底部的 gdb 使用说明。