2013-02-15 1 views
1

나는 "hello world"를 발견하고 그것을 썼다. 나노 hello.s어떻게하면 asm (가스)을 배우기 시작할 수 있습니까?

내가

ld -s -o hello.o hello* 

error 

ld: hello: No such file: No such file or directory 

어디 오전했던

hello.s:6: Error: no such instruction: global _start 

delete global _start. 

오류를 준 as -o hello.o hello.s 내가했던

.data 
msg: 
.string "Hello, world!\n" 
len = . - msg 
.text 
global _start 
_start: 
    movl $len,%edx 
    movl $msg,%ecx 
    movl $1,%ebx 
    movl $4,%eax 
    int  $0x80 
    movl $0,%ebx 
    movl $1,%eax 
    int  $0x80 

이 코드 내가 잘못 생각한거야?

p/s debian, amd64.

+0

당신이 무엇을 요구하는지 알기가 어렵습니다. "global _start"에 대한 오류가 발생하면 어셈블러를 실행했습니다. 해당 라인에 대한 잘못된 점을 확인하려면 어셈블러 설명서를 참조하십시오. 어쩌면 그 공간이 필요하지 않거나 전세계에이 필요하지 않을 수도 있습니다. " 앞에. –

+0

또한'gcc' 컴파일러를 사용하여 생성 된 어셈블리 코드를 살펴 봅니다. 'gcc -Wall -fverbose-asm -O -S file.c' 그러면'file.s' 내부를 보게됩니다 –

답변

2

시도 .globl _start 또는 .global _start.

진입 점에 문제가 생길 경우를 대비하여 start을 시험해보십시오.

마지막으로 64 비트 실행 파일을 만드는 경우 int 0x80이 아닌 syscall이 아닌 다른 시스템 호출 인터페이스를 사용해야 할 수도 있습니다. 그것에 대한 자세한 내용은 here입니다.

+0

또한 ...'ld -o hello hello.o''-o' 스위치는 출력 파일명을' hello.o'는 ld가 작업중인 파일입니다. 64 비트의 ld에서 32 비트 코드를 얻으려면,'-m elf_i386'. 오래된 'int 0x80' 시스템 호출은 64 비트 코드에서 작동하지만 올바르지 않습니다. 'push reg32'는 64 비트 코드에서 작동하지 않습니다! –

관련 문제