[Assembly486] Ajuda com calculadora - Assembly - Portugal-a-Programar
By Strabush, February 12, 2010 in Assembly
Bem, tenho um projecto pra terminar e no entanto enquanto o fazia deparei-me com certas situações limitantes no qual impediram a perfeição total do trabalho.
O objectivo é criar uma calculadora que faça operações aritméticas (+, -, *, /), lógicas (XOR, AND, OR) e também SL, SR, RL e RR. Consegui fazer a calculadora com as operações aritmeticas e mais o SL e SR. Falta XOR, AND, OR; RL, RL.
Para facilitar a vossa compreensão, vou enumerar as dúvidas:
1- Adicionar as operações XOR, AND, OR; RL, RL.
2- Fazer com que o programa detecte e indique no ecrã as situações de overflow.
3- O programa produz resultado em Hexa, como faço para po-lo em inteiro?
Se alguém pudesse ajudar agradecia imenso.
Caso prefiram, aqui têm o programa feito até agora:
s1	 db	0xa,"Introduza num: "
ts1	 equ	$ - s1
s3	 db	0xa,"Resultado: "
ts3	 equ	$ - s3
s4	 db	0xa,"Introduza o operador (+,-,*,/,&,SL,SR): "
ts4	 equ	$ - s4
s5	db	0xa,"Operador inválido",0xA
ts5	equ	$ - s5
call	pedeNumero
mov     edx,ts4
mov     ecx,s4
mov     ebx,1
mov     eax,4
mov     edx,MAX_PALAVRA
mov     ecx,strnum
mov     ebx,0
mov     eax,3
jne	subtrai
call	fsoma
jne	multiplica
call	fsubtrai
jne	divide
call	fmultiplica
jne	op_and
cmp	al, '&'
jne	op_SL
call	fop_and
op_SL:
cmp	al, 'S'
jne	erro_operador
lodsb	; Carrega 2º byte do operador no al
cmp	al, 'L'
jne	op_SR
call	fop_SL
op_SR:
cmp	al, 'R'
;call	fop_SR
erro_operador:
; Mensagem operador inválido
mov     edx,ts5
mov     ecx,s5
jmp	acabou
mov     edx,ts3
mov     ecx,s3
mov     edx,8
mov     edx,tlinha
mov     ecx,linha
mov     eax,1
;Funções
fsoma:
fsubtrai:
fmultiplica:
fop_and:
and	ebx, [num2]
; É necessário melhorar, pois o 'num2' pode ser maior que 'cl'
fop_SL:
mov	ecx, [num2]
pedeNumero:
mov     edx,ts1
mov     ecx,s1
mov     [tamstr],eax
Assim derepente, sei que ha regras para haver overflow, acho que se o digito mais significativo do 1º operando for diferente do digito mais significativo do resultado houve overflow (não tenho a certeza) , mas acho que podes pegar nessas regras e aplicar no assembly.
Em relação à tua 3ª questão, o enunciado pede mesmo para converter para inteiro? é que é um pouco inutil, a unica utilidade que vejo é mesmo a percepção humana.
Acho que expressei-me mal. O que quis dizer é que se a pessoa for fazer a conta com decimais, o resultado dá decimal; se fizer com Hex, o resultado dá em Hex.
Após muita luta consegui por as operações lógicas e os saltos SL-RL a funcionar, apenas falta as rotações RR-RL.
No entanto ainda falta-me implementar o detector de overflow e alguns detalhes quanto a escola do formato do número.
ps: Tenho o source com as alterações no Linux, e uso dual boot, de momento estou no windows, quando estiver no Linux posto como ficou.
ricpap 0
A tua calculadora tem que funcionar com numeros negativos e positivos ou so positivos? E o teu programa nao opera em virgula flutuante, em virgula flutuante tens que mexer no FPU.
Tive a fazer testes e funcionou com números negativos.
Funcionou? Deu resultados correctos? Oo
Certos não sei, os resultados apareciam em hexa. Por exemplo: 5*5 = 000002A (um exemplo apenas, não sei se é isso mesmo.)
Informo-vos que tive 16 no trabalho pratico
Joao_Ingles 0
Tenho esse mesmo projecto desenvolvido, queria fazer uma pequena alteração:
em vez dele mostrar o resultado mostrado no ecrã (monitor) no mesmo formato, queria que mostrasse num ficheiro no mesmo formato.