Subprogramas de chamada de montagem com base na entrada do usuário
Eu tenho um programa que deve adicionar ou subtrair dois números codificados com base na entrada do usuário0
ounot 0
. Recebo um erro de violação de acesso à memória por dentroinput
. quando eu tentocall sum
oucall diff
em vez deinput
na linha 9, funciona bem e me dá a saída esperada.loop
enext
é usado para exibir o resultado da pilha.
.text
.global _start
_start:
xorl %esi, %esi # zerowanie licznika
call input # <---- line 9
loop: # label
movl $0, %edx # reszta z dzielenia
movl $10, %ebx # dzielnik
divl %ebx # dzielenie, wynik w eax, reszta w edx
addl $48, %edx # kod ASCII
pushl %edx # edx na stos
incl %esi # esi++
cmpl $0, %eax # porównaj wynik i 0
jz next # jeśli koniec, jump next
jmp loop # jeśli nie, następna iteracja
next: # label
cmpl $0, %esi # porównaj licznik z 0
jz exit # jeśli koniec, jump exit
decl %esi # esi--
movl $4, %eax # kod 4 = zapis
movl %esp, %ecx # znak do wypisania
movl $1, %ebx # domyślny strumień - sys_out
movl $1, %edx # długość stringa do wypisania?
int $0x80 # przerwanie
addl $4, %esp #
jmp next # kolejna iteracja
exit:
mov $1, %eax # zakończenie programu
mov $0, %ebx # kod wyjścia
int $0x80 # przerwanie
# ---------------- subprogram ----------------------
input:
movl $3, %eax # code 3 = input
movl $0, %ebx # code 0 = stdin
subl $4, %esp # move stack pointer by 4 bytes
movl %esp, %ecx # set reading position onto stack
movl $4, %edx # read 4 bytes
int $0x80 # interrupt to execute above
cmp %esp, '0' # if(input == '0') sum else diff
jz sum
jnz diff
ret
sum:
movl $37, %eax # pierwsza liczba sumy
movl $22, %ebx # druga liczba sumy
addl %ebx, %eax # suma, wynik w eax
ret
diff:
movl $37, %eax # pierwsza liczba sumy
movl $22, %ebx # druga liczba sumy
subl %ebx, %eax # roznica, wynik w eax
ret
# ------------- end -------------
Como posso editar meuinput
para ler um caracter / número e compará-lo com0
?