Jump to content

Recommended Posts

Posted

Boa noite, estou a fazer um trabalho académico no qual me é solicitada a soma em hexadecimal de 2 numeros, os quais peço ao utilizador caracter a caracter, guardando num vetor de bytes e fazendo logo validações...

este programa está com algum problema e não consigo saber qual é o mesmo... Agradecia ajuda 🙂

Está feito para 8086!

.8086
.model small
.stack 2048

DATA SEGMENT
HEXA_MSG_1 DB 0DH,0AH,'Introduza primeiro nr. hexadecimal a somar: ','$'
HEXA_MSG_2 DB 0DH,0AH,'Introduza segundo nr. hexadecimal a somar: ','$'
MESSAGE4 DB 0DH,0AH,'ERRO. Introduza carater 0..9 OR A..F: ','$'
HEXA_BIGGER_8 DB 0DH,0AH,'Coloque 8 ou menos digitos, tente novamente... ','$'

   NUM_HEXA db 8 dup (?)
NUM_HEXA_2 db 8 dup (?)
   RES_SOMA DW ?
DATA ENDS

STACK_HERE  SEGMENT STACK
DW 40 DUP(0)
STACK_HERE ENDS

CODE SEGMENT
   ASSUME CS: CODE, DS:DATA, SS: STACK_HERE
   START: MOV AX,DATA
   MOV DS,AX

XOR DI,DI
; Read input from keyboard.
GET_INPUT1:
XOR AX,AX
; pedir digitos utilizador
MOV  AH,9
LEA  DX,HEXA_MSG_1
INT  21H
; Lê do teclado e coloca em AL.
MOV  AH,1
INT  21H
MOV NUM_HEXA[DI],AL
INC DI

; Get input as long as input not equal carriage return.
WHILE_HX:

CMP  AL,0DH ; compara se ja foi inserido o caracter enter da tabela ascii
JE   GET_INPUT2

CMP  AL,27 ;escape
JE   FINAL

cmp  SI,13 ;backspace
JE   END_WHILE_HX

CMP  SI, 8     ; Check if user input more then 8 Hexadecimal numbers.
JG   ERRO_GR_HEXA
; Verifica se é caracter valido dentro da GAMA 0..9 a..f A...F
CHECK_INPUT_HX:
CMP  AL,'0'
JE VER
CMP  AL,'1'
JE VER
CMP  AL,'2'
JE VER
CMP  AL,'3'
JE VER
CMP  AL,'4'
JE VER
CMP  AL,'5'
JE VER
CMP  AL,'6'
JE VER
CMP  AL,'7'
JE VER
CMP  AL,'8'
JE VER
CMP  AL,'9'
JE VER
CMP  AL,'A'
JE VER
CMP  AL,'B'
JE VER
CMP  AL,'C'
JE VER
CMP  AL,'D'
JE VER
CMP  AL,'E'
JE VER
CMP  AL,'F'
JE VER
CMP  AL,'a'
JE VER
CMP  AL,'b'
JE VER
CMP  AL,'c'
JE VER
CMP  AL,'d'
JE VER
CMP  AL,'e'
JE VER
CMP  AL,'f'
JE VER

JNE ERRO_HX2

VER:
AND  AL,0FH     ; Strip ASCII code.
SHL  BX,1     ; Make room for next input.
OR   BL,AL     ; Append digit.
INT  21H     ; Read next input.
INC  SI      ; Count how many Hexadecimal numbers user input.
JMP  WHILE_HX     ; Repeat loop.

END_WHILE_HX:

CMP  SI,8
JA  ERRO_GR_HEXA

; MOV NUM_HEXA, AX
; DEC  CX
CMP  CX,1     ; Check if first value.
JE   GET_INPUT1
CMP  CX,0     ; Check if second value.
JE   GET_INPUT2

; MOSTRA_C2 error message if user enter to many or to little Hexadecimal digits.
ERRO_GR_HEXA:
MOV  AH,9
LEA  DX,HEXA_BIGGER_8
INT  21H
MOV  SI,1     ; Reset counter to intial value.
JMP  GET_INPUT1

; MOSTRA_HX2 error message if user does not enter a legal Hexa digit.
ERRO_HX2:
MOV  AH,9
LEA  DX,MESSAGE4
INT  21H
MOV  SI,1     ; Reset counter to intial value.
JMP  GET_INPUT1


;-------------------------------------------------------------------------------------


GET_INPUT2:

;MOV  NUM_HEXA, AX ;coloca o  numero a utilizar na soma dentro da variavel
XOR  AX,AX
MOV  SI,1
; pedir digitos utilizador
MOV  AH,9
LEA  DX,HEXA_MSG_2
INT  21H
; Lê do teclado e coloca em AL.
MOV  AH,1
INT  21H
MOV NUM_HEXA_2[DI],AL
INC DI
; Get input as long as input not equal carriage return.
WHILE_HX2:
CMP  AL,0DH ; compara se ja foi inserido o caracter enter da tabela ascii
JE   SOMA

CMP  AL,27
JE   FINAL

cmp  SI,13 ;backspace
JE   END_WHILE_HX2

CMP  SI, 8     ; Check if user input more then 8 Hexadecimal numbers.
JG   ERRO_GR_HEXA_2
; Verifica se é caracter valido dentro da GAMA 0..9 a..f A...F
CHECK_INPUT_HX2:
CMP  AL,'0'
JE VER2
CMP  AL,'1'
JE VER2
CMP  AL,'2'
JE VER2
CMP  AL,'3'
JE VER2
CMP  AL,'4'
JE VER2
CMP  AL,'5'
JE VER2
CMP  AL,'6'
JE VER2
CMP  AL,'7'
JE VER2
CMP  AL,'8'
JE VER2
CMP  AL,'9'
JE VER2
CMP  AL,'A'
JE VER2
CMP  AL,'B'
JE VER2
CMP  AL,'C'
JE VER2
CMP  AL,'D'
JE VER2
CMP  AL,'E'
JE VER2
CMP  AL,'F'
JE VER2
CMP  AL,'a'
JE VER2
CMP  AL,'b'
JE VER2
CMP  AL,'c'
JE VER2
CMP  AL,'d'
JE VER2
CMP  AL,'e'
JE VER2
CMP  AL,'f'
JE VER2

JNE ERRO_HX2

VER2: AND  AL,0FH     ; Strip ASCII code.
SHL  BX,1     ; Make room for next input.
OR   BL,AL     ; Append digit.
INT  21H     ; Read next input.
INC  SI      ; Count how many Hexadecimal numbers user input.
JMP  WHILE_HX2     ; Repeat loop.

END_WHILE_HX2:

CMP  SI,8
JA  ERRO_GR_HEXA_2

;mov NUM_HEXA_2, AX

DEC  CX
CMP  CX,1     ; Check if first value.
JE   GET_INPUT1
CMP  CX,0     ; Check if second value.
JE   GET_INPUT2

; MOSTRA_C2 error message if user enter to many or to little Hexadecimal digits.
ERRO_GR_HEXA_2:
MOV  AH,9
LEA  DX,HEXA_BIGGER_8
INT  21H
MOV  SI,1     ; Reset counter to intial value.
JMP  GET_INPUT2

; MOSTRA_HX2 error message if user does not enter a legal Hexa digit.
ERRO_HX2_2:
MOV  AH,9
LEA  DX,MESSAGE4
INT  21H
MOV  SI,1     ; Reset counter to intial value.
JMP  GET_INPUT2



;------------------------------------------------------------------------
; SOMA
;------------------------------------------------------------------------
SOMA:
   MOV AX,NUM_HEXA ; First number loaded into AX
SUB AX, 30h
MOV NUM_HEXA,AX
MOV AX,NUM_HEXA_2
SUB AX, 30h
MOV NUM_HEXA_2,AX

MOV AX,NUM_HEXA
MOV BX,0H  ; For carry BX register is cleared
   ADC AX,NUM_HEXA_2  ;+2 Second number added with AX
   JNC DOWN  ; Check for carry
   INC BX  ; If carry generated increment the BX
DOWN: 
MOV RES_SOMA,AX  ; Storing the sum value



   mov bx, RES_SOMA ;imprime o erro
call Imprime
JMP FINAL
Imprime PROC
mov dl, [bx]
and dl, dl
jz fim
inc bx
mov ah, 02h
int 21h
jmp Imprime 
fim:
ret 
Imprime  endp

