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

tiagolimpo

[Ajuda] Calculadora em Assembly hexadecimal

11 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu fiz a cadeira de Assembly o ano passado e embora tivesse gostado já não tá muito fresco. Esse Assembly é para que processador?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Mas dá erro ? Não funciona ? Faz alguma coisa mal ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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