Ir para o conteúdo
tiagolimpo

Calculadora em Assembly hexadecimal

Mensagens Recomendadas

tiagolimpo

Boas, possivelmente ja mts de voçes ja fizeram este trabalho logo no 1ºano, agr é a minha vez.

Entao venho-vos pedir para que me podessem ajudar neste trabalho q vale 40% da nota da minha cadeira...  (agr precebem pq é tao imoprtante este trabalho.) quem tiver disposto em ajudar-m fico mt grato.

MT OBRIGADO

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Hipnoted

Sim convém especificar dúvidas concretas, não somos bruxos para as adivinharmos... :P


"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiagolimpo

Então é assim, básicamente e como ir buscar os dados a um ficheiro e executá-los no programa...

fica aqui tb a estrutura do trabalho:

O programa deve ler os operandos e operadores de um ficheiro no formato pós-fixo (notação polaca invertida). O resultado deve ficar no mesmo ficheiro (devendo ser removidos os operandos e operadores originais).

O programa deverá aceitar os 2 operandos (em hexadecimal) e o operador ( +, -, *, /, &, |, ^, SL, SR, RL, RR ), em linhas diferentes do ficheiro, sendo o resultado apresentado no mesmo ficheiro, no mesmo formato.

O programa deverá detectar e indicar no ficheiro situações de "overflow".

Exemplo de soma de 2 inteiros:

Ficheiro original

23 (1º operando)

15 (2º operando)

+ (operador)

Ficheiro final

38 (resultado) Ficheiro original

23 (1º operando)

15 (2º operando)

+ (operador)

3 (3º operando)

* (operador)

Ficheiro final

A8 (resultado)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
MX+

Como em tudo deves seguir o caminho de baixo-para-cima. Primeiro cria uma calculadora simples e testa fazer as operaçoes só com dois numeros (implementa logo através da pilha).

Depois aumentas para que ela leia sozinha da pilha até um caracter terminador.

Depios crias outra função que leia do ficheiro e coloque na pilha, para que a tua calculdora possa servir-se desses dados.

Finalmente adicionas uma funcionalidade de ir escrevendo noutro sitio na pilha e no final do calculo copias tudo para o ficheiro.

Pensar em coisas pequenas e ir avançando para todo o projecto é 99% das vezes mais fácil e simples.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiagolimpo

Podem dizer-me se este código esta certo?

Fiz com o MX+ sugeriu começei por fazer uma calculadora simples.

ca vai:

ENTDEC PROC

PUSH BX

PUSH CX

PUSH DX  ; guarda os registo que serao usados

XOR BX,BX  ; acumula o total

XOR CX,CX  ; indicada de sinal

;Mensagem a pedir o numero

MOV AH,1h

INT 21H

CMP AL,'-'

JE MENOS

CMP AL,'+'

JE MAIS

JMP NUM  ;  se nao for sinal, vai processar o caracter

MENOS: MOV CX,1  ;  negativo = verdadeiro

MAIS: INT 21H        ; le outro caracter

NUM: AND AX, 000Fh        ; mesmo q SUB AL, 30h para conversao de binario

PUSH AX    ; salva AX

MOV AX,10  ;  prepara constante 10

MUL BX    ; AX = 10 x total, total esta em BX

POP BX    ;  retira da pilha o valor salvo, vai para BX

ADD BX, AX    ;  total = total x 10 + valor binario

MOV AH, 1h

INT 21H

CMP AL, 0Dh  ;  compara com 'ENTER'

JNE NUM    ; se nao for, continua pro proximo digito

MOV AX,BX  ;  se for 'ENTER', coloca o total calculado em AX

CMP CX, 1  ;  numero negativo?

JNE SAIDO    ; se nao, sai do programa

NEG AX      ; se for negativo, faz o complemento para 2

SAIDA: POP DX

POP CX

POP BX  ;  restaura os conteudos originais

RET

ENTDEC ENDP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiagolimpo
Em 09/01/2008 às 17:18, MX+ disse:

Eu dei foi para o P3 (não Pentium 3). Mas é isso, testa e se houver erros diz lol

