我找到了类似的anwser here,但它仅适用于32位。我怎么能在64位处理器的NASM中做到这一点?
答案 0 :(得分:1)
假设这是X86,只需先输入低位双字,然后再输入高位双字。我不确定nasm,但是对于masm:
.data
myqwrd dd 089abcdefh, 001234567h ;0123456789abcdef low first
; ...
.code
mov eax, 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
答案 1 :(得分:1)
您可以使用两个双字连续变量(一个接一个),分别为它们分配值,然后将这两个值作为一个四字组。我在这个online compiler中测试了下一个代码:
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).
注意第二个双字(dw2
)如何获得更高值,以及第一个双字( dw1
)获取较低值。另请注意四字词如何从第一个变量中提取,但由于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告诉我我必须使用哪些寄存器),也在同一online compiler中进行了测试:
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