本文介绍了程序集,将单个字节从寄存器写入内存会覆盖其他字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在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/换行符0/换行符

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

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字节从任何寄存器写入内存

例如,将一个字节(字节0)写出R8寄存器将是

mov [rbx], r8b

rax中的一个字节将是

mov [rbx], al

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

这篇关于程序集,将单个字节从寄存器写入内存会覆盖其他字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 10:25