시스템 호출에 어떤 레지스터가 사용되는지 확인하는 방법은 무엇입니까? [폐쇄]

시스템 호출에 어떤 레지스터가 사용되는지 확인하는 방법은 무엇입니까? [폐쇄]

시스템 호출에 어떤 레지스터가 필요한지 어떻게 알 수 있나요? 기계마다 다른가요? 그렇다면 왜 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 사양을 읽은 다음 함수 인수의 순서와 크기를 사용하여 어떤 레지스터에 들어갈지 결정합니다.

바라보다https://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux-system-calls-on-x86-64

대상으로 삼으려는 플랫폼마다 다른 어셈블리를 생성해야 합니다. 그러나 모든 "Linux x86_64" 플랫폼은 바이너리 호환이 가능하며 x86, ARM, PowerPC 등에서도 마찬가지라는 점은 합리적으로 확신할 수 있습니다. 하지만 BSD도 있습니다 :-)

다음은 x86 및 x86_64에 대한 치트 시트입니다(빠른 Google 검색).

그러나 또한 주목해야 할 것은시스템 호출 번호 자체는 플랫폼마다 다릅니다., 따라서 "open"은 x86_64에서는 3이지만 x86에서는 5입니다.

관련 정보