2017-09-24 1 views
3

Intel 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 
+1

추천되는 방법이지만, 당신이 절대적으로 레지스터 피하기를 주장한다면, 당신은 물론 두 반쪽으로 저장할 수 있습니다. – Jester

답변

7

어떤 명령

mov r/m64, imm64 

당신은

mov dword [rdi], 0 
    mov dword [rdi+4], 0x40000000 

또는

and qword [rdi], 0 
    mov byte [rdi+7], 0x40 
를 사용할 수 없다3210

은 8 바이트입니다 (문제가있는 경우).

+0

작동! 고맙습니다! –

+0

마지막 버전에서 'byte'크기 지정자를 사용하지 않았습니다. code-size를 최적화하려면'and r/m64, imm8'을 사용할 수 있지만 성능면에서는 좋을 것입니다. 'mov qword [rdi], 0' /'mov byte [rdi + 7], 0x40'에 단지 몇 바이트 만 있습니다. (이것은 첫 번째 옵션보다 작지만 거의 같은 속도입니다. –

+0

'mov r64, imm64' /'mov r/m64, r64'과 달리, 다중 부분 옵션은 64 비트로드를 즉시 수행하면 상점 포기가 발생합니다. 10 바이트의 imm64 대신'mov eax, 1','shl rax, 40','xor eax, eax' /'bts rax, 40 '등의 작업을하는 것이 더 효율적이라고 생각할 수 있습니다. 코드 크기가 거의 절약되지 않습니다. –

관련 문제