Decio Filipe Melo Laranjei Posted May 30, 2014 at 10:48 PM Report #557716 Posted May 30, 2014 at 10:48 PM 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
sportex Posted June 2, 2014 at 10:43 PM Report #558011 Posted June 2, 2014 at 10:43 PM 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.
Decio Filipe Melo Laranjei Posted June 4, 2014 at 11:38 PM Author Report #558259 Posted June 4, 2014 at 11:38 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now