그래서 JIT x86 기계 코드를 생성하고 직접 실행하는 프로그램이 있는데 x86-64/AMD64/x64도 지원하고 싶습니다. 명백한 차이점은 다음과 같습니다x86과 x86-64 기계 코드의 차이점
- 새로운 레지스터 (
rax
,r8
...) 및 포인터 폭 - 기본 C 호출 규칙 (레지스터 대 스택에 인수)
- (포인터는 64 비트 REGS를 사용해야합니다) 일부 새로운 연상 기호는
뿐만 아니라 바이너리 명령어의 차이가하거나 적절한 경우와 C pushq
및 64 비트 레지스터를 사용하는 (대략) 충분해야합니다 (pushq
는 64 비트를 밀어) 오드가 효과가 있을까요?
코드 예제 :
static inline void emit_call(uint32_t target) {
emit_byte(0xE8);
emit_dword(target - ((uint32_t)out + 4));
}
이 아직도 내가 uintptr_t
를 사용하는 경우, 내가 생각하는 대신 uint32_t
의 작동하지만 rax
가 낮은 32 비트 별칭에로드 다른 64 비트 레지스터로 즉시로드 것 :
static void emit_mov_x86reg_immediate(int x86reg, int imm) {
emit_byte(0xB8 | x86reg);
emit_dword(imm);
}
다른 점이 있습니까?
코드를보고 싶다면 here에 액세스 할 수 있습니다.
꽤 많은 차이가 있습니다. 일부는 내 (폐쇄) 질문에 나열되어 있습니다 http://stackoverflow.com/questions/11897116/how-to-convert-linux-32-bit-gcc-inline-assembly-to-64bit-code. – nrz
'push'는 여전히 오래된 명령어이고 새로운 니모닉이 없으며 새로운 AT & T 접미사 만 사용되거나 접미사가 필요없는 Intel 구문을 사용합니다 –