我是汇编新手。简而言之,我不知道我在做什么,也不知道为什么这个东西会这样反应。我正在使用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, x
将x
的地址放入R9。(我想你的意思是做mov rsi, [x]
,这将是一个8字节的加载。)
然后使用' mov [x], r9w
将R9的低16位存储到x中然后将x
的地址传递给sys_write,将一个字节写入标准输出。
所以IDK你希望在这里完成什么,但也许这有助于解释你的代码实际上是做什么的。
要了解更多信息,请在调试器(如gdb)中执行单步操作,并观察寄存器值的变化。请参阅x86标记wiki底部的gdb使用说明。