pois... fiz assim agr:

section .data
MAX_PALAVRA equ 40
s1 db 0xa,"Introduza num 1: "
ts1 equ $ - s1
s2 db 0xa,"Introduza num 2: "
ts2 equ $ - s2
s3 db 0xa,"Resultado: "
ts3 equ $ - s3
s4 db 0xa,"Introduza o operador (+,-,*,/): "
ts4 equ $ - s4
linha db 0xa,0xa
tlinha equ $ - linha
num1 dd 0
num2 dd 0
result dd 0
tamstr dd 0
section .bss
strnum resb MAX_PALAVRA
section .text
global _start
_start:
mov eax, ds
mov es, eax
        ; Pede num1
mov    edx,ts1
        mov    ecx,s1
        mov    ebx,1 
        mov    eax,4 
        int    0x80   
        mov    edx,MAX_PALAVRA
        mov    ecx,strnum
        mov    ebx,0
        mov    eax,3
        int    0x80
sub eax, 1
mov    [tamstr],eax
xor eax, eax
xor ebx, ebx
mov esi, strnum
cld
mov ecx, [tamstr]
ciclonum1:
lodsb
cmp al, '9'
jg letra1
and al, 0xF
jmp fim1
letra1:
and al, 0xF
add al, 9
fim1:
shl ebx,4
add ebx, eax
loop ciclonum1
mov [num1], ebx
        ; Pede num2
mov    edx,ts2
        mov    ecx,s2
        mov    ebx,1 
        mov    eax,4 
        int    0x80   
        mov    edx,MAX_PALAVRA
        mov    ecx,strnum
        mov    ebx,0
        mov    eax,3
        int    0x80
sub eax, 1
mov    [tamstr],eax
xor eax, eax
xor ebx, ebx
mov esi, strnum
cld
mov ecx, [tamstr]
ciclonum2:
lodsb
cmp al, '9'
jg letra2
and al, 0xF
jmp fim2
letra2:
and al, 0xF
add al, 9
fim2:
shl ebx,4
add ebx, eax
loop ciclonum2
mov [num2], ebx
        ; Pede operador
mov    edx,ts4
        mov    ecx,s4
        mov    ebx,1 
        mov    eax,4 
        int    0x80   
        mov    edx,MAX_PALAVRA
        mov    ecx,strnum
        mov    ebx,0
        mov    eax,3
        int    0x80
mov esi, strnum
lodsb
cmp al, '+'
je soma
cmp al, '-'
je subtrai
cmp al, '*'
je multiplica
cmp al, '/'
je divide
soma:
mov ebx, [num1]
add ebx, [num2]
mov [result], ebx
jmp escreve
subtrai:
mov ebx, [num1]
sub ebx, [num2]
mov [result], ebx
jmp escreve
multiplica:
mov eax, [num1]
mov ebx, [num2]
mul ebx
mov [result], eax
jmp escreve
divide:
xor edx, edx
mov eax, [num1]
mov ebx, [num2]
div ebx
mov [result], eax
jmp escreve
escreve:
; Transforma resultado em string
mov ecx, 8
mov edi, strnum
mov ebx, [result]
cld
xor eax, eax
cicloresult:
rol ebx, 4
mov eax, ebx
and eax, 0x0000000F
cmp eax, 10
jl algarismo
add al, 'A'-10
jmp fim3
algarismo:
add al, '0'
fim3:
stosb
loop cicloresult
; Imprime resultado
mov    edx,ts3
        mov    ecx,s3
        mov    ebx,1 
        mov    eax,4 
        int    0x80   
mov    edx,8
        mov    ecx,strnum
        mov    ebx,1 
        mov    eax,4 
        int    0x80   
mov    edx,tlinha
        mov    ecx,linha
        mov    ebx,1 
        mov    eax,4 
        int    0x80   
acabou:       
; Sair do programa passando o controlo ao sistema operativo
        mov    ebx,0
        mov    eax,1
        int    0x80

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

Boa noite,

Não entendi a questão.

Cordiais cumprimentos,
Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

assinatura.jpg

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.