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)中单步执行并观察寄存器值的变化。请参阅 x86 标签 wiki 底部的 gdb 使用说明。
我是装配新手。简而言之,我不知道我在做什么,也不知道为什么这个东西会这样反应。我正在使用 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)中单步执行并观察寄存器值的变化。请参阅 x86 标签 wiki 底部的 gdb 使用说明。