В 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, но, похоже, перезаписывает каждый байт в памяти после этого, поэтому новые строки удаляются.

Мой вопрос заключается в том, как я могу записать один "байт" из регистра в ячейку памяти?

JasonY

Ответов: 1

Ответы (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

2022 WebDevInsider