2011-01-28 7 views
1

어셈블리 언어에서 those video tutorials을 팔로우하고 있습니다. 기본적으로 "hello world"예제를 사용하려고합니다.간단한 어셈블리 syscall이 작동하지 않습니다.

.data 
str: 
     .ascii "Hello World" 

.text 
.globl _start 

_start: 
     movl $4, %eax 
     movl $1, %ebx 
     movl $str, %ecx 
     movl $11, %edx 
     int  $0x80 

     movl $1, %eax 
     movl $0, %ebx 
     int  $0x80 

이 잘 컴파일하지만 난 그것을 실행하면 텍스트가 터미널에 인쇄되지 않은 : 여기 내가있어 것입니다. 나는 내가 뭘 잘못하고 있는지 전혀 모른다. ecx 레지스터에 어떤 값을 지정해도 아무런 차이가 없지만 아무 일도 일어나지 않습니다.

또 다른 질문, int 0x80 명령어를 호출 할 때 syscall이 어떻게 작동합니까? 일부 데이터는 레지스터로 옮겨졌지만 시스템 콜이되면 그 값을 "사용"하지 않습니다. 그것은 그것의 자신에 그 기록기에 이동 된 무슨 얻고 가는가 얻는가? 도움이 될 수

일부 시스템 정보 :

[email protected] ~/dev/asm/tutorial > uname -a 
FreeBSD freebsd-9 5.5-RELEASE FreeBSD 5.5-RELEASE #0: Tue May 23 14:58:27 UTC 2006  [email protected]:/usr/obj/usr/src/sys/GENERIC i386 
+1

필자의 개인적인 견해는 "hello world", 협약 및 기타 OS 종속 기능을 학습하여 어셈블리를 시작하는 것이 좋지 않다는 것입니다. 필자는 일반적으로 디버거 사용법을 배우고 작은 배열을 요약하는 등 단일 단계로 수행 할 수있는 자체 포함 된 asm 프로그램을 작성하는 것을 권장합니다. 일단 기본 지침에 만족하고 어셈블리가 끝나면 다양한 다른 것들을 쉽게 배울 수 있으므로 시스템 호출이 유용하지 않을 수도 있습니다. 하지만 그건 내 미친 생각이야 :) – Jester

답변

0

당신은 0 (표준 출력)에 %의 EBX 설정이 필요합니다. 현재 값 (1)은 stdin을 의미합니다.

+0

그것이 끝내는 syscall 상태 매개 변수가 아니라 내가 쓰고있는 fd입니다. – dotminic

+0

stdin은 0이고 stdout은 1입니다. stderr은 2 –

+0

입니다. @Fire Crow : 리눅스에서 stdin은 1이고 stdout은 0입니다. 나는 그가 freeBsd를 실행하고 있는지 보지 못했습니다. – BlackBear

1

이 작업을하려면 Linux 에뮬레이션이 필요하다고 생각합니다. 자세한 내용은 Developer's Handbook을 참조하십시오.

+0

링크를 제공해 주셔서 감사합니다. FreeBSD는 params가 스택에 전달되도록 요구합니다. 잘못된 호출 규칙을 사용하고있었습니다. – dotminic

1

FreeBSD는 더 '보통'는 콜 번호 가 EAX에 규칙을 호출 있으며, 매개 변수는 스택을 에

검사입니다 이 안녕하세요 세계의 조립식 토지에있는 자유 세계 섹션

내가 우분투와 netbsd 사이에 가서 그 둘 모두에 대한 어셈블리를 작성하는 데 도움이

* bsd는 파일 des의 인수와 쓸 바이트의 길이를 저장하기 위해 스택을 사용하며, 리눅스에서는 레지스터 eax와 ebx는 리눅스 스타일이다. 링커 진입 점을 mov 인 EDX, 렌에게; 메시지 길이를 MOV ECX, MSG, 파일 기술자 (표준 출력) mov 인 EAX, 4; 시스템 메시지가 mov 인 EBX, 1 쓰기 : 리눅스에서

: _start (sys_write와) INT 0x80으로 번호로 전화를 걸; 커널 전화는 FreeBSD에서

:

_syscall: 
    int0x80;system call 
    ret 

_start:;tell linker entry point 

    pushd word len;message length 
    pushd word msg;message to write 
    pushd word 1;file descriptor (stdout) 
    move ax,0x4;system call number (sys_write) 
    call _syscall;call kernel 

이 *의 BSD에 콜에 대한 스택 버전을 사용을

+0

그래, 내가 말했듯이 FreeBSD 문서를 읽음으로써 그것을 해결했지만 더 자세한 설명을 해주셔서 감사합니다. – dotminic

관련 문제