저에게 문제가되는 질문이 하나 있습니다.왜 어셈블리 x86_64 syscall 매개 변수가 i386과 같은 알파벳 순서가 아닙니다.
그래서 ... x86_32 내 기분이 레지스터에 전달되는 매개 변수에 에있는 알파벳 (eax
, ecx
, edx
, esi
) 및 이 위해 위 왜 (esi
, edi
을 ebp
)
+---------+------+------+------+------+------+------+
| syscall | arg0 | arg1 | arg2 | arg3 | arg4 | arg5 |
+---------+------+------+------+------+------+------+
| %eax | %ebx | %ecx | %edx | %esi | %edi | %ebp |
+---------+------+------+------+------+------+------+
section .text
global _start
_start:
mov eax, 1 ; x86_64 opcode for sys_exit
mov ebx, 0 ; first argument
int 0x80
동안 x86_64에 에서 콜의 매개 변수를 통과하다 그들은 특정 이유로 그렇게
+---------+------+------+------+------+------+------+
| syscall | arg0 | arg1 | arg2 | arg3 | arg4 | arg5 |
+---------+------+------+------+------+------+------+
| %rax | %rdi | %rsi | %rdx | %r10 | %r8 | %r9 |
+---------+------+------+------+------+------+------+
section .text
global _start
_start:
mov eax, 1 ; x86_64 opcode for sys_exit
mov edi, 0 ; first argument
syscall
이나요 : 조금 보이는 레지스터 에드 무작위 배열 ? 내가 여기서 뭔가 못 보는거야?
x86-64에서는 syscall 래퍼 함수가 경량이므로 함수 호출 규약과 일치합니다. i386에서는 IDK가 불편한 설정을 사용하는 이유는 무엇입니까 ('ebx'는 호출 보존이므로 거의 모든 syscall 래퍼가 ebx를 저장/복원해야합니다). –
@PeterCordes 그리고 함수 호출 규칙은 다음과 같은 경우에 레지스터 셔플의 양을 줄 이도록 설계되었습니다. 'memcpy'를'rep movsb'와 함께 구현합니다. – fuz
함수 호출 규칙? 어쩌면 나는 신참처럼 들릴지도 모르겠다. 어쩌면 나는 ...이기는하지만 함수 호출 규칙은 무엇일까요? 그게 어셈블리 일인가요? –