私はインテルx64アセンブリ、NASMコンパイラを使用して、 "0x4000000000000000"定数をメモリに移動しようとしています(ieee 754標準のdoubleは2.0になります)。x86アセンブリ内のメモリに64ビット定数を移動する
私が使用しているコードは次のとおりです。署名DWORD即時の範囲を超える:
%define two 0x4000000000000000
section .text
foo:
push rbp
mov rbp, rsp
mov QWORD [rdi], two
pop rbp
ret
はこれをコンパイルする
警告がスローされます。
私がC++で値を印刷すると、 "2"ではなく "0"が表示されます。
は、私はすでに正しい値を得るための方法、見つけた:
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
これは推奨される方法ですが、登録を避けることを絶対に要求する場合は、もちろん2つの半分に格納することができます。 – Jester