2013-02-14 2 views
0

Я хочу напечатать argv[1] (в терминологии C) из другой процедуры, а не из начальной процедуры (это точка входа). Но он дал разницу в размере:Почему это дало ошибку 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

Спасибо. Итак, можно получить доступ к аргументам программы в '' 'процедуре' ''? – Jack

+0

Несомненно, поскольку они будут находиться только над обратным адресом, который находится на '[esp ] ', один раз в подпрограмме' mov ebp, [esp + 4] 'вместо вашего' pop ebp' должен дать вам 'argv [1]' в 'ebp'. –

+0

Действительно, я просто забыл об этом. Сегодня немного не понимаю, почему. Во всяком случае, еще раз спасибо. – Jack

Смежные вопросы