Esta rutina será el nivel superior al interprete
colocado dos entradas atrás. Apoyándose en el intérprete, esta función
compondrá el texto completo de la instrucción en ensamblador, con los datos
correspondiente de la instrucción.
Para conseguirlo llamará con el
código máquina de la instrucción al Intérprete, el cual le devolverá un puntero
a la estructura de la instrucción. Según esta estructura, el desensamblador irá
imprimiendo los textos que representan el código de instrucción e irá leyendo
el resto de los datos para presentarlos posteriormente.
Por todo esto la instrucción
la llamé "presenta instrucción", dado que la hice de forma que
directamente presentaba en pantalla la instrucción. Para usarla, simplemente,
el programa que genera el listado de instrucciones irá situando en pantalla el
puntero e irá llamando a esta función pasando en dx el offset de la instrucción
en código máquina correspondiente.
PRES_INST.ASM
; Copyright (C) 2013 José Ángel Moneo Fernández ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/
include stdio.mac
.model compact,pascal
public pres_inst
.data
dato dw 0,0
;lista de registros para colocar en su lugar durante la interpretación de la instrucción
registro db "P0.",5 DUP (0)
db "TCON.",3 DUP (0)
db "P1.",5 DUP (0)
db "SCON.",3 DUP (0)
db "P2.",5 DUP (0)
db "IE.",5 DUP (0)
db "P3.",5 DUP (0)
db "IP.",5 DUP (0)
db "PSW.",4 DUP (0)
db "ACC.",4 DUP (0)
db "B.",6 DUP (0)
.code
extrn interpreta:near
extrn lee:near
pres_inst proc uses cx bx
;en dx se le psasrá la direccción del código a interpretar
call interpreta ;llama a la interpretación indicando la dirección en dx
mov bx,ax
mov al,[bx]
cmp al,0 ;solo codigo instrucc. de 1 byte
jnz decod1
printf byte ptr [bx+3]
jmp linea
decod1:
cmp al,1 ;1 codigo inst , 1 byte de dato
jnz decod2
printf byte ptr [bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
printf dato,@h
jmp linea
decod2:
cmp al,2 ;1codico + 2 byte
jnz decod3
printf byte ptr [bx+3]
call lee
inc dx
mov ch,al
call lee
inc dx
mov cl,al
mov dato,cx
printf dato,@h
jmp linea
decod3:
cmp al,3 ;1 codigo + 1 byte + codigo
jnz decod4
printf byte ptr [bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
printf dato,@h
inc bx
inc bx
busca1:
inc bx
cmp byte ptr [bx],0
jnz busca1
printf byte ptr [bx+1]
jmp linea
decod4: ;1 codigo + 2 byte + codigo
cmp al,4
jnz decod5
printf byte ptr [bx+3]
call lee
inc dx
mov cl,al
call lee
inc dx
mov ch,al
mov dato,cx
printf dato,@h
inc bx
inc bx
busca2:
inc bx
cmp byte ptr [bx],0
jnz busca2
printf byte ptr [bx+1]
jmp linea
decod5:
cmp al,5 ;1 codigo + 1 byte relativo + codigo + byte
jz escod5
jmp DECOD6
escod5:
printf byte ptr [bx+3]
call lee
inc dx
mov cl,al
mov ch,0
cmp cl,0
jz busc3
test cx,80h
jz positivo1
putchar '-'
not cl
inc cx
jmp short negativo1
positivo1:
putchar '+'
negativo1:
mov dato,cx
printf dato,@h
busc3:
inc bx
inc bx
busca3:
inc bx
cmp byte ptr [bx],0
jnz busca3
printf byte ptr [bx+1]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
printf dato,@h
jmp linea
decod6:
cmp al,6 ;SALTO RELATIVO
jnz decod7
printf byte ptr [bx+3]
call lee
inc dx
cbw
add ax,dx
mov dato,AX
printf dato,@h
jmp linea
decod7:
cmp al,7 ;1 codigo + 1 byte relativo + codigo
jnz caso8
printf byte ptr [bx+3]
call lee
inc dx
mov cl,al
mov ch,0
cmp cl,0
jz busc7
test cx,80h
jz positivo
putchar '-'
not cl
inc cx
jmp short negativo
positivo:
putchar '+'
negativo:
mov dato,cx
printf dato,@h
busc7:
inc bx
inc bx
busca7:
inc bx
cmp byte ptr [bx],0
jnz busca7
printf byte ptr [bx+1]
jmp linea
caso8:
cmp al,8 ;texto + direc 8 bits + texto + dato 8 bits
jnz caso9
printf byte ptr [bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
printf dato,@h
inc bx
inc bx
busca8:
inc bx
cmp byte ptr [bx],0
jnz busca8
printf byte ptr [bx+1]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
printf dato,@h
jmp linea
caso9:
cmp al,9 ;texto + direc 8 bits + texto + dato 8 bits rel
jnz caso10
printf byte ptr [bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
printf dato,@h
inc bx
inc bx
busca9:
inc bx
cmp byte ptr [bx],0
jnz busca9
printf byte ptr [bx+1]
call lee
inc dx
cbw
add ax,dx
mov dato,AX
printf dato,@h
jmp linea
caso10:
cmp al,10 ;texto + direcc 11 bits
jnz caso11
printf byte ptr [bx+3]
dec dx ;releeo el codigo para obtener la parte alta de la direccion
call lee
inc dx
mov cl,5
shr al,cl
mov ch,al
call lee
inc dx
mov cl,al
mov dato,cx
printf dato,@h
jmp linea
caso11:
cmp al,11 ;texto + bit
jnz caso12
printf byte ptr [bx+3]
call lee
inc dx
cmp al,7fh
jbe directo
push bx
sub al,80h
mov ah,al
and al,07h
push ax
and ah,0f8h
mov bl,ah
xor bh,bh
mov si,offset registro
printf byte ptr [bx+si] ;envia nombre del registro
pop ax
pop bx
directo:
mov cl,al
mov dato,cx
printf dato,@h
jmp linea
caso12:
cmp al,12 ;texto + bit + texto
jnz caso13
printf byte ptr [bx+3]
call lee
inc dx
cmp al,7fh
jbe directo12
push bx
sub al,80h
mov ah,al
and al,07h
push ax
and ah,0f8h
mov bl,ah
xor bh,bh
mov si,offset registro
printf byte ptr [bx+si] ;envia nombre del registro
pop ax
pop bx
directo12:
mov cl,al
mov dato,cx
printf dato,@h
inc bx
inc bx
busca12:
inc bx
cmp byte ptr [bx],0
jnz busca12
printf byte ptr [bx+1]
jmp linea
caso13:
cmp al,13 ;texto + bit + texto + dato 8bits
jz acaso13
jmp linea
acaso13:
printf byte ptr [bx+3]
call lee
inc dx
cmp al,7fh
jbe directo13
push bx
sub al,80h
mov ah,al
and al,07h
push ax
and ah,0f8h
mov bl,ah
xor bh,bh
mov si,offset registro
printf byte ptr [bx+si] ;envia nombre del registro
pop ax
pop bx
directo13:
mov cl,al
mov dato,cx
printf dato,@h
inc bx
inc bx
busca13:
inc bx
cmp byte ptr [bx],0
jnz busca13
printf byte ptr [bx+1]
call lee
inc dx
cbw
add ax,dx
mov dato,AX
printf dato,@h
jmp linea
linea:
ret
pres_inst endp
end pres_inst
No hay comentarios:
Publicar un comentario
Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.