Как переместить значение в регистре в переменную памяти в NASM? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь переместить соответствующее ЗНАЧЕНИЕ (не адрес памяти), содержащийся в регистре, в переменную памяти, но она не работает.

section .data
        regValue dq 0


section .text
        global main

main:
        push rbp
        mov rbp, rsp
        mov rax, 844
        mov rdi, 9393
        mov [regValue], [rdi]

Я получаю ошибку: ошибка: размер операции не указан

1 Ответ

0 голосов
/ 01 ноября 2018

Ну, для начала, значение из rdi на самом деле rdi, а не [rdi]. Последний, даже если предположить, что он действителен (я скорее человек gas, чем nasm человек), будет значением, хранящимся в памяти, на которое указывает rdi.

И, чтобы указать размеры операндов (где gas использует более краткие movl/movb/etc операции), вы указываете размер с операндами, например:

mov qword [regValue], 9393

Однако я не думаю, что это необходимо , когда вы используете 64-битный регистр, такой как rdi для источника, так как размер может быть выведен из этого. Я думаю, что вы можете просто сделать:

mov [regValue], rdi

Кстати, в NASM вы должны использовать default rel вверху файла, чтобы предпочитать режимы относительной RIP-адресации для статических данных (например, [regValue]) вместо 32-битного абсолютного.

...