Ошибка сегментации в программе сборки, вызванная подпрограммой - PullRequest
0 голосов
/ 06 апреля 2019

В настоящее время я продолжаю работу над проектом для моего класса Computer Architecture, в котором выражение постфикса преобразуется в полностью инфиксное выражение в скобках.Тем не менее, я испытываю трудности с поиском, как я получаю ошибку сегментации, когда я запускаю программу.Я знаю, что это напрямую связано с моей подпрограммой readPostfix, которая вызывает метод append, который вызывает метод lengthIs.Как мне решить проблему, с которой я столкнулся?

Я пытался опустить использование push для сохранения значений регистров, чтобы попытаться исправить программу, но я понял, что с помощьючто я бы потерял значения ecx, которые нужны для цикла, и некоторые другие важные.

Это часть кода, которую я хотел бы функционировать правильно.Если он работает правильно, он должен вывести A + B ...

%include "asm_io.inc"

segment .data                           
    postfix     db  "AB+", 0 
    maxSize     equ 100     

segment .bss                                                    
    postLength  resb 1                              

segment .text
    global  _asm_main

_asm_main:
    enter   0,0                                     ; setup routine
    pusha

    push    postfix
    call    lengthIs
    add     esp,4
    mov     [postLength],eax
    call    print_int

    push    postLength
    push    postfix
    call    postfixToInfix
    add     esp, 8

    popa
    mov     eax, 0                              ; return back to C
    leave                     
    ret



; A subprogram that converts postfix expression to a fully parenthesized infix expression
segment .data

segment .bss
operator        resd 1

segment .text

postfixToInfix:                             
    push    ebp                                 
    mov     ebp, esp                            

    mov     edx, [ebp + 8]                      
    mov     ecx, [ebp + 12]                     
    mov     esi, 0                              

infixLoop:
    mov     al,[ebx + esi]
    inc     esi
    cmp     eax,'+'                         
    je      operation                       
    cmp     eax, ' '
    je      infix_exit

    push    eax
    inc     esi
    loop    infixLoop

operation:
    mov     [operator], al
    pop     ebx                                 
    pop     edx                                 

    push    eax                                                                 
    push    ecx                                 
    push    edx                                 
    push    esi                                 
    push    esp                                 

    push    operator
    push    ebx
    push    1
    call    append
    add     esp, 12

    push    ebx
    push    1
    call    append
    add     esp, 12

    pop     esp
    pop     esi
    pop     edx
    pop     ecx
    pop     eax

    push    ebx

infix_exit:
    inc     esi
    loop    infixLoop

    pop     eax
    call    print_string
    pop     ebp                                 
    ret                                         

; A subprogram that gets the length of the postfix expression

segment .text

lengthIs:                                   
    push    ebp                                 
    mov     ebp, esp                            

    mov     eax, 0                              
    mov     ebx, [ebp + 8]                      
    mov     esi, 0                              
    mov     ecx, maxSize                        

length_loop:                                    
    cmp     [ebx + esi], dword 0                
    je      length_exit                         
    inc     eax                                 
    inc     esi                                 
    loop    length_loop                         

length_exit:                                    
    pop ebp                                     
    ret                                         


; A subprogram strcat appends the contents of one string to the end of another
; strcat(str1,str2)
; Result: str1= str1 + str2
segment .bss
append_length resd 1
segment .text
append:
    push    ebp
    mov     ebp, esp

    mov     edx, [ebp + 16]                         

    push    edx
    call    lengthIs
    add     esp, 4
    mov     [append_length], eax
    mov     eax, 0

    mov     ebx, [ebp + 12]                     
    mov     edx, [ebp + 16]                         
    mov     ecx, [append_length] 
    mov     edi, 0
    mov     esi, [ebp + 8]                      

append_loop:
    mov     al, [edx + edi]
    mov     [ebx + esi], al
    add     esi, 1
    add     edi, 1
    loop    append_loop

    pop     ebp
    ret 
...