Mar*_*ura 4 64-bit x86 assembly x86-64 nasm
我正在使用Intel x64汇编,NASM编译器,尝试将"0x4000000000000000"常量移动到内存,在ieee 754标准double中应该等于2.0.
我正在使用的代码是:
%define two 0x4000000000000000
section .text
foo:
push rbp
mov rbp, rsp
mov QWORD [rdi], two
pop rbp
ret
Run Code Online (Sandbox Code Playgroud)
编译此抛出
警告:签名dword立即超出界限.
当我用C++打印值时,它显示"0"而不是"2".
我已经找到了获得正确价值的方法,即:
mov r9, 0x4000000000000000
mov [rdi], r9
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有办法在不使用寄存器的情况下实现这一目标.
顺便说一句,我用这个脚本编译代码:
#!/bin/bash
nasm -f elf64 -g -F dwarf vvp_asm.asm -o vvp_asm.o
g++ -c -m64 -std=c++11 main.cpp -o main.o
g++ -o main -m64 vvp_asm.o main.o
Run Code Online (Sandbox Code Playgroud)
没有指示
mov r/m64, imm64
Run Code Online (Sandbox Code Playgroud)
你可以用
mov dword [rdi], 0
mov dword [rdi+4], 0x40000000
Run Code Online (Sandbox Code Playgroud)
要么
and qword [rdi], 0
mov byte [rdi+7], 0x40
Run Code Online (Sandbox Code Playgroud)
这只有8个字节(如果重要的话).