Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ORIG 8000h
- SP_INICIAL EQU FDFFh
- RESPOSTA STR 0,0,0,0
- ORIG 0000h
- JMP INICIO
- verifica_X: MOV R1, M[SP+3] ; Valor correto
- MOV R2, M[SP+2] ; Valor para testar
- MOV R5, RESPOSTA
- loop_X: CMP R2, 0 ; Enquanto não tiver percorrido todos os digitos hexa do número para testar
- BR.Z verifica_O
- MOV R3, R1
- AND R3, Fh ; Digito certo
- MOV R4, R2
- AND R4, Fh ; Digito teste
- CMP R3, R4 ; Se forem iguais, escreve 'X' no vector e incrementa a posição deste, senão passa ao proximo digito
- BR.NZ shift_X
- MOV R6, 'X'
- MOV M[R5], R6
- INC R5
- AND R1, FFF0h ; Zera o valor para ajudar a verficar os 'O'
- shift_X: ROR R1, 4 ; Roda para preservar os valores que não estão exatamente no sitio certo
- SHR R2, 4
- BR loop_X
- verifica_O: MOV M[SP+3], R1 ; Escreve na stack apenas os digitos que nao estavam no lugar
- loop_O_1: CMP R1, 0 ; Se todos estavam no lugar então sai
- JMP.Z FIM
- MOV R3, R1
- AND R3, Fh ; Digito correto
- CMP R3, 0 ; Se o digito for igual a zero (ou seja estava no sitio certo), salta
- BR.Z shift_O
- MOV R2, M[SP+2] ; Valor a testar
- loop_O_2: CMP R2, 0 ; Roda pelos digitos do valor teste para cada digito do valor correto
- BR.Z shift_O
- MOV R4, R2
- AND R4, Fh ; Digito teste
- CMP R4, R3 ; Se forem iguais, escreve 'O' na proxima posicao de string
- BR.Z inc_teste
- SHR R2, 4
- BR loop_O_2
- inc_teste: MOV R6, 'O' ; Escreve no vector e incremente a posição de escrita
- MOV M[R5], R6
- INC R5
- shift_O: SHR R1, 4 ; Próximo digito certo e recomeça o primeiro loop
- BR loop_O_1
- INICIO: MOV R7, SP_INICIAL
- MOV SP, R7
- MOV R1, 6515h ; Valor correto
- MOV R2, 6115h ; Valor para testar
- PUSH R1
- PUSH R2
- CALL verifica_X
- FIM: BR FIM
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement