Pessoal, gostaria de alguma ideia de código que eu poderia fazer uma calculadora binaria em assembly nasm com funções de soma, subtração, divisão, e multiplicação!
Tenho isso ate agora mas ta em hexadecimal e com erro na subtração e multiplicação
Quem souber algo, eu agradeço desde já!
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
Pergunta
Stheffany Silva
Pessoal, gostaria de alguma ideia de código que eu poderia fazer uma calculadora binaria em assembly nasm com funções de soma, subtração, divisão, e multiplicação!
Tenho isso ate agora mas ta em hexadecimal e com erro na subtração e multiplicação
Quem souber algo, eu agradeço desde já!
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
Editado por Stheffany SilvaLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.