시스템 호출에 어떤 레지스터가 필요한지 어떻게 알 수 있나요? 기계마다 다른가요? 그렇다면 왜 eax, ebx 등이 있습니까? 내 기계를 어떻게 찾을 수 있나요? 프로세서마다 다를까요? 즉, i586과 i386 사이에 차이가 있습니까?
_start: ; entry point for commands
; use the write syscall to print 'Hello world!' to stdout
mov eax, 4 ; move syscall 4(write) to the eax register
mov ebx, 1 ; move field descriptor for stdout to ebx
mov ecx, msg ; move the memory address of our string to ecx
mov edx, 13 ; move the length of the string to edx
int 0x80 ; execute the syscall
section .data
msg: db “Hello world!”, 0x0a ; the string, followed by a new line character
답변1
각 아키텍처는 기본적으로 "첫 번째 인수는 여기에, 두 번째 인수는 여기에, 세 번째 인수는 여기에 간다... .return 값은 여기에 반환됩니다"라고 말하는 "ABI"(Application Binary Interface)를 정의합니다. ABI 사양을 읽은 다음 함수 인수의 순서와 크기를 사용하여 어떤 레지스터에 들어갈지 결정합니다.
대상으로 삼으려는 플랫폼마다 다른 어셈블리를 생성해야 합니다. 그러나 모든 "Linux x86_64" 플랫폼은 바이너리 호환이 가능하며 x86, ARM, PowerPC 등에서도 마찬가지라는 점은 합리적으로 확신할 수 있습니다. 하지만 BSD도 있습니다 :-)
다음은 x86 및 x86_64에 대한 치트 시트입니다(빠른 Google 검색).
그러나 또한 주목해야 할 것은시스템 호출 번호 자체는 플랫폼마다 다릅니다., 따라서 "open"은 x86_64에서는 3이지만 x86에서는 5입니다.