x86_64 아키텍처에서는 동일한 효과를 얻기 위해 더 짧은 실행 파일을 사용하는 일부 명령어 - 피연산자 조합을 변경할 수 있지만 실행 파일은 더 작습니다.어셈블 된 실행 파일 크기가 같은 이유
xor eax, eax
대신 :
xor rax, rax
나는 그것을 테스트하고 싶었 어셈블리에 간단한 프로그램을 작성 : 내장
segment .text
global main
main:
push rbp
mov rbp, rsp
xor rax, rax ; line in question
leave
ret
: 예를 들어 , 쓰는 것이 일반적이다
yasm -f elf64 -m amd64 -g dwarf2 main.asm; clang -o main main.o
크기 :
....
Size: 9184
...
확인에 문제의 라인을 변경 :
stat main
이있어 작은 실행 파일을 얻을 수 있었으면
xor eax, eax
하지만, 크기가 같은 9184 바이트를 얻었다. 짧은 명령어 형식을 사용하면 왜 크기가 줄어들지 않았습니까?
다음 기능 전에 16B 경계로 채우기. 디스어셈블러 출력을보십시오. –
내가 GDB에서'disassemble'했다'0x400re0 <+0> 가지고 : 푸시 %의 rbp' 을'=> 0x4004e4 <+4> %의 RAX %의 rax', 그것은'의 XOR EAX 16 바이트 경계에서도 경우에없는 XOR, EAX '. –
_ "16 바이트 경계가 아닙니다"_ 그 명령이 중요하게 시작되는 곳이 아닙니다. 명령이있는 섹션은 X 바이트의 배수로 패딩 될 수 있습니다. 그러나 @PeterCordes와 마찬가지로 이미 디스어셈블러를 사용하여 원하는 명령어의 생성 된 기계 코드 바이트를 살펴보십시오. – Michael