Mac OS X에서 시스템 호출을 테스트하기 위해 짧은 32 비트 어셈블리 프로그램을 작성하려고합니다.mac os x의 32 비트 어셈블리에서 시스템 호출을 만들지 못했습니다.
아래와 같이 첫 번째 버전을 작성하고 write() 함수를 호출하여 화면에 문자열을 인쇄합니다. 그것은 효과가있다.
.data
str:
.ascii "Hello World\n"
.text
.globl _main
_main:
pushl $12
pushl $str
pushl $1
movl $4, %eax
subl $4, %esp
int $0x80
addl $16, %esp
pushl $0
movl $1, %eax
subl $12, %esp
int $0x80
이 후, 나는 또 다른 버전 "/ tmp를"새로운 디렉토리를 만들 MKDIR()를 사용 쓰기로 결정,하지만 난 실패했습니다. mkdir()의 시스템 호출 번호는 0x88이고 내 코드는 아래에 나와 있습니다. 아무도 내가 틀렸다고 말할 수 있습니까? 매우 감사합니다.
.data
path:
.ascii "/tmp/new_dir"
.text
.globl _main
_main:
nop
pushl $path
pushl $0x1ff
movl $0x88, %eax
subl $8, %esp
int $0x80
addl $16, %esp
pushl $0
movl $1, %eax
subl $12, %esp
int $0x80
왜'subl $ 8' ?! –
OS X은 스택이 16 바이트로 정렬되어야합니다. 나는 이미 8 바이트를 밀고있다. 그래서 스택을 정렬하려면'subl $ 8 '이 필요합니다. –
스택 정렬은 인수를 푸시하기 전에 * 발생해야합니다. 그렇지 않은 경우, 피 호출자가 인수를 어디에서 찾을 수 있는지 어떻게 알 수 있습니까? 진행 상황에 대한 내 답변 [here] (https://stackoverflow.com/questions/21367494/understanding-osx-16-byte-alignment/21371636#21371636)을 참조하십시오. –