NASM从内存移动到注册并返回不按预期执行

时间:2016-09-05 15:19:28

标签: assembly nasm

我是装配新手。简而言之,我不知道我在做什么以及为什么事情以它的方式做出反应。我正在使用nasm,但我不允许使用任何c函数。这是使用nasm程序集为intel x86 64bit编译和运行的。这是一些代码:

    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 r9,0。我可以看到,如果我添加200,它确实有一个值屁股,它给我输出

U

我这样做的唯一目标是尝试深入了解其工作原理。 感谢名单。

1 个答案:

答案 0 :(得分:0)

  

我正在尝试将值存储在x中的x

您是否正在尝试加载x的值,然后将其重新保存为未经修改?

IDK,如果您了解" x的价值" 存储在标有x标记的内存地址的内容。

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

然后您将x的地址放入R9 mov r9, x。 (我认为你打算做mov rsi, [x],这将是一个8字节的负载。)

然后使用`mov [x],r9w

将低16位的R9存储到x中

然后将x的地址传递给sys_write,将一个字节写入stdout。

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

要了解更多信息,调试器中的单步(如gdb)并监视寄存器值的更改。请参阅标记wiki底部的gdb使用说明。