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

问题描述 投票:0回答:2

我在here找到了类似的答案,但它仅适用于 32 位。我如何在 64 位处理器的 NASM 中做到这一点?

assembly nasm
2个回答
1
投票

您可以使用两个双字连续变量(一个接一个),分别为它们赋值,然后将这两个值作为一个四字获取。我在这个在线编译器中测试了下一个代码:

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



1
投票

.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

	
© www.soinside.com 2019 - 2024. All rights reserved.