2013-02-14 2 views
0

(C terminallogy에 있음)을 다른 루틴에서 시작하고 시작 루틴 (엔트리 포인트)에서 인쇄하지 않겠습니다. 하지만 그것은 seg 오류를 받았습니다 :왜이 오류가 발생합니까?

format ELF executable 3 
entry start 
segment readable executable 

start: 
    pop ebx ;argc 
    pop ebp ;argv[0] 
    call printarg 

    ;; exit 
    xor ebx,ebx 
    mov eax,1 
    int 80h 

printarg: 
    pop ebp ;argv[1] 
    call puts 
    ret 
puts: 
    pusha 
    mov eax,ebp 
    xor edx,edx 
    ;; get string length 
.loop1: 
    cmp byte [eax],0 
    je .loop2 
    inc eax 
    inc edx 
    jmp .loop1 
    ;; print it 
.loop2: 
    mov eax,4 
    mov ebx,1 
    mov ecx,ebp 
    int 80h 
    ;print a new line 
    mov eax,4 
    mov ebx,1 
    mov ecx,NL 
    mov edx,1 
    int 80h 
    popa 
    ret 

segment readable writeable 
NL db 0xA 

누군가가 설명 할 수 있습니까?

+0

이 숙제가 있습니까? – fons

+0

번호 :(정말 보이십니까? – Jack

답변

1

당신은

call something 

다음

something: 
    pop ebp 

수행하고 일을 기대할 수 없다 - 루틴, 당신이 터지는 무엇, 다음, 반환 주소는 그 호출 단지 밀고.

+0

감사합니다. 그래서'something' 루틴에서 프로그램의 인수에 접근 할 수 있습니까? – Jack

+0

확실히 - 그들은 반송 주소 바로 위에 있기 때문에, [[esp ]'한번''mov ebp '에서'pop ebp'대신에 [esp + 4]는'ebp'에'argv [1]'을 주어야합니다. –

+0

정말 잊어 버리 네요. 오늘 조금 내려 놔 LOL 이유는 모르겠다. 어쨌든, 다시 한번 감사드립니다. – Jack