如何将两个双字移动到一个qword中?

时间:2016-11-22 18:12:40

标签: assembly nasm

我找到了类似的anwser here,但它仅适用于32位。我怎么能在64位处理器的NASM中做到这一点?

2 个答案:

答案 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