2014-12-03 3 views
1

을 참조하지 않고 호출 : 나는 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"옵션을 사용하여 컴파일해도 작동하도록하는 것입니다.

+0

시스템 호출은 OS에 의존한다. OS를 지정하십시오. –

+0

linux :) @ Raymond Chen – Meteorite

+0

[x86 호출 규칙] (http://en.wikipedia.org/wiki/X86_calling_conventions)으로 시작하고 나중에 더 구체적으로 질문하는 것이 좋습니다. OS 운영체제의 사용 방법은 사용 된 OS에 따라 다릅니다. 리눅스? – alexander

답변

3

힌트 : x86 아키텍처가 오래되었거나 느리고 이상하고 더 이상 사용되지 않습니다. 대신 amd64를 사용해야합니다. 시스템의 목록이 호출

리눅스 소스 코드에서 사용할 수 :

https://github.com/torvalds/linux/blob/master/arch/x86/syscalls/syscall_32.tbl

시스템 호출 번호가 EAX에 간다. 매개 변수 순서는 항상 ebx, ecx, edx, esi, edi, ebp입니다. 그래서 코드가된다 :

 .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), %edx 
     leal 28(%esp), %ecx 
     movl $1, %ebx 
     movl $4, %eax 
     int $0x80 
    _READ: 
     movl $8192, %edx #buffer length 
     leal 28(%esp), %ecx 
     movl $0, %ebx 
     movl $3, %eax 
     int $0x80 
     movl %eax, 8220(%esp) 
     cmpl $0, 8220(%esp) 
     jg _WRITE 
     movl $1, %eax 
     movl $0, %ebx 
     int $0x80 

가 조립하고 링크 :

$ as --32 hel.s -o hel.o 
$ ld -melf_i386 hel.o -o hel 

http://www.linuxjournal.com/article/4048

관련 문제