FINAL:    MOV AH,4CH
   INT 21H
CODE ENDS
END START
Posted

Cheira me a trabalho do Isec 😉

SOMA:
MOV AX,NUM_HEXA ; First number loaded into AX

Nao podes fazer isto, estas a tentar passar um vector para um registo, o que podes fazer nesse caso e algo do tipo MOV Al,NUM_HEXA[sI], ou algo do genero, o tamanho tem que ser igual.

Posted

Boa noite .. ja tenho alguma evolução... neste momento consigo fazer uma soma direta... alguem me pode ajudar a fazer com k me apareçam letras de a...F e a somar letras ????

.8086
.model small
.stack 2048

DATA SEGMENT
HEXA_MSG_1 DB 0DH,0AH,'Introduza primeiro nr. hexadecimal a somar: ','$'
HEXA_MSG_2 DB 0DH,0AH,'Introduza segundo nr. hexadecimal a somar:  ','$'
MESSAGE4 DB 0DH,0AH,'ERRO. Introduza carater 0..9 OR A..F: ','$'
HEXA_BIGGER_8 DB 0DH,0AH,'Coloque 8 ou menos digitos, tente novamente... ','$'
RES_SOM_HEX db 0DH,0AH,'O Resultado da soma em hexadecimal e:	   ','$'
NUM_HEXA db 8 dup (0)
NUM_HEXA_2 db 8 dup (0)
RES_SOMA db 8 dup (0)
DATA ENDS

STACK_HERE  SEGMENT STACK
DW 40 DUP(0)
STACK_HERE ENDS

CODE SEGMENT
ASSUME CS: CODE, DS:DATA, SS: STACK_HERE
START: MOV AX,DATA
MOV DS,AX
MOV DI,7
MOV SI,1
; Read input from keyboard.
GET_INPUT1:
XOR AX,AX
; pedir digitos utilizador
MOV  AH,9
LEA  DX,HEXA_MSG_1
INT  21H
; Lê do teclado e coloca em AL.
MOV  AH,1
INT  21H


; Get input as long as input not equal carriage return.
WHILE_HX:

MOV NUM_HEXA[DI],AL
DEC DI

CMP  AL,0DH ; compara se ja foi inserido o caracter enter da tabela ascii
JE   GET_INPUT2

CMP  AL,27 ;escape
JE   FINAL

cmp  SI,13 ;backspace
JE   END_WHILE_HX

CMP  SI, 7	 ; Check if user input more then 8 Hexadecimal numbers.
JE GET
; Verifica se é caracter valido dentro da GAMA 0..9 a..f A...F
CHECK_INPUT_HX:
CMP  AL,'0'
JE VER
CMP  AL,'1'
JE VER
CMP  AL,'2'
JE VER
CMP  AL,'3'
JE VER
CMP  AL,'4'
JE VER
CMP  AL,'5'
JE VER
CMP  AL,'6'
JE VER
CMP  AL,'7'
JE VER
CMP  AL,'8'
JE VER
CMP  AL,'9'
JE VER
CMP  AL,'A'
JE VER
CMP  AL,'B'
JE VER
CMP  AL,'C'
JE VER
CMP  AL,'D'
JE VER
CMP  AL,'E'
JE VER
CMP  AL,'F'
JE VER
CMP  AL,'a'
JE VER
CMP  AL,'b'
JE VER
CMP  AL,'c'
JE VER
CMP  AL,'d'
JE VER
CMP  AL,'e'
JE VER
CMP  AL,'f'
JE VER


JNE ERRO_HX2

VER:
AND  AL,0FH	 ; Strip ASCII code.
SHL  BX,1	 ; Make room for next input.
OR   BL,AL	 ; Append digit.
INT  21H	 ; Read next input.
INC  SI	  ; Count how many Hexadecimal numbers user input.
JMP  WHILE_HX	 ; Repeat loop.

END_WHILE_HX:

CMP  CX,1	 ; Check if first value.
JE   GET_INPUT1
CMP  CX,0	 ; Check if second value.
JE   GET_INPUT2


