我在here找到了类似的答案,但它仅适用于 32 位。我如何在 64 位处理器的 NASM 中做到这一点?
您可以使用两个双字连续变量(一个接一个),分别为它们赋值,然后将这两个值作为一个四字获取。我在这个在线编译器中测试了下一个代码:
section .data
dw1 : dd 0 ;◄■■ FIRST DOUBLE-WORD.
dw2 : dd 0 ;◄■■ SECOND DOUBLE-WORD.
section .text
global _start
_start:
mov dword [dw2], 12345678h ;◄■■ ONE DOUBLE-WORD.
mov dword [dw1], 90ABCDEFh ;◄■■ ANOTHER DOUBLE-WORD.
mov rax, [dw1] ;◄■■ GET ONE QUAD-WORD (1234567890ABCDEFh).
注意 second 双字 (
dw2
) 如何获取 higher 值,first 双字 (dw1
) 获取 lower 值。另请注意四字是如何从第一个变量中提取的,但由于 rax
的大小而到达第二个变量。之前的代码没有显示任何内容来了解
RAX
中发生了什么,所以这是我的原始代码:它将值从
RAX
移动到字符串中,然后显示字符串(垃圾字符):section .data
str1 : db '12345678',10
len : equ $-str1
dw1 : dd 0
dw2 : dd 0
section .text
global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, str1
mov edx, len
int 80h ;◄■■ DISPLAY STRING = "12345678".
mov rax, 01234567890ABCDEFh ;◄■■ MOVE ONE QUAD-WORD DIRECTLY.
mov [str1], rax
mov eax, 4
mov ebx, 1
mov ecx, str1
mov edx, len
int 80h ;◄■■ DISPLAY STRING = "�ͫ�xV4"
mov dword [dw2], 12345678h ;◄■■ MOVE ONE DOUBLE-WORD.
mov dword [dw1], 90ABCDEFh ;◄■■ MOVE ANOTHER DOUBLE-WORD.
mov rax, [dw1]
mov [str1], rax
mov eax, 4
mov ebx, 1
mov ecx, str1
mov edx, len
int 80h ;◄■■ DISPLAY STRING = "�ͫ�xV4" AGAIN!!!
mov eax,1
mov ebx,0
int 80h
编辑:上一个是“int 80h”版本,下一个是“系统调用版本”(感谢@MichaelPetch告诉我必须使用哪些寄存器),也在相同的在线编译器中进行了测试:
section .data
str1 : db '12345678',10
len : equ $-str1
dw1 : dd 0
dw2 : dd 0
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, str1
mov rdx, len
syscall ;◄■■ DISPLAY STRING = "12345678".
mov rax, 01234567890ABCDEFh ;◄■■ MOVE ONE QUAD-WORD DIRECTLY.
mov [str1], rax
mov rax, 1
mov rdi, 1
mov rsi, str1
mov rdx, len
syscall ;◄■■ DISPLAY STRING = "�ͫ�xV4"
mov dword [dw2], 12345678h ;◄■■ MOVE ONE DOUBLE-WORD.
mov dword [dw1], 90ABCDEFh ;◄■■ MOVE ANOTHER DOUBLE-WORD.
mov rax, [dw1]
mov [str1], rax
mov rax, 1
mov rdi, 1
mov rsi, str1
mov rdx, len
syscall ;◄■■ DISPLAY STRING = "�ͫ�xV4" AGAIN!!!
mov rax,60
mov rdi,0
syscall
.data
myqwrd dd 089abcdefh, 001234567h ;0123456789abcdef low first
; ...
.code
mov rax, qword ptr myqwrd
; or for immediate store
mov qword ptr myqwrd, 0fedcba9876543210h
; or from ebx (low), ecx (high)
mov edx,ecx
shl rdx,32
mov eax,ebx
or rax,rdx