Ora bem desta vez tenho que fazer um programita todo pipi que efectue a soma de 3 valores (aqueles que estão no .data) atravez da pilha.
Caso não tenham percebido eu mostro mesmo o inunciado:
O Abel recebeu a sua primeira tarefa no seu primeiro emprego. O seu chefe, Carlos, pediu-lhe
que escrevesse uma pequena função em assembly que somasse três valores. Ao fim de meia
hora o Abel apresentou a função soma operacional e bem testada. No entanto, ao contrário dum
elogio Carlos deu-lhe uma descompostura por ter passado os parâmetros através de variáveis.
Então Abel não sabia que num programa complexo, com centenas de funções, usar variáveis
para passar os parâmetros é má ideia?
A sua missão consiste em fazer o que o Abel não fez bem: escrever a função soma passando os
3 valores a somar e o resultado por valor na pilha. Os parâmetros de entrada são words (2
bytes) e o resultado deve ser long (4 bytes). Todos os valores estão representados em
complemento para 2.
Prontos e eu armado em carapau de corrida toca a fazer o prog.
.data
valor1: .word 100 #Primeiro operando da soma
valor2: .word 10 #Segundo operando
valor3: .word -30 #Terceiro operando
.text
.globl main
main: pusha
pushw valor1
pushw valor2
pushw valor3
call soma
popl %eax
call imprime_eax
popa
ret
soma: movl %esp,%ebp
movw $0,%ax
addl $2,%ebp
add %ax,(%ebp)
add %ax,-2(%ebp)
add %ax,-4(%ebp)
cwtl
pushl %eax
ret
Ora bem eu depois de fazer isto compilo não dá erro nenhum, ao que parece tá tudo supimpa, mas depois quando vou correr dá-me o erro segmentation fault. E o que eu sei é que já alterei isto de todas as maneiras que me lembrei e nada!
Será que alguem me consegue ajudar?




