В настоящее время я продолжаю работу над проектом для моего класса 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