将 64 位常量移动到 x86 程序集中的内存
Moving 64-bit constant to memory in x86 Assembly
我正在使用 Intel x64 程序集,NASM 编译器,试图将“0x4000000000000000”常量移动到内存中,在 ieee 754 标准双精度中应该等于 2.0。
我使用的代码是:
%define two 0x4000000000000000
section .text
foo:
push rbp
mov rbp, rsp
mov QWORD [rdi], two
pop rbp
ret
编译抛出
warning: signed dword immediate exceeds bounds.
当我在 C++ 中打印值时,它显示“0”而不是“2”。
我已经找到了获取正确值的方法,即:
mov r9, 0x4000000000000000
mov [rdi], r9
但是我想知道是否有一种方法可以在不使用寄存器的情况下实现这一点。
顺便说一句,我正在用这个脚本编译代码:
#!/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
没有说明
mov r/m64, imm64
你可以使用
mov dword [rdi], 0
mov dword [rdi+4], 0x40000000
或
and qword [rdi], 0
mov byte [rdi+7], 0x40
只有 8 个字节(如果重要的话)。
我正在使用 Intel x64 程序集,NASM 编译器,试图将“0x4000000000000000”常量移动到内存中,在 ieee 754 标准双精度中应该等于 2.0。
我使用的代码是:
%define two 0x4000000000000000
section .text
foo:
push rbp
mov rbp, rsp
mov QWORD [rdi], two
pop rbp
ret
编译抛出
warning: signed dword immediate exceeds bounds.
当我在 C++ 中打印值时,它显示“0”而不是“2”。
我已经找到了获取正确值的方法,即:
mov r9, 0x4000000000000000
mov [rdi], r9
但是我想知道是否有一种方法可以在不使用寄存器的情况下实现这一点。
顺便说一句,我正在用这个脚本编译代码:
#!/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
没有说明
mov r/m64, imm64
你可以使用
mov dword [rdi], 0
mov dword [rdi+4], 0x40000000
或
and qword [rdi], 0
mov byte [rdi+7], 0x40
只有 8 个字节(如果重要的话)。