我是装配新手。简而言之,我不知道我在做什么以及为什么事情以它的方式做出反应。我正在使用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
我这样做的唯一目标是尝试深入了解其工作原理。 感谢名单。
答案 0 :(得分:0)
我正在尝试将值存储在x中的x
中
您是否正在尝试加载x的值,然后将其重新保存为未经修改?
IDK,如果您了解" x的价值" 是存储在标有x
标记的内存地址的内容。
无论如何,还要注意您已在地址x
(dd
)保留了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)并监视寄存器值的更改。请参阅x86标记wiki底部的gdb使用说明。