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

Assembly NASM从内存移动到寄存器并返回,未按预期执行,assembly,nasm,x86,Assembly,Nasm,X86,我不熟悉集会。简言之,我不知道我在做什么,也不知道为什么事情会有这样的反应。我正在使用nasm,但是我不允许使用任何c函数。这是使用nasm assembly for intel x86 64位共同编译和运行的。下面是一些代码: section .data x: dd 0 section .text global _start _start: mov eax,0 mov edi,0 mov rsi,x mov edx,1 sy

我不熟悉集会。简言之,我不知道我在做什么,也不知道为什么事情会有这样的反应。我正在使用nasm,但是我不允许使用任何c函数。这是使用nasm assembly for intel x86 64位共同编译和运行的。下面是一些代码:

    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

我试着做普通的异或运算,还有mov r9,0。我可以看到它确实有一个值,如果我加200,它会给我一个

U
我做这件事的唯一目标是试图对它的工作原理有更深入的了解。 塔克斯


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

所以你试图加载x的值,然后不加修改地重新存储

IDK,如果您知道x的值是存储在带有标签x的内存地址中的值

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

然后用mov R9,x把x的地址放入R9。我想你是想做movrsi,[x],这将是一个8字节的加载

然后用'mov[x],r9w将R9的低16位存储到x中

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

因此,请确定您希望在这里实现什么,但这可能有助于解释您的代码实际执行的功能


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

在调试器中单步执行代码。这将对你的理解有很大帮助。您正在将x地址的低16位存储到x中。IDK为什么这样做。我正在尝试将值存储在x中的x中。除了理解,没有其他理由。在做作业时,我偶然发现我的输出有不规则之处。我把它归结为一个问题,我在寄存器和内存之间来回移动。这是什么操作系统?当然不是Linux;否则你将字节读入空地址。他没有将字节读入空地址。mov rsi,x将x的地址移动到rsi,mov edi,0将FD设置为STDIN,mov edx,1表示读取1字节。EAX=0为系统读取。真正的问题是mov r9,x应该是mov r9w,[x]。方括号是必要的,因为我们想移动地址x上的内容,而不是地址本身。是的,这就是我的意思,谢谢。我并没有试图用我的代码完成任何事情,而是理解我在做什么。问题在于何时使用[]。我的目标是在我的代码中挑出我的问题,并将其发布在这里,而不是我的整个作业。我认为他的问题的标题比问题本身的措辞更好。我认为他的目标一直都在从记忆转移到注册和注册back@Elterado:你一般不应该把答案编辑成你的问题。一旦你理解了问题所在,你可以经常回头改进问题,使之更加清晰,但答案仍然属于答案。这个问题读起来还是一团混乱。IDK输入5代码块应该是什么,我花了几分钟的时间看了看你的问题,才明白它到底说了什么。顺便说一句,您可以使用反勾号在句子中获得行内代码格式。
U