2016-09-18 2 views
0

나는 조립하여 다음 코드 나는 문제가 무엇인지 모르는조립 NASM 분할 오류, 의미는 무엇입니까?

all: 
    nasm -f elf64 -o asm.o asm.s 
    ld asm.o -o asm 
    rm asm.o 

을 다음과 같이 Segmentation fault (core dumped)

section .text 
global _start 

_start: 
    mov eax, 8 

내 메이크 파일이 오류를 얻을 때.

저는 64 비트 우분투를 실행하고 있습니다.

감사합니다.

+1

을 당신은 종료하기 위해 콜을 사용하지 않는 프로그램이'mov eax, 8 '을 끝내면 프로그램은 결국 오류가 발생할 때까지 메모리에 어떤 일이 일어나도 계속 실행합니다. 프로그램을 종료하려면'mov eax, 60''xor edi, edi''syscall' 명령을 추가하면됩니다. 리눅스 시스템 콜에 대한 좋은 정보원은 [Ryan Chapman의 블로그] (http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/) –

+0

덕분에 참으로 매력적입니다! : D –

+0

'xor edi, edi' 부분은 무엇을합니까? 그것 없이는 작동하는 것 같습니다. –

답변

0

CPU가 프로그램을 실행하고 mov eax, 8 명령어를 찾았습니다. 실행 한 결과는 무엇입니까? 오브젝트 파일에는 명령어가 없지만 아무도 CPU에 알려주지 않았습니다! @MichaelPetch가 말했듯이, 다음 명령은 아무런 유효한 명령도 실행하지 않아 세그먼트 오류가 발생합니다.

가장 쉬운 해결책은 프로그램을 초기화하고 정리하는 래퍼 (wrapper)를 사용하는 것입니다 (예 : GCC). 그냥 다음과 같이 C.

에서

소스 파일을 수정 당신이 잘 알고있을 수 main 기능에 mov eax, 8를 넣어 :

section .text 
global main 

main: 
    mov eax, 8 
    ret 

(main 함수입니다, 그래서 당신은 반환 할 ret 명령이 필요합니다 그것에서)

하고 다음 스크립트를 사용합니다.

nasm -f elf64 -o asm.o asm.s 
gcc asm.o -o asm 
rm asm.o