2012-12-25 4 views
1

stdin에서 여러 문자를 가져 오는 간단한 프로그램을 작성하려고합니다. 간결성을 위해, 관련 코드는 다음과 같습니다sys_read syscall 대 int 0x80 GNU 어셈블러

mov $3, %rax # sys_read = 3 
mov $0, %rbx # stdin fd = 0 
mov $b, %rcx # '.lcomm b, 32' declared in .bss section 
mov $32,%rdx # size_t 
# syscall 
int $0x80 

내가 의도 한대로 int $0x80 프로그램 기능을 사용하는 경우, 그러나 syscall와는 세그먼테이션 폴트 (segfault). 인터럽트를 사용하면 커널이 기계의 상태를 기억해야한다는 사실과 관련이 있으며, syscall은 해당 요구 사항을 따르지 않습니다. 즉 커널이 자체 시간에 처리합니다. 이것이 진짜 이유인지 확신 할 수 없습니다. syscallsys_read과 같은 레지스터에 뭔가를 수행한다고 가정합니다.

또한 "syscall이 기본 커널 입력 방법"이며 "int 0x80은 시스템 호출을 호출하는 기존 방법이므로 피해야합니다"라는 이전 질문을 읽었습니다. (Link)

나는 이것에 대한 좋은 문서를 찾을 수 없으므로, 어떤 의견을 부탁드립니다.

편집 : 오타

+0

'syscall'은 64 비트 시스템에서 작동해야하지만 다른 레지스터에는 다른 sys_call 번호와 매개 변수가 필요합니다. 재미있는'int 80h'은 권장하지 않지만 ... 64 비트 시스템에서도 작동하는 것처럼 보입니다! 64 비트 레지스터와 32 비트 시스템 호출 번호 및 매개 변수가 혼합되어 있습니다. –

+0

아하 그래, 고마워. $ b와 $ 0는 각각 레지스터 rsi와 rdi로 들어갑니다. – jtx

답변

0

확인 this 질문입니다. x86_64에서 정확한 종료 시스템 호출은 $60이고 %rax이어야합니다.

mov $60, %rax 
mov $0, %rdi 
syscall