汇编,将单个字节从寄存器写入内存会覆盖其他字节

标签 assembly x86 x86-64 nasm

在 64 位 x86 汇编 nasm 中,如何将单个字节从寄存器移动到 .data 节中定义的内存位置?

我知道这有效

global _main

section .data
quotient db 0x0, 0x0, 0x30, 0xa ; 3 digit + newline
remainder db 0x0, 0x0, 0x30, 0xa; 3 digit + newline

section .text

_main:
mov rax, 0x2000004
mov rdi, 1
mov rsi, quotient
mov rdx, 8
syscall ; outputs 0 /newline 0 /newline as expected

exit:
mov rax, 0x2000001
mov rdi, 0
syscall

我还知道您可以使用 byte 关键字设置单个字节

mov rbx, quotient ; move location of quotient into memory
mov [rbx], byte 0x31 ; change first byte to ascii '1'

这将按预期输出 1 0/newline 0/newline

但是假设我想将其设置为寄存器值

mov rbx, quotient ; move location of quotient into memory
mov r8, 0x31 ; set another register to ascii '1'
mov [rbx], r8 ; write the register value into memory

这确实输出 1,但似乎会覆盖此后内存中的每个字节,因此换行符会被删除。

我的问题是如何将寄存器中的单个“字节”写入内存位置?

最佳答案

64 位寄存器包含 8 个字节,因此通过以下方式将寄存器写入内存

mov [rbx], r8

将把 8 个字节移动到从 rbx 开始的内存位置

下表显示了如何将任意寄存器中的 1、2、4 字节写入内存

enter image description here

例如,从 r8 寄存器中写入一个字节(字节 0)将是

mov [rbx], r8b

rax 中的一个字节是

mov [rbx], al

引用:http://cs.brown.edu/courses/cs033/docs/guides/x64_cheatsheet.pdf

关于汇编,将单个字节从寄存器写入内存会覆盖其他字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65527348/

相关文章:

assembly - LEA 指令的替代语法

程序集/gdb : add behavior

linux - rbp/ebp(x86-64) 寄存器是否仍按常规方式使用?

c - 在没有原型(prototype)的文件中调用的函数在ARM和x86-64上产生不同的结果

c - 函数指针编译错误

c - 通过内联汇编操作 c 变量

assembly - x86_64 - 为什么用 rdtsc/rdtscp 给一个程序计时会给出不合理的大数字?

assembly - 左移操作期间使用的寄存器

assembly - 如何在宏中指定寄存器大小(b/w/d)

c++ - SSE FPU 并行