; MOSTRA_HX2 error message if user does not enter a legal Hexa digit.
ERRO_HX2:
MOV  AH,9
LEA  DX,MESSAGE4
INT  21H
MOV  SI,1
MOV  DI,7	 ; Reset counter to intial value.
JMP  GET_INPUT1


;-------------------------------------------------------------------------------------
GET:
MOV SI,1
MOV DI,7
GET_INPUT2:

;MOV  NUM_HEXA, AX ;coloca o  numero a utilizar na soma dentro da variavel
XOR  AX,AX
MOV  SI,1
; pedir digitos utilizador
MOV  AH,9
LEA  DX,HEXA_MSG_2
INT  21H
; Lê do teclado e coloca em AL.
MOV  AH,1
INT  21H

; Get input as long as input not equal carriage return.
WHILE_HX2:

MOV NUM_HEXA_2[DI],AL
DEC DI

CMP  AL,0DH ; compara se ja foi inserido o caracter enter da tabela ascii
JE   SOMA

CMP  AL,27
JE   FINAL

cmp  SI,13 ;backspace
JE   END_WHILE_HX2

CMP  SI, 7	 ; Check if user input more then 8 Hexadecimal numbers.
JE SOMA
; Verifica se é caracter valido dentro da GAMA 0..9 a..f A...F
CHECK_INPUT_HX2:
CMP  AL,'0'
JE VER2
CMP  AL,'1'
JE VER2
CMP  AL,'2'
JE VER2
CMP  AL,'3'
JE VER2
CMP  AL,'4'
JE VER2
CMP  AL,'5'
JE VER2
CMP  AL,'6'
JE VER2
CMP  AL,'7'
JE VER2
CMP  AL,'8'
JE VER2
CMP  AL,'9'
JE VER2
CMP  AL,'A'
JE VER2
CMP  AL,'B'
JE VER2
CMP  AL,'C'
JE VER2
CMP  AL,'D'
JE VER2
CMP  AL,'E'
JE VER2
CMP  AL,'F'
JE VER2
CMP  AL,'a'
JE VER2
CMP  AL,'b'
JE VER2
CMP  AL,'c'
JE VER2
CMP  AL,'d'
JE VER2
CMP  AL,'e'
JE VER2
CMP  AL,'f'
JE VER2

JNE ERRO_HX2

VER2: AND  AL,0FH	 ; Strip ASCII code.
SHL  BX,1	 ; Make room for next input.
OR   BL,AL	 ; Append digit.
INT  21H	 ; Read next input.
INC  SI	  ; Count how many Hexadecimal numbers user input.
JMP  WHILE_HX2	 ; Repeat loop.

END_WHILE_HX2:


DEC  CX
CMP  CX,1	 ; Check if first value.
JE   GET_INPUT1
CMP  CX,0	 ; Check if second value.
JE   GET_INPUT2



; MOSTRA_HX2 error message if user does not enter a legal Hexa digit.
ERRO_HX2_2:
MOV  AH,9
LEA  DX,MESSAGE4
INT  21H
MOV  SI,1	 ; Reset counter to intial value.
MOV  DI, 7
JMP  GET_INPUT2



;------------------------------------------------------------------------
; SOMA
;------------------------------------------------------------------------
SOMA:
MOV DI,0
MOV AH,0
xor bx,bx
mov cx,8
ciclo:
MOV AL,NUM_HEXA[DI] ; Primeiro numero guardado em NUM_HEXA para AL
SUB AL,30h
add AL,AH
MOV BL,NUM_HEXA_2[DI]
SUB BL,30h
ADD AL, BL


MOV RES_SOMA[DI],AL  ; Guardo RES_SOMA
INC DI


loop ciclo

MOV  AH,9
LEA  DX,RES_SOM_HEX
INT  21H


;XOR BH,BH
MOV SI,7
MOV CL,7
;MOV CH,0
;MOV AX,0
;MOV DI,10
;CICLO1:
;MUL DI; DI x AX -> DX:AX
;MOV BL,RES_SOMA[sI]
;ADD AX,BX
CICLO1:

MOV AL, RES_SOMA[sI]
ADD aL, 30h

mov ah, 02h
mov DL,AL
int 21h
DEC SI

LOOP CICLO1

JMP FINAL




FINAL:	MOV AH,4CH
INT 21H
CODE ENDS
END START

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.