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



我是汇编新手。简而言之,我不知道我在做什么,也不知道为什么这个东西会这样反应。我正在使用nasm,但是我不允许使用任何c函数。它使用intel 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 

我试着做正常的xor和mov。我可以看到它确实得到了一个值如果我加上200,它给我的输出是

U

我这样做的唯一目标是试图更深入地了解它是如何工作的。谢谢。

我试图将x中的值存储在x

所以你试图加载x的值,然后不加修改地将其存储回来?

IDK,如果你理解"x的值" 存储在标记为x的内存地址中。


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

然后用mov r9, xx的地址放入R9。(我想你的意思是做mov rsi, [x],这将是一个8字节的加载。)

然后使用' mov [x], r9w

将R9的低16位存储到x中

然后将x的地址传递给sys_write,将一个字节写入标准输出。

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

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

最新更新