• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rubencosta

calculadora em assembly

9 mensagens neste tópico

tenho que fazer um projecto em assembly para fazer uma calculadora! tinha o projecto feito mas o stor a ultima quis mudar a maneira de fazer a mutiplicação e a divisao! o stor quer que faça a multiplicação com o ciclo multiplicador! alguem me pode ajudar??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja agora a divisao é feita com o circuito divisor..e os numeros que a calculadora aceita sao em hexadecimal...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra o que já tens feito, e pesquisa sobre o ciclo multiplicador (provavelmente é somar A vezes :).

Se tiveres dúvidas concretas é mais fácil ajudar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

aquilo que ja tenho é o seguinte codigo

section .data
res		dd	0	; guarda resultado
num1		dd	0	; guarda operando 1
num2		dd	0	; guarda operando 2
num_lidos	dd	0

pedido  db      "Insira número> "
tamped  equ     $ - pedido

msg	db	"Resultado: "
tamsg	equ	$ - msg

strop	db	"Insira o operador (+ - * /): "
tamop	equ	$ - strop

branco	db	0xA

section .bss
MAX_LINHA	equ	9
linha		resb	MAX_LINHA

section .text

global	_start

_start:
mov	eax, ds
mov	es, eax

; Código para ler o número do teclado

        ; Pedir o número
        mov     edx, tamped
        mov     ecx, pedido
        mov     ebx, 1
        mov     eax, 4
        int     0x80

        ; Ler o número
        mov     edx, MAX_LINHA
        mov     ecx, linha
        mov     ebx, 0
        mov     eax, 3
        int     0x80
dec	eax
        mov     [num_lidos], eax

; Converter "linha" para num
push	dword[num_lidos]
push	linha
call	conv2num
add	esp, 8
mov	[num1], eax

       ; Pedir o número
        mov     edx, tamped
        mov     ecx, pedido
        mov     ebx, 1
        mov     eax, 4
        int     0x80

        ; Ler o número
        mov     edx, MAX_LINHA
        mov     ecx, linha
        mov     ebx, 0
        mov     eax, 3
        int     0x80
dec	eax
        mov     [num_lidos], eax

; Converter "linha" para num
push	dword[num_lidos]
push	linha
call	conv2num
add	esp, 8
mov	[num2], eax

; Pedir o operador (+ - * /)
        mov     edx, tamop
        mov     ecx, strop
        mov     ebx, 1
        mov     eax, 4
        int     0x80

        ; Ler o operador
        mov     edx, 1
        mov     ecx, linha
        mov     ebx, 0
        mov     eax, 3
        int     0x80

; Avaliar o operador
; mov	esi, linha
; lodsb
mov	ebx, linha
mov	al, byte[ebx]
cmp	al, '+'
je	soma
cmp	al, '-'
je	subtrai
cmp	al, '*'
je	multiplica
cmp	al, '/'
je	divide
; Se não for nenhum, termina
jmp	fim

; Operações
soma:
mov	eax, [num1]
add	eax, [num2]
mov	[res], eax
jmp	escreve

subtrai:
mov	eax, [num1]
sub	eax, [num2]
mov	[res], eax
jmp	escreve

multiplica:
mov	eax, [num1]
mov	ebx, [num2]
mul	ebx
mov	[res],	eax
jmp	escreve

divide:
xor	edx, edx	; Apagar edx
mov	eax, [num1]
mov	ebx, [num2]
div	ebx
mov	[res], eax
jmp	escreve

escreve:
; Código para escrever o número no ecrã
mov	edi, linha
cld
mov	edx, [res]
mov	ecx, 8
converte2:
rol	edx, 4
mov	eax, edx
and	eax, 0xF
cmp	eax, 9
jbe	algarismo2
sub	eax, 9
add	eax, 0x40
jmp	proximo
algarismo2:
add	eax, 0x30
proximo:
stosb
loop converte2

; imprimir msg
mov	edx, tamsg
mov	ecx, msg
mov	ebx, 1
mov	eax, 4
int	0x80

; imprimir número convertido em string
mov	edx, 8
mov	ecx, linha
mov	ebx, 1
mov	eax, 4
int	0x80

; imprimir ENTER
mov	edx, 1
mov	ecx, branco
mov	ebx, 1
mov	eax, 4
int	0x80

fim:
; sair do programa 
mov	ebx, 0
mov	eax, 1
int	0x80

;;;;;;;; FUNÇÕES

; converter "linha" para "num"
; Recebe 2 parâmetros:
;	- 1º: linha [ebp+8]
;	- 2º: num_lidos [ebp+12]
; Devolve "num" no eax
conv2num:
push	ebp
mov	ebp, esp
xor	edx, edx	; apaga edx
xor	eax, eax	; apaga eax
mov	esi, dword[ebp+8]
cld
mov	ecx, dword[ebp+12]
converte:
lodsb
cmp	al, '9'
jbe	algarismo
add	al, 9
algarismo:
and	al, 0xF
shl	edx, 4
or	edx, eax
loop	converte
mov	eax, edx
pop	ebp
ret

é uma calculadora que ta a trabalahr bem..o problema é que a multiplicação e a divisao nao podem ser feitos assim.. =s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu tenhu uma semana para entregar isto e ja estou assim meio em desespero =s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como já foi dito, se não pode ser feito assim, só pode ser feito somando o número N vezes, parece-me. Ou seja, na multiplicaçao tens que fazer um ciclo que some N vezes, o numero em questão:

5 x 4 = 5 + 5 + 5 + 5

Quanto à divisão, podes pegar no numero e ir retirando o outro operando, até chegares a 0. Tens que ir contando quantas vezes tiraste o segundo operando até chegares a 0:

15 / 3:

15 - 3 - 3 - 3 - 3 - 3 .... Quando chegas a 0, o numero de vezes que retiraste o 3 (que foram 5 vezes) dá-te o resultado da operação.

Se a calculadora, tiver que funcionar para númeors fraccionários, então já não poderá ser feito assim. :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim eu tbm pensei nisso..mas o stor quer que nos faxamos com o ciclo mutiplicador, ou seja aplicar este fluxograma que esa neste teste exemplo nese link http://col.grupolusofona.pt/?i=16&k=GPCH3  so que esse ciclo esta para numeros binarios e o stor que em numeros hexadecimal! e sim a calculadora so aceita numeros inteiros

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em hexadecimal ou em binário é exactamente igual, não percebo o teu problema. Além do mais, quando o computador representa tudo em binário.

Não consigo perceber como funciona esse ciclo multiplicador, não faz qualquer sentido para mim. (principalmente a parte do rightshift ao A)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quanto à divisão, podes pegar no numero e ir retirando o outro operando, até chegares a 0. Tens que ir contando quantas vezes tiraste o segundo operando até chegares a 0:

15 / 3:

15 - 3 - 3 - 3 - 3 - 3 .... Quando chegas a 0, o numero de vezes que retiraste o 3 (que foram 5 vezes) dá-te o resultado da operação.

Não é até chegar a 0, é até ser menor que o divisor. No caso do exemplo, até ser menor que 3. Outro exemplo que prova isto é

14/3 = 4 com resto 2: 14 - 3 - 3 - 3 - 3 = 2

porque nunca seria igual a 0.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora