을 참조하지 않고 호출 : 나는 32 년 어셈블리 코드 (A .S 파일)로 변환 한 후X86은 : 시스템을 만드는 것은 내가 표준 입력에서 읽고 표준 출력에 기록하는 코드를 작성 표준 라이브러리
#include <stdio.h>
#include <unistd.h>
int main() /* copy input to output */
{
char buf[BUFSIZ];
int n;
while ((n = read(0, buf, BUFSIZ)) > 0)
write(1, buf, n);
return 0;
}
& T 구문 AT 비트 :
.text
.globl _start
_start:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp #16 bit alignment
subl $8224, %esp #space for local variables
jmp _READ
_WRITE:
movl 8220(%esp), %eax
movl %eax, 8(%esp)
leal 28(%esp), %eax
movl %eax, 4(%esp)
movl $1, (%esp)
call write
int $0x80
_READ:
movl $8192, 8(%esp) #buffer length
leal 28(%esp), %eax
movl %eax, 4(%esp)
movl $0, (%esp)
call read
movl %eax, 8220(%esp)
cmpl $0, 8220(%esp)
jg _WRITE
movl $0, %eax
leave
ret
그것은 잘 작동하지만 내가 어떻게 "읽기"및 "쓰기"시스템이 특정 레지스터에 (즉, 이동 숫자를 일반 어셈블리를 사용하여 호출하고 사용 "INT를 만들기 위해 확실하지 않다 0x80 "으로 시스템 호출을 실행).
제 목표는 "-nostdlib"옵션을 사용하여 컴파일해도 작동하도록하는 것입니다.
시스템 호출은 OS에 의존한다. OS를 지정하십시오. –
linux :) @ Raymond Chen – Meteorite
[x86 호출 규칙] (http://en.wikipedia.org/wiki/X86_calling_conventions)으로 시작하고 나중에 더 구체적으로 질문하는 것이 좋습니다. OS 운영체제의 사용 방법은 사용 된 OS에 따라 다릅니다. 리눅스? – alexander