2010-08-04 2 views
1

OpenSolaris syscall 호출 규칙 (x86)이란 무엇입니까?OpenSolaris syscall 호출 규칙 (x86)이란 무엇입니까?

F.e. 콘솔에 문자열을 표시하는 32 비트 어셈블리에서 프로그램을 작성하고 싶습니다. 이를 위해 "쓰기"시스템 호출 (4 번)을 사용하고 싶습니다. 쓰기에 대한 C의 정의는 다음과 같습니다

ssize_t write(int fildes, const void *buf, size_t nbyte) 

무엇 fildes, 버피 닌 nbyte 인수를 보유해야 등록? 어떤 인터럽트를 호출해야합니까?

답변

2

write을 호출하는 C 프로그램을 작성하고 어셈블리 언어 (-S 옵션 사용)로 컴파일 할 수 있습니다. 그런 다음 출력 결과를 검토하여 컴파일러에서 수행하는 작업을 확인합니다.

편집 :

오픈 솔라리스의 libc가 이런 식으로 작업을 수행합니다 당신이 몇 가지를 확인 쓰기 전화

먼저 다음 __write 호출

pushl 0x10(%ebp) 
pushl 0xc(%ebp) 
pushl 0x8(%ebp) 
call c2730 <__write> 

다음과 같은 __write :

<__write>: 
call c2735 <__write+0x5> 
pop %edx 
mov $0x4,%eax 
mov %esp,%ecx 
add $0x10,%edx 
sysenter 
jae c2751 <__write+0x21> 
cmp $0x5b,%eax 
je  c2730 <__write> 
jmp 2e0d0 <__cerror> 
ret 

ex (4)에 syscall 번호 쓰기, ecx에 스택 포인터, edx에있는 리턴 주소를 넣는다. 그리고 write syscall에 대한 인수는 이미 스택에 푸시되었습니다.

+0

컴파일러는 libc에서 'write'함수를 호출합니다. 'syscall'함수를 사용하여 syscall을 호출 할 때도 똑같은 기능을합니다.이 함수는 libc에서 'syscall'함수를 호출합니다. 여유 시간이있을 때 libc의 이러한 기능 구현을 분석 하겠지만, 아직 시간이 안왔다. :) – antonone

+0

Lol, 대답이 있습니다. 여기 있습니다 - http://bit.ly/baMJVo :) – antonone