2015-12-13 2 views
2

Я пишу код для отображения строки вместе с ее эквивалентом с заглавной буквы. Вот то, что я до сих пор:ошибка сегментации в коде сборки

extern printf 

SECTION .data 
string1: db "hello",0 
fmt1: db "%s",10,0 

SECTION .text 

global main 
main: 

    enter 0,0 

    ; display string1 as is 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
    push string1 ; address of the string 
    push fmt1 
    call printf 
    add esp, 8 

    ; capitalize string1 
    mov eax, string1   ; convert the 1st letter 
    mov ebx, 0 
    mov ebx, [eax] 
    sub ebx, 'a' 
    add ebx, 'A' 
    mov [eax], ebx 

    ; display capitalized string1 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
    push string1 ; address of the string 
    push fmt1 
    call printf 
    add esp, 8 

    popa 
    leave 
    ret 

Когда я выполняю это я получаю этот выход:

hello 
Hello 
Segmentation Fault 

вы можете помочь мне понять, что я делаю неправильно?

ответ

2

В конце концов, вы «попа», что означает поп всех регистров. Вы потеряли свой обратный адрес для выхода.

В начале «pusha» (нажать все), чтобы сохранить обратный адрес в стеке.

Enter 0,0 
Pusha 
+0

Проклятье, это было глупо от меня. Благодаря! – Sally

+0

Если у вас есть еще вопросы или проблемы, не стесняйтесь комментировать здесь. Удачи! – Steven

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