escuela politÉcnica nacional facultad de ingenierÍa...
TRANSCRIPT
ESCUELA POLITÉCNICA NACIONAL
FACULTAD DE INGENIERÍA ELÉCTRICA
ESPECIALÍZACION EN ELECTRÓNICA Y
TELECOMUNICACIONES
DEPURADOR DE PROGRAMAS PARA EL
MICROPROCESADOR S0486
(PARTE 3}
JORGE BOLÍVAR OSORIO HINOJOSA
ALEX JOHNINE TROYA ALDAZ
TESIS PREVIA A LA OBTENCIÓN DEL TITULO DE
INGENIERO EN LA ESPECIALÍZACION DE INGENIERÍA
ELECTRÓNICA Y TELECOMUNICACIONES DE LA
ESCUELA POLITÉCNICA NACIONAL
MAYO 1997
APKNDIC1Í G-
APÉNDICE Q
ARCHIVOS FUENTE LflSMl DE LOS EJEMPLOSDE DEPURACIÓN
G-l.
APÉNDICE G
FÜNCION.ASM
^ejemplo de programa interactivo dirigido por menú para obtener las junciones;seno} coseno y tangente de un ángulo, (para coprocesadores 80387 en adelante)
3dosseg.model small.386.387.stock 64h
ÁREA PARA DATOS
.data
menul db ' ESCOJA OPCIÓN INGRESANDO UNO DE ESTOSCARACTERES: ',10,13
db 'db 1
db 'db1
db1
db1
db 'db 'db1
db 'db 'S1
',10,13',10,13
S- OBTENER SENO DEL ÁNGULO (0-90°)',10,13',10,13
C- OBTENER COSENO DEL ÁNGULO (0-90°)',10,13',30,13
T- OBTENER TANGENTE DEL ÁNGULO (0-90°)', 10,13',10,13
E- FIN DEL PROGRAMA ', 10, 13',10,33
Menu2 db ' INGRESE VALOR ÁNGULO (.000° - 90.0°); $'
menú3 db 'menú4 db 'infinito db'Valué db ?noventa db Oselección db ?hex del Onuml db O
db Odb Odb O
tecla db O
RESULTADO = S1
PRESIONE UNA TECLA PARA CONTINUAR S1
RESULTADO = INFINITOS1
;recibe opción de .menú¿almacena ángulo en hexadecimal (grados);recibe el ángulo en decimal (grados)
¡indica si se presionó ESC o ENTER
G - 2
APÉNDICE G
posiciónans
dbdq
OO
milmiUon dd 1000000000millónconstlconst2constSdiezdeci.
dqdddddddbdt
printnumpiishaandormovmovintpopaendm
10000000018000018000180010o
macro
al.Qfha1,30hdi, alah,22.1.h
¿indica posición de la coma en ángulo¿almacena resultado en hexadecimal¡constantes
;almecena elresullado en decimal
¿imprime numero ASGH en pantalla¿guarda registros
;lo convierte a ASCH
¿iniciaíiza parámetros de intermpcion¿llama la interrupción
arith macropnshpushfinitfildcinpjnefidivjmp
norail:cmpjneJGdiv
n ocien:fídiv
hall arad:fldpiun ni
cmpjecmpjecmp
Je
cmp
axex
hexposicion,0nomilconstlhallara d
posición, 1n ocien.const2h aliara d
constS
selección,'s'senoseleccionas'senoselección,'Ccosenoseleccion/c1
¿macro aritmética
¿inicializa coprocesador¿carga valor entero hex en ST(0)¿punto decimal al inicio?
¿divide ST(0) para constl (1.80000) pa-p"a convertir a radianes y recorrer la¿coma decimal
¿divide ST(0) para constS (1800)
¿cargar valor PI en. ST(0)¿multiplicar ST(0) con ST(.l)¿se obtiene ángulo en radianes¿se desea obtener seno de ángulo?
¿se desea obtener coseno de ángulo?
G-3
ARENDICE G
cmpjecmpje
cosenoselección,'T1
tangenteselección, lt'tangente
¿se desea obtener tangente de ángulo?
seno:fsin
fildfinul
fistpjmp
coseno:feosfildfinulfístp
tangente:cmpjnemov
millónsl,st(l)
ansfin
millónst,st(l)ansfin
hex,900otrono venta, Ofín
mov bh;3£hclearscreen
cursor OcOOh
mov ah,9hmov dx, offset infinitoin1 21hjmp fin2
otro: fsincosfdiv st(l),st
físípfildJ&nulfistp
cali
ansmillón.st,st(l)ans
convdec
¿obtener seno del ángulo (radianes);contenido en ST(0)¿cargar constante millón en ST(0)¿multiplicar ST(0) con ST(1) para¿convertir valor decimal a entero¿sacar valor entero a la vañable ANS
¿obtener coseno del ángulo (radianes)
mov bh,3£h
¿obtener tangente del ángulo¿valor del ángulo = 90o?
¿indica que es tangente de 90°
¿atributo color¿macro para limpiar la pantalla
¿macro para ubicar cursor en¿fila 12, columna O
¿présenla resultado = infinito para¿tangente de 90°¿llama interrupción
¿obtener seno y coseno cíe ST(0)¡divide ST(0) para ST(1) (Seno/Coseno)¿resultado se almacena en ST(1)¿sacar valor entero a ANS¿cargar valor entero millón a ST(0)¿multiplicar ST(0) por ST(1)¿sacar valor entero (resultado) a ANS
pollina conversión a decimal del¿resultado de la tangente¿atributo color
C-4
APÉNDICE G
clearscreencursor OcOOhpiintchar menuS
movmovmovaddmovmovinldecmovmovcalidecmov
si,offse1 decibx,5al,[si+bx]al,30hd1,alah,221hbxal}[si+bx]valué, alprintitbxnoventaQeh
;macro para limpiar pantalla
;presentar menuS en pantalla
;presenta valor entero de tangente
fin: califin2: pop
popendm
readnumerolocalpushpushpushpushmovmovmovmovmovmov
llenar:movincloopmovmov
oirá: cmpjneinov
leertec:mov
convdecexax
macro thisnum, valorotraafin,eqiu)lax
exbxdxtecla, Oposición, Ofíhbx30ex, valorsijOfísel thisnumal,0
[si+bx],albxllenar
¿indica operación fue tangente
jrutina conversión a decimal del¿resultado de seno o coseno
;lee de teclado datos de acuerdo a valor¿define variables locales¿guarda registros afectados
¿indica no es ENTER ni ESC
¿número de dígitos¿ubicar datos en thisnum
¿borra contenido de thisnum
bx,0posiciorijblleertecposiciorijOflh
ah,01h ¿inicializa parámetros
£*xq diuoTIJTTI QtlTi"*" Jw-:
Ví?f)rT *"T¡ i IALSt-tJU*,* V»ü**>
"ÍI1TTTIATI-*•i"—H'V
TT'\'7"CTt.tI^C l"
;¡10 dtuCXO OUÍ
n JOSJT1O 13AÍ
TI vanL-H-**"
AOUI
AOUI
ou
• VI VA I• L-H^"'
CÍLUf
AOÜÍ
»| f_j.
duifAOUI3iiT«•*.
u nr\f »>
3U
diuo
•{rlllíSlU .MI!
OSJP.O
Tiar) 7T3 [OTIfA OmiTI»OatV W*^ ^«^Ib^A. * L^.*«r L
A pin -TtínJ fc-O i -» .j^pB.t.'^
nnt: -TTiínK*•"•* • -'""
TTT-T-nic
D 3DIOM33V
APÉNDICE G
G-6
ja emovjmp
no coma:cmp
cmpjbcmp
jmpmal:
movmovinlcalical]calijmp
carairas:movmovintretn
cnrdel:movmovintretn
fin: poppop
POPpopendm
malposición ,blequal
al,2chdecimalal,30hmalal,39hmalequall
ah,2dl,721hcarairascardelcarairasotra
dl,08hah,22.1.h
dl,20hah,221h
dxbxexax
readkey macro tniskeypush axmov si, offset tniskeymov ah,01hint 21hmovpopendm.
thiskey,alax
;esuna "," decimal?
;BEEP (carácter no aceptado)
;rnover cursor una posición atrás
;mover cursor una posición adelante
;lee un dato del tecladoAguarda registro afectado
;inic.ializa parámetros;lee interrupción tecla;guarda tecla devuelta en vanabíe
clearscreen macro ;bon"a pantalla color
c-r
APÉNDICE G
pusbainovmovmovinl.popaendiu
cx,0dx52479,hax,06QÜbJOh
cursor macro Jocatepusbamov ab,15íntmovmovíntpopaendm
printcbarpusbaleamovintpopaendm
JOhdx,locateah}2J.0b
macro text
dx,textah392.1h
¡inicializa esquina superior de ventana¡inicializa esquina inferior de ventana¡parámetros de interrupción¡llama interrupción
¡desplaza cui-sor (localizar)¡guarda registros;obtiene pantalla actual
¡llamada interrupción, inicializa valores BX¡desplaza posición de pantalla a AX¡inicializa parámetro de cursor¡llama a la inlemipción
¡imprime caracteres del segmento de datos cadena¡a ser pasada¡en (texto) se imprime hasla ($),¡se localiza, imprime desde posición¡actual de cursor
ÁREA PARA CÓDIGO
.codemov ax,@datamov ds,ax
¡dirección segmento datos a AX¡valor AX al registro de segmento
mmenu; -mov bh,70hclearscreencursor OcOOhprinlchar menxi.1
¡borra pantalla¡llairia macro cursor¡imprime menú principal
¡lee teclado para operación aritmética correctakey; readkey selección
cmp selección,'B!
¡lee opción de menú¡salir del programa?
G--S
APÉNDICE G
Jecmp
Je
cmpjecmpjecmp
Je
cmp
Je
cmpjecmp
jeimp
finalselección, 'e'finalseleccionas1
getnuselección, 's'getnuselección, 'Cgetnuselección, hcl
getnuselección, 'T1
getnuselección, 't!getnummenu
;si no, continuar
¡verificar si opción váliva
gelntfcmov bh,70hclearscreencursor OcQGliprintchar menu2
;leer primer numeroreadnumero numl,4xorcmpJe
movcmpjneinc
moveprim:movinccmpjneinc
movesec:movinccmpjneinc
moveter;movaad
eax,eaxtecla,0£QimmenubXjOposición, 0moveprimbx
ah,[si+bx]bx
posición,!movesecbx
al;[si+bx]bxposición, 2moveterbx
c],[si+bx]
;borra el menú¿desplazar cursor¿preguntar por ángulo
;lee entrada de teclado¿convertir ángulo a hexadecimal;eliminando el punto decimal
C - 9
AEENDICE G
movmuíxoraddcmpjbemovmovint
bien:
bx,10bxch,chax,cxax,90Qbienah,2di, 721h
getnu
hex,eaxnoventa, O
noven ta,0:l:frifín4novenía,0eh
¡compara si ángulo > 90*
movmovarithcmpjecmp
mov bb,3fhclearscreencursor OcOOhpiintchar menuSmovmovmovaddmovmovintdec
movmovmovInt
¡proceder con arithmetic
;hace operación seno, coseno o tangente
sig:movmovcal]clecloop
fin4: cursorprintcharmovintjmp
convdec;
decíbx34
al,[si+bx]al,30hdl,alah,22.1 bbx
cx,4ah32dl,2ch21h
al,[si+bx]valué, alprintitbxsigITOAhmenu4an,016bmmenu
;bon-a el menú;desplazar cursor¡preguntar por ángulo
¡presenta parle entera de seno o coseno
¡presenta parte decimal para todos;los casos
¡esperar por tecla
¡bifurca a menú principal y repite¡rutina conversión a decimal
ATKKDrCE C
G- 1.0
movJT1OV
movdivmovpushxormov
POP
div.movshlmov
movmovmovdivadd
movmovmovdivshladd
movmovmovdivshladd
movmovmovdivshladd
movmov.movdivshl
síjOffsetanseax,[si] ;ansedx,[si+4]milmillon ;ebxdi, offset deci ;manlisfeaxeax, eax[di], eaxeaxdiezbyíe ptr [di+5],alah,4byteplr [di+4],ah
eax,edxedx90ebx, 100000000ebx[di44],al
eax,edxecLx,0ebx,10000000ebxeax,28[di], eax
eax,edxedx,0ebx31000000ebxeax,24[di], eax
eax5edxedx,0ebx,100000ebxeax,20[di], eax
eax,edxedx,0ebx, 10000ebxeax, 16
;bon:o el contenido de mantisa
;reciduo a eax
;reciduo a eax
G - l i
APEITOICE G
add [di],eax
movmovmovdivshladd
niovmovmovdivshJadd
movmovmovdivshladdaddretn
eaXjGctxedx,0eb^lOOOebxeax,12[di],eax
eax,edxedx,0ebx, 100ebxeax,8[di],eax
eax,edxedx30ebx,10ebxeax,4[di],eax[di^edx
printitproc neíirpush axpush expush dxmovand al,0í0hmov el, 4ror al, elprmtnum.movandprintnumpop dxPOPPOP
retnprint.it endp
final: mov bh,07clearscreen..exitend
;procedimiento para imprimir números
;carga datos;man1iene solo 4 bi(s superiores
¿desplazamiento circular de cuatro bits inferiores¿desplazamiento circular;macro printnum¿cargar datos¿mantiene solo 4 bits inferiores
;fín procedimiento
¿volver al DOS
C-12
APÉNDICE G
PRÜRAT.ASM
¡programa ejemplo de uso del ratón en lenguaje enzamblador¿presenta información del modo de video y de la posición del puntero
dosseg ¿dice al enlazador que ordénelos segmento de acuerdo a¿la convención estándar del DOS
.model small ¿define un modelo de memoria tipo Small: un segmento;para datos y otro para código
.486 ¿especifica que se acepten las .instrucciones para el;microprocesador 80486
¿ÁREA PARA DATOS
.data ¿inicio del segmento de datos;**** Variables para el uso del ratónvari STRUCT
VAR11 dwVAR12 dw
vari ENDSvari vari <030>
OO
¿define una variable tipo estructura; define una variable tipo palabra (16 bits)
¿crea una variable tipo vari (estructura) , para uso¿con macros Mreseteo;y Mmovera
RESULT STRUCTVAR31 dw OVAR32 dw OVAR33 dw OVAR34 dw O
RESULT ENDSVAR3 RBSULT <0,0,0,0> ¿para uso con .macro MpresionadoVAR3a RESULT <0J0J0,0> ¿para uso con macro MLiberado
RESULT1 STRUCTVAR2J dw OVAR22 dw OVAK23 dw O
RESULT1 ENDSVAR2 RESÜLTl <0,0,0> ¿para uso con macro Mposicion
var dw O'ratonpresente db O
¿indica si el punetro del ratón est visible¿indica si el controlador del ratón est instalado
APÉNDICE G
G - Í3
¡mensajeinicial db ' PROGRAMA PARA PROBAR EL KATON EN MODOTEXTO1
db ,13,10,,! O ¡Enter (13) : pone el cursor al inicio¡Alimentación de línea (10)
db 'Presione una léela para continuar1
db 13,10db 'S1 ¡fin de string de caracteres
cont db 'H- Haga click en el cuadro o presione una tecla 'db 'para terminar1
db 13,10 ¡Enter pone el cursor al inicio y alimentación de¡línea
db ' modo video-video db O ¡almacenan el modo de vídeo en hexadecimal
db Odb 'b'db ' pagina activa-
activa db O ¡almacenan b página activa en decimaldb ' número de columnas—
columnas db Odb Odb O
cr db Odhfínsfr db '$'
contl db "x=""db 30h
punterodb 30hdb 30hdb 'y='db 30hdb 30hdb 30hdb Odh}'$'
lalinacenan el número de columnas en. decimal
;fin cíe mensaje
¡mensaje;alrnacenan ]a posición horizontal en pixels del
¡almacenan la posición vertical en píxels del puniero
;íin de mensaje
;AREA PARA CÓDIGO
.code ;ínicio del segmento de código
APÉNDICE G
C-14
ínclude mouse.asm ;se incluye el archivo de macros del ratón
extrn pasborramear
prurat:mov ax,@datamov ds,axmov es,axcali pasborra
¡incluir e] procedimiento externo Pasborra para¡borrar la pan talla.;se debe enlazar: Link Prurat] +Pasborra¡previamente debe ensamblarse el archivo¡Pasborra.asm yPruraÜ.asm separadamente
¡se pone el segmento de datos en ds y es
¡borrar la pantalla
¡Poner mensaje inicialmov ah,02 ¡mover el cursor a la posiciónmov dx,0h ;00300 (en caracteres)int: lOh
mov ex, 80rnov al,1'mov bl,17h
¡número de caracteres a poner en pantalla¡se escribe al carácler espacio blanco¡fondo azul(l), carácter rojo(4)
movmov
int
bh,0ah,9
lOh
m ov dx, offset inicial,mov ah,9inC 21,h
movint
ah,0J.6h
mov bh,0mov al,' 'mov bl,24hmov ex, .1680mov ah,9
¡página de vídeo activa es O¡función BIOS escribir caracteres y atributo desde¡posición del cursor sin alterarla¡Poner carácler y atributo en pantalla¡contenidos en al y bl respectivamente;bh indica la página de vídeo en la que se¡pondrán los caracteres
¡mover a dx Ja dirección de inicial
¡escribir el mensaje inicial
¡esperar hasta que se presione una tecla
¡fondo verde¡llenar franjas con fondo verde
APÉNDICE
G- 15
int lOh
mov ah,03hint lOhpush ex
¡obtener información del cursor y poner en la pila
mreseteo varljVar,ratonpresente ;macro: inicializar el ratón
mov varl.varl 1,105m ov vari .var 12,10 5mmovera varl,ratonpresente
;mover puntero de ratón a la posi-¡ción 105,.105 enpixels;macro: mover puntero
mov ah,0:fliint lOhpush nxpush bxpush ax
¡obtener infonnación de vídeo;al = número de car cteres por columna
;ah = niodo de vídeo¡bh = página activa¡guardar en la pila
and alsOfh
cmpjbeadd
menoraa:addmovpopmovshrandcmpjbeadd
menorab:addrnov
al,0ahmenoraaal,7h
al,30h
axcl,4al,cla!50fhal,0ahmenorabal,7h
al,30hvi de o, al
add bh,30hmov actrva,bh
mov al,ahxor ahah
¡transfoiTnar el primer dígito de número¡de columnas a¡fonnato a ASCH¡sallar si es dígito¡sumar 7 si es 3e1ra (A a F)
¡sumar 30h para pasar a fonnato ASCH¡almacenar el valor¡transformar el segundo dígilo
¡convertir el número de página a formato¡A SCü
¡transformar el número de columnas¡a base decimal y luego a formato ASCH
APÉNDICE G
G-16
cmp al,64hjb menoraJOObmov bUOOdiv bladd a1,30hmov co1umnas3al
mov al,ahmenoralOOb:
cmp al3Qahjb menoraJObmov bljlOdiv bladd al,30nmov columnas+1 ,al
mov al,ah.menora]Qb:
add al,30Hmov Columnas+2,a1
pop bxpop ax
mov ab,02mov dx,0a0abint lOh
¡primero hallamos las centenas;el número es .mayor a J OOd?;si, dividir para lOOd
;sumar 30b para pasar a ASCIT; alma cenarlo en columnas
;movemos el residuo a al;hallamos las decenas;es mayor a 10d?
;si, dividir para lOh
;sumar 30h^almacenar en columnas +].
¡movemos el residuo a al;que representan las unidades;sumar 30h para pasar a ASCH¡almacenar en columnas + 2
¡mover el cursor a la posición;lOd,.lOd (en catéteres)
mov ah,9mov dx, offset continC 21h
¡función 9 del DOS: mostrar¡un stringtenTiinado en '$'
mov cli?20.bmov ah,01int lOh
¡ocultar el cursor
lazoraí:
mov al, 7mov b1,78h
cali cuadro
¡carácter en el cuadro (punto)¡atributo del cuadro¡(fondo blanco y carácter gris obscuro)¡dibujar cuadro
APÉNDICE G
C-1.7
mov ah,02mov íint lOh;
reposición var25ratonpi;ese:nte ¡raacro: obtenerla posición del puntero;del ratón en la variable var2 Tino
xormovcmpjbmovdivaddmovmovxor
menoralOQ:pushmovmovpopcmpjbmovdivaddmovmov
menoralO:addmovxormovcmpjbmovdivaddmovmovxor
menoralOOa
dx,dxax,var2.var22ax,64nmenoralOOnx,100bxaJ,30hcontl.4-3ja1ax/ixdx,dx
axal,30ncontl-f45alaxaXjOah.menoralObl,10bla1,30b
contl+4;alal,ah
a!,30Hcontl4-5,aldx,dxax,var2.vai;23ax,64hmenoralOOabx,100bxal,30hconta-f-lOjalax,dxdx,dx;
;del ratón en la variable var2 tipo; estructura
¡transformarla posición horizontal de;hexadecimal a decimal y luego a formato;ASCH
¡transformarla posición vertical dehexade-;cimíil a decimal y luego a formato ASCH
G- 18
APÉNDICE G
push axmov al,30hmov conlJ+1.1.,alpop axcmp aXjOah.jb menoraJOamov bl,10div bJadd al,30hmov contJ+].l,almov al,ah
menoralOa:add a1,30Hmov contl,+123ítl
m ov dx, offset con IImov ab,9inl: 2Ih
mov a],''mov di, offset, cont 1 +3mov ex. 3rep stosbmov di, offset conM +] Oinov cXj3rep stosb
mov ah,Iinl: 16hjnz .finpru
;mostrar mensaje y valores de posición.
;poner los valores de posición del cursor;en blanco
;repetir stosb el .-número de veces que indica;cx
;ver si se ha presionado una tecla
;si: salir
JVtpresionado 0,var3,ratonpreseníe ;macro; obtener en var3 el estado;del botón izquierdo (0), y Ja¡posición del puntero desde la¡última vez que se presionó el bo-; Ion. izquierdo
cmp var3,var31,,.ljne lazorat
mov al,20b ;178mov bl,40h ;00caU cuadro
;se presionó el bolón;no; entonces saltar a .lazorat
AEEKDICE G
verificar:lyfliberado OjVar3a,ratonpresente
cmp var3 a,var 31. O
jne verificar
cmp var3 a. var33,70
jb lazoratcinp var3a.var33580ja lazoratcmp var3 a, var3 4,70jb lazoratcmp var3a.var345 SOja íazorat
FinPj"u:pop exmov afyOlint lOh
mmuestra 0)var5raionp]'esente
cali pasborra
mov a.int 2Jh
cuadro;mov aíis02mov dx,0909hint lOh
mov ex. 2mov bh,0
otrafila:push exmov ah}9
;macro: obtener en var3a el estado;deJ botón izquierdo (0)s y Ja¡posición del, puntero desde la¿última vez que se liberó e] bo-;tóti izquierdo;botón izquierdo liberado?
;= 1 no liberado, saltamos a verificar;hasta que se libere
;si: veiificamos si ]a posición;del puntero 3! liberar el botón¡estaba encima del cuadro (ubicado;en 70 a 80 horizontal en pixels¡y 70 a 80 vertical en pixels;si no está en los límites¡saltamos a íazorat
¡restauramos el cursor;con Jos valores antes de entrar;al programa
;macro:hacer .invisible el puntero¡del ratón
¡terminamos el proceso (programa)¡y retomar al DOS
¡dibuja un cuadro de 2x2 caracteres
APÉNDICE G
C-20
inl.CX, 2
JOh
mov ah,02mov dx,0a09hint 10h
;númer.o de caracteres a poner en pantalla;poner carácter y atributo en pantalla;contenidos en al y bl respectivamente;bh indícala página de vídeo en la que se;pondránlos caracteres
Amover el cursor a la posición;10d,9d (en caracteres)
pop exloop otra filareln
end Prurat
en el
;lazo hasta que cx=0;retorno
;se indica que el programa se ejecutapnicialmeníe desde Prurat;fin de todo el programa
C - 21
APÉNDICE G
PASBORRA.ASM
¿módulo tipo publico que es invocado desde PRURAT.ASM y sirve para borrar la¿pantalla (para monitores a color). Se utiliza el método de escritura directa enmemoria de video
pantalla equ Ob800h
.model small.codepnblic pasborra
pasborra proc near
push espush axpush expush dxpush dimov ax,pantalla
mov es,axmov di, Omov cx,2000
cid
mov al,' '
mov ah,07h
rep stoswpop dipop dxpop expop axpop es
reípasborra enclpend
¿define a pantalla como el valor OB800H
;define al módulo-como público¿define el procedimiento pasborra
¿guardar en la pila los registros importantes
¿mover a AX la dirección inicial de la memoria de¿vídeo¿pasar la dirección de vídeo a ES
¿número de localidades de memoria a escribir¿una palabra por cada carácter (un byíe de atributo y¿un byte de código ASCO)¿incremento del puntero para trabajo con cadenas de¿caracteres¿grabar en cada localidad el códgo ASCtT del espacio¿en blanco¿grbar en cada localidad de atributo el atributo 07h¿(fondo negro y letras blancas)¿escribirlas localidades de memoria¿restablecer los registros desde la pila
¿retomo¿fin del procedimiento pasborra;fin del archivo
APÉNDICE K - DSICTALASM H-1.
MODULO JNICIAL.ASM
dosseg.model small.486
;ÁREA PARA PILA
.stack 200h
;AREA PARA DATOS
.data
extrnextmexlrnextrnpublicpublicpublicpublic
ambiente: word,ejecut amen ii:bytepixelx:byte3pixely:byíe3ratonpresente:bytetabinf:near,íabbuf:nearVentNueva:byte,VenrActual:byte;vent:bytevisibledirret, mraux2;mraux3, vi d eoseg, valp trmopaiix^nopauxl3tiprut,otroaiix,colvenareamac3bmac,bgm;ic,bver
bopc dbbmac dbbver dbbgmac dbnivel dbnivell dbnivel2 dbresptrivel. dbbuffer dbbufferl dbbufTer2 dbrespbuf dbnclave dbnclavel dbncIaveZ dbx dby dbxprev dbacabar? dbmiodir dw
oooooooo8 dup(O)8 clup(O)8 dup(O)8 dup(O)
OOOOoo'QuieresO
¿bandera para mostrar subopciones¿bandera de ejec. de macros¿bandera de cbmprob. demacres¿bandera de grab. de macros¿nivel del menú actual¿nivel de la opción actual¿nivel de la subopcion actual
¿indica camino hacia menú actual¿camino hacia opción actual¿camino hacia subopcion actual
¿ubicación de BUFFER's en TABBUF
;# de opción actual;# de subopcion. actual.¿X que origino menú actual
terminar (S/N^Q^'SN1
¿Variables demacras delMASM
APÉNDICE H - TNICIALASM H-2
mopaux dbmopauxl dbm opa el: dbmbcbyte dbmbcinenii dbmbcpos dwinbcbuf dwvideoseg dwpanbuf dbmmvxl dbmmvHn dbmmvlinl dbmmvcar dbmmvdir dwmv?aux dbmv?auxl dbmpmprx dwmaylin dbmaycol dbdirsal dwtiprat dbtiprutl dbjnrauxl dbmraux2 dwmraux3 dwdirret dwdiract dwinword dwgetword dwmnmos dbmdirop dwmoslin. dbm os col dbrnpddir dw
OOOOOOO
O3680 dup(O)
OOOooooooo2 dup(O)
OOo
;sitios para paso de dato de;leclaclo sí hay rutina de escape
¿segmento de video¿sitio para salvar pantalla
¿sitio para dir. de rutinas de usuario;íipo de rutina: 1, 2 o 3;tipo de rutina de opción actual.
m c u r dwinibdir dw
fasepír dw
o2 dup(ü)2 dup(O)
OOO
Ooooof\
of \
r>\J
;Aqui se guardan, datos mientras se;corre la rutina del usuario.^Dirección de retorno
¡salida de GETKEY
¿puntero de íase de programa (73,23);p"oníero de valor que va en (73,24)
íhorrnfgrab dbfprob dbicorr dbfinnc dboíroaux dbblanco db
"Grab-A/í""Prob-M""Corr-M""Macros"G
78dup|2!
¿bandera que indica paso por "ooír".
APKNDICK H - 3
insprog db
dbdbcíbdbdbdbdb
escrnm dbnombvif dbareamac dbmacl dwnummac dbcontmcr dblongmac dbcontmac dbbufímnc dwnombmac dbnomac dbnoroorn dbgrmac db
dbborrmac dbpi'omac dbejemac dbescrncr dbinsmac db
dbdbdbdbdbdbdbdb
lismac dbpcbmac dbcolven dbcollincolexpcolactcolJact
dbdbdbdb
OPCIONES VALIDAS EN LOS MENUES.M,0" Estas son jas opciones válidas para cualquier mentí :"5G" Se puede elegir una opción por su "letra clave' o ""con las flechas y ENTER. ",0" "O presenta/quita las subopciones de una ""opción en una ventana. ";0" ESC permite salir al nivel superior de menúes. "30" T* presenta esta pantalla de ayuda.",()" AK lleva a las opciones de inacros del programa.",O11 ...Presiona cualquier tecla,..",0" Nombre del macro (7 car. máx.) o ENTERpnra salir...",0
7,9 dup (0) ;buffer para recibir el nombre del macro64 dup (0) ;indice de mncros8*64 dup (0) ;area de macrosO ;numei:o del macro actual en el ÍndiceO ;interface de macros de INICIAL y usuarioO ;longitud del macro actualO ;contador de posición en el macro actual64 dup (0) ;macro actual7 dup (0) ;nombre del macro actual
"Macros solo desde menú principal. Presiona una tecla.",0"No hay sitio para nuevo macro. Presiona una tecla.", O"Inicio grabación de macro. Terminar: AK. ""Presiona una tecla.",*)"Borro este macro (S/N)?"30323"SN""Inicio prueba cíe macro. Seguir: ENTER, Terminar: ^IC'jQ"Inicio corrida demacro. Presiona una tecla."30"Fin del buffery .fin del macro. Presiona ESC. "5033 dup (20h)3"MACROS."30
" Se pueden usar hasta 8 macros de 64 ""opciones máximo. ",0" Ingresa desde menú principal con AK,"S0" Escribe el nombre del macro. Termina con ENTER.",0" Si es nuevo, defínelo.",0" Si es viejo lo puedes probar, correr o borrar.",0" Este es el índice actual demacros:'l306 dup (20h)64 dup (20h)30
"Probar...P Correr...C Borrar...B",0J3,"PCB"bnnonn ¡atributos: color de ventanabnnonn ;color de lineabnnonn ;co1or cíe explicaciónbnsubb ;color de subopcion actualbninv ;color de opción actúa]
; Variables para uso del ratón*Para los macros:
APÉNDICE H - INICIAL-ASM
vari STRUCTvar] 1 dw Ovarl.2 dw O
var] ENDSvarratonl vari <030>
;* Para los Macros: Mposicion, MfonnaCursorvar2 STRUCT
var21 dw Ovar22 dw Ovar23 dw Ovar2 ENDS
varraton2 var2 <G,0,0>
;* Para macros: MPresiojiado,MHberado,Mocultarvar3 STRUCT
var31 dw Ovar32 dw Ovar33 dw Ovar34 dw O
var3 ENDSvarratonS var3 <0,0)030>
visible dw O ; indica si e] cursor esta activado/desactivado (.1/0)
Lineal db 4,12,20,28,36,44,52,60,68,76,0Ltnea2 db 1.36,37,63,80.0 járve para líneas 2,3,4,5Linea21 db 72579,0Linea 6 db 36,37,80,0 ;sirve para líneas 6,7LinealO db 1,36,46,70,79,80,0 ; sirve para .líneas 1.0,11,12,13,14,15
; 16J 7,18,19,20,21,22Linea23 db 7,15,24,33,39,45,53,62,72,80,0nurneroop db O ; indica cuantasa opciones hay en
; la línea de menii
;AREA PARA CÓDIGOi —
.code
extrn rinicaiear,rJ5nal:near,ñinciones:nearextm nmaxbnf:abs,restorvec:near
ninfbuf eq_u 7 ¡informaciones asociadas a bufferlonglin equ 160 ;80*2 (incluyendo atributos)íleder equ 77 jteclas pulsadas:
APÉNDICE H - OTICIAL-ASM H - 5
fleizq equ 75jQearr eqn 72fleaba equ 80cr equ 13ctrlo equ 15ctrjp equ 16ctrli equ 9ctrlk equ 11esqsi equ Odahlinsup equ Oc4hesqsd equ Obfhtínlat equ Ob3hesqü equ OcOhesqid equ Od9hbnnorm equ 7bnsubb equ 09hbninv equ 78hmaxmac equ 64
inchide inimac.asminclude mouse.asm
inicial proc near
;codigos para dibujo de cuadro
subrut
;vicleo nonnaí (B/N);siibrayado intenso
;inverso;macros de 64 words máximo
;incluir archivo de macros INTMAC.ASM
;submtinas de macros del iVÍÁSM.inicio:
movmovmovmovmovmovmovmovmovcmp
Je
addviciad dr:
movmovmovmovcidxorrepjnov
i_l: pchar
ax,@data pnicializo OS y .ESds,axbx,4ch.ax9word ptr es:[bx]ambiente, axaxs40hes,axax,es:[63h]dxÍGbOOOhax,3b4h.
vidaddrdx5800h
videoseg,dxes,dxax,0720h ;20h = " ", 07h = video normal.cx,2000
dijdistosw ;borro pantallac!325Oah ;escribo 25 LF para poner
APÉNDICE H - miCIALASM R - 6
dec el jcursor al fin de pantallajnz i_Jmov faseptr, offset fnormmov valplr,offset blancomreseteo van'atonl,visíble,ratonpresentemov varratonl.varll,77FFhmov vamttonl.varl2j7700hformacursor G,varratonJ ,ratonpresenlemmuestra 0,visible3ralonpresentemov varraton].vari 1,0 ;7mov varratonl.var.1.2,0 ;192rnmovera varratonl,ratonpresente ¿mueve el cursor del ratón a la posición
;que estaba antes de salir de pantallacalí rinic ;ratina inicial de usimrio.guarpantal]a ;muestro instruccionesImppnlayuda insprog, 8,collactgelkeyresfpan tallamov nive^O pnícializo variables q;iemov biiffer, 1 ;manejan, fliijo del programa.mov bufferl^Uh ;J.lhmov bopCjO ;no subopciones.mov bmaCjO pío macros.mov bver,0 ;no verificar rnacros.mov bgmaCjO ;no grabar macros.mov x,2 ;1 ;opcion actual
a_nivel:mov y, O ;subopcion actual
bjsubnivel:bufcla nclave3buffer ;Variables del menú actualmovbuf respbufjbuffermov al,nivelmov respnível, almovbuf bufferljbuffermov al,nivelmov niveU,al ;Variables de opción actualinc nivel 1nunivel bufferl,nivel!,xbufcla nclaveÜ sbufferjmovbuf buffer2,bufferlmov aljiíivelJmov nivel2,al ;Variables de subopcion actualinc nivel 2nunivel buffer2,niveí2,ybufcla nclave2,buffer2explica nclave2 ;Explico que hace la subopcion
APÉNDICE H - mTCIM-ASM 1 1 - 7
;muestro ventana de subopciones?
;sij pero salvo pantalla.
e_veníatia:cmp bopc,ljne b_s5guarpanlallamenuvent n clavel
b_s5:memilinea nclave ;muesíro menú,
statusf ;fase del programa ystatusv ;valor dado por usuario.rnov otroaux,0
c_ppcion:opción? ;recibe datos de teclado.mov aí,mopact ;# de la opción elegida.
c_op.l: actuar ;salta ala nitina correcta.dw offset oizc^offset oder,offset oarrdw offset oabas offset ore15 offset ootrdw offset octOj offset octp, offset octkdw offset ocll
oizq:
o den
oarr:
meni.zq nclave ;pasar a opción a la izquierdajmp b_subnivel
mender nclave ;opcion a la derechajmp b_subnive]
cmp bopc,lje c_o*"ljmp c_opcion
;subopcion. superior si.;lahayysiBOPOl
c oal:
;subopcion inferior si;laliayysiBOK>l
cmp tipnitl,3 ;opcion tiene subopciones?jz c_oa2jmp c_opcion ;no.
c_oa2: menan" nclavej. ;si.jmp b_subnivel
o aba:cmp bopc, 1je c_ob3jmp c_opcion
c_ob.l:cmp liprull,3jz c_ob2jmp c_opcion
c_ob2: menaba nclaveljmp b_subnivel
oret:inc nivel ' ;se presiono ENTER, correr.nunivel bufferjjiiveljX ;nitina de opción actual.
APÉNDICE H - DÍICIAL.ASIVI H - 8
c_or2: cmp y, Ojne c_orlcmp íiprutl,3je c_or3jmp c_oo2
c_or3: rnov xsljmp c_po2
c_orl: mov al;ymov x,aljmp c_oo2
ootr:
c ool
valida? nclaveje c_ooljmp e ventana
¿se dígito una opción desconocida.;esta entre las validas del menú?;no.
;si, correr rutina de esa opción.mov y, Umov x,alinc nivelnunivel buffer5nivelxmov otroaux, 1
c_oo2:bufcla nclave, buffer ¿aquí se transfiere el control alrutina nclave ¿usuario y este lo devuelve.
c_oo3: actuar ¿actuar de acuerdo a liprut,dw offset rnorm.,offset rinv,offset rrama
morra:movbuf buffer3respbuf ;normal, quedarse en nivel actual.mov aljrespnívelmov nivel, aljmp b_subnivel
nnv:movbuf buffer3respbuf ¿inversa, salir a nivel superior,mov al5respnivelmov nivel, aljmp íl_supemivel
rrama:cmp otroauXjljne rramalmov x. 1
rramal : jmp a_nivelocto:
cmp bopc, 1je c_ocolmov
profiíndizar.
;si BOPC=1 hacer O y viceversa.
jmpc_ocol: mov
mov
bopc, 1c_oco2
bopc,0
APÉNDICE H - H - 9
c_oco2: jmp b_subniveloctp:
guarpantallaImppntayuda insprog,8,col]actgetkeyrestpantalla
jmp b_subnivel
;mostrar instrucciones.
octk:
c okO:
mov contmcr50guarpantallamov ax,offset blancopmenu 24,colexpcmp nivel, Oje c_okOmov ax, offset nomacpmenu 23, c olla ctgetkeyjmp c_ok5
mov x,lmov y, Omov bopc,0mov ax,0push espusli dspop esmov di, offset nombufinc dimov ex, 9rep stosbino v ex, maxma cmov di,offset buffmacrep stoswmov contmaCjOmov ex, 7m ov di, offs et nombma crep stosbpop esindrnacImppntayuda, insmac, 8, colla ctmov ax, offset escmmpmenu 23, colla ctmov faseptr, offset jSnacstatusf
;Rutinas de macros.;reset a byíe de interface.
;nivel actúa] era O?
;no5 salir.
;los macros se deben iniciar;desde el mismo punto de partida.
;borrar área de nombre de macro.
;borro buffer de macros.
;borro nombre actual.
;prepara un Índice de macros.
;instrucciones de macros.
¡muestra fase del programa.
APÉNDICE H - OTIOALASM II - 1.0
;macro antiguo?
;SL¿no, grabar macro nuevo.
inbuff nombuf ¿recibe un nombre.mov si,offset nombufinc simov al, [si]cmp al,O ¿se dio nombre?jne c_ok01 ¿si.mov fa'septr,offset fhorm ¿no3 salir.statusfjmp c_ok5
c_ok01: getnmac ¿obtengo numero de macro.cmp nummaCjOffh ¿macro nuevo sin sitio?jne c_°kl ¿nomov axs offset noroompmenu 23,col]actgetkeymov faseptr, offset fiíormjmp c_ok5
c_okl: cmp nnmmac,80hjb c_ok2jmp c_ok3
c_ok2: mov ax,offsel grmacpmenu 23,collactmov faseptr, offset fgrabstatusfgelkeypush espush dspop esmov si,offset nombufadd sij2mov di, offset nombmacmov cx57rep movsbpop esmovjmp
c_ok3: sub nummac,80hmostrar pcbmac,23,coUactactuardw offset c_ok313offset c_ok32,offset c_ok33
c_ok31: mov ax,offser promac ¿probar macro.pmenu 23,collactmov faseptr, offset fprob ¿mostrar fase.statusfgetkeycali inimacmov bver,l ¿banderas para probar macro.
¿bandera de grabación,
¿macro viejo.
APÉNDICE H - HÍICIAL.ASM H-U
movjmp
inimac:pushpushPopmovmovmovmuíaddmovmovreprnovmovmovmuíaddmovmovincmovmovrepmovpopretn
bmac,lc_ok5
esdsessi offset maclaljnummaccl32*maxmacelsi,axdi, offset buf&naccx^maxmacmovswsi, offset areamacal,mimmaccl,8elsi,axal,byte ptr[si]longmac;alsidi, offset nombmacex, 7
movsbcontmaCgOes
;paso macro al. buffer Buf&nac
;obtengo datos de macro actual.
;RUTINA DE MANEJO DEL RATÓN
public pantallapantalla proc near ;rutina de tratamiento del ratón
mimiestra I,visible3raíonpresente ;macro; hace visible el puntero;deí ratón
mposicion vaixaton2}ratonpresente ;macro: obtiene la posición, del;puntero del ratón
mpresionado 0;varraton3,ratonpresente ;obtiene el estado del botón.;rzqmerdo del ratón
;ax = posición vertical;bl = pixel por carácter en y;ax/bl;se está ejecutando alguna;opción de menú?;si, ratón no debe realizar nin-;guna opción;el ratón está en línea 1 (menú)?
mov ax,varraton2.var23mov bl,pixelydiv blcinp ejecutamenu, 1
e noopcon
cmp
APÉNDICE K - H- 1.2
amovcmpjnecmpjbemov
mov
nolsi, offset linealvarratonS .var32, 1noenterlvarraton2.var22332esescejecutamemijl
aXjlcGdhfinpantalla
noenterl:mmovimiento varratonl,ratonpresentecmp varraton 1 .vari 1,0jne simo viocmp varraton] .vari 2,0je noopcion
simo vi o:
;no;si;se presiono botón izquierdo del ratón?;no
;es la primera opción(..)?¡si, enviar código de ESC¡indicar que se está ejecutando opción,¡de menú
;enviar el código de Enter
cmpjecali
cmpjecmpjecmp
jaincmovmovjmp
esesc:mov
vents 1noopcionscanlinea
x,blnoopcionbx,0ffh:finpantalla.lbl,numeroop
noopcionbxx,bl
axs4bOOhfinpantalla
ax5011bh.finpantaUa
¡se está en edición de ventanas¡si, entonces ratón no hace nada¡entrega en bl la opción sobre la
¡que está el puntero del ratón¡es igual a la opción actual?
¡se está fuera de cualquier opción?¡si, no se hace nada¡es el valor de bl. mayor anúmero
¡máximo de opciones del menú?¡si, no hacer nada
¿incrementarnos bl¡incrementar el apuntador de opciones¡código de flecha a la izquierda
¡código de ESC
nol:cmp ax,23 ¡es la línea 23 (funciones)?jne no23 ¡nocmp varraton3.var32}l ¡se presiono botón izquierdo del ratón?jne noopcion ¡no, no hacer nada.mov si,offset Jinea23 ¡cali scanlinea ¡ver que sobre que función se estámov ax,3aOOh ¡código dePladd ah,bl ¡sumar el número de opción para obtener
¡el código de la función respectiva
AEEKDICE H - INICIAL-ASM JH - 13
mov ejecutamenu, 1 ¿indicar que se está ejecutando;una opción
cmpjecmpjemov
noleer:
no23:cmpjeCITlp
jnecmp
cmpjacmpjnemovpushcalipopcmpjacmpjnecmpjne.movmovcmpjemovmov
ax,40001inoleerax,4300hnoleerejecutameniijO
fbipantalla
ejecutamenu,!noopcíonvarraton2.var21;1 ;se presionó botón izquierdo del ratón?noopciou ;noaXj2 ;es mayor que la línea 2?
noopcion ;no5 no hacer nadaas, 5 ¡está" en las líneas 2 a 5?no2_5 píovarraton3.var323l. ;se presionó botón del ratónnoopcionsi, offset Iinea2axscanJinea ;bl = ventana sobre la que está el punteroaxax?4no3bx,lno3vent;lno3
espgup:mov
¡estamos en línea 2, 3 o 4?;no¡es 3a barra de movimiento?¡no;se estaba editando ventanas?¡no
ventnueva,2 ¡activamos la ventana 2(código)al,Ventnuevaal,Ventactual ¡es ventana actual igual a ventana nueva?espgup ;siax^OfOOh ¡enviar código de TABventnueva52íinparitalla
ax^OOh. ¡enviar código de Página Arribafinpantalla
no3:cmp
cmpje
bx,2novent2ax,2noopcion
;es área de ventana 2 (código)?:no
APÉNDICE H - EflCIW-ASM H - U
mov VentNueva,2 ;activar ventana 2jmp fin3_22
novent2:cmp bx,3 ;es la barra de la ventana O?jne noventOa 10cmp vent,l ;se estaba editando en ventanas?jne activarventO ;nomov aljVentnuevncmp aljVentactual
activarventO:mov VentNueva,0 ;activar ventana Oje ediíventOjmp fin3_22
editventO:cmp varraton3.var32,l
no opción;enviar código de flecha arriba
jnemov ax,4800hjmp .finpantalla
noventOa:cmp bx,4 ;está sobre la ventana Ojne noventO ;nomov VentNueva;0jmp fín3_22
noventO:cmpjne no opción.
;es la ventana 1?;no
mov ^/'entNueva) .1 ^activar ven lana .1mov al,ventnueva ;cmp al jVen táctil al ;ventana nueva = a ventana actualje ediíventl ;sijmp fin3_22
editventl:rnov si, offset Iinea21cali scanlinea ;es la baira de ventana 1.mov ax34bOOh ;enviar código de flecha a la izquierdacmp bx,2jne Jlechaizq21mov ax,4dOGh
flechaizq21:jmp finpanlíilla
no2_5:cmp ax,7ja no6_7push ax
;código de flecha a la derecha
; está el puntero en líneas 6 o 7?;no
APETÍDICE K - 1KIOAI-ASM H - 1.5
mov si,offset lineadcali scanlinea ¡ver sobre que ventana está el punteropop axcmp bXjl ;estamos en la barra de ventana 2jne novent2a ¡nomov VentNueva,2 ¡aclualizarventana 2jmp Jm3_22
novent2a:cmp bx,2 ¡estamos en ventana 2jne noventOb ¡no.cmp vent,l ¡estábamos editando en ven tanasjn e a cti varven tO a ¡nomov a 1, ven tnu evacmp aljVentactual
ací ¡ vaivén tOa:mov VentNuevajOje editventOajmp fm3_22
edil ven tOa:cmp varraton3.var32,1 ;se presionó botón izquierdo del. ratónjne noopcionmov ax,5000h ¡enviar código de flecha abajojmp finpan talla
¡esta sobre la ventana ONoVentOb:
cmp bx,3jne .noopcionmov VentNueva,0 ¡actualizar ventana Ojmp fin3_22
no6_7:cmp ax¡22 ¡estamos en las líneas 8 a 22ja noopcion ¡nomov si,offset HnealO ;push axcali scanlineapop axcmp ax,16ja no!5acmp ax,14jb no!5acmp bx,ljne nol 5cmp ventjljne nol 5mov ventnueva,2mov a],Ventnueva
¡vemos en que posición está el puntero
¡es línea 8 a 16)¡está sobre líneas de 14 a 16
¡está en 1a barra de ventana 2;no
APÉNDICE K - IKICIA1_ASM: H - 16
cmp aljVentactuíilje espgdownJTIOV aXjGfOOh ¡enviar códig de TABjmp finpantalla
espgdown:cmp vaiTaton3.var323]jne noopcionmov aXj51QOh ¡enviar código de página abajo
fínp anta lia
nolObx,6no!5ventj.lno!5ven táctil al; 4no 15aljVenínuevaal, venta ctualiguallO_20cx,0fffeh
no.15a:cmp
cmp
cmpjnecmpjbmovcmpjnemov
retardo 1:loopjmp
iguallO_20:cmpjnemovmov
nolO:
¡cambiado 97/03/09
retardo 1espgup
vent,lno 15venínueva,5ax,0f00h.fin pantalla
¡actualizar ventana 5
cmp ax.20
cmpjnecmpjnecmp
bx,<5no!5venl; 1
movcmpjejmp
espgdownl:mov
ven tactual, 4nol 5 ¡cambiado 97/03/09aljVentmievaal, ven tactu alespgdownl
iguallO_20
APÉNDICE H -
retardo:loop retardomov ax,51GOhjmp finpantalla
JiolS:cmp bx,2ja novent2bmov VentNueva,2 ¡actualizar ventana 2jmp fin3_22
Novent2b:cmp bx,3jne NoventSmov VentNueva,3 ¿actualizar ventana 3jmp £m3_22
NoventS:cmp bx,4jne Novent4mov VentNueva,4 ¿actualizar ventana 4jmp .fín3_22
NoVent4:cmp bx,6ja noopcionmov Ventnueva,5 ¿actualizar ventana 5jmp fin3__22
noopcion:mov bx,0fflijmp jQnp antall a J.
fin3_22:mov a^SbOOh
finpantalla:mov bx,0mmueslra 0.visible.raloiipresenle ;macro: oculatar puntero de ratón
finpantalla 1:retn
pan talla endp
II - 1.7
scanlinea:mov ax,varraton2.var22mov bl,pixelxdiv blmov bx,0
mayor:cmp byte ptr [si+bx],0je nohayopcionescmpinc bx
APÉNDICE H - QíIOAUXSJVC H - 1 8
jbe menoriguíiljmp mayor
nohay opciones:mov bXjOffh
menorigual:reLn
c_ok32: mov ax, offset ejemac ;correr macro.pmemí 233collactmov faseptr, offset fcorrstatiisfgetkeycali inimacmov bver,0 ;batideras para coirer macromov bmac,J.jmp c_ok5
c_ok33: mov faseptr,offset fiíonnstatusfmostrar borrmac,23,co11act ¡borrar macro?cmp al,ljne c_ok5 ;nomov ax,8 ;sipush espush dspop esmov cl,nummacjnul cJadd ax,offset areamac.mov di,axmov ex, 8xor ax}axrep stosbmov ax,2*maxmacmov clj.nummacmuí eladd ax, offset maclmov di,axm ov cx,maxmacxor ax,axrep stoswpop es
c_ok5: restpantallajmp b_subnj'vel
octl:d_supejTiível:
getxpi' jxpi'ev^iilíimo jiibble de] buffer OO
APÉNDICE H - OTICIAL.ASM I I - 1.9
íiunivel buffer,nivel,0 ;y que ahora pasa a ser 0.dec ni ve]cmp niveljOffli ¡estaba en menú principal?je d_slmov a1,xprev 5110, voy a nivel superior.niov x,aljmp a_nivel
d_sl:moslrar acabar?324-,colexpactuard\ offset d_s3, offset d_s2
d__s2:rnov x,l ;no acabar.mov nivel, On univel bufferjtüveí, 1jmp a_nivel
d_s3:cali rfínal ;ruíina de salida del usuario,
final:cali restorvecmov visible, Ommuestra I,visibl6,ratonpresentepush axxor ax,axmov fs,axmov gs,axpop axmov ah34chint 21h
inicial endpend inicioend
CAHTULQ H - PB.04S£,áS¡yi tí. - 20
MODULO PR0486.ASM
.model small,486.datapublic tabbuf3tabiíif,nffiaxbnf:veiitiiueva,ventactual,ventpiiblíc ejecutameíiijextm visible:word
extrn dirret:iieextm videoseg:word3valptr:wordjCoíveti:nearextm niopaire:byte,niopauxl:byte,típrot:byreextm areamac:near,bgrnac:byfe,bmac:byte,bver:byteextm RegAxiDwoi^^RegBxiDword^egCxLDwordjexím RegDs:word:RegEs:word,RegCs:word,RegSS:wordextm RegSi:DwordJRegDi:Dword;RegBp:dwoi'd3RegSp:dwoj-dextm Flags:word, Eflags rDword, RegTp LDword, regfs:word,re^s: wordextrn PointerLstidworcIjXfej-Addrrdwordextm. vector2f:dword,FLoadExe:byteextm PSPparentiWORDjFileSizeiwordjFileNíinie.'b^eextm FinNormakbytejTablaBrkibyte
mnaxbuf equ 30
tabbuf dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
\# de buffers
Ilh>00h,00)is00h300hj00hs00hj00h21hs00hí00h,00hí00h300h300h,001i3IhsOOh9OOhJOOhso6lisOOhJOOh,OOh41h,OOhí001i9OOh3OOhJOOhíOOhJOOh41hJ01hJOOh,OOhJOOhsOOh,OOhsOQh41hj02h300h300h,00h,00h300hs00h41hJ03hJOOh,OOhsOOh3OCfhJOOhsOOh413ii041i300h,001i500h,00h500li500h41h,05h,001i5OOh,OOhsOOhJOOh,OOh4111,0611,001 0011,00 0011,0011,001141)1,1611,0011,0011,0011,0011,0011,001141h,26íi,001i,001i;001i,00h,001i300íi41b,361i,00h,001i,00h)00h,00h5003i41h)46h300h,00hí00h,00h,00h300h41]i5561i5001i,00)iI001i,001i,001i;001i41hJ66h)OOh)OOhIOOh,OOhiOOh,OOh'41h307h,OQh9OOh3OOhJOOhsOOh9OOh4111,0811,0011,000,0011,0011,0011,001141hs09hJOOh3OOhsOOh,OOh,OOhsOOh41Iis19h3OOhJOOhJOOh)OOhsOOh3OOh41h329h3OOhsOOhJOOhJOQh5OOh5OOh
;príncipaí;salir;an;Ínfoi-macion;depiirador;salir a depurar;dpdc
;dr *;salir a dr;drcjura;drb;dmi.
;deb;dm *; salir a dm.:drnl
H - 71CAPITULO H - i'RO-ISS-ASM * *•'-
db 41h;39hIOOh,OOü,OQb,OOh,ÜQh,OOh ¡dmbdb 41h)49h)00h;00h}00h,00ii100h300h ¡dmcdb 41hJ59h)OOhíOOh,OOh,OOh,OOhJOOh ;dmfdb 41]iJOAh3OOhaOQh,OOh,OOh,OOhsOOh ;dfdb 51h)00hj00h,00h300h)00h)00hí00h ¡salirdb 61hJOQh)OOh,QOh>OOhJOOh,OOhsOOh ¡shelldb 7].h,OOhJOOh,OOh,OOhJOOh,OOh,OOh ¡ensambladb 81hJOOhJOOhJ003iJOOhJ00]i)OOhI00]i ¡funciones
tabinf dw ofísel expO,ofFset menuOjoffset rutO ¡principaldb 3dw offset sup,offset menuO,offset salidadb 2dw offset earijoffset menuO,offset ran. ;aadb 1dw offset eijOffsetmenuOjOffeetrmfo ;infomiacion (i)db j.dw offset edjOffset md,offsetnitO ;depurador(d)db 3dw offset sup, offset md,offset salidadb 2dw offset edp3offset menuG, offset rdp ;dpdb 1dw offset edc,offset menuO,offset rdc ;dcdb Jdw offset edj, offset menuO,offset rdj ;djdb J.dw of&et cal,offset menuO,offset ral ;dldb Jdw offset edr, offset mdr,offset ruíO ;drdb 3dw offset supaoffset mdr,offset salidadb 2dw offset edrc, offset menuO,offset rdrc ¡drcdb 1dw offset edra,offset menuO,offset rdra ¡dradb 1dw offset edrb, offset menuO, offset rdrb ;drbdb 1dw offset edrm,offsetmenuO,offsetrdrm ¡drm.db 1dw offset edf, offset raenuO, offset rdtf ;drfdb 1dw offset EDIljOffset menuO,offeet rdi ;didb 1dw offset edebjOffset menuO, offset rdeb ¡debdb J
CAFUIILQ H - FR0486ASM H-22
dw offset edm,offset mdnijOffset rutO ;dmdb 3dw offset sup,offset mdm, offset salidadb 2dw offset edml3 offset menuO, offset rdml ;draldb 1dw offset edmb, offset menuO, offset rdmb ;drnbdb 1dw offset edmcs offset menuO,offset rdmc ;dmcdb 1dw offset edf,offset menuO, offset rdinf ;dmfdb 1dw offset edf, offset menuO, offset rdf ;dfdb 1dw offset efjOffsetmentiO^ffset rutO ;termina(t)db 2dw offset eshell,offset menuO,offset shell ;shelldb 1dw offset ensa,offsetmenuO,offset ensambla jensambladb 1dw offset edfjOffset menuO, offset if ;funciones(f)db 1
expO db ' l,0ean db 'Permite cargar nuevo programa a depurar (.EXE o .COM)',0eal db 'Kesetear archivo actual1,0eag db 'Graba archivo nombrado en su estado actual',Oei db 'Información sobre PKO.EXE',0ed db 'Depurador interactivo1,0edp db 'Ejecuta la instrucción remarcad a', Oedc db 'Corre hasta cumplir un. evento: dirección o condición',0edj db 'Ejecuta hasta terminar o enconlrar un punto de ruptura',0edr db 'Puntos de ruptura1,0edrc db Marca un punto de ruptura',0edra db 'Activa o desactiva un. punto de ruptura',0edrb db 'Elimina un punto de ruptura1,0edrm db Muestra la tabla de puntos de ruptura',0EDI1 clb 'Ejecuta una irisírucción',0edeb db 'Busca una instrucción en el segmento de código actual',Oedm db 'Operaciones en la ventana principal de memoria1,0edml db 'Llena desde la posición actual en memoria con un valoij,0edmb db 'Busca un grupo de ciatos desde posición actual en memoria',0edmc db 'Copia desde posición, actual en. memoria a otra área1,0edf db 'Punciones especiales',0ef db 'Findelprograma',0sup db '.Retomar al .nivel superior',O
CAPOTJLO H - PR04S6.ASM K - 2 3
eshell db 'Salir temporalmente a DOS , se retoma con EXTT,0ensa db 'Ensambla y Enlaza un Archivo .ASM previamente editado con'
db '<F6>',0mensens db 10,13,'**** Ensamblado terminado. Presiona ENTERpara Enlazaro ESC para terminar ****$'mensensl db 10,13,******* Proceso terminado. Presiona una tecla para '
db 'continuar ******$'menuO db '.. Archivo Ihfor Depurar I 1
db ' Salir sHell eXe Función',0,8,' AIDSHXF!5OfIhmd db '..Paso Corre ejecuta Reinicio pArada I Tnstr Busca1
db ' Memoria! Función',0,10,'PCJRAIBMF'5OJíhmdm db '.. Llena Busca Copia Función',0,5,' LBCF',Q:finmdr db '.. Crea Act/des Boira Muestra'
db ' Función',0,6,'CABMF',OfEh
Mf* I
revers dbwarning dbnormal dbsubbold dbboldbmenufloatcua!2cualsnoverflow dbautoseg ddautooff ddmein loe db
clbdbdbdbdb
70hOf4h79Ofh30hOO1
ivideo reverso
;atribnto para menúes
didtdtdtdtdi:dtdt
OSTOST1ST2ST3ST4ST5STÓST7NANPOS dbNANNEG clbZERO db '+0memocopl db 332 dup(O)memocop2 db 29 dvip(O)
jvariables ¡)ara funciones'instrucción incoirecta, intente otra vez'sO? ;meinoria relativa (PgUp y PgDn)? ¿memoria relativa (PgUp y PgDn)94DUP(0) ¿variables para coprocesador
¿PILA COPROCESADOR
'+N.AN•-NAN ,0
prevdiccopcopsignmsignexpdms
dwdbdbdbdd
OOOOo
¿memoria para ventanal del coprocesador¿memoria para veníana2 del coprocesador
¿puntero mamona 1 coproc.¿identifica tipo de numero de Ja pila del cop.¿signo de mantisa¿signo expon ente¿dato en. decimal del exponente
CAPITULO K - PRO4S6.ASM li - 24
vai'2 ddmantis delmantisf dtstatcon dwcontcon dw£3? dbf5? dwcodhex dwcodhex2 dwcount dbprevcod dwvjdeomodcflujo dbbnflujo dbvntmono dbvntcolor dbarchmcr dbvlinOvcodvcod2vprol
vi-egVpSW
vexpcvstkvopmlvcopOvcopl.vcop2vhm.vamvccvc.1vc2vc2svc2ovc2hvc2d
dbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
dbdbdbdbdbdbdb
OOOO
OOOOOOO
db
¿resultado de¿contiene mantisa en hexaclecimal¿mantisa en decimal¿palabra de status de] coprocesador
¿palabra de control del coprocesador¿Presentar coprocesador o No¿presentar instrucción completa o No¿contiene .igual valor que regTp
vmemrel dbvclhvdavrvbvhasvensvcond
dbdbdbdbdbdbdb
¿para código extendidoO ¿modo de video
70h,337,79h370h ¿atributos para menúes en color70h57,7,7,70h ¿y monocromáticos'winbn.vnt',0 ¿archivos de ventanas:rnonocromatico
'wincolor.vnt',0 ¿a colorPpro486.mcr',0 ¿archivo de macros'UNEAO',0 ¿nombres de las ventanas'CODIGO',0'CODIGO2'50 ¿para código extendido'PRO 1', O ¿presentad ónPRO2';0 ¿presentación'REGIST',0'KLAGS',0EXPCOD',0'STACK',0'OPCMEMl',0'MEMCOPO',0'MEMCOPl',0'A/1EMCOP2',0'HEXMEM,0
'CCOD',0'COPl',0'COP2'}0PCOP2SEG',0ICOP2OFF'J0ICOP2HEX'30'COP2DESP',0
'MEMRETJ,0DHEXT,0DASC',0fREG',0DBIN1
'HASTA',0ENS',0
'.O
CAPiniLQ K - FRO43Gj\SM H-25
vcban dbvmom dbvrdir dbvfhorm dbvrv dbv£> dbvascl dbvasc2 dbvnomarch dbvmpvil.
dbdb
vcopia dbvñmc dbVÍ1YPvayavaydvayevaym
dbdbdbdbdb
'CBAND',0"RUPNOM',0tRUPDlR',0TJNNORM',0
'REGVAL',G'DECHEX',0hASCUl!,0'ASCII^O
'NOMARCH^QKUPTURAS',0'LLENAR',0'COPIAR',0FFUNCTON1J0'AYP',0'AYA',01AYD'50'AYE',0
vayr dbvinfo dbvbarral dbVbarra2 dbvnarch dbvideo dbvcop dbvinst clbvnoarchivo db
'AYR',0'INFO',0'BARRAl',0'BARRACO
'VIDIO150'COP',0TNST',0
•NOFILE'
¡ventana de eiTor de coprocesador no presente¡ventana de error de instrucción inválida
,0barra 1 dbbarra2 dbregist dwcódigo dbpswl dbexpcod dbmeml dbslck dbmemol dbbufrup dbopcseg dbopcoff dbxxxxseg ddxxxxoff dd
dbdwdw
dwdwdw
1111 dup(!)14 dnp(0)14dup(58dup(0))23 dup(O)36 dup(?)104 dup(O)18 dup(O)104 dvip(O)168 dup(O)1,1,3,1,15 dup(17)
;buffers para ventanas
sidirldir21dir22dir23dii-24
0,0
0,00,00,00,0
¡direccionesjbuffer para ventana de rupíuras(8*21)
¡opciones predefinidas: DS:0,;DS:8, ES:lOn, DS:18h, DS:20h
¡registro segmento para memoria¡registro offset para offset
¡signo del desplazamiento¡dir. de áreas de memoria que se verán; offset, s egm enío
Tt - ERQ4SS.ASM 1.1 - 26
dir25 dwc1ir21r dwsegcocl dwoffcod dwtabcod dwproxins clwtabrup dbbanens dbtoggsub dwtoggcorre dbopcpaso dbopccorr dbrd6? dbaux dw
0,05 dup(0,0)? ;d? ¿oílldup(?)? ;lii13 dup(?)0
•i- ;t0 ;tc
'SiNo1
'Direc Cond0 ;bar9 9•i •
ceros db 10 clup('O')uno db ]\iline2 dbtiline dbulinel dbbirfcorr dwdsegm dwnlinea dbdhex3 dbdhextnr dbdhexlE dbdhexl dbdbex2 dbddec dbdbin dbdbyte dbinsbuff dbnombrk dbarchivo dbInsEns dbalrprev dbdiiprev dwatrprevl dbcual dbdirprevl dwnomreg dbmpact tlbbrup dbStackLow dwSíackHi dwsiaich dbbufin 1 dwchkl db
27 dupCJ)10 dup(' ')
(,04 dupC l)004,7 dup(O)27,28 dup(0)8,13dup(0)4,7dup(0)4,7 dup(O)10,15 dnp(O)1,0,02,0,0,0,079,81 dup(O)10,11 dnp(O)79,81 dup(O)20 dup(O)000003,0,0,0,0009
9
0
7 dup(O)6ch
¡respaldo de dir21...dir25r. inicial de desensamblado
¿offset inicia] (pagina 0);tabla de inicios de paginas de código
;linea que coincide con CS:IP;l=ruptura en esa linea
;toggle ingreso a subr., , reps;toggle corrida hasta direccion(0)/condicion
;opciones: coirer subruíinas?1 ¿opciones: hasta dirección o condición?
¿bandera para rd600 y rd-700
¿pañi rnem. relativa¿paramem. relativa
¿para recibir nemotecnico¡nombre de breaVpotnl:¿nombre de] Objetivo
¿variable para los registros
¡ruptura actual -1¿bandera para rut de rupturas
OVECTULO H - ER.O48fi.ASM: '"' ~ 27
chk21 db 13chk22 db 33regs db 'DSESSSCSAXBXCXDXSIDIBP'HneaO db 44 dup(' ');20 dup(O)lineal db 80 dup(")lOini db '</X>IVÍenúes> <F2=Ayuda>!,0FTDirecc db "DirectoF7Condic db 'Cond',0FSSiSubr db 'SÍSubr',0FSNoSubr db 'NoSubr',0tlini db 'FlEdit F2Ayuda F3Coproc F4PntUsr'
db 'F5Cod F6Asm FTDirec FSNoSubr F9Dec¿Hex FIOASCIT',0nomodo db "Modo de video no soportado.',0123d_ db TAB: próxima ventana SHIFT TAB: ventana'
db ' anterior ESC: menú principar30124d_ db 'Acceso a Jas ventanas de) depurador', OlOreg db 'Alterar valor registros',0llreg db Use las flechas para pasar de uno a otro registro',0lOban db 'Alterar valor banderas'30liban db 'Use las flechas ',26j' y ',27,' para pasar a otra bandera',0lOcod db 'Desensamblado!*: Página '.Ollcod db 26,' y ',27,': pasar al otro campo. '
db 'PGUP y PGDN : cambiar de página',0llcodl db '** ATENCIÓN: PGDN: próxima página. PGUP: página 9 **',0lOopl db 'Acceso a memoria',010op21 db 'Acceso a memoria relativa'30Uop2 db 'I y í : Cambio de página (Segmento).1
db ' PGDN y PGUP : Cambio de página (Offset)',010op22 db 'Offset para ventana de memoria relativa',0Uop2d db 'Escriba el desplazamiento con. su signo',0Jlop2o db 'Escriba el offset'jOIlop2s db Escriba el segmentólolOhex db 'Alterar memoria'jOllhex. db 'Flechas: movimiento en las ventanas.'
db ' PGUP y PGDN: cambio de páginas',0lOasc db 'CR^ENTER^O ;TAB-CF10]TAB3ESC-CF10]ESC'30123ens db "Dirección^ : . Escriba'
db ' neraotecnico o ESC para salir',0eirejis db "Este nemotécnico no es con'ecto'jOEnsBusc db 'Escriba el nemotécnico de la instrucción, que desea encontrar',0NoEnsB db 'No se encuantran mas coincidencias en el segmento de código',0EnsWl db 'Es posible encontrar el código de Ja instrucción, '
db 'pero el flujo'jOEnsW2 db ' del. programa no sera necesariamente l
db 'de la forma mostrada.'S0instruc db 'Escriba el nemotécnico de la instrucción a ejecutarse',0J23bkp db TGUP y PGDN: Pasar de página en ventana de rupturas. ESC:
CAPÍTULO H - FR04S6.ASM H - 2 8
Salir',0123cd db TAB: Pasar al otro campo. ESC: Salii-,',0123cc db 24,' y ',25,' : Pasar a otra opción.'
db ' ESC: Salir. ENTER: Opción',0123rcmp db 'Escriba el registro , o ESC para salir1,0123cmpr db '...y ahora el valor, o ESC para terminarloigual db ' ',0noesreg db 'Este no es un. registro. Presiona una tecla'
db ' o ESC para salir';0nombre? clb 'Escriba el nombre del archivo a depurar (.EXE o .COIVl) ESC =salir',0leo db 'Leyendo...', Ononomb db 'Aunno se ha ingresado el nombre del archivo. Presione una tecla ',0nohay db 'Este archivo no existe. Presione una tecla1,0longO db 'No puedo aceptar tamaño O', Oerrgrab db "Error al grabar el archivo',Ovalor? db 'Escriba el valor o ESC para salir',0bytes? db 'Escriba el número de bytes o ESC para salir1,0buscase? db 'Secuencia en ASCH o hexadecirnal (A/H)?',0busca? db 'Escriba la secuencia o ESC para salir1,0NoIíayStr db 'No encuentro la secuencia en todo el segra.ento',0sigo? db 'ENTER: Busca próxima. ESC: Terminadonoesbrk db 'No existe ese punto en la lista. Presione una tecla1,0
¡MENSAJES AL MOMENTO DE LA CARGANoVnt db 'El archivo de ventanas ha sido aíterado',0ErrAbrir db "No puedo abrir archivo de venlanas',0Errivícr db 'Error' al abiir/crear archivo de macros',0NoChild db 'No encuentro todos mis programas asociados',0ArchOK db l<Objetivo>iisto',0NoParam db '*** Atención: No tengo <Objeíivo>... ***',0MalParam db 'Archivo a depurar no enconlrado. Presione una tecla',0MalExec db 'Problemas en Ja carga del <Objetivo>...',0Listo db 'Operación terminada. Presione una tecla.',0TecSal db 'para salir1,0TecCont db 'Presione una tecla para continuar',O
¡MENSAJES DE ERROR AL CORRER PROGRAMASNoFuncion db 'Número cíe función no válida <presiona una tecla> ','$'Noarch db 'Archivo editor no encontrado <presiona una tecla> ','$'Nopath db "Palh.no encontrado <presiona unatecla> ','$'Noacceso clb 'acceso denegado <presiona unatec]a> ','$'Memonades db ' Bloques de control de memoria destruidos '
db '<presiona una tecla>'.]'$'Nomemoria db 'Memoria insuficiente <presiona una tecla> ','$'Noblock db 'Dirección de bloque de memoria inválido '
db '<presiona una tec3a>','S'
CAPITIHO K - FROJS6ASM H - 29
Noambiente db 'Ambiente inválido <presiona una tecla> ','$'NoFormato db "Formato inválido <presiona una tecla> ','$'
mensajes dw O ¡desplazamiento de los mensajes de errordw offset Noftincióndw offset noarchdw offset nopathdw Odw offset noaccesodw Odw offset memoriadesdw offset nomemoriadw offset noblockdw offset noambientedw offset noformato
varea db 50*256 dup(O) jarea de ventanas¿valores originales de los vectores de interrupción Oóh y 07ho!d6h dwO
dwOoldTh dwO
dwOerror db Oerrorcj db O¡Variables para correr Edit.com,Comrnand.com, Masm.exe, Ltnkexenarch2 db 4034G dup('')
mil db 41,''; ¡parámetros para UNICexenarchS db 40 dup(' '),0dh
Parámetros db 11,' pro486.h!p'JOdh ¡parámetros par F2Parámetros! db 1,' ',0dh ¡parámetros para COMMAMD.COM
nombreS db 'lirLk.exe',0 ¡path deLink.exeNombre2 db 'masm.exe',0 ¡pathdemasm.exeNombrel db 'command.com^O ¡path de command.comambiente dw O ¡guarda el valor del bloque de ambienle desde psp (4Ch)Nombre db 'edit.com',0 ¡path. de edil.com
narch 1 ílb 41,'' ¡parámetros para F6 y para IvrASM.exeNarch db 40 dup (' 'XOdh
viejosp dw O ¡guarda sp antes de hacer EXECviejoss dw O . ¡guarda ss antes de hacer EXEC
FCbloquel db O ¡bloques de control de archivodb 11 clup(O)db 25 dup(O)
CABTUEO K - HR0436.ASM ' "
FCbloque2 db Odb 11 dup(O)db 25 dup(O)
FCbloqueS db Odb 1.1 dup(0)db 25 dup(O)
FCbloc[ue4 db Odb 11 dup(O)db 25 dup(O)
PARA/fBLOQUE STRUCT ;Bloque de parámetros para la funciónarnbientel dw O ;4Bh de DOSparamaddress dw Oparamsegmento dw Ofcbloffset dw Oícblsegmenlo dw Ofcb2o£fset dw Ofcb2segmenlo dw O
PAKMBLOQUE ENDS
pb PARMBLOQTJE <0,0,03050,0,0>pbl PAKIvrfeLOQUE <030I0)03030I0>
; variables para uso del ratónventAcíual db O ; indica la ventana activa actaalVentNueva db O ; indica la nueva ventana seleccionadavent db Oejecutamenu db Opixely db 8 ;indican elnúraero depile] hoi-ixontal y veitical por carácterpíxelx db 8 pnicialmente se asume de 8x8 para pantalla a color de 80x25ratonpresenle db Ovar.l STRUCT
varll dwOvar!2 dw O
var.1 ENDSvarratonl varí <030>
.codepublic rinic3rfínal3;funcionesextm. panlalla:proc3savepspchild:proc,restpspchüd:procextiTi desensdet:proCjAcoríaMiMem:procextrn InstHandler63:proc3SetTerm:pi-ocextrn LoadExe;proc,ReduceLevel:procextrn ExUniq:proc1BxHasía:proc)ExPaso:proc,ExCond:procextrn AssemjproCjExTolahproc^estti-aprprocextrn AddBrkPt:proc,DelBrkPt:proc,TogBrkPt:procextrn EncRegiproCjEncSreg^roCjExTns :procexíin Uenar:proc3biiscar:proc3copiar:proc
CAPITULO K - ERO4S6.ASar H - 3 1
in elude provntasminclude jnpro.asminclude mouse.asm
shrvnlsbrmcrsbrpro
relomo macrocidmovmovmovmovmovmovmovmovmovjmpendm
ax,@datads,axaXjVÍdeoseges,axax,mraux3bp, offset diixetds:[bp],axax,mraux2ds:[bp+2],íixdword ptr din'et
;consfruye dirección de^regreso y salta.
programa ************
;Regreso general de todas las opciones a .KLU.TOSalida:
m QV ejecuíam enu, Oretomo
n'nic: caH testtrap ;para elegir nitina cíe paso a pasocali redefvect ;Kedefíne vectores 06h y OTh, instrucción
;no válida y coporcesador no presente¿determino modo de video;en AL
;ubico segmento de info
rinü: mov ah30fhint .1 Ohpush esmov bx,40hmov es,bxmov ah,es:[10] ;veo Upo ele monitorpop escmp al;2 ;acepto modos 80*25 de:16 grisesmov videomod,a1je esbncinp alj3 ;colorje modookcmp al,7 ;o blanco y negroje modookjmp modono
esbn:
CAHXULO H - PRCWSG-ASM H - 32
mov pixelx59.mov pixely,14jmp modook
modono: piint l^jnomodOjrevers ;modo no soportado, finjmp ríníf2
modook: and ah,18h ;solo dejo los bits necesariosjz rini.12 ;si son O's, es de coloridvnl: vntmono,varea,5Qmov aux.axmov si,offseT bnfhíjo ;atributos B/N para menúesjmp rinilS
rini.12: idvn vnicolor,varea550mov aux,axmov si3offset cflujo ¿atributos de color para menúes
rim"13:.mov ex,5mov di,offse(- colvenpush espush dspop esrep movsb
pop esmov ax,auxcmp aXjO ;todo bien?je rinilbpush axcali presen ;no, presenta el programacali presOprint 5,21,TecSal,bold. ;da mensaje y salepop axcmp ax, 1jne rinillprint 5,20,EiTAbrir,bolcl ;error al abrir o no hayjmp rinifl.
rinill: prinl: 5,20,NoVnt,bold ;No hay espacio o no es de ventanasjmp rinifl
rinilb:iru'mcr archmcr jleo/creo archivo de macros precíeñnidocmp ax,0 ;todo bien?jne rinmljmp rinmf
rinml: cmp ax,2 ;nuevo?jne rinm2creamcr archmcr ;Io creoje rinm2jmp rinmf
rinm2: cali presen ;errorcali presO
CATITULO K - pfi.CM86.ASM: H - 3 3
printprint
ríni2:
rinmf: movmovcalicalicalijncmovmovmovJdsmovintmovmovmovcalicalipriníprint
rn3: calimovmovmovjnc
ririiSm:calicaliprintcmpjneprintjmp
rim'3m.l:printjmp
rin¡3b:movmovmovmovmovmovmovmov
5,2.1 riniflSlackLoWjSp ;todo bien con. ventanas y macrosStackHijSS jtrato de cargar objetivoAcortaMiMemTnstHandler63ReduceLevelrini3
ax,@data ;No pudo bajar cíe niveldSjflxes,videosegdx,Vector2F ;resta uro int 63hax,2563h
2.1 hax,@datads,ax
es,videosegpresenpresO5,205NoChild5bo]d5,21,TecSal,boldrinifi.
LoatlExeax}@dalads,axes,videosegriniSb
presen jeiror al cargar p]-ogramn5 presentopresO5,21,TecSal,bold ;doy mensaje y salgo.FLoadExe54riniSm.15)20}MalParam5boldrimf
rinif
sp,StackLowss3StaclíHiax,regdsxxxxsegjEax ;ial que inicie con Dsclhexseg,eax
autoscg)caxxxxxofíjOdhexorlí)
O
CAPITULO II - EH.048&ASM
mov autooffjOcal] presen ;presenta el programacali presOprint 5,21 ,TecCont,boldcmp KLoadExe,3 ;no param?je riniSlmov siarchjOffhprint 5}205ArchOK,boldjmp rini32
rinB.l : print 5,205NoParam,boldrini32: getkey
mov si, offset lOini ;preparo y muestro linea Ocali mlinOlimpln 23,normalprint Oj23}l.lini,bmenu
rínifO: cali preopc ;prepara bufíersMEMOl yMEMO2cali pdebngcali delayretn
rinif; getkeycali rfinal ¡salida por errores desde nivel hijojmp rinif2
rinif].; gelkeyrinií2: mov ah,2 ;idem desde nivel padre
mov dl}7int 21h ¡pitarmov ah,4ch ;y terminarint: 2.1 h
presen: mov dl,0ahmov ex, 25
presl; mov ah,2 ¡limpio pantallapiish exinl: 21hpop exloop preslm ov bx, offset vpro 1vnt 'a1
mov bx, offset vpro2vnt 'a'reta
presO; posdir 0,1.9cali presOOposdir 0,22
presOO: mov di,pddirmov ex, 79
O
CAPITULO H - FRO486.ASM H - 33
mov aljOcdhmov ahjbold.rep stoswretn
delay: mov ax,4delayl: mov cx,0ffifhde1ay2: ]oop delay2
dec axjnz delay]reín
rñnal: mov di,0 ¡limpio panlalla al salirmov cx52000mov a,\',0720hrep stoswgrabmcr ;graba macroscerrmcrkls dx,Vector2F ;restauro int 63hmov ainl: 2.1hmov amov ds,nxmov Stacklow,sp ;salvo stack y sobo de nivelmov SfackhijSSmov dx,offset rfínlcali SetTerm.mov ah.,4chinf 2,1 h
rJünl: mov ax,@data ;recupero stacky regi'eso a teiminarmov ds}axmov es,videosegjnov sSjStackhimov sp,stack1owretn
rutO:jmp salida
rf: ¡ayuda menú principalcmp otroaux.O :ENXER, pasar->- J J j í
je rffcmp ,mopaux,0jne if£cmp mopauxl,60 ;F2?jne rffstodo
CAPTnlT.O 1:1 - 3ÍÍ
movmovmovmovmovmovmovmovmovmovmovmovmovmovpushmovmovmovincmovinípopmovmovint-piishmovmov
movint
movmov
movinfjnccalijmp
sim ero oria 1;pusb
ax,@dataíls,axbx, ambientepb. ambiente.1 ,bxbXjOlTset: parámetrospb . p aram a ddress, bxpb.paramsegmentOjaxbx, offset fcbloquelpb.fcbloffsetjbxpb.fcb.lsegmento}axbx, offset iebloque2pb.fcb2offset5bxpb,fcb2segmentosaxbx,offset pbdses,axdi,pb.fcb.toffsetsi,pb. ambiente!siax,2901b2.1 hesdi3pb.fcb2offsetax,290,lh21hbpviejospjSpviejoss,ss
ah, 62h ¿obtener dirección de mi PSP21h
es,bxbXj2000h ¿liberar memoria para ejecuí
ah,4ah21h.sim em oria 1menserrorbíencorridol
dspop esmov bx,offset pbmpv dx,offset nombremov ax,4bOOhint 21,bjnc bienconidol
CAPITULO H - PRCWSG.ASM H "37
cali menserrorbiencorridol:
movmovpopmov
sSjVJejosssp,"viejospbpvisible, 0
numiestra l,visibíe,ratonpresente
rfñraf:
movmovmovmovintitodocalijmp
jmp
cmp
Je
cmpjnecmpjnemovvnl;limplngetcharcaliirmj
íih,2bh,0dh,24dl,0lOh
pdebugsalidardfpn
;ayudíotroaux.Oraff,mopaLix,0raffmopaux3360raff
;oíras fimciones» menú archivos
.jENTER. pasar
;F2?
bx,offset vaya'a'24,nonnal
pdebugsalida
raff: jmp rdfun :otras fimciones
rdf; ;ajaida menu depuradorcmp otroaux.O ;ENTER, pasarje rdxfcmp mopauXjOjne rdxfcmp mopauxlj60 ;F2?jne rdxfm ov bx, offset vaydvnt 'a1
limpln 243nonnaígetcharcal] pdebugjmp salida
rdxf"; jmp rdfun jotras funcionesrdef: ;ayuda menu ensamblador
cmp otroaa\0 jBNXER, pasar
T-lCAPITULO K - PRO4S6.ASM 11 -
je rdeffcmp mopauXjOjne rdeffcmp mopauxl ;6Q ;F2?jne rdeffmov bx, offset vayevnt 'a'limpln, 24,norma1getcharcali pdebugjmp salida
rdeff: jmp rdfun jotras funcionesrdmf; ;ayuda menú memoria
cmp otroauXjO ;ENTER, pasarje rdmffcmp mopauXjOjne rdmffcmp mopauxl36Q ;F2?jne rdmffm ov b,x, offset vaymvnt 'a'HrnpJn 24jnormalgetcbarcali pdebugjmp salida
rdmff: jmp rdfun ;otras fiíncionesrdrf: ;ayxida menú rupturas
cmp otroauXjO ;KNTER5 pasarje rdrffcmp .mopauXjOjne rdrffcmp mopauxl,60 ;F2?jne rdiíFm o v bx, offs e t vayrvnt 'a1
limpln 24,norma1geícharcali pdebugjmp salida
rdrff: jmp rdfun ;otras funcionesrin fo: ;infbrm a ci on
linppnt ;limpio pantallamov bx,offset vinfo ;muesíro ayudavnt 'a'limpln 23,revei-slimpln 2prinl' l
CAPITULO H - PROÍS6.ASM H - 39
getcbarcíill pdebugmov sijoffset lOini ;preparo y muestro linea Ocal] mlinOlimpln 23,noiTnalprint 0, 23,1,1. ini,bmenu
ririifl 1 : jmp salida
ran;litnplnlimplnprintmov
rro.1: getlinemovcmpjecmpjnecmpjemovpiisbmovmovmovrepmovmovmovmov.movrej)pop
.rrnf:
;recíbe el nombre del Objetivo23,revers24Jnorma]l)23)nombre?,reversgdreset,].l,24-,arcbivogclreset,0gccod}4 ;ESC?
gccod,! ;valido?rrnlarchivo+,1,0 ;vacio?rrnfj.si,offsetarcbivo-H. ;valees ;paso a PSP del padre y a FileNameeSjPSPparentdi, 8 Ohex, 80movsbax,@dataes,ax
FileNamearchivo+2
ex, 80movsbes
prinl" 0,23,11-inijbrnemipush espush dipush expush axmov es,axmov di,offset TablaBrk ;primero borro buffermov cx,3Q96mov al, Orep stosbpop ax
CAPrniLO H - EB04S6.ASM: H-40
poppoppopjmp
rrnfl:printjmp
ral:movmov
movpushxormovmovpoplimpln.limplnpushmovcmp
; popjaeprintpopjmp
rrla; popprintcalimovmov
movjnc
rrlm:movpushpushpopmovmovmovreppoppopícidcmp
exdiesral
0,23,1 Hni5bmenusalida
;lee el Objetivo desde discoerror, 0SfackLoWjSp ¿salvo SS:SPStackHijSSaxax,axfsaaxgs,axax23,revers24}normaleseSjPSPparentbyteptres:[80hyesrrlaI,j23,nonomb3revers ;aun no tengo nombreesrrlfesl}23,]eo,revers ¿leyendo...LoadExeax,@datads,axeSjVÍdeosegrrlb
siarchjO ;con 0 índica que no se ha cargado archivoesdsesdi, offset filenameex, 80al,"stosbes
FLoadExe,4 ¿errores en LoadExe
CAPITULO H - PRO486JVSW
jne rrlmllimpln 23:reversprin 1" 1,23 ,MalParain 3 vvarningjmp rrlb.1
rrlml: print l,233MatExec.reversjmp rrlf
rrlb:mov siarchjOfíh ¡con ííh indica que se ha cargado archivomov sp;SlackLow ¡lectura OKmov ss,Stackffiprint l}23?listOjrevers
rrlbl:cali pdebvjggetchar
irlf: mov si,offset lOini ¡preparo y muestro linea Ocali mlinOlimpln 23,riQrmalprinl 0,23,11 ini,bmenu
rinif22:jmp salida.nomarch:
mov ax,dsmov si, offset fílenamemov b,\",offsetvnpmarchvnt 'a'retn
rnlinO: cali prelin ¡preparo linea Omov ax,dsmov bx, offset vlinOmov si, offset lineaOvnt 'a'retn
H-41.
pdebug:cal! mreg ¡prepara y muestra: .REGTSTcmp banens,! ¡Si BANENS=1,no mostrar códigoje pdeb21mov ax,regcsmov segcod,axmov Ea^regjp ¡si REGTP esta en pagina actual,cmp aXjOffcod ¡no cambiar de inicio de paginajb pdeblcmp ax,proxinsjb pdeb2
pdebl: mov oiícod,axpdeb2: cali mcod ¡CÓDIGO
cali nomarchpdeb21:
CAPITULO H - EROJ86J\SM M - 42
cali mroem ¡MEMcali mstk ;stck (stack)cali mexpc ¡EXPCODcali mreg ;prepara y muestra; REGISTcali mpsw ¡PSW1 (banderas)
;Presentar instrucciones completas??=1 si
;debo presentar ven tan a del coproc?;no fí?=0--> no présenlo
=1 —> lo resento
dntos nila conrocesador
¡présenlo stat y cont del coproc.
cmp f5?,Jjne copf3?cali mcodcali nomarcb
copf3?: cmp f3?,ljne cop41cali rdfBmmrmiestra n.visibíe.ratOTinresen1;emov ax,dsmov bx, offset, vconOvnt 'a1
mov aXjdsm ov bx. ofTset vcop 1mov si, offset memocop!vnt 'a1
mov ax,dsmov bx, offset vcop2mov si, offset memocop2vnt 'a'mm uestra 1 jvistble,ratonpresente
cop41; cmp FinNormalj] ;acabo?jne pdebSmov bXjOffsetvfnorm ¡ventana de terminaciónvnt 'a1
getcbarxor FinNonnal,!jmp pdebug
pdebS: retn
fijnciones:limpln 23,nonnalprint Oj2
rinif44: i'etn
mcod: piish ds ¡Preparo el buffer CÓDIGO con 13;instnicciones desensambladas
¡y lo muestro en pantallapusb esmov sijOffcodmov di, offset código ;En PRQXIHS sale offset de prox.mov ax5@data jinstniccionmov esaxpush dimov cx:14*58 jlimpío buffer
CAPITULO H - PJMWSSASM H-43
mov al,20hrep slosbpop dipush di ^impio TABRUPmov di, offset tabnipmov ex, ,13mov a1,0rep síosbpop dipnsh dimov GXjSegcodmov aljChhexascmov íiljClmov cx,bxhexascmov ax,cxxchg al,ahxchg bl,bhmov aux,axmov aux+2,bxpop dimov di, 14mov dhjGffh
pcocíO: mov aXjSegcodcali ' pcrOcmp ítxyegcsjne pcodOlcinp Esi,regipjne pcodOlmov dh,14sub dh,dl
pcodOl; mov ¿x,aiustoswmov -íiXjíHJX+Sstoswmov ds,segcodcali desensdetmov bx}@daíamov dSjbxadd si, exadd díj54
¡guardo el valor del segmenlo que¡ira al inicio de todas las lineas
;13-DL-# de linea (0-12);# linea a resaltarse
¡coincide el CS?
¡coincide el IP?
¡si ambos coinciden, linea debe resaltarse
¡escribo segmento
¡desensamblo linea
cmp byte ptr [di-2],' 'jne pcodScmp al,0jne pcodl
;Si la linea no es muy larga¡pongo el tipo de instrucción.
¡AL = 0 --> byte ptrmov byleptr[di-i],'B'
CAlTriJLO K - PRO4S6-ASM H-44
jmppcodl; cmp
jnemovjmp
pcod2; cmpjnemovjmp
pcodq: cmpjnemovjmp
pcodt; cmpjnemov
pcod3; cmpjnepnshmovmovP°P
pcpd31; CTTIPjnemov
cocl6: deejnz
cod7: poppopmovmovmovvntmovmovpushmovmovpopvnt
pcodSíiljl ;AL ~ 1 —> word pír
pcod2byte plr [di-iywpcodSa],2 ;AL = 2 --> dword pírpcodq ;AL — 255 --> nadabyte plr [di-iyP'pcodSalt3pcocltbiteptrrdi-iyQ'pcod3
pcodSbyte pír [di-l],1!'dl,9pcoclSlax
preveo d,íixax
dl:2c-od6
dipcodOes
dsax,ds ;venlana Código.bx,offsetvcodsi,offset código'a1
ax;dsbx, offset vcod2axax,prevcodsi,axax'.,'
codfin; cmp dh,0ffhje pcodSadd dh,3
mov di, 11posdirdljdhmov dijpddir
;no hay línea que resallar
H - ER0485ASM H-45
ncIDOVmov
pcod4: stosbincloop
pcod5: caliretn
dicx;26al,07h
dipcod4pcrOQ
p-esalto linea CS:IP
;resalto bkpts
code?; pushacmp f5?,lie codeO
codeO:
codel ;
pcrO:
wtiucalicalijmpmovmovmovvntmovmovpvishmov.movP°Pvntcalipoparetn;veo si
J.I.AI Wii ,.UVJ
mpswmmemcodelax,ds ;ventana Código.bx, offset vcodsi, offset código'a'ax,dsbx, offset veo d2axaXjprevcodsi^axax'a'nomarch
AX;SI pertenecen a TABLABRK y si es asis
pcrO.1.
;pongo un, 1 en la entrada respectiva de TABRUP si;es punto activo o 2 si es .inactivostodomov dijOifset TablaBrkmovmovmovmovsh.lcmp
Je
cmpjnecmpjnemov
eh,Q ;GH^ del bkpt buscadobl.ch
cls4bXjd -multiplico por 16byte ptr[di+bx],0 ;veo si termine la tablapcr03[di+bx+12]ísi ;offsetigiial?pcr02 ;no[di+bx4-14]sax ;si, segmento igual?pcr02 ;no
CAPITULO II - FHO436JVSM Ff - 46
cmp [di+bx-H.],al ¡si, hay un. bkpt. Desactivado?jne pcrOllmov al,l ¡si
pcrOJ 1: inc al ;AL=1 activos, 2 inadivosmov bl,13sub bl,dlmov di,olTset TabRupmov bh,0 ¡BX-i-DI apunta a enlrada en TABRUPmov byte ptr[di+bx],aljmp pcr03 ¡salgo
pcr02: inc ch ¡preparo siguiente búsquedajnz pcrOl
pcr03; rtodoretn
pcrOO: ¡busco en TABRUP las lineas que tienen bkpts y las resallo.mov nlinea, Omov si,offset TabRup
pcrOOl: mov bl,nlinea ¡para cada linea veo si debo resaltarmov bh,0cmp byte ptr[bx+si],0je pcr002 ¡no resaltojnov l,2h ¡resaltocmp bylept.r[bx+si],3 ;es aclivo?jne pcr003mov dl,4h ;si, video reverso; no, s
pcr003;mov ch,bladd ch,4posdir l,chmov di,pddirinc dimov al, dicali rdcdOl ¡resalto 4 casillas
por002: inc nlineacmp nlinea, 13jne pcrOOlreín
prelin: mov bx,di ¡preparo LINEADmov di, offset lineaOpush espiish dspop esmov al,1' ¡primero borromov ex, 44rep stosb
prll; mov ex, 44 ¡escribo LINEAOmov di.ofísel ÜneaO
*[K SupxXE dodxo dod
AiSOjS
'[G Sqox-iqs
£jo AOUCxo qsndXE qsnd
AOLU
AYSOJS
:£[B Svjoxxe dodxo dod
AÍSO.JS
[O AOLU
Xo qsndXB qsnd
AOUI
aiiídaicE
jíquoso oí
XB dodxo dod
AVSO}S
ITP^
'p AOLU
xo L|sndXB qsnd
AOLU
so dodsp qsndss qsnd
cip AOUI
dod
qsojsof
dixioqspot -Ttí-lcí
CAPITULO ir - FRO4gffj\SM
stoswmov eax,RegBxpush axpush exmov el, 16shr eax,clxchg al,ahstoswpop expop axxchgstosw
movpushpushmovshrxchgstoswpop
POP
xchgstoswmovpushpushmovshrxchgstoswpoppopxchgstoswmovpushpushmovshrxchgstoswpoppopxchgstoswmov
eaXjRegBpaxexc1,16eax,clal,áh
exaxal,ah
j,eax3RcgCxaxexel, 16eax,cla!3ah
exaxaljah
eax}RegSiaxexel, 3 6eax,clal}ah
exaxal?ah
EaXjReglDx
;Leo un registro del usuario
;pongo MSB antes de LSB;y guardo en ef buffer.
CAPITULO K - EROJSfiJVSivr1 1 - 49
pushpushmovshrxchgstoswPoppopxchgstoswmovpushpushmovshrxchgstoswpoppopxchgstoswmovpushmovshrxchgstoswpopPopxchgstoswmovxchgstoswmovxchgstoswmovxchgstoswmovxchgstoswmovxchgstoswmov
axexel, 16eax,cla]3ah
exaxal,ah
eaXjRegDiaxexcl.16eax,clal,ah
exax31,3*1
eaXjEflagsexc],J.6eax,clal,ah
exaxal:ah.
ax3RegFsal,ah
aXjRegGsal,ah
ax,RegCsa!3ah
ax,RegDs ;E1 orden de los registros es ela1,ah ¡adecuado para la ventana REGISTRO.
aXjRegEsal,ah
ax.ReaSs
T'xq
ZAiSdd
AOUI
qsojsAOUI
ouf
.L'xeSAisdd
AOUI
qsojsAOUI
oufpl
J/XG
iMsdd
pMsdd
AOUI
qsojs :iA\sdtlAOUI
ouf[M
AOUt
qsojs :pMsddAOUI
ouf
j/xeOMsdd
p'xq
gcg'xqsrro'ip
AGUÍ
qsojs :AOUI
oufpj
AOUI
AOUI
AOUI
:oA\sdd
TAVSd
qsojs[A\sd ps^o'tp
8*xo
p oidiuijí ,0/XG
spS9
AOUI
AOUI
AOUI
dodqsnd
qsnd :Msdui
GUG;UOAÍ
AOUIAOUIAOUIdod
A\SOJSSqox
OS-H • H Diimsvo
CAHXULO K - ERO486.ASM I I - 51
jncmov
ppsvva: slosbmovreíreíjncmov
ppswp: stosbmovreíre]jncmov
ppswc: slosbpopmovmovmovvntretn
mmem:
ppswaax,T
;Aax-,'0'bx,lbx,lppswpax,T
;Pax3'Q'bx,lbx,.lppswcax,T
;Gesax,ds ; Ventana Pswbx, offset vpswsijOfísetpswl,a,
mmemx:
mmeml: mov di,offse1 .memlmov dx,dspush espush dspopmovm ovmovmovxchgmov
esex 52
;cls=es
si,axeax,xxxxsegax,dxds,dx
mmemll: movswdec excmp ex, Ojne mmemllxchg ax,d\mov ds,dxpop esmov ax,ds ¡ventana Opcmemlm ov bx, oJís e 1: vopm .1m ov si, offset mem o 1vnt 'a'
CAPITULO X - FRO4SC.ASM: 11 - 52
mstk:
pstkl:
pstk2:
mexpc:
movmovmovvntmovmovmovvntretn
pushmovmovmovmovmovmovmovxchgmovsubaddloopmovmovmovxchgmovsubaddlooppopmovmovmovvntretnmov
movpushpushmovhexascmovxchg.
ax,ds ¡ventana Hexmembx, offset vhmsi, offset meml'h'ax,ds ¡ventana AscmerabXjOffsetvamsi, offset meml'a'
esex, 4 ¡preparo buffer STCKsi, 14 ¡segunda columna.bx, offset stckdi,0ebp,regspes,regssax,es:[bp-Hli]al,ah[bx+si],axsi, 4di}2pstklex, 5 ¡primera columnasi, 16ax,es:[bp+di]al,ah[bx+si],axsi, 4di,2pstk2esax,ds ¡Ventana StackbXjOffsetvstksis offset stck'h'
bXjTegcs ¡pongo en EXPCOD los valores de Cs e Ipdi3offset expcodbx ¡reges a la pilabxal:bh
ax5bxaljflh
nush es
CAPITULO H - MMM86.ASM H-53
dses
push
popstosw
POP
popmov"h ex asemov ax,hxxchu; al,ah
esbxa!3bl
nush
cod2:
esdses
esebx,regipbxbxa!3bh
ax,bxal,ah
esdses
esbx
popstoswpopmovpushpushmovhexascmovxchgpushpushpopstoswpoppopmov al,blhexascmov ax,bxxchg al ihpushpushpopstoswPOPmovmovmovaddcal]movcmpJeaddcali
;regip a la pila
esdses
¿valores de Cs e Tp almacenadosescount,14bXjOffsel'códigosi,offset codhexbx,4
codOOedx,regipax,dxcodObx558 ;60
codOO
a-54CAPmiLO H - PSO4S6.ASM
codO:
codeírcodl:
cod5:
codSl:
dec countjz coderrjmp cod2add bx,58 ;60'mov sijOffset codhex2cali codOOsub ax,codhexcmp ax,14ja coderrjmp codl: mov ax,14mov cx,axmov ax5@data ;p<mov es;axmov dijoffset expcod-Hpop si ;spop ds ;push exmovsb :dec dimov bl,byte ptr es;[di]mov a!3blhexascmov ax,bxxchg al,ahpush dspush espop dsstoswpop dsdec exjnz cod5pop axmov cXj28sxib cx,axmov al/ 'push dspiish espop dsstosb
loop codSlpop dsmov ax,@datamov cJs;axmov eSjVideosegmov bxs offset vexpcmov ax.ds
;paso 14 bytes de código a EXPCOD-t-4;es=@datat
;si=regip;ds~regcs
;ds;si —> es:di
;lleno con blancos lo restante
;(cs;ip —> @data:offset expcod+4)
;presenTo venííma
CAPITULO H - FR04S6.ASM I I - 55
rnov si, offset expcodvnt 'a'retn
codOO: mov al^bx] ¿conversión del ascii a hexadecimalcali rgd03mov el, 4shl dh,cl ;dh contiene ubicación en gdtab del ascii
movmovcaliaddmovcalimovshlmovmovcaliaddmovretn
,rgd03
a!3[bx+2]rgdGScl,4dh,cl[si],dh
rgd03[si],dbax,[si]
;MSB Iransfoirnado^convierto LSB
;[si] = ascii convenido en he.xadecimal
preopc: movmovmovpushpusbpoprep
POPC2; movmovmovmovmov
popelJ; movmovhexascmovxchgstosvvmovmovhexascmovxcbgstosw
ex, 104 jpreparo buffer MEMO1di,offset memol ;en base a OPCS.EG, OPCOKF,al,1 ' ;XXXXSHG yXXXXOKF.esdsesstosb ¿primero borro MEMO2
dijOffsetmemo.l. ¿escribo MEMOJ.ebx,XXXXSEG ¿segmentoedx,XXXXOEF ¿offsetcx313^P5bx ¿guardo BX.bx,bp ¿escribo direccionesaljbh ;de la primera ventana.
alsah
bx,bpal,bl
ax,bx
CAEHULO K - PRO486.ASM tí-56
rdp:
mov al,dhhexascmov ax,bxxchg ;il,ahsloswmov al, dihexascmov ax,bxxchg al,ahstoswadd dx,8loop popclJpop es
reta.
;Correun paso del programacmp error, Ojne íinrdpcmp siarchjO ;híi:y archivo para depurar?jne pasar ;si, procedermov bx5offset vnoarchivovnt 'a' ¿ventana de error de archivo no presentemov ah,0int • .16hcali pdebugjmp salida ;no} tenninar
pasar:usrpromov word pír xferaddr, offsetmov word ptr xferaddr-K2,cspush toggsubpush sipush dspush axmov Ksi,Reg7pmov ds,RegCsmov a!,[si]cmp al,0cdhpop axpop dspop sijne Nolníenippush dspush simov esi,regipmov ds,regcsmov al,[si+l]
;nointenipcion
;DS;ST - apuntador a la instrucción
;es una TNT?
CAPITULO H - ERCWS6.ASM H - 57
pop sipop dspush eaxcmp aJ,]Objtie int21?mov eax,regaxcmp ah,00jne .in!21?usrpromovvntmovintusrproPOPpop
jmpint217: pop
movNolnlerup:
cmp toggsub,0pop toggsubjeJ^P
bXj offset video'a1
ah,GO16h
eaxtoggsubyalyeaxtoggsub, 1
:fin alizar
¿ingreso a subnitinas,reps,]oops?
rdp2: jmp
rdp2expasoexuniq
;no
YaEj: mov ax,@datamov ds,axmov es,videosegusrpro
finrdp:mov visib]e,0mmueslra ].,visiblesratonpresentecali erroricjmp salida
eiTonc:cmp error, 1jne nointemov bx5offi>et vinstjmp shoit mostrare
noiníe:cmp error, 2jne noerrorcm ov bx, offset ve op
mostrare:vnt 'a'geíchargefchar
CAPITIILO K - FRO486.ASMH - 58
no errare:caliretn
modvid:movinfcmpjemovmovintmovmov
pushamovint
popadecjnzmovmovint
bien vid:retn.
rdc:movcmpjnecmpjnemovvntmovintcalimovjmp
correr:limplnlimplnmovmovcmpje
pdebxig
ah,0fhlOhal,videomodbien vidaljVideomodah,0lOhcl,24dl,0ah
ah,2 ;Uso rutina del DOS para escribir DL21h
el ;cursor al fin de pantallai_lz30,02dx, ,1200hlOh
errorcjjOffherroi^O ;está activado el indicador de error?rdcfsiarch}0 ;hay archivo para depurar?correr ;sibx, offset vnoarchivo'a' ;ventana de eiror de archivo no presenteah,016hpdebugerrorcjjQ
salida ;no. tenninar;Coire hasta la ocurrencia de un evento
23,revers24, normalword ptr xferaddr, offset YaEJHasWord ptrxferaddr-í-2,csloggcorrejO ^Hasta dirección?rdcd
CAFmJLO H - PRO4Slíj\SM: 1.1 - 59
rdcd:jmpmovmovxchgpushhexasepopxchg
rdccax,RegCs ;Corrida hasta cierto puntoword ptr dhexl+6,axa1,ah ¡Hago que CS usuario sea seg. preclef.ax ;para lo que simulo condiciones
axbl.bbword ptr dhexl+23bxbufcorr,bx.a1,ah
movrnovmovh.exascxchg bl,bh
wordbufccbyte *bx,offset vhas ¡ventana para recibir datos (CORRE HASTA
¡CIERTA DIRECCIÓN)
movmovmov
rdcd} : movmovmovvntprintmovcmp
Je
movmovmovjmp
rdcdll: caligetdata
calimovmovcalimovcmpjecmpjnecalijmp
rclcdl2; cmpjne
rdcd2: movrdcd21:call
wordptr dhe;bufcon-f2,bxbyte ptr dhexbx, offset vhaíax,ds ¡'si, offset bufcc'a'1,23,12300,1^gdreset,!byte p ir bufccrdcdllax,' 'bufcorr,axbufcorr4-2,ax
,rdcd2rdcdO ;T10,20}dnex1sTfuncionesa1,atrprev ;di,dirprevrdcd03gdreset,0gccod,0rdcd2gccod,?rdcd 12funcionesrdcfgccod,5
rdcdllgdresel,!rdcdOO :
¡resalto campo de segmento1 ¡recibo segmento
¡quito resaltado
¡dato valido?
¡ESC para abortar
¡TAB para pasar
¡resalto campo de offsetgetdata 17520)dhex23'h! ¡recibo offsetcali funciones
O
H: - ERQ486.Asivr H. - 60
mov aljatrprev ¿quito resaltadomov dijdirprevcali rdcdOlmov gdreset50cmp gccod,0 ;dato valido?je rdcd3cmp gccod, 7 ¿ESC para abortarjne rdcd22cali funcionesjmp rdcf
rdcd22: cmp gccod,5 ;TAB para pasarjne rdcd2.1jmp rdcdl
rdcd3: usrpro ¿Pantalla de usuario<~>PROmov bx,word. ptr dhex2-t-6mov word ptr pointerlst,bxmov ax,word ptr dbexl+6mov word ptr potnlerlst+2,axjmp exbasta
rdcc: mov bx,o(Tsetvcond ;ventana con las condicionesvnt 'a1
print l,23,123ccjreversmov nlinea,0 ;para cada linea...
rdccl: cali rdccO ;resalto linea actualge tenarmov al,atrprev jquito el resaltadomov dijdirprevcali rdccOlcmp gccod, 1 ;ENTER?je rdcc2cmp gccod,4 ;ESC?jne rdcc]. 2cali funcionesjmp rdcf ¿abortar
rdcc!2: cmp gccod,5 ¿especial?jne rdcclcmp gcascü,72 ;si, arriba?jne rdccl, 3clec nlínea ;sicmp nlineajOffhjne rdcclmov nlinea,2jmp rdccl
rdccl.3: cmp gcascii,80 ¿abajo?jne rdcclinc nlinea ;sicmp nlinea,3
CAPITULO H - rRO486-ASa[ H-61
jne rdcc.1mov nlineíijmp rdccl
rdcc2: calicali
¡restauro pañi alia
¡condición de bandera?
;ESC?
;recibi un reg?
mexpcmstk
cmp nJinea,2jne rdcc21jmp rdcc5
rdcc21: mov bx, offset vrv ¡ventana para condiciónvnt 'a1
limpln 23}revers ¡registro - o o xxxxprint l)23,123rcinp,revei'smov iguaB-4,—'cmp nlinea,0 ¡igualdad?je rdcc22mov igual+4,Qd8h ¡no, desigualdad
rdcc22: print 9,20,igual)normalmov gdreset,!
rdcc221 :geíline 9,20,nomregmov gdresetjGcmp gccodj4jne rdcc23cali funcionesjmp rdcf
rdcc23: cmp gccod,!jne rdcc221mov si,offset nomreg+2 ;si recibí, es reg. normal?mov cljO ¡en CL enviare una banderacali EncRegjne rdcc25mov cl,lcali EncSregmov cl5ljne rdcc25limpln 23sreversprint 1,2getcharmov ax,geíwordcmp ¡11,27 ¡ESC?je rdcc24jmp rdcc21
rdcc24:jinp rdcfrdcc25: ¡aquí ya 1engo el registro, ahora recibo el valor
push exmov aux^axlimpln 23:reversprint 1,23,123 cmpr,revers
;no, es de segmento?
;no, en-or
CAPITULO H - ERO4S6.ASM H - 62
mov gdreset,!,rdcc26: cal! rdcc260 ¡resalto el campo
pop excmp cí,0 ¡registro normal?jne rdcc261test byteptraux3.18h ¡si, 8 o 16 bits?jnz rdcc2ólgetdala .H^dbyte/b1 ;8 bitsjmp rdcc262
rdcc26Í:test byíe ptr aux,16jnz ruplj
getdata IS^O/lhex^'h1 ;16 bitsjmp rdcc262
ruplj: mov cua12,lgetdata LS^dhexle/h1 ;32bils
rdcc262:mov gdreset,0cmp gccod,7 ;ESC?jne rdcc27jmp rdcf ;si,salgo
rdcc27: cmp gccod^O ;tengo dalo?jne rdcc26jnov ah,0 ;si, preparo llamada a ExConclcmp d}0 ¡registro normal?je rdcc28
mov ah,80h ;no, de segm., bit 4 de AH = .1rdcc28: mov al,byte ptr aux
add ah,alcmp cI30 ;reg. normal?jne rdcc281test byte ptr aux,18h ;si, de 8 o 16 bits?jnz rdcc281.mov bl,dbyte44- ;8 bitsmov bh,0jmp rdcc282
rdcc281:test byte ptr aux, 16jnz rdcc28.1jmov bx,\vord ptr dhesl+6 ;16 bitsjmp rdcc282
rdcc281j:mov ebx,dword ptr dhexlE+10 ;32 bits
rdcc282:pushadusrpro ¡Pantalla de usuario<~>PROpopadcmp nlinea,0 ¡igualdad?
CAPITULO K - PR04S6.ASM H - 6 3
¡ENTER?
¡ESC?
je rdccSjmp rdcc4
rdcc3; mov al,O ¡registro = xxxxjmp exconcl
rdcc4: mov al,l ¡registro o xxxxjmp excond
rdcc5: mov bx,offset vcban ¡condición de banderasvnt 'a'mov nlinea50 ¡para cada linea...
rdccSJ; cali rdcc50 ¡resalto opción actualgetcharmov a],aírprev ¡quito resaltadomov di,dirprevcali rdccSOlcmp gccod, Ije rdcc6cmp gccod, 4jne rdccSScali funcionesjmp rdcf
rdcc53: cmp gccod,5 ¡especial?jne rdcc5cmp gcascii,72 ¿arriba?jne rdcc54dec nlinea ¡sicmp nlinea, Offhjne rdcc5.1mov nlinea,15jmp rdccSl
rdcc54: cmp gcascii,80 ¡abajo?jne rdccSinc nlineacmp n]inea5.1.6jne rdcc51mov nlinea.Ojmp rdcc51
rdcc6:usrpromov al,2mov ah,nlineajmp excond
YalijHas:mov ax,@dati
¡Pantalla de usuario<™>PRO¡ya tengo la condición
rdcf:
mov ds,axmov es,videosegusrpro ¡1
cali pdebug
de ojsuario<—>PRO
CAHTULO K - ERO486AS61 I í - 64
cali modvidcali funcionesmov sijOffsetlOicali mlinOcali eiToricmreseteo varraton]mov visible,0mmuestra l,visible,mov errorcj,0jmp salida
rdcdO: posdir 1,0,20rdcdOa: mov di,pddir
inc dimov ah,es:[di]mov atrprev,ahmov dirprev,dimov al,70h
rdcdOl: mov ex,4rdcd02: síosb
inc diloop rdcd02retn
rdcdOO: posdir 17,20jmp rdcdOa
rclccO; mov el,7mov ch,nlineíiadd ch,18posdir cl,chmov di,pdclir
i ;preparo y muestro linea O
,visible,ratonpresente
incmovmovmovmov
rdccOl; movjmp
rdcc50: movmovaddposdirmovincmovmovmovmov
rdcc501:mov
diah,es;[di]atrprev,ahdirprev,dial,7Qhex, 17rdcd0201,19ch,nlineach,6cl,chdi,pddirdiah,es:[di]atrprev,ahtliipreVjdial,70hcx,15
;r,esalto campo de segmento
;calculo posición;aíributo en ese lugar
:i-everso
;resalto campo de offset;aqui incluido el RETN
^resalto uno de los tres casos;simiJar a rdcdO
;aqui ya se hace el RETN;resalto una de las 16 opciones
a
CAPITULO Jí - PRO486-ASS.r I f - 65
jmp rdcd02 ;aqui ya se hace el RTZTNrdcc260:posdir 15,20 ^resalto campo de dirección
mov di,pddirinc dimov alj70hmov ex, 8
rdcd02j:stosbinc diloop rdcdOZjretn
rdj; ;ejecuta hasta niptura o fina!mov errorcj,0:ñhcmp error., Ojne finejeccmp siarch,0 ;hay archivo para depurar?jne ejecutar ;simov bx, offset vnoarchivovnt 'a' ;ventana de error de archivo no presentemov ah,0inl~ 16h
cali pclebugmov errorcj,0jmp salida
ejecutar:usrpromov aXj offset rdjlm ov worcl ptr XferAddr, axm ov word ptr XferA ddr+2, esjmp ExTotal
rdjl: mov ax}@datamov ds,axmov es,videosegcali modvidusrpro
finejec:mov si,offset lOini ;preparo y muestro linea Ocali mlinOcali funcionescali erroricmreseteo van-atonl}visible,ratonpresentemov visible,0mmuestra l,visib]e,ratonpresentemov eirorcjjOjmp salida
rdra: ;activo/desacíivo bkptmov brup,l ;bandera BRUP=1 para activar/desactivar.
H - ERCMS<;,ASM: H-66
rdrc:jmprnovjmp
rdrb: rnovrdrbl: mov
rdrblbrup}2rdrblbrup,3rupact3023,revers
limpln 24,normal.prínt l^S^Sbkpjrevers
bx,o£fsetvrnoTn ;ventana para nombreax,ds
;crear brkpt, BRUP-2
;borro brkpt, BRUP-3;recibo nombre del Brkpt;RUPACT^ruptura actual-1
a
movmovmovvntmov gdreset,!
i-dblla:call rdrOrdbll: geíline 12J19,nombrk
mov gdreset,Gcmp gccod,4 ;
rdb.12
;muestra ventana de bkpts;recibo nombre del brkpt
rdbl2:
rclblS:
rdbl.32
rdbU:
jmpcmp
jnecmpjnejmpcmpjnecmpjecmpjnecmpjaaddmovmovmuíaddmovcmpjnesubjmp: cmpjbsubjmpmov
nlrbUgccod, 1rdb!3
;vale?
bjte pírnombrk[l]J0 ;si, pero esta vacio?rdbl.4rdrbflgccocíjSrdbllgcasci'1,73rdb!32gcasciis81rdbllmpací,247rdbllrupací,8al, 16cl,rupactel
:si, termino; especial?
;PGUP?
;PGDN?;no vale
;PGDN
aXj offset TablaBrksi,axbyte ptr [si]rdbllanipact,8rdbllnipact58rdbll
rupac1,8rdbllacl,l
>°
;PGUP
;acceso a bkpts solo por noml
CAHTULO H - ER04S6.ASM H - 67
rdrb2:
rdrb21
rdrbS:
mov si,offset nombrk+2roov al,bnipcmp al,l ; activo/desactivo brkpf?jne rdrbScali TogBrkPt ;si toggleje rdrb21cali rdrOcal! pdebugcali rdrOjrnp rdra ;rdrbf!.: limpln 23,reyersprint Is23,noesbrk,reversgeícharcali rdrOcali pdebugcali rdrOjmp rdra ;rdrbfcrap al,2 ;creo brkpt?je rdrb31jmp rdrb4
rdrbSl: limpln 23jreyersmov ax,RegCs
;ltmpio lineas 23 y 24;bkpt en cierto punto
rupl
mov word ptr dhexl-H>5axxchg al,ah ;Hago que CS usuario sea seg. predef.push ax ;para lo que simulohexascpop axxchg bl,bhmov word ptr dhexl+2,bxmov bufcorr5bxmov al,ah.hexascxchg blsbhmov word pír dhexl-t-45bxmov bufcorr+2.bxm ov b>te ptr dh ex 1+ 1 3 4
condiciones
mov bx, offset vrdir ;ventana para recibir direcciónmoy aXjdsm ov si, offset bufcorrvnt 'a'print l^j^cd^reversmov gdreset,!cmp by\Q ptr bufcorr, '_'je rupllmov ax,' 'mov bufcorr, axinoy bufcorr+23ax
CAPITULO H - H-70
;mueslro segmento
mov byteptr[di+2],'*'rdr021: mov ax,ds:[si+bp+2] ;copio 10 bytes del nombre
mov [di-t-3],axmov ax3ds:[si+bp-¡-4]mov [di+5],axmov aXjds:[si+bp+6]mov [di-í-7],axmov ax,ds:[sHbp4-8]mov [di+9],axmov ax,ds:[si+bp-KÍO]mov [di+ll],axmov al,ds:[sí+bp-H5]hexascxchg bl,bhmov [di-f-13]3bxmov al,ds:[si+bp+14]hexascxchg b],bhmov [di+15],bxmov a],ds:[si+bp+13]hexascxchg bljbhmov [di-í-17].bxmov al,ds:[si+bp4-J.2]hexascxchg bl:bhmov [di-H9],bxinc nlineainc diadd di,21cmp nlinea, 8je rdrOScmp di, Oje rdr03jmp rdrOl
rdrOS; mov bx.ofísetvrup ¡muestro la ventanamov ax,dsmov si,ofFset bufnipvnt 'a1
retn
¡muestro offset
¡veo si termine la ventana
¡llego a ultima linea?
¡ultima ruptura?
rdnn; ¡muestra ventana de bkplsmov rupactjOlimpln 23,reverslimpln 24jnormalprinl: l^S
rdrmllaxall rdrO ¡muestra ventana de bkpls
CAPITULO ir - FBO4S6.ASM: 1 1 - 7 1
rdrmll: getehar ¡recibo orden de] tecladocmpjnecalijmp
rdrm!2; cmpjne
rdrmlS: cmpjecmpjnecmp
jaaddmovmovmuíaddmovcmpjnesubjmp
rdrml32:cmpjbsubjmp
rdrmf: cali
rdi:
rdil:
rdi2;
caUcalijmp
limplnlimplnprintmov
geílinemovcmpjnejmpcmpjnemovmovmovmov
gccod, 4rdrml 2funcionesrdrmf
gccod; 5rdrml 1gcascii,73
rdrrnl32gcascii,81rdrmllrunact,247rdrmllni pací; 8al, 16cl,rupactel
¡ESC?
¡especial?
¡PGUP?
¡PGDN?¡no vale¡PGDN
aXjOffset TablaBrksi,axbyteptr [sij.Ordrml lanipact8rdrmll
rupact,8rdrmllnipact,8rdrml lammemmregrnpswsalida
23,revers24,nonn¡ilIjSSjinstruCjregclreset, 1l)243insbxiffgdresetjOgccod, 4rdi2
¡PGUP
¡restauro pantalla
;vers
¡recibo nemotecnico
rdif ;ESCgccodj 1rdilbl,insbnff+lbh,0
¡ENTER, dato valido
si, offset insbuff-i-2byteptr[bx+si],0
CAPITULO H - II - 72
mov word ptr XferAddr,offset rdi3 ¡dirección de retornomov word ptr XferAddr-J-2,cscali juncionesjmp Exlns ¡ejecuto
rdi3: mov ax,@datamov ds,axmov eSjVideosegjnc rdi4limpln 235revers ¡nemotecnico incorrectoprint l.,23)errens,1reversjmp rdif
rdi4: cali pclebng ¡todo bienHmpln 23,reversprint l,235]isto,revers
rdif: getcharcali tincionesjmp salida
rdeb: ¡ensambla y busca en e] segmento de códigolimpln 0,reverslimpln l,reversprint 10,0, ens wl 3reversprint 10,1 s ensw2,reverslimpln 23,reverslimpln 24,nomialprint l,23,ensbusc,revers ¡indicacionesmov gdreset,.!
rcleba: limpln 24,normalrdebal: getline T,24,insbufF
mov gdresetjOcmp gccod,4jne rdeba2cali funcionesjmp rdebf
rdeba2: cmp gccod,!jne rdeba]mov bl5insbnff[l]cmp bl,0jne rdebaSjmp rdebf
rdeba3:xor bh,bhmov si, offset insbufF+2mov byte ptr [si+bx]sO ¡termino bnfíér con Omov bx,esmov ax,dsmov es,ax
¡recibo nemolecnico
¡ESC?
¡Vale?
¡BX = # de caracteres
CAPITULO K - PRO436J\S\ H - 73
rdebx:
rdebxl
mov di.oñseí: frisEnscali assemmov es3bxjnc rdebxlimpln 23,reversprint 1,23, erren s,reversgetcharjmp rdebfpush Reglp
bx,cx ;busco en el códigoes,RegCs jLiicio de b\isqueda
Edi,RegIp ;en CS:1P del usuario.si,offseí:InsEnscx.OfESh.
mov.: movmovmovmovcali buscarcmp cx30jne rdeblpop RegTpmov es,videoseglimpln 23,reversprint 1,23,NoEnsIgetcharjmp rdebf
rdebl: mov es,videoseglimpln 23,reversmov offcod5dipush bxpush dicali mcod
di
;CX~0 si no encontró
;no encontró
;si encontró,
popPopprint
bxl,235sigo?,revers ;busco próxima?
rdebl I; getcharmov ax,getwordcmp al,l.bhjne rdeb2jmp rdeb3
rdeb2: cmp a1,0dhjne rdebl1inc di jENTERj sigo buscandomov RegTp,Edijmp rdebxl
rdebS: pop Regíprdebf: mov si,offset lOini ;preparo y muestro linea O
cali mlinOlimpln 23,normalprint 0,23,Uini,bmenu
CAFTniLO 1E - PRO4S6.ASM: H - 7 4
rinifS: cali pdebugcali, funcionesjmp salida
jactuaHzo pantalla
rclml:
rdmll
;lleno un área de memorialimpln 23,reverslimpln 243normalmov bx, offset vil ¡ventana para pedir datosmov ~"xchgmovmovxchgmovmovmovvntprintmovcali
eax,autooffal,ahbufml+2,axeax,autosegal,abbufrnl,axax,dssi, offset bufml
l,23,bytes?,revers
rdm32:
gdresel,rdmlQ
getdata 20,1mov gdreset,0mov al,atrprevmov di,dir])revcali rdm.101cmp gccocí,7jne rdm!2jmp rdmlf ;ESCcmp gccod,0jne rdmll.limpln 23,reversprin t 1 ,23^1 lor?3revei-s
;recibo # de byíes;resalto campo de #bytes
mov gdreset,]rdm!3: cali rdmlOO
getdata 22,1mov gdreset, Omov al,atrprevmov dijdirprevcal] rdmlOOlcmp gccod,7je rdmlfcmp gccod,0jne rdml3
rdmH; push esmov es,autoseg •mov edi,avitoofj" ;dirlmov cx.word plr dhexl+6
;aquiya hay el #bytes en DKEXJ.+6
;ESC
;aqui ya tengo el valor
;ES:DT apunta al inicio del área
CAPITULO K - PRO436-ASM H - 7 5
mov al,dbyte+4cali llenarpop eslimpln. 23,reversprinl .1,23cali pdebuggetcharjmp rdmlfl
rdmlf; cali pdebugrdmlfl: cali funciones
jmp salidardmlO: posdir 20,18
mov dijpddirinc dimov al,es:[di]mov alrprev,almov dirprev,clímov al,70h
rdmJOlrmov cxs4rdm!02: stosb
inc diloop rdml02reín
rclinlOO: posdir 22,19mov di,pddirinc dimov al,es:[di]mov atrprev}almov dirprev,dimov al,70h
rdml001:mov cx,2jmp rdml02
rdmb:
;31eno el área con e] valor de AL
¡resalto campo de #bytes
;esto incluye el relnjbusca un string en segmento actual
Jimpln 23}reversHmpln 24,nonna]prínl l,23,buscasc?,revers
rdmb].: getchar ¡espero respuesta H3 A o ESCmov aXjgetword
al.lbhrdmb!2
cmpjnejmp rdmbf2
rdmb!2: cmp al,VVje rdmb2cmp alj'a1
je rdmb2cmp alj'H1
;ESC
CAPITULO K - PRO4SfiJ\SM H - 7 6
je rdmblScmp al/h1
jne rdmbl ¡respuesta incorrectardmblS: jmp rdmb4rdmb2: mov gdreset',1 ¡SecuenciaenASC.il
limpln 23,reversprint l,23jbiisca?,revers
rdmb21: geíline l,24,insbuff ¡leo secuenciamov gdresel',0cmp gccod, 4jne rdmb22jmp rdmbf2 ¡ESC
rdmb22: cmp gccod,!jne rdmb21mov bl,insbuff-H ¡vale, pero si esta vacio salgocmp b!50jne rdmb23jmp rclmbf2
rdmb23: mov bh,0 ¡preparo BX para llamar a rutina de búsquedajmp rdmb6
rdmb4: limpln 23,revers ¡Secuencia en HEXprint 1,23,busca ?5reversmov bx,0
rdmb41: mov cl,blmov al,3muí elinc almov cl,almov gdreset,!
rclmb42: cali rdmbO ¡resalto sitio actualgetdata el, 24 11; ,'IVmov gdreset, Omov al,atrprev ¡quito resaltadomov clijdirprevcali rdmbOlcmp gccod,?
rdmb43rclmbS ¡ESC
rdmb43; cmp gccod,0jne rdmb42cmp cíbyte+1,0 ¡O datos?je rdmb5 ¡si, pasar a buscarmov si,offeetinsbuff-i-2 ;vale,guardo en TNSBTJFF+2mov al,dby1e+4mov [si-Hbx]3alinc blcmp bl,24
CAPITULO II - H - 77
jnerdmbS: cmp
jnejmp
rdmb41bl,0rdmbSI
rdmbf2rdmb5]:mov insbuff-Hl,blrdmb6: mov cx,0fíífh ;preparo llamada
mov bljinsbiiff-Mmov bhjOmov sijOÍfset insbufF-K2piish eaxmov eax,autosegmov esaaxpop eaxmov edi,autoo:ffcali buscarpush eaxmov ax,esmov autosegjCaxmov dhexseg,eaxmov xxxxseg,eax
. pop eaxmov autoo£f,edimov dhexoff,edimov xxxxoff,edimov es,videosegcmp cx,0
rclmb?neUmpln 23,reverspiintincincinccalJcalijmp
rdmbT: calicali
;CX=0 si no encontró
;no encontró
autooffdhexoffxxxxoffpreopcmmemrdmbfpreopc ¡encontró, muestro en ventanammem
limptn 23,reversprínt l,23ssigo?srevcrs jbusco próxima?
rdmb72: gelcharaXjgeíwordal,lbhrdmbJG ;ESC, salgoal,0dhrclmb?2antooíf
movcmpjecmpjneincinc dhexofF
CAPITULO H - 5RO486.AS&r -78
;enter, busco otra vez
^resalto campo para byte actual
inc xxxxoffjmp rdmb<$
rdmbf: getcharrdmbfi: cali funciones
jmp salidardmbO: posdir cl.,24
mov di,pddirinc dimov al,es:[di]mov atrprev,almov dirpreVjdimov al,70h
rdmbOl; stosbinc distosbretn
rdmc: ;copia desde la ventana principal a otra árealimpln 233revers ;limpio lineas 23 y 24limpln 24,norrnalmov eax,auíooffxchg al,ahmov bufml+2,axmoA^ eax, autos egxchg al,ahmov bufml,axmov eax. autosegmov word ptr dhexl+6,axxchg al,ah ;Hago que DS usuario sea seg. predef.push ax ;para lo que simulo condicionesmov bufml+4,axhexascpop ax
rdmcl
xchgmovmovmovhexascxchgmovmovmovmovmovmovvntprint
bl,bhword ptr dhexl.+2,bxbufcorr5bx
bl,bhword ptr dhexl-M-;bxbufcorr+2jbxbyte ptr dhexln-l ,4bXj offset vcopia ;ventana para recibir direcciónax3dssi, offset bufml'h'l}23J23cd,revers
mov gdreset,].
CAP1TIKD HT - ER04SSASM: H - 7 9
byte ptr bufcorr,'JrdmclOax/ _ 'bufcorrsaxbufcorr-l-2,ax:ax0
cmpjemovmovmovmovmovjmp rdmc2
rdmclO; print 15,18,rdmcll: cal) rdmcO
getdata 15,183dhexl,'h' ;recibo segmentomov al,atrprev ;cjuito resaltadomov di3dirprevcali rdmcOl
;resa1to campo de segmento
movcmpJe
cmpjne
jmprdmc!2; cmp
jnerdmc2: movrdmc21: cali
getdatamovmovcalimovcmpjecmpjneJmp
rdmc22: cmpjne
gcireset,Ugccod, 0rdmc2gccod,7rdmcl.2rdmcf
gccod, 5rdmcllgdreset, 1
rdmcOO20,18,dhex2al,atrprevdi,dirprevrdmcOlgdreset, 0gccod, 0rdmc3gccod, 7rdmc22rdmcfgccod, 5rdmc21
;dato valido?
;ESC para abortar
;TAB para pasar
;resa)to campo cíe offset,'h' ;recibo offset;quito resaltado
;dato valido?
;ESC para abortar
;TAB para pasar
rdmclrdmc3: print l,23)bytes?,revers ;recibo el # de bytes
mov bp,word ptr dhexl^-6 ;libero dhexlmov gdreset,!cali rdmc30 ;resalto campo de #bytes
rdmcSl: getdata 20J19,dhexl)Ih!
mov gdreset, Ocmp gccod,?
rdmcfgccod, O
ecmpjne rdmc3)
;ESC
;no vale
CAHTULO H - ERO4S6.ASM H-80
rdmc4; movmovmovmovmovcalimovmovmov
eSjbp ;aqui tengo todo listo, copiodi,word ptr dhex2+6 ;ES:DI~>desíÍTiocXjWordptr dhexl-HS ;#byfesesi,axitooff
;dirl+2 ;DS;SI->origends,autosegcopiarax,@datads,axes,videoseg
limpln 23,reversprint l,23jlisto,reverscali pdebuggetcharjmp rdmcfl
rdmcf: cali pdebugrdmcfl: ca]l funciones
jmp salida
rdmcO: posdir 15,18mov di,pddirinc dimov a!3es;[di]mov atrprev,almov dirpreVjdimov al,70h
rdmcO 1: jmp rdml 01rdmcOO: posclir 20,18
mov di,pddirinc dirnov al,es;[di]mov atrprev5almov dirpreVjdimov al,70hjmp rdmlOl.
rdmc30: posdir 20519mov di,pddirinc dimov al, es: [di]rnov atrprev,almov dirpreVjdimov al}70hjmp rdmlGl
rdfun: cmp otroaux,0jne rdfun 1jmp rdfm
rdfun 1: cmp mopaux,0
;resalto campo de segmento
;Esto incluye el RETN;resalto campo de oífset
;Esto incluye el RETN;resalto campo de #bytes
;Esto inclirye el RETN
;si se dígito ENTER, mostrar funciones
;ASCrT normal si AL=0
CAPITULO K - PRCUH6.ASM: H - 81
je rdflljmp rdf6
rdfll: cmp mopauxl,59 ;F1?jne rdfl2
cop451: cali rd_ ¡editor en pantallamov B?,0
jmp rdffrdf!2: cmp mopauxl.,60 ¡F2?
jne rdfBjmp rdff
rdf!3: cmp mopauxl,6l ;F3?jne rdfl.4xor 13?, 1 ;complemento variablecmp :f3?,lje cop4-2jmp cop43
cop4-2:cali rdfSmmmuestra 0,visible,ratonpresentemov ax,dsm ov bx, offset vcopOvnt 'a'
mov ax,dsmov bx,ofísetvcopl ¡presento datos pila coprocesadormov si, offset memocoplvnt 'a1
mov ax,dsmov bXjoffset vcop2 ¡presento stat. y cont. del coproc,mov si5offsel memocop2vnt 'a'mmuestra l,visible,raíonpresentestodomov getword,ax ¡espero se presione una teclartodomov nXjgetwordcmp al, 27 ¡esc?je cop40cmp ah,61 ;f3?je cop40cmp ah,59 ¡fl?jne cop44xor Í3?,lcali pdebugjmp cop451 ¡transfiero control a nitina de Fl
cop44: cmp ah}62 ¡f4?jne cop45
CAPITULO H - FRCWS6.ASM H - 8 2
¡transfiero control a mtina de F4-;f7?
;lransfiero control a rulina de F7;:f8?
;transfiero conlrol a rutina de F8
;transfiero control a rutina de F9;flO?
¡transfiero control a rutina de FIO
jmp cop461cop45: crnp ah,65
jne cop46jmp cop471
cop46: cmp ah,66jne cop47jmp cop481
cop47: cmp ah,67jne cop49jmp rdfl.9a
cop49: cmp ah,68je rdfajmp rdff
cop40: xor f3?,lcop43: cali pdebug
jmp rdfF
rdf!4: cmp mopaux.1,62 ;F4?jne rdf].5
cop461: usrpro ;Muestro pantalla de usuariordu.1: getchar ¡espero KSC para regresar
mov ax,getwordcmp ah,62 ¡ESC?
je rctfljcmp al, 27jne rdul
rdflj: nsi"pro ¡vuelvo a pantalla de PROjmp rdff
rdfl5: cmp mopauxl,63 ;F5?jne rdfl6xor f5?,lcali pdebug ¡si f5?=l --> debo presentar ventana con
¡instrucciones completas¡si f5?=0s no
NocodE: jmp rclffrclfl6: cmp mopauxl,64 ;F6?
jne rdfl.7stodomov ax,@dafiimov ds,axpush axpush dipush sipush exmov bx, offset vnarchvnl: 'a'mov gdreseljl
CAPITULO K - PROlS6J\Síir H-83
geíline
movcmp
pushmovmovmovpushpushpopreppoppopmovmovpushpushpopreppop
poppoppopmovmovmovmovmovmovmovmovmovmovmovmovpushmovmovmovincmovintpopmov
cl,0fmf<5exdi, offsel narch
13H, OeH}Narch2;en Narch2
cljbyte ptr narch2+l;se inglesaron parámetros?;nOj terminar
jrecepfar el nombre del archivo a abrir
ex, 40escises
stosbesexsia offset narch2+2di,offset narch ;pasar los parámetros a Narchesdses
movsbesexsidiaxIíXJarnbien.te ;preparar para correr el editorpb.ambiente ].,bxbx, offset narch 1pb.paramaddress,bxpb.paramseg(Tiento,axbx, offset fcbloquelpb.fcbloíísetjbxpb.fcblsegmento,axbXjOÍfsel' fcbloque2pb .fcb2o.rTset, bxpb.fcb2segmento,axbx, offset pbdses,axdi,pb.fcbloffsetsi,pb.ambiente!siax,2901h21hesdiIpb.fcb2offset
CAHUIILO K - PRO48G-ASM: tí-84
movintpushmovmovmovintmovmovmovintjnccalijmp
ax32901h21hbpvíejospjSpviejoss,ssah562h21hes,bxbx,2QOOhah}4ah21hsimemoriamenserrorbienconido
¡obtener dirección de mi PSP
¡actfrtar la memoria que utilizo¡liberar memoria
í
¡llamar a presentar mensaje de error
simemoria:pushpoprnovmovmovintjnccali
dsesbx,ofísetpb 3
dx,offset nombreax,4bOOh21hbiencorridomenserror
¡ejecutar el editor
¡hubo errores?¡si
biencom'do:movmovpopmov
ss,viejossspjViejospbp
visible, 0
¡restaurar los punteros de pila
mmuestra l,visible,ratonpresente ¡mostrar el puntero del ratón
fn.f<5:
rdl70:
rdft7:
cop47]
movmovmovmovintrtodojmppoppoppoppoprtodocalijmpcmpjne
- : xormov
ah,2bh30dh;24dl,0lOh
rd.170ex
sidiax
pdebugrdffmopaux.1,65rdtlStoggcorre,].al, 6 ¡
¡mover el cursor
;F7?
¡corre hasta dirección/condición.indico en pantalla:
CAPITULO H - ERO486.ASM H-85
movmuímovacldm ovmovrnovmovmovmovmovprintjmp
rdf!8: cmpjne
c op 4 8 1 : xormovpushmovmov
; "DireccCondic*
cl,toggcorre ;Direcc o Condicelsi,axs^offset opccorrdi,ofísetIl.íni-f-47ax,[si][di],axax,[si+2]
ax,[si+4]
;F8?
;permite/impide ingreso en;svibmtinas, reps o loops.
;indico en pantalla:
popmuí
si, offset opcpasodis offset llini+55
[di],ax
; 'SINO1
rdffmopauxl,66rdf!9toggsub,!a132axax,toggsubcl}alaxel ; Si o No Subr.
mov si\axaddmovmovmovpríntjrap
rdf!9: cmpjejmp
rclfl9a: mmuestramov bXj offset vf9mov ax^ dsmov si, offset uline2vnt 'a'mmuesíra ].3visible3ratonpresentemov gdreset,] ;recibo un decimal
rdf!91: movgetdatamov gdreset30
gccod,?rdfl.92rdf!9f
rd£L92: cmp gccod,0jne rdf!91
rdffmopauxl.,67rdfl^ardfla
;F9?
cmpjne
CAHTUIO K - PR04S6.ASM H - 86
.posclir 47h,4mov diapddirmov eaXjdword ptr ddec-H.2push axrcr eax,.l6xchg al,ah ;mtiesTro equivalencia hexpush ax ;en la pantallahexascmov es:[di],bh.mov es:[di+2],blpop axmov al,ahhexascmov es;fdi+4],bhmov es:[di+6],blpop axxchg al,ah jrnuestro equivalencia hexpush ax ;en la pantallahexascmov es:fdi+8]3bhmov es;rdi+l,0],blpop axmov al,ahhexascmov es:[di+].2;Lbhmov es;[di+].4],bllimpln 24jnormalgetchar
rclfiaf: cali mregcali mpswjmp rclff
rdfl.a: cmp mopaux.1,68 ;F10?je rdfajmp rclff
rdfa: ;sílimpln 24,norma]mmuestra OjVÍsible^aTonpresentemov bx,ofísetvascl ¡muestro ventana de código ASCffmov ax,dsmov si,offset unovnt 'a'mov bx, offset vasc2vnt 'a'mmuestra 1, vi si ble, ratón presen tegetcharcali pclebugjmp rdff
CAMTUtO H - PROISS-ASM H - 87
rdf<5; cmp mopaux,'F ;ASCU normalesje rdfin ;si es F o f muestro explico funcionescmp mopauXjfjne rdff
rdfm; mov bs, offset vfunc ;rnuestro ventanavnt 'a'limpln 24,normalgetcharcali pdebug
rdff: mov mopaux,0mov mopauxl,Qjmp salida
menserror: ¡Muestra mensajes de error que puedan ocurrir al correr;el editor de texto(F6)} SHell, Ayuda (F2) desde el menú¡principal
jnc biencorridoshl al, 1mov si,offset mensajesxor bx,bxmov bl;almov dx,[si+bx]mov ah,9int 21hgetcbarretn
rd_: ;edicion en pantalla.;Qrden en que se atenderá a las ventanas: 1 Registros, 2 Banderas,;3 Código, 4 dirección memoria 1, 5 direcciones memoria2, 6-memorial¡hex, 7 memorial ascii, 8 memoria2 hex, 9 memoria2 ascii.;Se usa para leer ciatos dos rutinas: GETCHAR y GETDATA, que al salir;dan códigos sobre la forma en que se produjo la salida. En esta;parte clel programa el usuario tendrá opciones generales como:; TAB pasa a próxima ventana.; SPBFT TAB pasa a ventana anterior.; ESC sale del editor al menú.;Existen opciones aplicables de forma diferente en cada rutina.
rcL_3-: ¡Cambios en ventana que muestra registros.;Usar Flechas para moverse o para no alterar un registro.mov vent, Imov venlacíual,0mov dl,0 ;reg. actual = BPmov cual, 1mov gdresetjlmov sijOffsetlOreg ;UNEAO
CAPITULO K - PROOS6J\SA[ I I - 88
cali mlinOlimpJn J,reverslimpln 23,reverslimpln 24,norma]print 15,1,1 ].reg}revers
;b"jieas .1, 23 y 24
prinl 3,235123d_,reversprint 3,24,124d_JTiormal
rd_a:push f5?mov £57,0cali code?pop f5?mov bx. offset vr ;veu_tana para cambiosmov ax3dsmov si, ofíset ulin evnt 'a'
rd_JU: cali rcMO presaltareg. actualcmp cualjOjNe rd_lllpush axpush bxpush sipush dxmov si, 2mov dh,4mov bx,ofíset dhexlmov a],'0'
RD_01 1 ; mov [bx+srj,alinc sidec dhjnz rdJXUmov [bx+l],0pop dxpop sipop bxpop ax
rd_b: mov bXjOffsetvr ;veníana para cambiosmov aXjdsmov sijOffset ulincvnt 'a'
getdata 15H,OeH}dhex.1 ;(1 5H,OeH si enjmp rd_112
rd__ll] : push axpush bxpush sipush dxmov si}2
screen)
CAPITULO H - PRO4S6.ASM: H - 89
mov db,8mov bx,offset dbexlEmov al,'O'
RD_001: mov [bx+si],alinc sidec dbjnz rd_001mov [bx+13,0pop dxpop sipop bxpop ax
rd_C: mov bx,offset vrmov ax,dsmov si,offset ulinevnt 'a'geídata ilHjOEH.dbexlE/h'
rd_112: mov a1,atrprevmov di,dirprev
gdreset,0rd_102gccod,5rd_12gccod,8
;ventana para cambios
movcalicmpjbcmpjaejmp
rd_12: cmpjne
rd-J,21:mccmpjnemov
rd_122: jmprd_13: cmp
jnedeccmpjnemov
rd_131: jmp
rd__14: cmpjnecmpjbsubjmp
gccod,2rd_13di
;ABAJO?
¡siguiente registro;16 registros
rd_llgccod,!rd_14didl,0ffli
dÜ5rd_ll
gccod,4rd_15di, 12rdj.41dl,2
rd 142
;registro anterior
CAPITULO H - FRO-iaS-ASM H. - 90
rd_141: cmp dl,<5jb rdJ411sub di, 6jmp rd_142
rd_1411;cmp
add di, 10jmp re
add dLÓjmp rd_142
rcl_142:jmp rd_llrd_15: cmp gccod,3 ; >?
jne rd_16cmp di, 12jnb rd_151cmp di, 6jnb rd_11501add dl,6jmp rd_152
rd_11501:cmp di, 10jb rd_11502add d!52" i i •" jmp rd_l32
rcl_11502:sub di, f>jmp rd_152
rd_151: cmp di, 14jb rd_1511sxib dl,10jmp rd_152
rdj.511:add di, 2jmp rd_152
rd_152: jmp rd_llrd_!6: mov gdresel;!
/~MTir"i f* r i í> I 1t_^_l 11 j J ^Liíli-* -L
je rd_l601mov bx;word pli: dhexl+6jmp rdj.611
rd_1601: mov Ebx3D\vord pír dhexlE+10
mov al, di
CAPrnir.o K - II - 91
actuardwdwdwdwdw
rd_ip: mov
rd_sp: movjmp
rd_bp: mov
rd_si: movjmp
rd_di: movjmp
rd es: mov
rd_ax; movjmp
reí bx: mov
rd_cx: movjmp
rd_dx: movjmp
rd_flags:movmovjmp
rd_ds: movjmp
rd_fs: movjmp
rd_es: movjmp
rd_gs: movjmp
rd_ss: movrd_161:push
calipop
offset rdjp, offset rd_sp, offset rd_bp, offset rd_sioffset rd_di, offset rd_cs, offset rd_axoffset rd_bx, offset rd_cx, offset rd_dxoffset rdjflags, offset rd_ds,oflfeet rd_fsoffset rd_es, offset rd_gs, offset rd_ss
rd_Í<Sl.regsp,ebxrd_161regbp,Bbx
rd_l6lregsi;EbxrdJ61regdi,ebxrd_161reges, bxrd_161regax,Ebx
regbx,ebxrd_161regcXjBbxrd 161
etlagSjEbx
rd_lf: movmovmovmov
regds,bxrd_16lregfSjbxrd_161regesjbxrd_16lreggs,bxrd_161regss,bxdx
pdebugdxrd_aax, regessegcod}ax]iax,regipofTcod,ax
*í6c P9cqo
so ppj:
t*ÍP09pJA~pJ
[ 'cL^iotCltmO
Xí6ctí°c'uo
tp3~~pj
£'IPOSplA pj
['cieno•£e[enoHóc'P
t^OlS3~pJ
zlpO3plA~"pJ
11* 113
L ltí*-«-O
T.O Cj \o
^I'lp103pIA~pl
ocn^oI'ITOO
ner'p^O'tio
ds»~pa0*IP
jf pj¿~p^
uiauíuiAiSdUI
AoaiAOUI
3Uf
dtuoduif
AOLU
AOUI
AOUI
AOUI
3UÍ"
duioduif
AOUf
AOUI
AOLU
AOUI
3UÍ"
duio :duif
AOUI
AOUI
AOUI
AOUI
duio :duif
AOUI
AOUI
AOUI
AOUI
3Uf
duioduif:duifUKOIfUO
ripg pj
: LS3~p J
dqs^pj
dso~pj
:OI~PJ
Zíl P-1
OT'P-1duio :TJduif
ufóiuuiAvsduiSaou
duioMsdtupooui
sj ppj
trip03plA pJ
1 'juno
sp ppior_'ip
OSppY pl
'[u no
6^1PoopiA p;
('[«no
9e'iot'qo
81POOpiA pl
H9£'P
L'W03plA p.
pi
OOpIA pl
Olc[iíiio
L<IPOSpIA pl
oufduio :sp~~ppi
duifAOUI
AOUI
AOUI
AOUI
oufduro :0:3~p-rduif
AOUI
AOUI
AOUI
AOUI
oufduio ::duif
AOUI
AOUI
AOUI
AOUI
oufduio :x
AOUI
AOUI
AOUI
AOUI
pj
duio ::duif
AOUI
AOUI
AOUI
AOUI
3Uf
duio::duif
AOUI
AOUI
AOUI
AOUI
9Uf
duio :so~ppiduif
AOUI
AOUI
C 6 - H - H OULLWVD
qsojs
íP ouíqsojs
íP ou.1
G'ltmoTpeA9JdJlp
[ip]:saeUB
ÍPjippd'ip
OSplA
ss ppj
trt>OOplA pJ
sS ppjeilp
S3 ppj
O3plA~pJ
íp OUL
qso^s
duio :rtAOUI
AOUI
AOUI
AOUI
OUI
AOUI
JTpSOd
:oop[A~pjAOUI
AOUI
AOUI
AOUI :ss~duif
AOUI
AOUI
AOUI
AOUI
oufduio :síT
duifAOUI
AOUI
AOUI
AOUI
duio :duif
AOUI
AOUI
AOUI
AOUI
oufduio :<;
duif
AOUI
AOUI
AOUI
AOUI
- u oirmsva
CAPITULO H - PRCMfifiJVSM
inc dird_reg8:
stosbínc distosbínc distosbinc distosbretn
rd_2: ;Cambios en banderas del microprocesador.¿Flechas — > y <-- para ir a otra bandera.mov ventjlmov ventacnml, 1mov di, O ;bandera actual OFmov sijOffsetlOban ;Iínea Ocali mlinOlimpln l,revers ;linea ].print 16,3,llban,revers
- 95
rd_2a:
rd_21:
rd_22:
rd_221
pushmovcalipopmovvntcalimovmovcalicalicmpjnemovcalipushcali
popjmp
cmpjneinccmpjnemov:jmp
f5?f5?,0code?f5?bx, offset vb ;ventanapara cambios'a'rd__20 ¡resalta bandera actualal,aírprevdijdirprevrgkOrd_201 ¡quito resaltadogetword, 1 cOdh ¡enterrd_22gdreset, 1 ;dato valido.rd 210 ¡altera variable .Flagsdxmpsw ¡actualiza pantalladxrd_2a
getword, 4dOOh ; " — >"rd_23di ;siguiente banderadi, 8rd 223.dl,0rd_21
CAMXULO H - ERO4SG.ASM H-96
rdJ23:cmpjnedeccmpjnemov
rd_231: jmprd_
rd
i'd_
rd^
rd
_241: movmovmovmovptishcalicalicalicalimovvntPopcmpjnecalicalijmp
25:cmpjnecalicalijmp
26: cmpjejmp
J20: movaddaddmovposdirmovincmovmovmovmov
201: stosb
getword^bOOli ; " < — "rd_241di ;bandera anteriordl^Offlird_231dl,7rd_221ax,regcs
segcod,axEax,regipoffcod^axdx ¡preservar ultimomcodmmemmregmpswbx, offset vb ;ventan a para'a'dxgelword,0í09h ;TABrd_25mregmpswrd_3
getword.OFOOH ;sTAB•rd_26itu'egmpsw
rcLigetword3011bli ;ESCrd frd_21
di
cambios
c!364 ;resalto bandera actualel, dicl,dlch,3c]5chdi,pddirdial,07ri ;video reversoah,es:[di] ¡atributo previoatrprev;ahdirprev,di
;pone atribvTto (AI-) en bar
CAPrrur.Q H - H -97
rd
rd
rd
addstosbreta
210: movaddmovcmpjbinccmpjbmovsubadd
_2101:movcíercrxorpushmovandandorpopreía
di, 159
dh,dl ¡en CL obtengo la posicióndh,4 ¡del bit a alterarsec!5dh ¡empezando por el fin.dl,3rd 2101eldi, 5rd 2101el, dicl,3cl,dhax,8000h ¡un uno y quince ceros
;CF=0 (desactivar acarreo)aXjCl ¡rotar CL vecesf]ags,axeaxax,:flagsea^OGOOffiheflags.OffííQOOOheflags,eaxeax
3: ¡Recibir una dirección y desensamblar desde ella.¡PGUP y PGDN para cambiar de paginas.¡Hechas — > y <— para pasar del un campo al otro sin alterarlo
rd
rd_
movmov
_30a: movmovmovmovmovmovmovmovcali
3a: pushcali
vent, 1ven tactual, 2dl,l ¡campo para el offset
11 f\0 ;Pagina 0
ax,offcodtabcocl,axax,proxinstabcod+2,axgdreset, 1si, offset lOcod ¡linea 0mlinO
dxmcod
pop dxcaliLimpln
code?1>REVERS ¡linea 1
CAPITULO K - ERO436ASQI H-98
cmp dh,10jae rd_3alprint 9jl,ll,cod,reversjmp rd_3a2
rd_3al: pánt IS^llcodl^reversrdJ3a2: mov bx, offset vcc ;ventana para dar
mov aXjdsmov si, offset ulinevnt 'a'
dirección
rd 31:
axdxexbxsidi.esdsesdx;0ax,offbodbx,5957
bxcx,;nbx,axdi, offset barra 1
caüpushpushpushpushpushpushpusíipushpopmovmovmovdivmovmovmovmov al3'£rep stosbpop esmovmov byte ptr[si+bx]5f'mov bx, offset vbarra 1mov ax,dsvnt 'a1
pop dipop sipop bxpop expop dxpop axgetdata lfliI12h,dhexlI'h1
mov al,atrprevmov di,,dirprevmov gdreset,Qcali rd^SOlcmp gccod,0
;resalta campo actual, muestra # jjagina
;quito resaltado
CAHTtlLO H - FR043GJVSRI H-99
rd_311
rd_32:
rd_33:
rd_34:
rd_341
rd_35;
rd_351
jnemovmovpushcaliPopjmp
.: cmp
jbcmpjnexorjmpcmpjnexorjmpmovcmpjnemovmovpushcal?popcmpjainc: movmuímovaddmovmovjmpcmp
jnecmpjnejmp: decmovmuí
rd_311gdreset, 1 ;dato validodh,0dxrd 310 ;altera variables y desensambladxrd_3agccod,3
rd_31gccodj3rd_33d1,l ;otro campord_31gccod54rd_34d],l ;otro campo
rd_31gdreset,!gccod,9rd_35aXjproxins ;PGDNofícod,axdxrocoddxdh,9 ; A la pagina 9 se regresa desderd_341 ;todas las pagjnas posteriores.dh ;no dejo que DH pase de 10.a!52dhsi, offset tabcodsi,ax ;ST apunta a la DH-esima pos. en TABCODax,proxins[si+2]Iaxrd_3agccod,8rd.36dh30 ;PGXJP, No bajo de la pagina 0.rd 351rd_3adh ;pongo pagina de arribaal,2dhsi, offset tabcodsi,axax,[si]offcod,ax
CAPITULO H - PROJS6.ASM H - 100
rd_35;
rd_37:
rd 38:rd_30:
rd_302
rd_301
pushcaliPopjmp
cal]movmovmovmovcal!cmpjnecalicalicalicalijmpcmpjnecalicalicalicali.jmpjmpmovaddcmpjbmov: movstosbmovmuímovincmovposdirmovincmovmovmovmov: stosbinc
d j c 1
mcoddxrcl_3a
^mstkax, regessegcod,axJiax,regipoffcocl,axmcodgccod,5rd_37mexpcmmemmregmpssvrd_5gccod,6rd_38mexpcmmemmregmpswrd 2rd fal,dhal, 'O1
dh,10rd_302al,'Xh
di, 46
al, 5dic1,alelch,3cl,ch.dijpcldirdia^OThah,es:[di]a1rprev,ahdirpreVjdi
di
¡ventana Opcmem2¡ventana Stack
¡ventana Código
¡TAB
;SHTFT TAB;ESC¡resalto área de segmento o de offset
¡primero muestro # de pagina
¡pagina 10 o superior
¡video reverso¡atributo previo
¡Atributo AL en segmento u offset
CAPITULO H - PRG4Se.ASft.r
stosbinc distosbinc distosbreta
rd_310: mov ax,word ptr dhexH-6 ;desensamblo desde dir. dadacmp dl,0 ;Antes veo si lo alteradojne rd_3!01 ;fue el segmento o el offsetmov segcod,axjmp rd_3!2
rd_3101;mov offcod,axmov tabcod}ax
rd_312; cali mcodmov ax;proxinsmov tabcod+2,axcmp f5?3lje rd_3fincal! mregcali mpswcali mmem
1 1 - 1 0 1
rd_5: ;C:imbi.os en las opciones de ventanas de memoria relaíiva.;Flechas —> y <— para pasar a otra de las opciones; arriba;y abajo para ir a otra linea de la ventana; y PGUP y PGDN;para pasar de Segmento a Offset o a la inversa,mov ventjlmov ventacüía^Smov cll,0limpln l,reversprínt 2, .l,Uop2,revers
.RD51A:movmovmovcalimovmovmovvntmov
rd5H; calipushpushpushpush
dh,0si, offset 10op21readerr,0mlinObXjOffsetvmernrel ;ventana de memoria relativaax%clssi,oiTsetulíne2'a'gdresetj.
rd51.0j ;resalta linea actualaxdxexbx
CAEECm.0 H - ERO4S6.ASM: H - 1 0 2
si,offset autooffax, [si]bx,5957bxex, 11bx,axdi, offset barra2
push sipush dipnsh espush dspop esmov dxmovmov ax, [si] ;ofíeodmovdivmovrnovmovmov a 3 $ ;rep stosbpop esmovmov byte ptr[si+bx];f'mov bx, offset vbaiTa2mov ax,dsvnl 'a'pop dipop sipop bxpop expop dxpop axgetdata2 ThjOer^dhexMEVh' ;regresa el buffer rotado y
Almacenado segmento y offsetcmp
je
movmovcalimovcmpjecmpjecmp
jecmpjecmpjne
rd5550:jmp
readeiTj 1rd51a
al,atrprevdi,dirprevrd5101jgdreset,0gccod,0rd51UOgccod, 1rdS550gccod, 2rd5550gccod, 8rd5550gccod, 9rd5554rd5551
;si ocurrió error en getdata2 buelvo al inicio;para que in^-ese nuevamente datos, ya antes se
;se borro bufíers dhex3 y dbexMr;quito resaltado de linea y opción
jfíecha arriba? navegación en ventana relativa
;flecha abajo?
;PgUp?
;PgDn?
CAPITULO K - PRO4S6.ASM: H - 1 03
- error 1: pushmovmovintpopprintcalijmp
rd5551:pushmovmovpop
rd5552: jmperror2: push
movmovint
P°Pprintcalijmp
rd5553: pushmov
rd5402: movpopjmp
rd5554: cmpjnecalical]cal]calijmp
rd518: cmpJne
calicalicalicalijmp
rd519: jmprd51110:cmp
cmpjajmp
error3: push
dx
dl,721hdx0,23 j overfl o w,reverserrorOrdSlaeax
eax,autoscgxxxxseg,eaxeaxrd5553clxah,2di, 721hdx0,23, overfl o w, reverserrorOrd51aeaxeax,autooffxxxxofT,eaxeaxrd53002
rcblSmcodmregmpswmmemrd_6gccod,6rd519mcod.mregmpswmmemr d 3
;TAB?
¡restaurar la pantalla
¡sT/VB?
¡restaurarla pantalla
;ESCdhexseg,0error3dhexseg,0fifflerror3rd5301dx ¡overfl o w
CAITTULO H - PRO486.ASM H--304
movmovintpopprinl:cali
rd530J: píishmovmov
POPRD5300:
cmp
cmp
jmperror4: push
movrnovintpopprinícali
errorO; movmovrnovmovmovmov
jxUQn; movincdecjnzmovmovmovmovmovmov
rdlOb: movincdecjnzmovmov
21h
0,23,averjnow,reverserrorOrd51aeax
enx,dhexseg
eax
dhexof^Oerror4dhexoff.OSHherror4rd5302dx ;overflow
di,721hdx0,23 j overfl ow^reverserrorOrd51abxsoffset dhex3dh,[bx]ai30
si, 2
[si+bx],alsi
dhrdlOabx3ofíset dhexMrdh,[bx]al,0
Sí
dhrdlObposinijO •posmediumsO
cAirruto ir - PRO-ISC-ASM: H - 1.05
movmovmovmovmovcal]caliretn
rd5302: pushmovcmpjbmovmov
rd5403:MOV
signopos,0signobef,0dhexseg,GdhexoffsOreaderr, 1mregmpsw
eaxeaXjdhexoffeax,0ff98hrc!5403eax,0ñ98hautooffjeax
xxxxoff.eax
;no se pase de Ofrffh en ventana de mem, reí.
pop eax
rd53002:call mcodcali mstkcali mexpccali preopccal] mmemmov dhexsegjOhmov dhexofíjOhmov signobef,0mov signopos,0jmp rd5la
rd510.T: movmovposdirmovincmovmovmovmov
rd5101j;movrd5]Q2J:stosb
incloopcalicalireta.
cl,25hch,9hcl,chdijpddirdiah,es:[di]a1rprev,ahdirprev,di«1,0711cx,9h
dird5102.Tmregmpsw
;bon~ar últimos datos ingresados de;seg. y oíf. en memoria relativa
,y volver al inicio;O,TO retorno con jmp y no con reln
¡resalta linea actual
¡atributo previo
rd_6: ¡Cambios en memoria directamente desde teclado. Las flechas —>;y <— no hacen cambio de linea. Arriba y Abajo no cambian de
CAPITULO U - PRO486.ASM: ti.~l.Q6
¡pagina, son para pasar de linea o ventana, PGUP y PGDN para pasar;a oirá pagina (+-64 en la ventana absoluta, +-8 en las relalivas);;mov rd6?,0 ¡bandera para rd600 y rd.700
mov vent;lmov ventactual,4mov dl,0 ;DL=# de linea (0-1.2)mov dh,0 ;DH=# de columna (0-7)mov si, offset lOhex ¡linea 0cali mlinOlimpln 1,REVERS ¡linea 1print 6, l,Uhex,REVERSmov gdreset,!
rd6a; pushapush f5?mov f5?,0cali code?pop f5?popamov bx, offset vdh ¡dibujo la ventanamov axadsmov si, offset ulinevnt 'a1
rd6l: cali rd60 ¡resalto bytepush axpxish dxpxish expush bxpush sipush clipush espush clspop esmov dx,0mov si, offset autooff.mov ax,[si] ¡offcodmov bx,5957div bxmov ex, 11mov bx,axmov di, offset barra2mov al,'í:'rep stosbpop esm ov si, offset barra2mov byte pü-[si+bx]3'fmov bx, offset vbarra2
actual
CAHTULO H - ER.O4S6.ASM H - 107
movvntpoppoppoppoppoppop
ílX» QS
'a'disibxexdxax
getdata ].4h,0eh,dbyte,íh.' ;recibo entrada de teclado
rd6ll:
rd6l.llrd<5l2;
rd<5l21rd6!3:
movmovmovcalicmpjnemovcaliinccmpjnemovInccmpjbdecmovjmpcmpjnedeccmpjnemov:jmpcmp
jneinccmp
mov:jmpcmpjneinccmpJne
mov
al,atrprev ;quito resaltadosdi,dirprevgdreset,0rdSOlgccodjO ;daío valido?rd611gdreset,!. ;sird610 ;altero memoria, actualizo pantalladh ;paso al próximo bytedh,8 ;hasta llegar al fin cíe la ventanard6adh,Qdidi, 13rd6adidh,7rd6agccod,! ;arriba?rd612di ;sid!30ñhrd6111di, 12rd£lgccod52 ;abajo?rd613di. ;sidl,13
dl,0rd61gccods3 ;— >?rd614dh ;sidh58rd6131dh,0
CAHTUI.O in - H - 108
rd<5131: jmprd6.l4:
rd614]rd615:
rd616:
rd617:
rá62:
rd<53:rd60:
rdSQl:
cmpjnedeccmpjnemov
.: jmpcmp
jecmpl'ne'calijmpcalicalicalicalicalicmpjnecalicalijmpcmpjnecalical]jmpjmpmovmovmovmuíaddmovaddposdirmovincmovmovmovmovstosbincstosb
rd<51gccod,4rd61,5dhdb,0ffhrd6.14.1dhjrd61gccod.8rd6.16gccod,9rd617rd6l60rctélmcodmstkmexpcramemmpswgccod,5rá62mregmpswrd_7gccod,6rd63iní'egmpswrd 5rd fcl,dhch,dla!53
elal,2fhcl,alch,9c],chdi,pddirdiah,es;[di]atrprev5andirprev,dial,07h.
di
;o PGDN?
;restauro pantalla
;TAB?
;st;SHIFT TAB?
;ESC;resalto byte actual, Pnmero¡calculo posición
;cambio el atributo
CAHHJI.O K - EB.O4S6-ASM H - 109
retn; push
rd610.1: pushm,ovmovpopmovmovmu]addmovaddmovstosbmovpushcalipop
rd61Gf: calicalicaüpopretn
rd61.6Q: movmov
rd61602;cmpjnesubpushmovmov
POP
dxeaxeax,autooff~di,axeaxes,autosegal, 8dia],dhah50
;a1tera memoria
di,ax ;ES:DI apunta a byte a cambiarse
es,videosegdxmmemx ¡actualizo ventana de memoriadxmcodmstkmexpcdx
si3offset autooff ;dirl ;si, SI apunta a dirección a alterarse
s
rd61603:addpushmovmovPOP
rd61(?04:pushcalicalipop
rd61605:retn
ex, 104gccod,8
rd61603[si], exeaxas, [si]xxxxoff,eaxeax
rd61604[si],cx ;PGDNeaxax,[si]
;CX tiene el valor a sumar o restar;PGUP?
eaxdx
preopcmmemxdx
rd_7: ;Cambios en memoria directamente desde teclado (ASCII). Las flechas;--> y <-- no hacen cambio de linea. Arriba y Abajo no cambian de;pagina5 son para pasar de linea o ventana, PGUP y PGDN para pasar
CAPITULO H - ER.04Stf.ASM: H - UO
;a otra pagina (+-64 en la ventana absoluta, +-8 en. las relativas)movmovmovmovmovcalilimplnprint
rd7a; push apushmovcalipoppopamovvnt
rd71: calipushpushpushpushpushpushpushpushpopmovmovmovmovdivmovmovmovmovreppopmovmovmovmovATlt
popPoppoppop
vent3 1ventactual,5dl,0 ;DL=# de linea (0-12)dh,0 ;DH^# de columna (0-7)si,offset lOasc ;linea 0mlinOl,revers ¡linea 16)l,Ilhex,revers
f5?f5?,0code?
f5?
bx, offset vda ;dibujo la ventana'a'rd70 ;resalto ascii actualaxdx
f t
bxsidiesdsesdx30si, offset autooffa?s[si] ;offcodbx}5957bxex, 11.bx,axdi, offset barra2al,'^'stosbessi, offset barra2byteptr[si+bx],fbx, offset vbarra2ax,ds'a1
disibxex
CAPITULO H - EEO486j\S&r H - ni
pop dxpop axgetcharmovmovstosbcmpjnemovmov
rd71x: cmpjnecalimovvntpushmovcalipopinccmp
Jne
movinccmpÍViJ*"
decmov
;recibo entrada de teclado;quito resaltado
rd711: cmpje
rd711x: cmpjnedeccmpjnemov
rd7111: jmprd712: cmp
jneinccmpjnemov
rd7121: jmprd713: cmp
;ENTER?
;si, simulo GCCOD-0;Enter=AM;dato valido?
al,aírprevdi3dirprev
gccod, 1rd71xgccod30gcascii,13gccod, Ord711rd710 ;si, alt. memoria, act. pantalla, — >.bx} offset vda ;dibujo la ventana ASCII'a'f5?f5?,0code?f5?dh ;paso al próximo bytedh,8 ;hasta llegar al fin de la ventanard71dh,0di(31,13rd71didh,7rd71gccod,5rd711xrd717
;especiales?
arriba?rd712didl,0fíhrd7111di, 12rd7]gcascii58Qrd713di
rd7121dl,0rd71gcascii',77
;si
;abajo?
s
H-112
jne rd714inc dhcmp dh,8jne rcl7131mov dh,0
rd7 1,31: jmp rd71rd714; cmp gcascii,75
jne rd715dec dhcmp dh,0fflijne rd7141mov clh,7
rd7 1,41: jmp rd71rd715: cmp gcascii,73
je rd716cmp gcascii,81je rd716jmp rd71
rd7l6: cali rd7160jmp rd71
rd71.7: cali pdebugcmp gccod,2jne rd72jmp rd_l
rd72: cmp gccod,3jne rd73jmp rd_6
rc!73: jmp rd_frd70: mov cl,dh
mov ch,dladd cl,47hadd ch,9posdir cl,chmov di,pddirinc diroov ah,es:[di]mov atrprev,ahmov dirpreVjdimov al,07h
;si
;<--?
;si
;PGUP?
;o PGDN?
;lecla invalida;PGUP 0 PGDN
¡restauro pantalla;TAB?
;si;SHIFT TAB?
¡si;ESC¡resalto byte actual. Primero¡calculo posición
stosb ;cambio el atributoretn
rd710: piish dxrd7101: push eax
mov eax,antoofTmov di,axpop eaxmov es:autoseg
¡altera memoria
;dirl+2
CAPITULO H - ERXWS6.ASM I I - 113
movmuíaddmovaddmovstosbmovpushcal]popjmp
rd710f: calicalicalipopretn
rd7160: cmpmovmov
rd7l602:cmpjnesubpushmovmovpopjmp
rd7.!603: addpushmovmovPop
rd71604:pushcalical]Pop
rd7I605:retn
rd f;
al, 8dial,dhah,0di,ax ;liS;DT apunta a byte a cambiarseal,gcascii
¿actualizo ventana de memoria
es,videosegdxinmemxdxrd710fmcodmstkmexpcdx
dl,8 ¡ventana absoluta?sijOffset autooff ;dirl ;si, SI apunta a dirección a alterarseex, 104 ;CX tiene el valor a sumar o restargcasciiJS ¡PGUP?
UÍ71603[si],cs: ¡sieaxax,[si]xxxxofFjeaxeax
rd71604[si],cx ¡PGDNeaxax, [si]xxxxorT,eaxeaxdx
preopcmmemxdx
movmovcalical]íimpln 233nonnalprinl
RINOP6: ret
vent,0si3 offset lOinimlinOpdebug
CAPITULO H - ER04S&ASM: H - .1 1-4
; RUTONAS COPROCES ADORRÜF3M:
fhstcw contcon ;cargar valores originales status y controlfnstsw statconfsave memjocfrslor memjocmov düofiset memocoplmov esi,offset memjoc ;almaceno TAGadd esi54mov bx,[si]push espush dspop espush bxmov al,bhhexascmov ax,bxxchg alsah.stoswpop bxmov al,blhexascmov ax,bxxchg al,ahstoswmov esi,offset memjoc ;almaceno ffTR (MSB)add esi, 9mov bljbyte ptr[si]rcr bl,4mov al}blhexascmov al,blstosbm ov esi, ofl'set: memjocadd esi, 6mov bx,[si]push bxmov al,bhhexascmov ax,bxxchg al.ahstoswpop bxmov a1,blhexnscmov ax,bxxchg al,ah
CAPITULO H - PS0436.ASM H - 1 ] 5
stoswmov esi,offsetmernjoc ;a1naceno OPCODEaclcl esi,9mov bl,byte ptr[si]and bl,7mov aljbíhexascmov aljblstosbmov esi,offset mem_locadd esi,8mov H[si]mov al,blhexascmov ax,bxxchg al,ahstoswmov esijOfíset memjoc ;almaceno OPTRadd esi513mov bl,[si]rcr bl,4mov aljblhexascmov al,b]stosbmov esi,ofíset mem.Jocadd esi,10mov bx}[si]] ish bxmov al,bhhexascmov ax3bxxchg a!5ahstoswpop bxmov al,blhexascmov ax,bxxchg al,ahstoswpop esmov prevdicsdi ;almaceno puntero de memorialpiish simov si,offset mem_Jocpush exmov cx}[si-l-2]and ch,38h
H- 116
movshrmovrorpopcmppopje
pushmovpushpushpopmovmov
Iazo2: stosblooppoppopmovmovmovandcmpjneadd
regtfO.!:addcali
regGQ: movmovandcmpjneadd
reg<511: addcalJ
cop61.1: movmovandcmpjneadcl
c1,2
cl,chwordptr [si+4],c1exword plr[si>4]3OfflJK
sicopvaciodidi, offset memocopl-l-17esdses ¡es^ds
pneinoria coprocesador
¡inicio borrando memocoplInzo2esdiprevdic,di ¡contiene puntero para mem, coprocesadoresijOffset mem_Joc ¡registro ST de la pila del coprocesador
ax,3h
regííOJprevdic,39reg60
esi,14 ¡apuntar a st(0)saveesi,offset mem_loc ¡almaceno st(í)ax3[si-f4JaXjOchax50chregól 1prevdic)39cop611esi,24 ¡apuntar a st(l.)save
esi,ofFse1 mem_loc ¡almaceno st(2)
reg62J,: add
ax,30hax,30hreg621.prevdic}39cop621esi,34 ¡apuntar a st(2)
CAPITULO K - pROjas-Asat H - J17
cali savecop621:mov esi,offset memjoc ¡almaceno st(3)
mov ax,[sí-{-4]and ax,0c0hcmp aXjQcOhjne reg63.1add prevdic,39jmp cop63
reg631:add esi,44 ¡apuntar a st(4)cali save
cop63: mov esi,offset memjoc ¡almaceno sl(4)mov ax,[si+4]and ax,300hcmp ax,300hjne reg641.adcl prevdicí39jmp cop64
reg<541: add esi, 54 ¡apuntar a st(4)cali save
cop64: mov esi,offset memjoc ¡almaceno sí(5)mov ax,[si-H]and ax50c00hcmp ax,0c00hjne reg651add prevdic339jmp cop65
reg651: add esi, 64 ¡apuntar a st(5)cali save
cop<5?; mov esi,offset memjoc ¡almaceno st(6)mov aand ncrop ax^SOOOh
adcljmp
l; add esíj74 ¡apuntar 9 st(í¡)cali save
cop<56; mov esi,offsetmcmj.oc ¡almaceno st(7)mov nx,[?i+4]and ax,0c000hcmpjne reg(571addjmp
reg(571; add esi, 84 ¡apuntar a sí(7)cali
CAPITULO 11 - PRCUSff.ASM: H - 1 18
jmp cop<57snve; cali snvest ¡guarda exponente y mantisa de ST(n) en ven_
;tana para memorial del eoprocesadorcaU expcop janaUza exponente actual de la pila cíe],
;coprocesadory lo convierte a decimalcali savemant ¡guarda esp, y mantisa en formato real en lareí ^ventana para memorial del coprocesndor
copí>7; mov dijOftset memocop2 ;memoria para satatus y controlmov nrevdic^dicali savecont- ¡almacena palabra de control en memoria2 para
;e] coprocesadormov di,prevdiccali savestat jahnacena palabra de staüL? en memoria2 para
;el coprocesadorretn.
>S AVEST; mov bx,word ptr[si+S] ;guarda exponente y mantisa de st(n)esds
pop esmov di.revdic ;apunta a siuiente fate en, memorial
mov al,bhhexasc ^convierto a ASC.U
xchg a],ahstoswpop bxmov al,blhexascmov ax}bxxchg al,ahstoswmov bx,\vord ptr[si+6] ;almaceno mantisapush bxmov al,bhhexascmov ax,bxxchg a],ahsloswpop bxmov al.,blhexascmov ax,bxxchg al,ah
.i 'vi,
"F a ££
X 42
,C^T
«
X 43
•> re
re "
Iff
o
>
5 >
2P
nie
¡ii&
is|
c
p,
te r
d.
te
x «
P-
- P.
4^
te
o C/D en B •P
X 4¿
-C\ re
x
__r
re
rs
>
cO &
5
•=
SP
y °
P
F-<
M
«s 4^ re
&¡
ft te
Ü yj
re X ü 4^
X ^ 13
5< jf
—
re
£ j? "
c -o
2
te x
w
i — i
'OT, -b OH
Tj
V- o & X"
4= g P
4=
x -^
^
"re
4^
>2 b
P-.
E
£ x re
O w
^
i §
W
r-4^ "
4=:
re 13 ^ «
•5 S
X
w
_
xx
3
-o42
— "
X
re
reO
s-!¡
!&
E J
= E
re cfl
43 U X
5 írt o "55
acen
o p
unte
ro f
ina!
E 15 * **
"T3 **Ü 1 u P
H
g E
•-j
73 o" 1E/
3 !-•
U
&
§-¡
&• E
"§
GH
P
O
CAHXIILO H - FRO4S6.ASM H-120
mov di,offset memocopl-HJmov cx5312mov al,1'
lazo: stosbloop lazopop esjmp cop67
EXPCOP: ;rutina que analiza el exponente y lo convierte a decimal;sale con código de acuerdo al tipo de dato asi:;copcop~0 si # es valido; copcop-2 si se trata de numero no valido;(3fffh < exp < -3.iffh); copcop=3 si # es un cero (exp=0000)mov copcopjOm ov ax, word ptr[£cmp ax3Gjne coplOOmov copcopj3mov signm, Ojmp íincopS
coplOO: cmp ax^Offffhjne coplOlmov copcop,2mov signm, 1 ;-NAN si EXP < -163 83jmp fincop3
cop 101: cmp ax, 7ff¥hjne cop!02mov copcop32mov sigam,0 ;+NAN si EXP > 16383
analizo si dato es valido
copl,02:test ax,8000bjz coplOJTIOV signm, 1jmp copll
coplO: mov signm,Ocopll: and ax,7fífb
subsubcmp ax,80QOh
;numero 4-o - ? (analizo signo mantisa)
;valor "-w
jvalor "-Í-";eíimono signo;exponente polarizado;por la multiplicación que se afectara a la
¿mantisa
mov signexp,! ;exponente"-"xor aXjOifffh ;calcuío complemento aí 2 para convertir eladd as, 1 ; exponente a un valor positivojüip cop 13
copl.2; mov signexp,0 ;exp;í^y^rjl^í- -mciir ^~iv 1 OADrt
,+« »U-"
inrvt7 i-l
r\-nj Trv*
Gilí t>^
CAHXULO H - PR04S6-AS1VE H - 121
mov dms,eax
¡TJOV jw ]QOQmov ib;, Odiv bx
add dms,eaxmov ax,ds ;DX coníi
mov dx,0div bx<íh! a\ R->'M *' A) O
add dms,eaxmov ax,dxmov bx ln
mov dx,0
add tifus czix
Si
push esi ; se trata de mi "NAN"mov dijprevdicpush espush dspop es ;ds=escmp signm,0 ;dato 4- o - ?jne cop32mov si5offsetNANPOSmov cXj.1.9rep movsbpop esm ov prevdÍGj dipop esireln
cop32: mov si,offset NANNEGmov ex, 19rep movsbpop esmov prevdiCjdipop esiretn
copSl: cmp copcop}3
í..
CAPITULO H - U - 122
jnepushmovmovmovpushpushpopreppopmovpopreta
cop30esidi,prevdic ;se trata de un cerosi,offsetZEROex, 19esdses ;ds=esmovsbesprevdic.di. ;guardo puntero de memorialesi
cop30: ;se trata entonces de un dato valido, almaceno mantisa y exponentecali
pushpushpopcmpjnemovmovstosbmov
j™pcop33: mov
movstosbmov
cop34: movmovmovhexascmovmovstosbmovmovmovpushmovhexascmovmovxchgstosw
mantisa ;regresa con valor convertido en decima] de;la mantisa en variable mantisf
esdses ; ds~essignm,0 ;signo de mantisa + o - ?cop33di,prevdic3],'+'
prevdiCjdicop34dijprevdic ;# negativoal,'-'
prevdtCjdidijOffset manlisfbl,byteptr[di+4]al,bl
di}prevdical,bl
prevdiCjdidi,offset mantisfbx,word ptr[di4-2]bxai,bh
clijprevdicax,bxah,al
CAETTULO H - 5RO486ASM H - J 2 3
pop bxmov al,blhexascmov ax,bxxchg ah,alstoswmov prevdic,di
movmovpushmovhexascmovmovxchgstoswpopmovhexascmovxchgstoswmovsíosbmovstosbmovstosbmovcmpjemovmovstosbmov
jmpcop350: mov
movstosbmov
cop351; movtestjnztestjnztest
di,offsetmantisfbXjWord ptr[di]bxal,bh
dijprevclicax5bxal,ah
bxal,bl
ax,bxah,al
al,'x'
al,1!1
al,1A'
prevdiCjdisignexp,0cop350di,prevdical,'-1
prevdic,dicop351di,prevdical,'-!-'
prevdic,clieaXjdms
eax,0fl)000hcop355eax5OÍDOOhcop354eax^OfOOh
;exponente negativo
;dms contiene dato en decimal del exp.
;exponente de 5 dígitos
;exponente de 4 dígitos
o
CAPÍTULO It - 1-R04S6JVSM H - 12-4
jnztestjnzmovmovmovhexascmovstosbmovstosbstosbstosbstosbmovpopretn
cop352: movmovmovhexascmovxchgmovstoswmovstosbstosbstosbmovPOP
retncop353: mov
movmovhexascmovxchgmovstoswmovmovmovmovhexascmovstosb
cop353
cop352di, offset dmsaljbyte ptr[di]di,prcvdic
al,bl
al,' l
;exponente de 3 dígitos
;exponenle de 2 dígitos;exponente de 1 dígito
prevdic,dies
di3offset dmsbI3by[eplr[di]al,bl
ax,bxal,ahdijprevdic
al,1'
prevdic.dies
di, offset dmsbl,byte ptr[di]al,bl
ax3bxal,ahdi3prevdic
prevdic.didi,offseí:dmsalbyte ptr[di+l]di,prevdic
CAI'IXULO H - FRCM36j\SM M - 125
mov al,' 'stosbslosbmov prevdJCjdipop esretn.
cop354: mov dÍ3ofFset dmsmov bXjWord pír[di]push bxmov al}blhexascmov ax.bxmov di,prevdicxchg al,ahstoswpop bxmov al,blhexascmov axsbxxchg al,ahstoswmov prevdic.dipop esretn
cop3 55: mov di, offset dmsmov bx.word ptr[di]piish bxmov a1,bhhexascmov ax,bxmov di,prevdicxchg ai,ahstoswpop bxmov al,blhexascmov ax,bxxchg al}ahstoswmov prevdic,dimov dijoffset dmsmov al,byfe p1r[di+2]mov di3prevílichexascmov a1,blstosbmov cli,prevdic
CAPITULO H - ERO4S<r.ASM H -126
popretn
MANTISA:cíemovreímovmovmov
cop20: movreíJc
pushpushmovmovmuímovPoppopjmp
cop21: movdivaddpusb.pushmovmovmuímovmovpoppop
cop22; inccmpjbmov
es
ebx,dword ptr[si-¡-4]ebx3lvar2,2cx,lmantis,10000000heaxJOOOOOOOhebx, 1cop21 ;es un cero o uno?eax ;es un ceroebxeaXjVar2ebxs2ebxvar23eaxebxeaxcop22edx}0
var2 ^entonces es un " ,1 "manííXeaxeax.ebxeax,var2ebx, 2
ebxvar2jeaxeaXjVar2ebxeax
excXj28 ;sufíciente presicion practicacop20eax,mantis
^conversión a decimal de la mantisamovmovdivmovpushxor
ebx,l. 00000000edx,0ebxdi,o0set mantisfeax
eax3eax
CA1TTULO K - PfiO4S6j\SM: H - 127
movPopmov
movmovmovdivshJadd
movmovmovdivshladd
movmovmovdivshladd
movmovmovdivshladdmovmovmovdivshladd
.movmovmovdivshladd
[di], eax ;borro el <eaxbyteplr[di+4],al
eax,edx ;recicluo a edxedx,0ebx, 10000000ebxeax,28
[di], eax
eax}edxedx,0ebx, 1000000ebxeax,24[di] } eax
eax,edxedx}0ebx,100000ebxeax,2G[di] j eax
eax}edxecl\%0ebx, 10000ebxeax, 16[di], eaxeax,eclxedx,0ebx,1000ebxeax512[di],eax
eax,edxedx,0ebx, 100ebxeax, 8[di], eax
mov eax,edxmov edx,0
CAMTULO K - FRCU8£.ASR,r H - 128
ebxmovdivshladd [di],eaxadd [di],edxretn
S AVESXAT; ;guarda palabra de status de coprocesadormov di,prevdicpush espush dspop es ;ds-esmovpush statconpush bxpush bxmov a],bhhexascmov ax,bxxchg a],ahstoswpop bxmov al,blhexascmov ax,bxxchg a1,ahstoswpop bxmov aXj'O'rcr bx, 1jnc copiemov aXjT
copie: stosb ;iemov aXj'O'rcr bx,]jnc copdemov ax,T
copde: stosb ;demov ax,'0'rcr bx, 1jnc copzemov ax,T
copze; stosb ;zemov ax,'0'rcr bx, Ijnc copoemov ax.T
;bx contiene status
S3Í
atií
30Í
¿t-isCCXG
t£OCÍ03
,9/1'-'
¿Sis9'xt:
teodoo
¿'(ü¿9JS
Ll™
ÍT^XG
iT/XB
¿odooT'xq
.OÉ'XK
,1/XG
[odoofxq
lO/xe
.[/XG
Qodootexq
.0/XB
,!>•S3CIOO
^'xqlO/XE
r £YPi Li AB
sddoo['xq
lOt^
/t/XK
andoot'xq
,0/xt;
surduio :¿gj¡duif
qsoisAOLU
3UÍ"
cUuo :¿9jsduif
qsojsAOLU
3Uf
dLUO
aoJdod
qsojs :^odooAOLU
ouf40J
AOLU
qsois :|'odoaAOIU
ouf40J
AOLU
qsojs :QodooAOLU
oufJOJ
AOLU
qsojs :ssdoo
AOLU
ouf.IOJ
AOLU
qsojs íoddooAOLU
oufJOJ
AOLU
qsojs :sndooAOLU
oufJOJ
AOLU
qsojs : 3 odoo
6Z'l - H - H
CAi-rnnio K - pRCU86.AsaE t-| - 130
mov al,'5'Slosbjmp copcSl
st4?: cmp ax,4jne si 3?mov al,'4'stosbjmp copc3,l
st3?: cmp ax,3jne st2?mov al,'3'stosbjmp copcS 1
sl27: cmp ax,2jne stl?mov al/2'stosbjmp copc31
stl?: cmp ax,.ljne stO?mov al,1!1
síosbjmp copcSl
srO?: mov al,'Q'stosb
copcSl: mov ax,'0'rcr bx,4jne copcSmov ax,T
copc3: stosbmov prevdiCjdipop esretn
SAVECONT: ¡almaceno palabra de controlmov dijprevdicpush espush dspop es ;ds=cspush contconpush contconmov bx, contconpush bxpush bxmov al,bhhesasemov ax,bx
CAPITULO K - PR&ISfíJvSRt H - 131
Xchg a1,ahstoswpop bxtnov al,blhexascmov ax,bxxchg a1,ahstoswpop bx ;bx contiene statusmov aXj'O'rcr bx, 1jnc copimmov ax,T
copim: stosbmov aXj'O1
rcr bx, 1jnc copdmmov ax,T
copdm: stosbmov aXj'O1
rcr bx, 1.jnc copzmmov ax,'l'
copzm: stosbmov ax,'0'rcr bx,1jnc copommov ax,T
copom: stosb.mov ax,'0'rcr bx, 1jnc copummov aXj'l'
copum: stosbmov ax,'0'.rcr bx,.1jnc coppmmov ax/1'
coppm: stosbpop axrcr ax,8and axs3cmp ax,3jne pc2?mov ax,3'stosbjmp copre
fo'xq AOUIxq£!'3jU3iquitrqd AOLU
q AOUIxu'sp AOUI
B AOUI
opoisiuddut[
T CYPi Li 'vt-
oidoo¿<xq
UJ3J
dodAOLU
qso;s :oidooAOLU
ouf
qso^sAOLU
Qoidoo duifqsois
,'f/Xt' AOUI
¿QOJ 3Uf
I1 cxe duioOoidoo duif
qsojs,7,eXB AOLU
dtuo :;,duif
qsoisAOLU
g'xe duio£*XB pUE
Ol'XB JOJ
XB dod :ojdooqso^s
,0/xe AOLU :¿oodojdoo duif
qso^s,1,'XE AOLU
['XG duio :¿todojdoo duif
qsojs.^/XB AOLU
¿pd suf7cxc duio
Z£ I ~ H
CAPITULO H - PRO486.ASM K-133
movmovmovmovmovmovmovmovmovpushmovmovmovincmovintpopmovmovintpushmovmovmovintmovmovmovintjnccalijmp
simemoria2:push
P°Pmovmovmovintjnccali
bien corrí do2:movmovpopmov
pb . p aramaddress, bxpb .paramsegmenl p, axbx,offset fcbloque!.pb,fcbj,offset,bxpb ,fcb 1 segm ento, axbx,offset fcbloque2pb.fcb2offsel,bxpb.fcb2segmento,axbx, offset pbdses,axdijpb.fcbl offsetsi,pb. ambiente!siax,2901.h21hesdi,pb.fcb2offsetax,290!,h21hbpviejosp,spviejosSjSsah,62h ;obtener dirección de mi PSP21hes,bxbx,2000h ;2300h ;acortar la memoria que utilizoahj4ah21hsimemoría2menseirorbien corrí do2
dsesbXjOffeet pbdx3 offset nombre!ax,4bOOh21hbien corrí do2menserror
ss,viejossspjviejospbpvisible,0
mmuestra I5visible3ratonpresen te
CAPITULO H - PRO486.ASW H - .134
roov ah,2mov bh,0mov cíh,24raov di, Oin.t lOhrtodocali .funcionescali pdebugmov si,offset lOini ¡preparo y muestro linea Ocali mlinOjmp salida
ensambla:mmuesira 03visible,ratonpresenleItnppntstodomov ax,@datamov ds,ax
mov bx, ambientemov pb. ambiéntelas:mov pbl,ambientel,bx
mov bx,ofísef narchlmov pb.paramaddress.bxmov bx,offset milmov pbl.paramaddresSjbx
mov pb.pararnsegmento,axmov pbl.paramsegmento.ax
mov bx, offset- fcbloquelmov pb.fcb.loffset,bxmov bx, offset: fcbloqueSm ov pb 1 .fcb 1 o lTset,bx
mov pb,fcb].segmento}axmov pbl.fcbJ.segmento,ax
.mov bx, offset fcbloque2mov pb.fcb2offset,bxmov ]3b.fcb2segmento,axmov bXjOffsel fcbloque4mov pb I .fcb2offset5 bxm ov pb 1 .fcb2segmento, ax
mov bx,offset pbpush ds
CAPITULO H - PRQ436.ASM: H - Í35
movmovmovincmovintpopmovmovint
movpushpopmovmovincmovintmovmovintpushmovmovmovinl:movmovmovintjnccalijmp
es,axdijpb.fcbloffsetsi,pb. ambiente!sias,2901h21hesdi)pb.fcb2offselax,290!h2!h
bx, offset pb!clses
sijpb!,ambiente!siax,290!h2!hdi,pbl.fcb2ofifeetax,2901h21h
viejosp,spviejoss^ssah,62h21h.es,bxbx,2000hah,4ah2!hsimemoriaemenserrorbiencom'doe
;obtener dirección de mi PSP
¡2300h jacortarla memoria que utilizo
simemonae:movmov
simemoriae!:pushPOPmovintjnccali
bien corrí doe:cmp
dx, offset nombre2bx, offset: pb
dsesax,4bOOh2!hbiencorridoemensen-or
cl,lbh
CAPITULO K - PRCMS&ASM H - 136
Jemovmovintmovintmovcmp
Je
movmovinl:movmovmovjmp
yalink:movmovpopmov
yalxnkah,9dx, offset: mensens21hah,016hel, alcUbhyalinkbx,2000h ;2300h Acortarla memoria que utilizoah,4ah21hdx, offset' nombre3bx, offset pblcl,.lbhsimerooriae.1.
sSjViejossspjVÍejospbpvisible,0
mmuestra .1 ,visible,ratonpresentemovmovmovmovintríodomovmovintmovinlcalicalimovcalijmp
recleívect:pushpushpushpushmovinl:movmov
ah,2bh,0dh,24dl,0lOh
ah,9dx, offset mensensl2.1hah,016htincionespdebugsi, offset lOini ;preparo y muestro linea 0mlinOsalida
;Redefíne vectores 6h y 7h ;97/02/28clsesaxbxax,3506h2.1 hold6h,esold6h+2,bx
H-137
movintmovmovmovmovmovmovintmovmovintpoppop
POPpopretn
ax,35G7h21ho]d7h,eso1d7h+2,bxax,csdSj3X
dx, offset new6hax3250óh21hdx, offset newThax,2507h21bbxaxesds
new6h proc far
finintl:
;nueva rutina para ta interrupción 6h;instrucción no válida
push axpush dsmov ax3(ojmov ds,axmov error, 1cmp errorcjjOflhje finintl,pop dspop axpop axinc axpush axjmp finint
dsaxaxax
finint:
POPpoppopincpush. axint 3
iretnew6h endp
CAPITÍILO K - BRO4S6J\SHr H- 138
proc far
push axpush dsmov ax,@dalamov ds,axmov error, 2cmp errorcjjOffhje finintlpop dspop axpop axinc axpush axjmp finintiret
newTh endp
pubHc restorvecrestorvec proc near
mov ds,o1d6hmovmovmovintmovmovmov.intretn.
restorvec endp
;nueva rutina para la interrupción 7h;coprocesador no présenle
dx,oid6h+2ah,25h
2Íh
dx,old7h+2al,7h
end
AEEKDICE IT - DEFÜEA.ASM H~ - 1S9
MODULO DEPURA.ASM |
;Ejecuta porciones de código.
.model small
.486
.data
pubHc XferAddr,PointerLsl;Vector2Fpxiblicpublicpublic TablaBrk5FLoadExe;FileSizesFileNarnepublic FinNorma],PSPParent
MyLength equ 36QOh
Vecror2F dd ?ChildName db '01^^486.6x^,0FüeName db 256 dup (0)
ParBIoclí dw OPtrCommLme dw offset CommLineCommSeg
ParBlockNewCommUneFfleSizeFilePtrExeFIagFinNormalReglpRegCsRegSpRegSsRegBpRegDsRegEsRegDiRegSiRegDxRegCxRegBxRegAxflags
dw ?dw 6 dup (?)dd ?db 0,0,0
dw 0dw 0db 0db 0dd ?dw ?dd ?dw ?dd ?dw ?dw ?dd ?dd ?dd ?dd ?dd ?dd ?dw ?
Al'EtíDICE K - DEPURA-ASM H - 140
EÜagsregfsreggsRegTpTnicRegCsTnicRegSpInicRegSsTjücRegBpTnicRegDsTnicRegEsInicRegGsTnicRegFslnicRegDunicRegSilnicRegDxTnicRegCxtnicRegOxEnicRegAxTnicílagsTnicEflagsln.icParSpParSsPSPParentPSPChildstaitNamelenghtNameNByíesFallanFHandlerwAreastoreprvstoreprv2PrsiVPrg.PrsrvPspvectorvecfor2PointerLstPoinlerNxlXferAddrXferProvnadaPrCoclInsTipoCompliCRegCompECValCompECRelardoTF
dddwdwdddwdddwdeldwdwdwdwddcidciddddddddwdddwdsvdwdwdwdbdw
dwdbdwdbdbdbddcidddddciddddbdb
clbdbdd
db
Q
?rj
9
9
?
9
9
9
9
9
9
9
9
79
?
9
?
9
9
9
9
9
9
9
9
9
51,2 dup (?)9
256 dup (?) jzona de preservación de inst. anterior32 dup (?)256 dup (?)? jarea de preservación de vectores de int.?
? ¡apuntador a la última inst. (en EXHASTA)9
? ;dirección de transferencia tras la ejec.9
30 dup (?).16 dup (?)
9
9
9? ¡bandera indicadora de si se produce retardo
FLoadExe db;1a interrupción de trap flag.
APÉNDICE H - DEPDIULÁSM H - 741
corre? db O ;indica si se está corriendo hasta detectar;una condición
TablaBrk db 4096 dup (?)
.codeextrn desens:proc,assem:proc
JoadRegs proc near
;Este procedimiento carga los registros con los valores de memoria.
mov aXj(_mov ds,axpop ax ;extraer la dirección de retorno de estamov worii ptr cs;retloadip,ax ;rutinamov word ptr cs:reíloadcs,cs ;ponerla en el Jmp finalmov bXjílagsmov Edi,Regfpmov es3RegCsmov a1,es;[di] ;opcode de la instrucción por ejecutarcmp 3l,üfah ;CLT?jne NoCHand bXjOfdffh ;si} borrar Ijmp short PonFl.
NoCli: cmp al,0fbh ;STT?jne NoSíior bx,200h ;si, set Ijmp short PonFl
NoSíi; mov Edi,RegSpmov es,RegSscmp a]59dh ;POPF?jne NoPopfmov bx,es;[di] ¿si, obtener flags cíe stackand bXjOfeffti ;borrar Tjmp short PonFJ
NoPopf: cmp al,0cfh ;IRET?jne PonFlmov bx3es:[di+4] ;si, obtener flags de stackancl bx,0feffh ;borrar T
PonFl: push bxmov fhgs}bxpopfpush eaxpiishfd
pop eaxmov eflags.eax
pop eaxmov Eax^regAx
APÉNDICE X - DEPUEA-ASM
mov ebx,regBx.mov ecXj,regGxmov edx,regDxmov ebp,regBpmov esp,regSpmov esi,regSimov edi,regDimov es,regEsmov ss,regSsmov ds,regDsdb Oeah ¡.UVÍP FAR
reíJoadip:dw ?
reüoadcs:dw ?
loadRegs endp
storeRegs proc near5
;Este procedimiento pone en memoria los registros.
H - 142
pushfpushpushmovmovpopmovmovmovmovmovmovpushxormovaddandpushmovancimovPOP
addmovpopmov
dsax ;(9/12/96)ax}@datads,ax
regAXjEaxregBXjEbxregCx,EcxregDx,EdxregBpjEbpregsp.espeaxeax, eaxeax,regsp
eax.OOOOffifheaxeax,regspeax5OfEETOOOOhregsp.eaxeaxeax,regspregsp:eaxeaxregFs,fs
APÉNDICE H - DEPUHA.ASM: H-143
movmovmovmovmovpopmovpopmovandormovpushandandorpopretn
storeRegs
regCjs3gsregSijEsiregDi,Edireg£s,esregSs^saxregDs,axax ;AX=fbx,f)ags ;BX:
bx3200h ;dejax,bx ;dejaiflags,axeaxea^OOOOrTiíheflags}OrEm)OOOheflags,eaxeax
endp
; nuevas~Qags anteriores
;dejar solo la bandera de interrupciónel estado anterior de I en flags
public TestTrapTestTrap proc .near
;Este pi'ocedimiento determina como se comporta la computadora en cuanto a si;hay o no retardo en Ja interrupción 1> que debería producirse en cuanto sea 1;la trap flag, pero que suele retardarse en una instrucción en ciertos;micropro cesa dores. De ser este el caso, ReííirdoTF es 1, y de lo contrario 0.
pushpush.pushpushpush;push;pushmovintmovmovmovmov
axbxdxdsesfsgsax,3501h ;get vector .121hax;@datüds5axword ptr vector,bxword ptr vector-t-2, es ;preservar vector original
mov ax,csmov ds.axm ov edx, offset AfVerTestmov ax,2501b ;poner como vector la dirección de APTERTESTint 21h
APÉNDICE H - DEPURA-A-SMH -
xor bx,bx ;BX - O;flags en el stack¡fiíigs en AX;T = 1jflags cambiadas devuelta al stack
¡tras esta instrucción, debe producirse la inf;si hay retardo, se ejecutará esta inslrucción
¡restaurar stack, alterado al producirse la int
pop axor ah,lpush axpopfnopmov bx,lnopnop
AfterTest:add sp,<5mov ax,@datamov ds,axmov RetardoTF,0cmp bx,0je YaProbadoinc BytePtrRetarcloTf
YaProbado:Ids dx, vectormov ax,2501h ¡restaurar vector 1int 21hpop espop dspop dxpop bxpop axretn
TeslTrap endp
public ExUniqExUniq proc near
3
¡Este procedimiento coloca el código de SETTRPFLG inmediatamente antes de la¡inslrucción que se desea ejecutar (preservando lo que estaba antes), ejecuta¡dicha instrucción, y luego restaura el código. Si la insfracción es una¡intemipción, el procedimiento es diferente: se simula dicha interrupción¡de forma que se recupera el control una vez ejecutada.
¡Entrada: Regjp; RegCs: Deben contener la dirección absoluta de la; instrucción que se quiere ejecutar.; RetardoTF: Debe ser ]. si hay q\ie considerar un retardo; en INT 1 tras hacer T=l, O en caso contrario.; XFERADDR: Debe contenerla dirección absoluta donde debe; transferirse el control una vez finalizado este; procedimiento.
APÉNDICE li - DEPURA-ASMH - 1.45
;Satida: RegjpRegCs: Contienen la dirección déla siguiente
instrucción, después déla ejecutada.
;TiVIPORTANTE: Este procedimiento debe invocarse mediante un¿medíanle un CALL.
y NO
cidmovmovmovmovmovmovmovcmpjbmovmovjmp
noKB: movcmpjejmp
Silní; movcmpjne
SaUIhtympNolnt21:mov
intmovcmpjaemovmovmovmovmovmovpushpopfclipushfpushmovadd
ax,@dataessaxds,axcl,RetardoTF ;bandera de retardo en CL]isi,RegTpds,RegCsax,dsax,OaOQOhnoRBax,@daíads,ax
;DS:SI = apuntador a la instrucción
jROMBTOS?
dword ptr XferAddr ;si, no hacer nadaal, [si]al,0cdhSiTntNolntal,[si+l]al,21hNolní21ExPaso
ah,35h21hdx,esdx,GaQOOhSílltíllt
dx,@datads,dxParSpjSpParSs3ssEsp,RegSpss3RegSsílags
RegCsEdx,RegIpdx,2
;es una TNT ?
;número de la int.
¡siempre sallar la int 21
;get vector
¡ROMBTOS?;si, saltar
¡Simular la inteirupción
APÉNDICE H - DEFURAASM H - 146
pushmovmovmovmovmovmovjmp
RegSp,ESpRegSs,SsSpjParSp
RegIp,Ebx ;apRegCs,esdword ptr xferaddr
Nolnt:cmp
cmpjne
SiMSRg:jmpNoMSrg: cmp
jnecmpjecmpJe
cmpjecmpjejne
SiMSRgl:andcmpje
norargl:pushdecdecmovmovmovsbmovsbmovmovmovmovcmpjnexchg
AlterCod:stosb
al,8chSiMSRgal,8ehNoMSrg
Expasoal,0fh
SiMSRgl[si+l],0a0hSiMvSrg
; apuntar a la rutina
;finali.zar
;mov sreg ?
SiMSrg[si+l],0a8hSiMSrg[si+l]}0a9hSiMSrgnomrgl
al,0e6h
SiMSrg;push o pop sreg?
dssisi ^apuntar a los dos bytes anterioresdx,si ;preservar este apuntadoredi,offset storeprv ;ES:DI apunta a donde se preserva el código
;preservar código anterior a la instrucción
ax.,dses,axdi,dxax,909dhcl,0AlterCoda!3ah
;ES:DI apunta a donde se colocara POPF;código de POPF y NOP
;si no hay retardo, poner el NOP antes del POPF
¡colocar el código alterado
APÉNDICE H - DEFDRA-ASM H - 147
movstosbmovpushintmovmovmovmovmovmovmovmovintpoppopmovmovmovmovmovmovcalipushfpushpushmovmovor.movpoppopdb
dirip: dwdircs: dw
al,ah
ax,3501h ¡get: vector 1dx21h
ds}axWord pír vector,bxword ptr vector-K2, es ¡preservar vector originalaxjcsds.axedx, offset afterexax,250.1h ;poner como vector la dirección de AFTEREX21hbxaxword ptr cs:dirip;bxword ptr cs:dircssax ¡dirección del salto
ds}axParSp3sp
loadRegs ¡poner los valores de los registros¡flags en el stack
axbpbp3sp ¡apuntar BP al stackax,[bp+4] ¡flags en AX
[bp-f4],ax ;flags cambiadas de vuelta al stack
axOeah ¡JMP FAR
alíerex: ¡aquí se pasa el control luego de ejecutar la
ax ¡instrucción única por efecto de la intpush bppush dsmov ax,@clatamov ds,axmov bp,spmov ax,[bp+6] ¡obtenerla dirección deretornOjm ov word ptr pointernxt, axmov ax3[bp+8]
APÉNDICE H - DEFURAJvSM 4-148
movpoppoppopcalicid
movmovmovmovmovmovdecdecmovmovsbmovsbIdsmovintmovmovmovpushxorpopmovmovmovjmp
exuniq endp
word ptr poínternxt+21ax ¡preservar esta direccióndsbp ;(9/12/96)axstoreRegs ;salvar registros
; hace flag D=0 por lo tanto SI y DT incrementan¡solo se ]o usa en cadenas JORGE(9/12/96);no efecto con mi problema (eip=eax en parte alta)
ax,@datadsjíixsp,ParSpSs,ParSsEdi,RegTpes,RegCs ;ES:DI = apuntador la instrucción ejecutadadi ¡apuntar al código alteradodiesijOÍfset storeprv
¡restaurar código
dXjVectorax,2501h ;restaurarvec1or ]21hax,@datads,axax,word ptr pointemxtaxeax,eaxaxRegTp.eaxaXjWord ptr poiníernxt+2RegCs5axdword ptr xfei-addr ¡.finalizar
p\iblic exhastaexhasta proc near
;Este procedimiento ejecata desde la dirección de inicio indicada (inclusive)¡hasta la de finalización (exclusive) indicada.)¡Entrada: Reglp; RegCs: Deben contenerla dirección absoluta de la; instrucción desde la que se quiere ejecutar.; POTNTERLST; Debe contener la dirección absoluta de la; instrucción hasta la que se debe ejecutar.; XFERADDR: Debe contener la dirección absoluta donde debe: transferirse el control una vez finalizado esle
APÉNDICE It - DEPURA-ASM |_[ _ j^g
; procedimiento.
3
¡IMPORTANTE: Este procedimiento debe invocarse mediante un JMP, y NO¡mediante un CALL.
cidmov ax3@datamov ds,axmov ah,62h ¡encontrarla dirección de mi PSPint 2.1hmov PSPChildjbx ¡Preseivarla, asumiendo que este es un childmov edXjüffset afiergocali SetTerm ¡por si hay un EX1T, fijo dirección de term.les si,pointerlsí ¡ES;ST = apuntador a Ja última instrucciónmov ax^escmp a^OaOOOh ¡ROM BIOS?jb noRBhjmp dword ptr XferAddr ¡si, no hacer nada
noRBh; mov a],es:[si] ¡preservar lo que hay allímov byte ptr storeprv, almov byte ptr es:[si],0cch ¡colocar un breakpoint (INT 3)mov ax,3503h ¡get veclor 3int 21hmov ax,@datamov ds5axmov word ptr veclor,bxmov word ptr vector-K^es ¡preservar vector originalrnov ax,csmov ds,axmov edXjOfíset' aftergomov ax,2503h ¡poner como vector 3 la dirección de AFTERGOint 21hmov ax,@datamov ds,axmov Eax,RegTp ¡preparar ejecuciónmov word ptr cs:goip,axmov ax,RegCsmov word ptr cs:gocSjaxmov ParSp,spmov ParSs.sscali loadRegsdb Oeah ¡TMP FAR
goip: dw ?gocs: dw ?
afíergo: ¡aquí se pasa el control luego del breakpointcall storeRegs
APÉNDICE H - DEPUHAj\SM H - 150
cidmovmov.movmovmovinrcmpjecaUcal]movmovcalimov
EsHijo: movpushxorpopmovmovmov
RestDir;lesmovmovIdsmovintmovmov
exhasta endp
[email protected],axsp3ParSp
ah,62h21h ;obtengo dirección de PSP actualbx5PSPCbÜd ¡es este un proceso hijo?EsHijoSavePspCh-ild ¡no, preservar parámetros del PSPReduceLevel ¡bajar de nivelax,@datads,axRestPspChild ¡restaurar parámetros del PSPEinNormal,.!. ;mostrar mensaje de finalización de procesoshort RestDirax,word ptr pointerlst ¡poner la dirección de la nueva inst.
axeax,eaxaxReglpjEax ;coino resultadoax,word pír pointerlslH-2RegCs,ax
;ES:SI = pointer al breakpointsi,pointerlstal,byte pír storeprves: [si], al ;restaurartlx, vectorax,2503h ¡restaurar vector 321hax,@clatads,ax
dworcí ptr xferaddr ¡finalizar
publíc expasoexpaso proc near
¡Este procedimiento ejecuta desde la dirección de inicio indicada (inclusive)¡hasta la siguiente intrucción (exclusive). Es útil para saltar subrutinas.j¡Entrada: Reglp; RegCs; Deben contener la dirección absoluta de la¡ instrucción desde ja qxie se quiere ejecutar.¡ XFERADDR; Debe contener la dirección absoluta donde debe; transferirse el control una vez finalizado este
AEETTOICE H - DEFÜRA.ASM H - 151
procedimiento.
;IMPORTANTE: Este procedimiento debe invocarse mediante un JMP, y NO;mediante un CAUU3
cidmovmovmovmovlodsbcmpjbcmpjbe
noprf: decgetlen: mov
movmovcalimovacldmovmovmovmovmovcmpjnejmp
No.Tmp: cmpjnecmpjnecmpjnejmp
NoRet: cmpjnecmpjnejmp
NoTret: cmpJne
cmpjnecmp
ax3@dataíls,axEsi,RegTpdSjRegCs
al,0f0hnoprfal}0í3hgetlensiax,@dataes,axedi, offset nadadesensbx3es:[di] ;obtener primeros caracteres del mnemoex, siax,@datads,axword ptr pointerlst,cxax,RegCsword ptr pointerlsM-2jaxblj'.T ;es algún tipo de salto?No Jmp ;noExUmq ;si
bl/R' ;esunRET?NoRetbh/E'NoRetbyteptres:[di-K>],Tf
NoRet ;noExUniq ;si
bl,T ;esun.TRET?Nolretbh,'R'Nolret ;noExUniq ;sicon'e?,0fíh ;si se está corriendo hasta unairexhasta ^condición se debe ingresar a los calibi;Cf ;esunLOOP?
irexhastabh.'A1
APÉNDICE H - DEPURA-ASM I I - 152
jne irexhastacmp byte ptr es:[di+2],lL1
jne irexhastacmp byte ptr es:[di+3],'L'jne irexhasta ;nojmp exuniqirexhasta;jmp exhasta
expaso endp
public exCondexCond proc near
3
;Este procedimiento ejecuta desde la dirección de inicio indicada (inclusive);en adelante hasta que se cumpla una condición determinada.3
¡Entrada: RegTp; RegCs: Deben contenerla dirección absoluta de la; instrucción desde la que se quiere ejecutar.; AL; O si la condición es igualdad de un registro; con un valor; .1. si la condición es desigualdad entre un; registro y un valor, en ambos casos:; AH: xxxOwReg para registros normales; xxxlxxSr para registros de segmento; BX: valor; 2 si la condición es de flags, en este caso:; AH: xxxxCond; XEERADDR: Dirección de terminación al finalizar;Salida: RegTp; RegCs: Apuntan a la próxmía intrucción tras cumplirse; la condición;NOTA: Este procedimiento debe invocarse mediante Jmp, y no Cali.; ""
mov dx,@datamov dSjdxmov corre?, Offhles dx,XferAddr ;preservar el XferAddrmov word ptj- XferProv}ci\m ov word ptr XferProv-i-2, esmov word ptr XferAddr+2,cscmp al,2 ;condición de ;flag?jne RegCondmov edx,offset FICondRet ;si, fijar terminaciónmov word ptr XferAddr,dxand ahjOfh ¡generar código de un Jconditionor ah,70h ;cambiar el código para que se produzca
APEWDICE H - DEFURAJ\SM:I I - 153
111 OV
RegCond:mov.movmovmovmov
RS2EC: cmpjnemovjmp
RS3EC: cmpjnemovjmp
RS4EC: cmp
byte ptr cs:condic,ah ;un salto en la condición dadaExPaso
edx3offset RegCondRet\vord ptr XferAddr,dxTipoCompEQalRegCompEC,ahVíilCompEC,Ehx
ExPasoFICondRet:
movmovcmpjepushpopf
Condic:
jojmp
GoExitCond:jmp
RegCondRet:movmovcmp
movtest
andcmpjnemovjmp
RS1EC: cmpjnemov
ds,axFinNonnaJjlGoExilCondflags
GoExitCondExPaso
ExitCond
ax,@datads,axFínNormal,!GoExiíConda1,RegCompECal,80hRegNormalal,7al}0RS1ECdx,Reges\VrordRegO
al,lRS2ECdx,RegpsWordRegO
al,2RS3ECdx,RegSsWordRegO
al,3RS4ECdx,RegDsWordRegO
al,4
;el código de esla insínicción es¿alterado anteriormente
APÉNDICE H - DEFURAJkSM , , _ , - .
jne RS5ECtnov dXjRegFsjmp WordRegO
RS5EC: mov dx,Reggs
WordRegO:mov ahjRegCompECjmp WordReg
RegNormal:mov ah,aland a 1,7cmp al, Ojne R1ECmov EdXjRegAxjmp short RdyVal
R1EC: cmp al,ljne R2ECmov Edx,RegCxjmp short RdyVnl
R2EC: cmp al,2jne R3ECmov EdXjRegDxjmp shortRdyVal
R3EC: cmp al,3jne R4ECrnov Edx,RegBxjmp short RdyVal
R4EC: cmp al,4jne R5ECmov EdXjRegSpjmp shortRdyVal
R5EC: cmp al,5jne R6ECmov Edx,RegBpjmp short RdyVal
R6EC: cmp al,6jne R7ECmov Edx,RegSijmp short RdyVal
R7EC: mov Edx,RegDiRdyVnl: test ah,18h
jnz WordRegand ah,8and ValCompECjOfEh ¡recortar a 8 bits el valor de comp.and Edx,0ffh ¡eliminar MSByte del registrocmp al ,4
APÉNDICE H - DEHJHAJ^M
jb WordRegjne S5ECmov dl3byte ptr RegAx+1jmp short WordReg
S5EC: cmp al,5jne S6ECmov dljbyte ptr RegCx+1jmp short WordReg
S6EC: cmp al,<5jne S7ECmov dl,byte ptr RegDx+1jmp short WordReg
S7EC: mov dl,byte ptrRegBx+1jmp dwordreg
WordReg:test ah,16jnz dwordregand edxíOfetíh.and valcompeCjOfñíh
dwordreg:m ov Eax, Val CompECcmp byte ptr TipoCompEC, 1je Desigcmp Eax,Edx ¡comparar el registro con el valorje ExitCondjmp ExPaso ;ExUmq
Desig:cmp Eax,Edx ¡comparar el registro con el valorjne ExitCondjmp ExPaso ;ExUniq
ExitCond;mov ax,@datamov ds,axles dx,XferProv ¡restaurar XferAddr (9/12/96)mov worcl plr XferAddr, dxmov word ptr XferAddr-l-2,esmov corneojmp dword ptr XferAddr
exCond endp
APÉNDICE lí - DEPUHA-ASlvr H - 156
pubiic AddBrkPtAddBrkPl proc neari;Este procedimiento añade un breakpoint a la tabla, de no haber existido;antes uno en Ja dirección indicada o con el nombre indicado, caso contrario,¡elimina dicho breakpoint para crear uno nuevo.3
¡Entrada: DS:S.t apunta al nombre del breakpoint (10 caracteres; siempre, forzados final); DX:BX dirección absoluta del breakpointi;Salida: CX número del nuevo breakpoint; CY sel si hubo error, excediendo el límite de 255:
xor cl,cl ¡referencia por dirección, a DelBrkPtBorraB: cali DelBrkPt ;busco y elimino de la tabla al breakpoint
jnc BorraBmov cl,l
BorraN: cali DelBrkPt ¡eliminar también los de nombre igualjnc BorraNpush ajípush sipush espush dicidmov ax,@datamov es,axmov edijOfíset TablaBrkmov al,l ¡número de breakpoint
SrchFl: cmp byte ptr es:[di],O ¡fin de tabla?je FinTabadd di, 16inc aljz ErrAdBr ¡si se llega a 256, errorjmp short SrchFt
FinTab; stosb ¡guardar en la tabla el numero del brkpt.mov ah,almov al, 1,stosb ¡marco activo al nuevo breakpointmov ex, 10rep movsb ¡poner el nombre en la tablamov cl,ah ¡parámelro de retornoxor ch,chmov ax,bx ¡guardar dirección en tablastoswmov ax,dxstosw
APÉNDICE K - DEPimjVASM 1 1 _ 157
cíejmp short Fin AdBr
ErrAdBnstcFinAdBr:pop di
pop espop sipop axretn
AddBrkPt endp
public DelBrkPtDelBrkPl proc near;
;Este Procedimiento elimina un breakpoint de la tabla.:
¡Entrada: si CL - O entonces; DX:BX dirección absoluta del breakpoint por eliminar; si CL o O entonces; DS:SI apunta al nombre del breakpoint por eliminar3
¡Salida: CY si el breakpoint no estaba en la tabla
push axpush expush sipush dipush dspush escidmov ax}@datamov es,axmov edi, offset TablaBrk
SrchBrk:cmp byte ptr es:[di],0je FinTablacmp c],0 Deferencia por nombre?jne SrchNam ;si.cmp es:[di+12],bx ;nojne NoEsEstecmp es:[di+] 4],dxjne NoEsEstejmp Encontrado
SrchNam :push sipush dipush exinc diinc di ¡apunto al nombre en la tablamov ex, 10
APÉNDICE H - EEPURA-ASM H-158
diah,alFinSrchNamCmpNam
cx,0exdisiEncontrado
CmpNam: lodsbinov ah,es:[di]inccmpjneloop
FinSrchNam:cmppoppop
POPJe
NoEsEste:addjmp
Fin Tabla:stcjmp
Encontrado:movaddmovmov
MovTab: cmp
short SrchBrk
shortFinDlBrk
si, disi, 16ax,esds;ax:
byte ptr [si],0YaBon*ado
lodswdecstoswmovrepjmp
YaBotrado;movsbcíe
FinDIBrk:poppoppoppoppoppopretn
DelBrkPt
al
ex, 7movswshort MovTab
;ajustar el número del breakpoint;una vez encontrado el brkpt, eliminarlo
;moviendo hacia atrás el resto de la tabla
jmover el fín de tabla
esdsdisiexax
endp
APÉNDICE H - DEPOHA-ASM Jf _ 559
publjc TogBrkPtTogBrkPt proc near
;Esíe Procedimiento invierte el. estado de un breakpoint de la tabla.
5
^Entrada: si CL = O entonces; DX:BX dirección absoluta del breakpoint; si CL o O entonces; DS:SI apunta al breakpoint5
;Salida: CY si el breakpoint no estaba en la tabla3"
push axpush exptish sipush dipush escidmov ax,@datamov es3axmov edi, offset TablaBrk
EncBrk; cmp byte ptr es:[di],0je FinTablaBcmp el,O Deferencia por nombre?jne EncNam ;sicmp es:[di+12],bx ;nojne NoEsEsteBcmp es;[di+14],dxjne NoEsEsteBjtnp EncontradoB
EncNam: push sipush dipiish exinc diinc di ;apunto al nombre en la tablamov ex, 10
CmpNom: lodsbmov ah,es:[di]inc dicmp ah,aljne FinEncNamloop CmpNom
FinEncNam:cmp cx.,0pop expop dipop si
APÉNDICE H - DEPURA-ñSM
je EncorUradoBNoEsEsteB:
add di, 16jmp sbort EncBrk
FinTablaB:stcjmp sb ort FinHabBrk
EncontradoB:xor byte ptr es;[di+l],l ;toggle el breakpoint
EinHabBrk:pop espop dipop sipoppopreta.
TogBrkPt endp
public ExTotalexTotal proc near3
;Este procedimiento ejecuta desde lít dirección de inicio indicada (inclusive);hasta encontrar alguno de los breakpoints listado en la tabla. Si no hay;breakpoinís3 se ejecuta hasta el fín del programa.3
jEntrada: Reglp; RegCs; Deben contener la dirección absoluta de la; instrucción desde la que se quiere ejecutar.; XFERADDR: Debe contener la dirección absoluta donde debe; transferirse el control una vez finalizado este; procedimiento,; TablaBrk Tabla de breakpoints. Cada, uno es un registro; de 16 bytes, y el final de la tabla es un O,; La estructura de cada registro es:i; Offset Longitud Contenido; O 1 Numero (1 a 25 5); 1 1 Estado (1 =hab, O = desh.); 2 10 Nombre (forzado a 10); 12 4 Dirección absolutai;IMPORTANTE: Este procedimiento debe invocarse mediante un JMP, y NO¿mediante un CALL.
cidmov ax,@datamov ds,ax
APÉNDICE K - DEPURAOS»! j_| _ jg¡
mov ah,62h ¿encontrarla dirección demiPSPint 21hmov PSPChildjbx ¿Preservarla, asumiendo que este es un child
mov ax.@datamov ds,axles bx,XferAddrm o v word ptr XferProv, bxmov word plr XferProv+-2,esmov dword ptr XferAddr,offset AftPrimlnstmov word ptrXferAddr+2,cs
jmp ExUniq ¿ejecutar la primera instrucción por si había¿un breakpoint allí.
AftPrimlnst:les bXjXferProvmov word plr XferAddr}bxmov word pIr XferAddr-f-2,escmp FinNorm al, ,1jne ' NoAcabojmp dword ptr XferAddr
NoAcabo:mov edx, offset AfterGoTotcali SetTerm ;por si hay un EXI.T, fijo dirección de tenn.mov esijOÍTset TablaBrkmov edi, offset StorePrv2
Prsrv: cmp byte ptr [si],0je FinPrsrvcmp byte ptr [sv+l]30je NxtBrkPt ¿ignorarlo si esta deshabilitadomov bx,[si+12]mov es,[si+14] ¿obtener dirección del BrkPtmov al,es:[bx] ;presejvar lo que hay allímov [di]}almov byte ptr es;[bx]50cch ¿colocar un breakpoint (INT 3)inc di
NxlBrkPt:add si, 16jmp short Prsrv
FinPrsrv:mov ax,3503h ;getvector 3int 21.hmov ax,@datamov ds,axmov word plr vector25bxmov word ptr vector2+2, es ¿preservar vector origin almov ax,cs
APÉNDICE H - H - 162
movmovmovintmovmovmovmovmovmovmovmovcalidb
GoTotTp:dwGoTotCs:dw
AíterGoTot;pushpushpushmovmovmovmovdecmovmovmovpoppoppopcalicidmovmovmovmovmovintcmp
Je
calicalimovmovcali
as,axeclx} offset AfterGoTotax,2503h ;poner como vector 3 la dirección de AFr
21hax,@datads,axEaXjRegTp ¡preparar ejecuciónword ptr cs:goTotIp,axax,RegCsword ptr cs:goTotCs;axParSp3spParSs3ssloadRegsOeah ;JMP FAR
?
?
;aqui se pasa el control luego del breakpointaxbpdsax,@datads,axbpjSp^[bp+^l ¡obtenerla dirección de retornoax ¿ignorar el breakpointword ptr pointernxr,axaxj[bp-f8]word ptr pQÍnternxH-2,ax ;preseivar esta direcciónds
bpaxstoreRegs
aXj@datads3axsp,ParSpss,ParSsah,62h21h ;obtengo dirección de PSP actualbXjPSPChild ;es este un proceso hijo?EsHyo2SavePspChild ;no, preservar parámetros del. PSPReduceLeve] ;bajar de nivelax,@datacls,axRestPspChild ¡restaurar parámetros del PSP
APEKDTCE K - DEWJKAASM
mov FmNormal,! ¡mostrar mensaje de fin de procesojmp sn orí- RestBrk
EsHijo2:mov ax,word ptr pointernxt ;poner la dirección de la nueva insl".push axxor cax,eaxpop axmov RegIp5Eax ;conio resultadomov ax,word ptrpointernxl+2mov RegCs,ax
RestBrk:mov edi,ofíset StorePrv2mov esijOffset TablaBrk
Rstr: cmp byte ptr [si],Oje FinRslrcmp byte ptr [si+l],0je NxtBrk ¡ignorar el brkptsi esta deshabituadomov bx,[si+I2]mov es,[si+14]mov al,[di] ¡restaurar lo alterado por los breakpointsmov es:[bx],alinc di
NxtBrk; add si, 16jmp short Rstr
FinRstr:Ids dx,vector2mov ax,2503h ¡restaurar vector 3int 21h
finj:mov ax3@dalamov ds,ax
jmp dword ptr xferaddr ¡finalizar
exTotal endp
public ExlnsExlns proc near
3
¡Este procedimiento ejecuta una instrucción no perteneciente al código.3
¡Entrada: DS:SI apunta a un asciiz que contiene el mnemotécnico; de la instrucción por ejecutar¡ XFERADDR punto de transferencia al finalizar.¡Debe ejecutarse mediante JMP.!
push ds
AEENDICE lf - DEL'URAASIVt li-164
pushmovmovmovmovmovmovmovmovmovrepmovmovmovmovpop
POPcalijemovmovlesmovmovmovmovpushjmp
AftExTns:popmovmovlesmovmovmovcmpjnemovmovaddcmpjnemov
RestCod:movmovmov
siax,@datads,axes,axEsi,RegTpds,RegCsedi, offset PrCodlnses:[di+103,sies:[di+12],ds ¡preservar RegCs,RegIpcx34movsw ¡preservar lo actual en RegCsrRegTpax,esds,axEdi,RegTpes;RegCssidsassem ¡ensamblar, CX tiene la long. del cod. generadoFinExInsax,@datads,axax,XferAddrword ptr XferProv,axword ptr XferProv-f- 2, esdword ptr XferAddr} offset AftExTnsword ptr XferAddr+2,csexExUniq
exax,@datads,axaXjXferProvword ptr XferAddr,axword ptr XfbrAddrt-2,esax,word ptr[PrCodTns-!-.1.2]ax,RegCsResTCodax.word ptrrPrCodIhs+.l01j i, u j
dx,axax,cxEax,RegTpReslCodRegTp,Eclx
esi, offset PrCodTnses,word ptr[PrCodIns+12]di,word ptrfPrCodIns+10]
AFENDICE H - DKFURAJWit
mov ex, 4rep movswcíe
FinExTns:jmp dworcl ptr xferaddr
ExTns endp
public AcortaMiMemAcortaMüVIem proc near
tí-] 65
;Este procedimiento reduce la memoria localizada para el proceso padre a;MyLenght párrafos, para dejar memoria libre,; CY set si hay error.3
movmovmovintmovmovmovmovintreln
ax,@datads,axah,62h ;21hPSPParetrl,b,\eSjbxbx3myLengthah,4ah21h
obtener dirección de mi PSP
;acortar la memoria que utilizo
AcortaMiMem endp
public InstHnndler<53InstHandler63 proc near
¡Este procedimiento instala elHandler de servicio de la interrupción 63, de;no estar ya instalado, y ademas contiene el handler.
movmovmovmovintmovmovmovmovmovmovint-
Yalns: retn
ds,axaXjSQQQh ;preguntar si ya esta instalado el handlerax,3563h ;no, hacer un getVecíor para preservar el21h ;vector originalworcl pü* Vector2F+2,esword ptr Vector2F,bxclx, offset Handler2Fax,csds,axaXj2563h ;SetVector de mi rutina21h
Handler2F:
APÉNDICE íí - 11-166
cmp ah,80hje miópush axpush dsmovmovmovmovmovmov word ptr cs:[salto+3]}axpop dspop ax
;esíe es e] servicio a la interrupción
ax,@datads,axax,word ptr Vector2fword ptr cs:[Sa1to+l],ax
ptr Vector2f+2
Salto: dbdd
Oeah
;si, fin
;es un reqyiest de existencia?
mió: cmp . a],0f8h ¡función reservada?jb noReserviret
noReserv:or al, aljnz noRequestmov aljOffh ;si, decir que ya esta instaladoiret
NoRequest:jmp ChildProc ¡devolver control
mstHandler63 endp
public SavePspChildSavePspChiJd proc nearI
¡Este procedimiento preserva la segunda mitad delPSP del pi
pushpushpushpushpushpushmovmovmovmovmovmovreppoppop
axexsididsessi,8Ghedi, offset PrsrvPspax,dscs,axds,PSPChildcx,40hmovswesds
APÉNDICE 11 - DHL-URAJVSir
pop dipop sipop expop axretn
SavePspChild endp
public RestPspChildRestPspChild proc near
H- 167
¿Este procedimiento restaura la segunda mitad del PSP del Cliilcl.
movmovmovmov,repretii
esi, offset PrsrvPspes;PSPChilddi,80hcx,40hmovsw
RestPspCbild endp
public reduceLevelReduceLevel proc near
;Este procedimiento ejecuta Child486.exe, que simplemente devuelve al control a;ChildProc, de forma que se baja el nivel a procedimiento bijo. Restaura los;regístros a sus valores iniciales. Retoma CY=1 si por alguna razón no es¿posible correr Child486.exe,
movmovmovmovaddmovxormovmovrepmovmovmovmovmovmovmovmovint
ax3@datads,axes3axax,PSPChüdax,10hds,axsi, siedijOffset PrsrvPrgcx,10h ¿preservarlo que había antes desdemovsw ;PSPChüd+10:0, 32 bytesaxsesds,axCommSeg,axedx, offset ChiJdNameebXjOfísetParBlockax34bOOhParSs,ssParSpjSp ¿preservo Stack21h ;EXEC!
APÉNDICE TE - DEPURA-ASM I I -168
movmovmovmovretn
ChiMProc:movmovmovmovmovaddmovmovxormovrepmovintmov
FinRedLev:movmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmov
ax,@data ;E1 conlrol no se transfiere si hay error, yds,ax ;viene aqui, asi que recupero Stack y retomo.ss,ParSs ;Notese que CY es 1 en este punto, por el fallosp,ParSp ;de la función del DOS.
ax,@datads,axss,ParSssp,ParSp ;Recuperar Stackax,PSPChiklax,10hes,axesi, offset PrsivPrgdi, dicx,10hmovsw jRestaurarlo alterado debido alEXECah,62h ;encontrar la dirección del PSP de] child21h ;processPSPChilc^bx ;Preservarla
ax,RegGs!nicRegGs3axaXjRegFsmicRegfs,axEaXjRegTpInicRegTp,Eaxax,RegCsInicRegCs,axEaXjRegSpInicRegSpjEaxax,RegSsTjiicRegSs3axEax,RegBpInicRegBp,Eaxax;RegDsTnicRegDs,axaXjRegEsTiiicRegEs3axEax,RegDiInicRegDisEaxEaXjRegSilnic.RegSi,EaxEax,RegDxTiiicRegDx3EaxEaXjRegCxInicRegCx3Eax
APÉNDICE K - DEL*Un,VAXM-
mov EaXjRegBxTnicmov RegBx,Eaxmov EaXjRegAxmic,mov RegAx,Eaxmov ax,flagsTnicmov flags,axpush eaxmov eax,eílagslnicmov eflags,eaxpop eaxretn
ReduceLevel endp
public SefTermSetTerm proc near
;Este procedimiento fija la dirección, de terminación del proceso hijo.3
;Entrada: DX = dirección de íenninaciónj -
mov axsPSPChüdmov es,axmov es:[10]jdxmov es:[12],csreín
SetTerm endp
public LoadExeLoadExe proc near5 ~~ ~
;Esle procedimiento carga el archivo cuyo nombre se pasó como parámetro;a este programa en el PSP del proceso padre, al final del PSP del hijo.;Luego calcula los valores iniciales de los seudoregistros, y pasa los;siguientes parámetros al PSP del hijo. CY es 1 si se pasó un nombre de¡archivo incorrecto o si hubo problemas al cargar el archivo.;Obtiene la posición del Load Module dentro del archivo que se carga.3
;Ademaíí se reloma la siguiente información en FLoadExe:; O si es un archivo .exe; I si es un archivo .cora; 2 si es un archivo de datos; 3 si no se se especificó un nombre de archivo; 4 si el archivo especificado no existe; 5 si no se pudo cargar el archivo .exe^ _
mov aXj@data
ir - DEPURAJVSMU - 170
movmovmovmovmovmovmovcmp
Je
movcidrepecmp
Je
decincmovmovmovmovmovmov
XferName:jodsbcmp
ds,axParSpjSpParSs,ssax,PSPParentes,ax ;ES apunta al PSP del padre.di,81h ;voy a buscar el nombre del archivo.cx37fhbytep1res:[80ri]}0noParamal,' '
scasb ¡encontrar el primer elemento diferente de ' 'cx;0NoParamdiexsi, diax,esds,ax ;DS apunta al PSP del padreax,@dataGs,axcdij offset FileName
al,"noEndNendNombreArch
noEndN; stosbdec exjz NotFound
shortxferNamejmpNotFound:
mov
NoParam:mov
byte plr FLoadExe,4SinProgi'amaEx e
byte ptr FLoadExe33S inProgramaExe
LoadNoExe:movmovmovmovlodsbcmp
ds,dxds^PSPParentsi, ex
ni ' 'ai,.jne NoComlodsb
ATENDICE It - DEPURA-ASMH - 17.1
and.cmpjnelodsbandcmpjnelodsbandcmpje
NoCom: movmov
al,0dfhal.'C1
NoCom
al,Gdfhal,'Q'NoCom
a1,QdfhaVM'SiCom
ds,dxbyte plr FLoadExe,2
jmp short LoadFileSiCorn; mov
movLoadFile:
movmovinljemovmovmovmovmovmovintjemovmovmovmovmovint
ds,dxbyte ptr FLoadExe, ]
edXjOffseí: FileNameax;3d40h21hNotFoundFHandle,axbx,axdx,100hc^Qfflíhds,PSPChüdah,3fh21hNotFoundbx}@dafads}bxFileSize,axbx,FHandleah,3eh
;abnr archivo
;leer archivo
2] h ;cerrar archivo
S i nProgramaExe:movmovmovmovmovmovmovmovm ovcmp
ax,@datads,axss3ParSssp,ParSpExeFlagjOFilePtr,0aXjPSPChild
;posicionar pointer al inicio de archivo
RegTpInic^lOOhFLoadExe, 2
lí - DE!.'IJHAj\SJVtf l - 112
jnemovmOV
addIp.1.00: mov
movmovmovmovmovmovxormovmovmovmovmovmovmovmovcmpjb"
Jestc
IplOGRegIP)0RegTpInic,0aXjlOhRegCs3axRegCsInic,axRcgDs,axRegEs,axRegSs3axRcgFs,axRegGSjaxEaXjEaxRegAXjEaxRegBx,EaxRegCx.EaxRegDx,EaxRegSi,EaxRegDi,EaxRegSpjEaxRcgBp,EaxFLoadExe,3NoErrLEBorralnCod.
BorraTnCod:movinovmovxorrep
NoErrLE: cíe
finload
es,RegCsEdi,RegTpex, .16ax,axstosw ;bon:ar ijiicio del código
.fin load
endNomrjreArch:rnov d1,ds:[80h] ^Longitud de parámetros en PSP padrexor dh,dhmov ax,@daUmov ds,ax ¡Restauro DSinc exm ov NBytesFal I an, exxor al, alstosbdec sim ov starl Nam e} sisub si,81hsub dx,si
Ai'EKDICE II - I I - 173
lengritName,dlmovmovmovmovmovmovmovmovmovmovmovrepxor
Complet:cmpjaeslosbjmp short Complet
ListoPSPChiJd:
ax,PSPChilcles}ax ;ES apunta al PSP del hijoaljlenghtNamees:[8Qh]}alsijStartNamedi,81hcXjNBytesFaltanax3PSPParent:ds,ax ;DS apunta al PSP del padremovsbal, al
di;100hListoPSPChild
m.ovmovsub
Quedase:
ds,dxsi,StailNamesi,4 ¡apuntar a la extensión del archivo
mov dSjPSPParentmov ex, silodsbcmp al,'.'je bienPjmp LoadNoExe
BienP: lodsband al,0dfhcmp al,'E'je BienEljmp LoadNoExe
BienEl: lodsband al,0dfhcmp al,'X'je BienXjmp LoadNoExe
BienX: lodsband a],0dfhcmp al,'E1
je BienE2jmp LoadNoExe
BienE2: mov ds,dxmov edx,offset FileNamemov ax,3cWOh ;Abrir archivoint 21h
APÉNDICE 1C - U - f 74
ncjmp
bienS: movmovmov.movmovintjncjmp
bien4: movmovintjncjmp
bien5: movcmpjemovmovmovsubjmp
BienL: movpiishxorpopmovmovpushxorpopmovmovmovmovshladdmovmovmovmovaddmovmovmovmov
bien 3NotFoundFHandle,axbx,axedx, offset nvAreacx,512ah,3fh21h ¡Leerlos prímeros 512 byles del archivobien 4NorFoundah,3ehbXjFBandle ¡Cerrare! archivo21 hbien 5NotFoundesi, offset rwAreaword ptr [si],5a4dhBienL ¡Verificar la marca del Linker
ds,cxcx,StattName
ex, 4Lo adNoEx e
ax,[si-í-10h] ¡preservar en memoria los valores de Stackyax6ax,eaxaxRegSpjEaxax,[si+l,4h] ;va a controlaraxeax,eax ;una solución es "xor eax,eax"axRegTp,EAxRegTpIniCjEaxax,[si+4]el ,8ax,clnx,[si+2] ¡obtener la longitud del archivoFileSize,axax,[si-í-8]FilePtr}ax ¡posición del Load Module en el archivobx,PSPChildbx,10h ¡poner al archivo al final del PSP hijoword ptr ParBIockNew}bxword ptr ParBlockNew-t-2,bxax,dses3ax
ATENDICK H - DEPURAJ^SM tí. - Í.75
mov edx,offset FüeNamemov ebx, offset ParBlockNewmov ax,4bQ3hinf 21h ;EXEC, cargar el archivo sinjnc bien 6jmp NotFound
bien 6:mov ax,@datamov ds,axmov ExeFlag,!m ov esi, offset rwArea
ejecutarlo
mov aXjWord ptr ParBlockNew+2 ;Relocation factormov bx,[si+16h]add bx,axmov RegCs,bx ;Kijar nuevo valor de CSmov .RegCsTaiCjbxmov bx,[si+0eh]add bx,axmov RegSs,bx ;Fijar Nuevo valor de SSmov Eax,RegSpmov RegBpjEaxmov aXjPSPChildmov RegEs,ax ;Crear los seudoregjslrosmov RegDs,axxor ax,axmov RegFSjax ;es aquí que se ebje con que valor inicienmov RegGs,ax' ;Ios registrosxor EaXjEaxmov RegAXjEaxmov RegBx,Eaxm o v RegCx,E axmov RegDx,Eaxmov RegSijEaxmov RegDi,Eaxm ov FLoa dExe, 0cíe
finload:mov EaxsRegTpmov RegTpTniCjEaxmov ax'jRegCsm ov RegCsTnic, axmov Eax3RegSpmov RegSpInic,Eaxmov aXjRegSsmov RegSsInic}axmov Eax,RegBpmov RegBpTniCjEaxmov ax,RegDs
ATENDICE II - DEPUHAASM ft - 176
movmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovpushmovraov
POP
retnLoadExe
en el
RegDsInic,axax3RegEsRegEsTnic,axax,RegFsRegFsInic,axax,RegGsRegGsTnic,axEax,RegDiRegDiTniCjEaxEax,RegSiRegSilníCjEaxEax,RegDxRegDxTniCjEaxEax,RegCxRegCxmic,EaxEax3RegBxRegBxIniCjEaxEax,RegAxRegAxTntCjEax41 *fcj -l.J <l £¿j5
t í ílfrC1 T-m f* i \.r.1. J íT-bLO J.J I1O. (l*\x
eax,efíagseflagslnicjeaxeax
endp
AI'IÚVDICK II - J)KSliNS.AS.\ H - 177
MODULO DESENS.ASM
;Programa desensamblador.
.model small
.486.data
segreg db (E,C,S>D,1segregl db 'F,1segreg2 db 'G,'
; Mnemotécnicos de las instrucciones del Coprocesador Matemático
operOFOOdb ISLDTJS7R}LLD7J???)VERRJVERW31
operOfOldb rSGDT>SIDT)LGD7)L!D7,SMSWJ???,LMSWJNVLPG,1operOfQ2 db 1???í???1LAR,LSL,f
operOfOó db 'INVD.WBINVD^LTS»1
operGf90db 1SE70,SE7NO,SETB3SE7KB3SE7EJSETNEÍSE7BE,SE7A,SE7SÍ1
db ISE7NS)SE7PJSE7N"PSSETLÍSE7NL>SE7LESSE7G;operOfaS db IB7SB7S,BTRÍB7C3'operOfa4 db ISHiD>??7)???9???,SimD>lMUWoperOfbO db 'XADO^MPXCHG,'operOfb2 db IFSJ-GS.LSS.BTR,1operOfbS db 'BSF,BSR,'operOfb6 db IMOV2X,MOVSX>1
operOfcS db 'BSWAP,'operl db 'ADDSOMDC>SBB,AND>SUB,XOR,CMP,1oper2 db 'DAA1OAS)AAA5AAS,1operS db 1INC,DEC,PUSH,?OP>1
oper4 db 'OÍNO1CÍNCSZ,NZSBE,A,S,NSJPÍ'NP)LJGE)UEÍG1I
oper5 db IPÜSH9POP,SAH,LAH,1operó db IROL,ROR,RCL,RCR>SHL)SHKÍ???)SAR)I
oper? db lTEST)???9NOTsNEG1MUL,lMUL,DTV)rDTV;operg db 'CLC,S7C,CLI,S7r,CLD,S7D;oper9 db fJNC,DECsCALL,CALL FARSJMP)JMP FAR,PUSH,???;operpi db 'PUSHJMUL;9perpba db 'PUSHA ,POPA .BOUND.ARPL,1operpp db
APÉNDICE H - DKSENS.ASM: H - 178
opería dboperm? dboperlea dboperxax dbopercc dboperjc dboperwai dbopercín dbopérelo dbopersl dboperm dbopenf dboperll dboperíS dboperáí dboperio dboperir dboperaa dbopería dbopérese dbopeijl dboperoio dboperios dboperlk dbopenrr dboperhlt dbopéreme dbopemop dboperel db
;Registros
regí
'MOV,???,1'LEA,1'XCHG AX,XCHG EAX,'
MM^CALL,''WAIT,''CMPS^íOVS,''STOS,'
'SCAS,LODS,''RETN,'-RETF,'
TNT03,1
ONT ,'INTO,''IRET,1'AADjAAM,''XLAT5!
'ESC ,''JCXZ.LOOP,''OUT ,TN ,OUT DX5''JNS.OUTS,1T.OCK,1'REPE,REP,REPNE}''HT.T,''CMC,''NOP,''ENTER,LEAVE;
reg2dbdb
reg3 dbregtr db '???)???)???)TR3JTR4,TR5}1TR6ITR7!'regdr db TDROJDR1,DR2JDR3I???)???)DR6IDR751
regcr db 'CR05???)CR2)CR3)???) ???,???,???,'modos dbescala db '+l*í+2*í+4*,+8*J1
; Mnemotécnicos de las instrucciones del Coprocesaclor Matemático
opOOOa db T•^\DDJF^rüL;FCO]VI}FCO^IP!FSUB;FSUBR}FD^VíFD.r\'^RJf
APÉNDICE If - DESEMS-ASa-f ja-179
opOOOb db 'FADD st,FMCJL s^FCOM^COMP^SUBR sr,FSUB sVdb FDTVR st,FDJV st;
opOOla db 'FLD,FXCH st,FST,FSTPlFU)E>^1FLDCW,opOOlb db 'FNCJ^FABS, , ,FTST,FXAM, , ,FLDJ )FLDL2T)FI.DL2E)FLDPI;'
db IFU)LG2)FD^LN2,FLDZ;opOOlc db IF2XM1ÍFYL2X,FPTAN)KPATANÍKXTRACT)FPREM1,1
db IFDECSTP,FTNCSTP'FPREM,FXL2XP1IFSQRT,1db rFSINCOSJFKNDINT)FSCALE;FSINíFCOS;
opOlOa db TIADDjFIMÜJ^HCOHopOlOb db 'FUCOVIPP;opOJJa db «FILD, .FTST.HSTP, ,FLD, ,FSTP,'opOllb db TENI,FDJSIsFCLEX,FINrríFSEirPM,'oplOla db 'FLD, ,FST,FSTP,FRSTOR, }FSAVE,FSTSW,'oplOlb db 'FFREE, ,FST,FSTP;FUCOM st,FUCOMP sí,1opllOb db "FADDP.FMUUP, ^COMPP^SUBRP.FSUBP,'
dbopllla db «PUJO, ,FIST,FrSTP)FBLD,FILD1FBSTP1FrSTP)'
;Regsitros del coprocesador
regcop db 'st(0)1st(l)íSt(2)jSt(3)Jst(4)íSt(5)1st(6)jSt(7)J'
casos dbdbdbdbdbdb
;Direcci oríes
direcc dwdwdwdwdwdwdwdwdwdwdwdwdwdwdw
40h,60h)70h180h)84h)88h,8ch,90hÍ>lh198b,9ah,9bh,9ch)0a0b,0a4h30a8hOaah30ach,0b0h10c0h}0c2hí0c4h)0c6h,0c8hOcah,0cchs0cdh)0ceh30cfh30d0h)0d4h)0d6hOd7h30d8h)0e0h30e4hj0e8h}0eah;0ebh)0ecbOf0h50f].h,0f2bj0f4h30f5h}0f6bí0f?íh30feh
de la rutina de cada
oífset caseQtoSfjofíset case60ío6fs
ofTseí:case80to83,offset case88to8b}
offset' case90,offset case98to99}
offset: case9b,offset caseaOtoaS,offset casea8roa9,offset caseacToaf3
offset casecOtocl,offset casec4toc5,offset casec8toc9,offset casecc,ofEsef casece,
caso
offset case40l"o5foffset case70to7foffset case84to87offset case8cto8foffset case91to97
offset case9aofí^et case9cto9foffset casea4!oa7offset caseaatoaboffset casebOtobfoffset casec2toc3offset casec6toc7offset casecatocboffset casecdoffset* casecf
APÉNDICE ir - DESENS.ASM H - I 80
dw offset casedOtodS, offset cased4tod5dw offset casecl6, offset cased?dw offset casedStodf, offset caseeOtoeSdw offset casee4toe7, offset casee8toe9dw offset caseea, offset caseebdw offset caseectoef, offset caseíOdw offset casefl, offset casef2tof3dw offset casef4, offset casef5dw offset casef<5tof7, offset casefS tofd
¡Variables generales
memop clb O ¡indica si se direcciona memoriasib dw O ¡indica si hay el bite s-i-b para direccionamiento escalonado11 dw O ¡indica si hay redefinición de segmento12 dw O ¡indica si son datos de 32 bits13 dw O ¡indica si es direccionamiento cíe 32 bits133 dw Oaddl dw ?mne db ? ¡almacena C,E,D o S según la redefínicón del segmentoopcode db 14 dup (?) ¡contiene 14 bytes del código a desensamblarastringdw ?bslring dw ?atasír db 20 dup (?) ¡almacena temporalmente el operando
¡correspendiente a RBGatbstr db 20 dup (?) ¡almacena temporalmente el operando
¡correspondiente a MOD y R/M
.code
readarray proc near
¡Este procedimiento lee un elemento de un arreglo atfauuméricof de dirección¡especificada por DS:SL El elemento se coloca desde ES:DT; y DI se acomoda¡para que apunte a la dirección siguiente al ultirao carácter del elemento,¡Los separadores enlre elementos deben ser comas (,).
¡Entrada: CX = número del elemento en el arreglo.3
¡Salida: DI — dirección del ultimo carácter transferido + 13
push axpush expush sior ex,ex ¡primer elemento del arreglo?jz enconl: ¡si
busccoma: ¡buscar el elemento
: U - DKSKN&ASMM - 181
mecmpjneJoopinc
encont:lodsbcmpjesíosbjmp
fínread;poppopPOPretn
readarray
SI
byte plTbusccorbusccoisi
a!,Yfínread
shorten
siexax
endp
a ;noa ;si, decrementar número de elemento
;apuntar al elemento encontrado
;carácteren AL;separador?
;si, finalizar transferencia;no, transferir
public convhexconvhexproc near
;Este procedimiento genera un string de 2 caracteres desde ES:DF. que¡representan hexadecimalmente al número en AL. DI se acomoda como en el¡procedimiento readarray,
¡Entrada: AL = número por convertir.5
¡Salida: Di — dirección deí ultimo carácter generado -f- 1.
push axpush exmov ah,aland ahjQfhmov el ,4shr al,clor ax,3030hcmp al,'9'jbe numaladd aVAIJ9'-J
numal: cmp ah9'9'jbe numahadd alVA-'-V-l
numah: stoswpop expop axreín
convhex endp
;4 Isb en AH
;4 msb en AL;conv. a ascii
APÉNDICE K - DESENS.ASa,t I I - 1 8 2
conv2hex proc near
;Este procedimiento genera un string de 4 u 8 caracteres desde ES:DI que¡representan hexadecñnalmente a la palabra apuntada porDS: SI+BX. DTse¡acomoda como enreadarray.
j¡Salida: DI - dirección del. ultimo carácter generado + 13
¡Usa: convhex
pushmovcmpJe
addshl
OtraPalabra;pushmov
primerapalabra:push axmov al,ahcali
excx,l12,0 ;es doble palabraOtraPalabrn ;nobx,2cx,.l
axaXj[si+bx]
popcali
POP
sub
convhexaxconvhexaxbx,2
loop olrapalabraadd bx,2pop ex
¡lazo a convertir la segunda palabra
retn.conv2hex endp
codSbit proc near
;Este procedimiento obtiene el número de 3 bits de los bits 3, 4 y 5 de¡BL, y lo coloca en BL. Es de utilidad para, por ejemplo, obtener reg¡en el byte de modo de dirección amiento,3
¡Entrada: BL3
¡Salida: BL = (BL and 38H)/83
push exand bl,38hmov c\3shr bl,cl
APÉNDICE 3t - DESEKS.ASM
pop exretn.
codSbit endp
copmem proc near
¡Este procedimiento genera el string de modo de dirección amiento [...]¡desde ES:DT para las inslrucciones del coprocesador
s
¡Entrada: AL = tipo de operador (Q,B,D,Q,T)
¡Salida: CX = longitud presumida de instrucción; memop = 1 si se opera con memoria3
¡Usa: modrtn, addbstr
push bxpush axmov al,''stosbmov bx, offset atbstrmov bstringjbxcali modrm ¡generar [...]cali addbstr ¡poner [...]pop axpop bxretn
copmem endp
copreg proc near3
¡Este procedimiento genera el string de registro del coprocesador¡desde ES:DT)¡Entrada: si = apunta al inicio del código de la instrucción3
¡Salida: ex = longitud presumida de instrucción; al = tipo de operador
¡Usa: readarray
push bxmov bx,Uacld bx,12add bx,13
APÉNDICE T[ - DKSEHSJXSM
mov cl3[si-t-bx-Kt] ¡cargar la paite del. código que indica;el registro
and ex, 7ptish sim ov si, offset regcopcali readarray ;poner el registropop simov al, 4mov cx,2 ¿longitud presumida de la
;instrucciónpop bxretn
copreg endp
modrm proc near3 -
;Este procedimiento genera el string de modo de direcciona miento [...];desde DSrbstring, y lo termina con 0.3
;Entrada: AL = tipo de operador (w)
5
;Salida: CX ~ longitud presumida de instrucción; memop — 1 si se opera con memoria•);Usa: convhex, conv2hex} readarray)
push dxpush bxpush axpush dipush espush dspop esmov di,bstringmov bx,Uadd bx,12add bx,Bmov dh3[si+bx+2] ;segimdo byte del opcodemov bl,[si+bx+]] ;primer byte del opcodemov bh,bland bh,0c0hmov el, 6shr bh,cl ;2 msb de dicho byte an bh (mod)mov dl,bland di,7 ;3 Isb de dicho byte en di (r/m)cmp 13,1
f I -
APÉNDICE H - DESEKS.ASM: H - 185
je Direcc32Bitcmp di ,6jne nodir ;si no fuera modo directoor bh,bhjnz nodir ;idem
mov memop,.! ;modo directo: mod=0, r/m=6mov al,'['stosb ;ponei; la dirección entre corchetesmov bx,ll ;y terminar string con 0.add bx,12add bx}13add bx,2pusíi 12mov 12,0cali conv2hexpop 12mov al,1]'xor ah,abstoswmov cx,4 ;Iong. 4 bytesa cid ex, 12
finmodrm
nodir: cmp bh,3 ¡registro a registro?jne no3 ;nomov cl,dl ;si,leer de la tabla de registrosxor ch,chpush simov si,offset regí ;poner nombre de registro en stringor al,al ;instrucción de word?jz primfila ;nocmp 133,1je modnnexcmp 12,0 ;es doble word?je moclrmex ;sim ov si, offset reg3jmp short primfila
modnnex:mov si, offset reg2 ;si
primfila;.cali readarrayxor al, alstosb ;terminar con Omov cx32add c.x-,12pop si
APÉNDICE K - DESEWSJVSMH-.1S6
jmpno3: mov
pushmovstosbpushmovmovxorcalipopcmpjnemovaddaddaddmovcmpjbemovnegjmp
positoffs:mov
addsgn: stosbmovcal]jmp
mdnol: cmpjnemovstosbmovaddaddaddpushmovcal]pop
endselmodrm:movxorstoswPOP
fmmodnnmemop,] ¿operación con memoriabxal,'['
sisi, offset modoscl,dl ;leer un modo de direc. de la tablach,chreadamrysibh,l ;mo<l=l?mdnol ;nobx,ll ;si, offset de un bytebx,12bx,I3bx,2bl,[si-i-bx] ¡obtener offset
bl, 127 ¡hallar su signopositoffsal,'-'blshort addsgn
al,'*1
al,blconvhex ¡incluir offset en el stringshort endselmodrm
bh,2 ;hay offset?short enclselmodrmal,'-!-' ;sij de 2 bytes
bx.11bx,12bx,13bx,21212,0conv2hex12
al,']'ah,ah
¡acabar con 0bx
APKKDICE H - DESENSJiSM ., 1O~11- lo/
mov cl,bhxor ch,chadd cx,2 ¡long. = mod + 2add cx,12
finmodrm
Direcc32Bit: ¡Modo de direccionamiento de 32 Bitscmp di, 5jne NoDirecto ;si no fuera modo directoor bh,bhjnz NoDirectomov memop,] ¡modo directo: mod-0, r/m=5mov al,'['stosb ¡ponerla dirección entre corchetesmov bx,!! ¡y terminar string con 0.add bx,12add bx,33add bx,4push 12mov 12,0cali conv2hexsub bx,2cali conv2hexpop 12mov al,1]1
xor ah,ahstoswmov cx,6 ¡long. 6 bytesadd cx,12 ¡sumar uno debido al prefijo de doble palabra
;fínmodrm
NoDirecto:cmp bh,3 ¡registro a registro?jne NoRegaReg ;nomov cl,dl ¡si,leer de la tabla de registrosxor ch,chpush simov si,offset regí ¡poner nombre de registro en stringor al,a] ¡instrucción de word?jz NolnstWord ¡nocmp 133,1je NoModRinExcmp 12,0je NoModRmExmov si,offsetreg3jmp short NolnsWord
NoModRmEx:
APÉNDICE H - DESENS-ASSf H - 188
movNoTnstWord:
calixorstosbmovadclpopjmp
NoRegaReg:movpushmovstosbmovcmpjnemovmovmovcaliandandmovshrpushmovmovxorcalicmpjecmpjnemovmovcalijmp
Nolndef:movmovcalimovmovcalipopjmp
si,oiTser regz ;si
readarrayal, al
germinar con 0cx,2cx,12si
finmodrm
memop, 1 ¡operación con memoriabxaVC
sib30dl,4NoHaySibsib,ldl,dh ;SihayS-i-bbl5dlcod3bitdl,7dh,0c0hel, 6dh,clsisi, offset reg3cl,dlch,chreadarraydh,0 ;Si Índice es 4 y escala no es 0 entoncesNolndef ;]a dirección efectiva queda indefinidabl}4Nolndefsi,ofísetoperm?ex, 3readarrayshort VerDesp
si, offset escalacl,dhreadarraysi, offset reg3cl}blreadarraysishort VerDesp
APÉNDICE K - TDESENS.ASM H - 1 S 9
NoHaySib;pushmovmovxorcalipop
VerDesp:cmpjnemovaddaddaddaddmovcmpjbe
sisi, offset reg3cl,dl ;ltch,chreadarraysi
bh,l ;mdnoeslbx,ll ;:bx,12bx,13bx,sibbx,2bl,[si-l"bx]bl,127 :positoffsl
un modo de direc. de la tabla
;mod-l?;no, offsef de un byte
;obtener offset;hallar su signo
mov al,'-'neg bljmp short addsigno
positoffsl:mov al,'+'
addsigno: stosbmov al3blcali convhex ;incluir ofíset en el stringjmp endselmodrml
mdnoesl:cmpjnemovstosbmovaddaddaddaddpushmovcalisubcal!POP
endselmodrml:mov al,1]'xor ah,ah
bh,2 ;hay ofíset?endselmodrma!5M-'
bx,Ubx,12bx,13bx,sibbx,41212,0conv2hexbx,2conv2hex12
;si, de 2 bytes
AEEKDICE ir - DESENS-ASM
stoswpop bxmov cl,bh
ch,chcx,12
H - 190
¿acabar con O
xoraddaddaddcmp
addfmmodrrn:
poppoppoppoppopretn
modrm endp
cx,2cXjSÍbbh,2
.finmodrmcx,2
esdiaxbxdx
;long, — mod 4- 2
modregrm proc near
;Este procedimiento genera el stiing de modo de dirección amiento y su¡registro operador en el orden apropiado a partir de ES:DIy acomoda DI;como en readarray. Utiliza DS:astringy DS:bstrmg
¡Entrada: AH = dw (par de bits de dirección y tipo de operador)
¡Salida: CX = longitud de instrucción; AL = \ (tipo de operador)¡ memop = 1 si se ha operado con memoria.
¡Usa: motlrm, codSbit, readarray, orderj
push bxpush clxpush sipush espush dspop esmov aJ7ahand aí,l ¡obtener wcali modrm ¡obtener [...]cal} cod311inc ¡obtener cod del byte de modo de dirt
mov si,offset regí ¡leer reg de la tabla según wor al. al
c
APKKD1CE H - t\
JZcmpjemovjmp
Tnodregrmex:bringreg:
pushpiishmovmovxorcalimovan,dpoppoppopcaliaddpopPoppopreln
modregrm
bringreg12,0modregrm exsi} offset reg3shoit bringreg
mov si, offset reg2
exdidi,astringcI3blch,chreadarraydh,ah ;ob1ener d en DHdh,2
diexesorder ;poner en orden [...] y su. operador
ax,Í2sidxbx
endp
defectmem proc near
;Esle procedimiento extrae los bits 6 y 1 del segundo byle del opcode;sirve para ias insirucciones del coprocesador
iSalida:di = ((2do byte del opcode) and OCb)/64
push expush bx:mov bx,Íladd bx,12add bx,13mov dljfsi-i-bx-i-J.] ;b1 = segundo byet deimov c],6shr di, el ¡dividir para 64-pop bxpop exre tíi
deteclmem endp
opcode
AFKTíDlCE ir - DE3EN5-ASaE j.j _ j 07
modregrnú proc near
¡Este procedinuento genera el stríng de modo de direccionaiiliento y su¡registro operador en el orden apropiado a partir de ES:DIy acomoda DT¡como en readarray. Utiliza DSrastring y DS.'bstring
¡Entrada: AH = dw (par de bits de dirección y tipo de operador)
¡Salida: CX = longitud de instrucción; AL - w (tipo de operador)¡ memop = I si se ha operado con. memoria.?¡Usa: modmij codSbit, readamy, order
push bxpush dxpush sipush espush dspop esmov al,ahand al,,1 ¡obtener wpiish axmov 133,1cali modrm ¡oblener [...]mov 133,0calí cod3Ilinc ¡obtener cod del bj'te de modo cíe dinmov al,lmov si,offset regí ¡leer reg de la tabla según wmov al,lor al, alpop axjz bnngreglcmp 12,0je modregrmexlmov si, offset reg3
short bringregl
modregrmexl:mov si, offset reg2
bnngregl:push expush dimov di, asi ringmov cl,bl
APÉNDICE J-r - DESKTTS.ASM: H-193
artdpoppoppopcali
POPpop
POPreln
modregrml
xor ch,chcali readarraymov dh,ah
dh,2diexesordersidxbx
¡obtener d en DH
;poner en orden [...] y su operador
endp
order proc near
;Este procediíiúento establece el orden en que deben ir astring y bstn'ng en;el nemotécnico (a partir de ES:PJ) según e) bit de dirección (DH) y los¡coloca, acomodando después DI como en readarray.í
¡Entrada: DH = bil de dii'ección
j;TJsa: addaslr, addbsír
¡poner un espacio
¡agregar el string almacenado en atastr
¡agregar ei. string almacenado en atbstr
push axmov ai,''síosb
or dh,dhjz bfirsfcali adcbstrmov al, ystosbcali adclbstrjmp sh ort fin order
bfírst; cali addbstrmov al,1,'stosbcali addastr
finorder:pop axretn
order endp
acicisír proc nenrj ™¡Este procedimiento coloca un string apuntado por DS:SI terminado en O
APÉNDICE Jt - DESEKSASM H - 1 Q J
;en ES;DI, acom.odando DI como en readarray.5
push sipnsh ax
xfer: lodsbpush sipush didec simov di, sipush axmov al, Ostosbpop axpop dipop sior al, al ;fin de string?jz .fin addstr ;sistosb ;no, continuarjtnp short xfer
finaddstr:pop axpop siretn
addstr endp
;í_os siguientes dos procedin:iientos colocan los strings apuntador por;astring o bslring desde ES:DT, acomodando DI como en reíidarray.j;Usan: addsü.-
addastr proc nearpush simov si,asíring ;apimtar a atastrcali addstrpop sireln
addasír endp
addbstr proc nearpush simov si,bstring ¡apuntar a atbstrcali addstrpop si.retn
addbslr endp
o
AEEKDICE Jt - DESETÍS.ASM: ¡-I _ 195
acodala proc near
);Este procedimiento genera un stríng de operación, de acumulador con. datosInmediatos, y lo coloca a partir de ES:DI, acomodando L>I como en readarray.3
¿Entrada: AL = w (bit de tipo de operador)
í;SalÍda: CX = longitud de instrucción
;Usa: readarray, convhex, conv2hex
5pusli bxpush dxpush simov di, al ;preservarwmov al,1'stosb ;pon.er un espacioxor cx,cx ;leer string de acumulador (AL o AX)mov si,ofl"setregl.or dl}dl ;segun wjz dalalcmp 12,0 ;esEAXje accex ;nomov si,offset reg3 ;sijmp shortdata],
accex: mov si,oñset reg2data].: cali. readarray
pop simov al,1,1stosb ;poneruna coma después del acumuladormov bx,lladd bx,12add bx%13inc bx ;ST-¡-BX apunta ai dato inmediatoor di, di ;qne es de J o 2 bytes según wjz datlcali conv2hexjmp short fínaccdaía
datl: mov al,[si+bx]cali convhex
:finaccdata:xor ex, exmov al,dl ¡recuperar wcmp 12,0je longacclmov cl,2rnov al, 2
APÉNDICE IE - OESENS-ASat , „,-- ¡yo
longaccl;add d,2adci c],alpop dxpop bxretn
accdata endp
realadr proc near
¡longitud de instrucción,
;Este procedimiento calcula la du'eccion real de un salfo relativo y la¡convierte en un slring a parlir de ES:DI, con DI come en readarray.)jEntrada: AL^w; CX = longíl^d de instrucción
;Usa: convhex
push axpush bxmov bx,llor a l a l.movcbvvjz dsplbmov
dsp.lb: add axsadclladd ax,cxpush axmov al,' 'stosbmov al,ahcali convhexpop axcali convhexpop bxpop axretn
realaclr endp
wob proc near
;apiintar al opcode; desplazamiento de un bj'le?
;si;no
¡dirección real en ax
;ponerun espacio;poner el síríng
;Este procedimiento coloca " W" o "B" en ES:DI e incrementa DI, según w. Es;util para completar instrucciones de string.
¡Entrada: AH = opcode
APÉNDICE If - DESKWS-ASB.Í jj _
¡Salida; AC~ w; CX = longitud de instrucción
mov al,ahand al,l ;AL = wpush axjnz instwmov al,'B' ;Bytejmp short adcar
instw: mov al/W ¿palabracmp 12,0je adcarmov a],'D' ;Doble palabra
adcar; stosbmov cx,l ;long = 1pop axadd ax,I2add ex, 12reta.
wob endp
datadic proc near!
¡Este procedimiento genera el string de modo de dirección amiento [...] y;un operador inmediato desde ES:DÍ. Acomoda DI como readarray .i¡Entrada : AH = opcode; DL = sw (bits de extensión de signo y tipo de operador)i;SaIJda: AL — w; CX = longitud de instrucciónj;Usa: modrtn, addbstr, conviiex
push bxmov al,ahand a1,l ¡obtener wmov bx, offset atbsírmov bslringjbxcali modrm ¡generar [..,]push axmov al,' 'stosb ¡poner un espaciocali addbstr ¡poner [...]mov al,1,' ¡poner una comastosbmov bx,H ¡apuntar al opcode
O
APEWDICF. K - DESKWS.ASM: 11-198
sinext:
nnbyte;
date di c
datret: ;
addaddmovcmpjnepushaddmovaddmovmovcalimovcalipopinccmpjneincmovmovcalimov: caliPoppopretaendp
proc
bx,13bx,cx ;apuntar a los datosax,[si-i-bx]12,1 ;es doble palabra?sinext ;noaxbx,2ax,[si+bx]cx,2bl,alal,ahconvhexal,blconvhexaxexdl,lunbyíe ;s-0 y w=l implica dalo de 2 byt(exbl,alal,ahconvhexal,blconvhexaxbx
near
;Este procedimiento decide si ciertas instrucciones requieren, datos, y, de;ser asi, los incluye como string desde ES:DI Acomoda DT como readarray.!
;Enírada: AH ~ opcode3
¿Salida: AL = w; CX = long. de instrucción
;Usa: conv2hex
push bxtest ah,ljz haydat ;si el Isb del opcode es O, hay datosmov cx,ljmp shott fíirdatret
haydat: mov al,1 ' ;poner un espacio
APÉNDICE H - DKSEKS-ASM
stosbmov bx,11inc bxcali coiw2hex ¡poner datomov ex, 3
findatret:mov al,l ;w=lpop bxreln
datret endp
absoluto proc near
;Este procedimiento pone un string de dirección absoluta desde ES:DI,¡acomodando DI como readarray.
•s
¡Salida: AL = w; CX = long. de instrucción
¡Usa: conv2hex5 "*
push bxmov al,''stosb ¡poner un espaciomov bxjladcl bx,3 ¡apuntar al segundo par de bytescali conv2hexmov al,1:1stosb ¡poner dos puntossub bx,2 ¡apuntar al primer par de bytescali conv2bexrnov ex, 5mov al, 2pop bxretn
absoluto endp
cod3Uinc proc near3 '
¡Este procedimiento encuentra el código de 3 bits del byte siguiente¡al opcode en BE, Es un procedimiento auxiliar.5
mov bXjlladd bx,12acld bx,Bmov bl,[si+bx+l]cali codBbit
_ JQQ
APÉNDICE H - DKSENS.ASIV[
retícodSllinc endp
incógnita proc near
, , _
;Este procedimiento coresponde al desensamblado de UR código¿totalmente inválido, y establece los parámetros correspondientes.5 •
mov sijOfíset openn?mov ex,]. ;???cali readnrrayxor al,al ¿terminadorstosbmov ex,! ;long.mov al,255retn
incógnita endppublic desens
desens proc near
¿Este es el procedimiento principal. Genera un. string desde ESJDl¿terminado en O, desensamblado de la instrucción apuntada por DS:ST.¿Preserva todos los registros que no transfieren parámetros,
¿Salida: CX = longitud de la instrucción; AL = tipo de operador:; O = byte (B); 1-word (D); 2 = dword (D); 3 = qword (Q)¿ 4 = T (temporal del coprocesador 80 bits): 255-indefinido
pushfpushpushpushpushpushpushcidmovmovpushpushmov
bxdxbpdssidi
bx,siax,@dataesdies,ax ¿segmento de datos (para instrucciones desensambladas)
APÉNDICE H - DESENS-ASM IJ - 20 1
mov di, offset opcode ; dirección de datos temporal para transferirpnstraccion (código de maquina) a desensambalr
mov ex, 14rep movsb ¡transferir instrucción al segmento de datosmov ds,axmov nddl,bx ¡transferir a "addl" la dirección de la instrucción que
;esta siendo desensambladamov si, offset opcodepush simov bx,0mov al,[si] ; transferir a "al" primer byte del código de maquina de
la instrucciónmov ahjalmov 13,0cmp ah,67h ;es dirección extendidajne NoDirec32Bitmov 13, 1add bx,13mov al,[sH-bx]mov ah,al
NoDirec32Bit:mov 12,0cmp ah,66h ;son registros extendidosjne noext ;nomov 12,1add bx,12mov al,[si+bx]mov ah,al
mov mne,0mov 13,0and ah,0e7hmov si, offset segregcmp ah,26h ¡prefijo de redef. de segmento 03,113,03,33?je short siprefmov ah,almov sijOpfset segreg2cmp ah,65h ¡prefijo de redfinición de segmento GSje shorl siprefmov si,offset segreglcmp ah,64h ;prefijo de redefinición de segmento FSjne proced ;n opref
sipref:mov 11,1 jopcode desplazado un byteand al,18hmov el, 2shr al, el ;número del segmento * 2
APÉNDICE ir - DESEK5-AXM H - 202
xoraddmovmov
proced: popmovmovaddaddmovcmpjbpoppoppushcali
JTTIP
menfe: mov
movxor
buscop: scasbjbincjmp
encontrado:popPOP
shladdpushcali
ajusfar :popcmpjecmpjepushpushpushmovmovrepnepushxorrepne
ah,ahsi,axal, [si]mne,alsimemop30bx}ilbx,12bx,13ah,[si+bx] ;opcode en ahah,0feh ¡primer byte es mayor a feh?menfe ;nodiesdicasefetoffshort ajusfar
di, offset casos ;ver en que caso está el primer byte del o¡pcocle
al,áhbx,bx
encontradobxsh orí: buscop
diesbx3lbx, offset direccdi[bx] ¡saltar n la rutina de desensamblado con'espondienie
di ¡incluir el prefijo de redefinición de11,0 ¡segmento de ser posible y necesariofinmemopjQprprefaxexdi
"VI1
cx330scasb ¡buscar un [dial, alscasb ¡buscar un nuil
A1"EKDICE K - DESEHS-AS-UI I - 203
popsub
CX
ex, dincg exinc ex
movmovmovpoppoppopinc
prpref:movmovmovmovmovmov
fin : addpoppopPOP
poppopPoppopfretn
desens endp
;cx debe tener el número de caracteres que;van a moverse a la derecha para que pueda;entrar el prefijo de redefinición de seg.
push dspush espop dsmov si, didec siadd di,2stdrep movsbcidpop ds
¡preparar el movimiento¡hacia atrás
¡acomodar string
word ptr es^di-lj^S1
al,mnees:[di-2],aldi
exaxex ;long. de inst. incluye prefijo de redefinición de segmentoshortfin
ai,mnees:[di],alword pír es:[di+l],':S'byte ptr es:[di+3],0ni, 25 5cxslcx,B ;¡ong. de insínicción incluye prefijo de dirección
disidsbpdxbx
caseOío3fcmpjne
proc nearah,0fh
nocasoQf¡es el caso OFh¡no
K - DESENS.ASM H - 204
mov bx, 1add bXjlladd bx,12add bx,13mov al^si+bx] ¡primer byte dei opcodemov ah,aímov bl,[si-t-bx+l] ¡segundo byie del opcodemov bh,blcalí cocBbit ¡obtener los bits 5,6,7 en bhpush axmov ai,lpush siinc sipush espush dspop esmov dx} offset atastrmov asiring,dxmov dx,offset atbstrmov bstríng,dxmov ahj3cali modrmpop espop sipop axcmp ahj2jae casof23push si ¡casos OfDQh a OfOlhmov si}offset operOFOO ¡instrucciones SLDT)ST.R)LLDT,VERR5\OiRWcmp ah30je esceromov si,orrset operOfOl ¡insíi-ucciones SGDT^IDT^GDT^IDT^MS"W
;TJVÍSW5IKWLPGescero; push ex
mov ci,bíxor ch,chcaií readarraypop expop simov ax/'síosb
¡hallar ei operando correspondiente a MOD y R/M
¡leer ei mnemotécnico
mov ax, 1cal] addbstrjmp íinGfl
casof23:cmp ah,ó
¡agrarar el operando
¡casos OF02h y 0^03h
APKKDICE K - DESETÍ5.A5M H - 205
jae casof6mov cÍ,ahxor ch,chpush simov síjOffset operOfD2 ¡instrucciones LÁR,LSLcaü readarraypop simov ah,3push siinc sicali modregrm ;coioca desde ES:DT ios operandos correspondientespop sijmp fmOfl
casof6: cmp ah,20hjae casof2Q ;caso OFOSbniov c],ahand ex, 3piish simov sijOffset operOfí)6 ;insínicciones rNVD,WBTNVD,CLTScali readarraypop simov cx,l iiongiÍTidj no tiene operandosjmp fin Gil
casof20;cmp ahjSOhjae casofSO ;caso OF20hpush sipush exmov ex, Omov si, offset operm? ;instrucción MOV con'registros especialescal] readarraypush axmov as,1' ;Poner un espacio iuego de] mnemotécnicosíosbpop axpop expop sípush sipush axand ah,4cmp ah,4jne notrmov si,oífseí regir ;Ieer regisiros TR.jmp short leeee
notr: mov ah,al
AFKTÍDICH 11 - DESEÍSJ\S;,t II - 206
andcmpjnemovjmp
nocr: movmov
leeee: poppushpushpush
POPmovmovxorcalimovmovandpushmovcalipoppopmovandpopcalimovpopmov
ah,lah,0nocrsi, offset regcr ;leer registros CRshortieeeeah}alsi,Qffset regar ;leer registros DR
axdiesdsesdijastring ¿obtener primer operandocl,blch3chreadarraydi3bs1ringcl,bhex,?sisijOffsetreg3 ¡segundo operandoreadarraysiesdluah ;ob1ener d en DHdh,2diorder ;poner en orden los operandoscx,2sial. 2finOñ
casofBO:cmp ah,90hjae casofPO ;caso O.F80Kpush siinc sicali case70to7f ;insírucciones de saüos condicionales de
;y 32 bitspop simov al, 1jmp fínOtoBf
cas 000;cmpjae
ah}0a0hensotaG
AFffiíDICE H - DB5KKS.AKVÍ H - 207
pnsh si ;caso OfPOhmov svsflsetoperOSK) instrucciones SETO^ETNO^EXB^ETNB^ETE
; SETHE, SETBE, SETA,SETS, SETNS, SETP, SETNP; SEXL, SETNL, SEXLE, SETG;'
push exmov ci,ahand ex, 3 5cali reacurray ¡poner el Mnemotécnicopop expop simov ax/'síosbpush sipush espush dspop esmov ax,0inc sicali modrm ;ieei- operando correspondieníe a MOD y R/Mpop espop sicali addbstr ;poner eí operandojmp íinOfí
casofaO: cmp ah,0b0hjae casofbOpush ax ;caso OFAOhand ah,7cmp ari,2pop axjae mayora2push simov si,offset operpp ;instmcciones PUSH,POP con segmentos GS y FSmov ci,ahand ex, 7cali readarraymov sijOfrseí segregmov b],ahcali coíBbitmov c]5blxor ch,ch
;Ieer F o G a elcali readarraymov ai/S'stosbmov cx,lmov al,l
;longi.md de a instnicción de un byte
APÉNDICE H - DESENS.ASM(i - 208
pop sifínOfl
mayora2:pushandcmppopjnepushaadmovshrmovmovcalípopmovpushinccaíipop
mayoraS:pushpushmovandmovshrxormovcalipopmovcmpjnemov
noimul: pushinccalipoppopmovaddpush
axah,7ah,3axmayoraSsiah,8ex, 3ah,clcl,ahsi, offset opeiüfa3readarraysiahslsisimodregrmsífinOfl
;msirucciones BT,BTSÍBTR3BTC
¡poner operandos
axsiai,ahahjOahcl,ah
ch,chsi,oífset operOfa4 ; instrucción es SHLD.SIiRDjIMULreadarraysiah,la^Oafíinoünulah,3sisimodregrm ;poner operandossíax
ax,12ax
AOUI
pUB
panbuuiduio
soputasdo asuodí
-OHOXdíAID'aaVX sauoporujsuií
OpUUJSdü [0 JSUOdí
duifis dod
IS OUT
is qsnd1[U pUB
is dod
jssjgo'is AOUIis qsnd
JOX
AOUI
91 lie punAOUI
3lífduiopuu
duio
13QW3XB
ÍP
fll^S
couc'qt;
ig jjoqsyo
X51JAUOO
Kq+JS^B
Tí^qí^qfOU
tfyv¿'qy
duifdod :03p
duifMSOIS
AOUI
3UÍ"
duioduifout[[L'O
AOUI
PPG
AOUI
3UÍ"
duiopUB
:cou
AOIU
60Z - H 1ÍSVSMHSHO - It
AP-ENDICE K -H - 2 1 0
xor ch,chpush simov si, offset operQíb2 ¡instrucciones IjFS,LGS3I_,SS,BTRcali readarraypop sicmp ah,3jne no03mov al,!jmp proce]
no03: mov ah,3push siinc sicali modregrm jponer operandospop si
finOfl,
maqueó: pushandcmppopjnemovandmovshrmovxorpush
• movcalipopmovand
proce:pushinccaliPopjmp
noes6: cmpjaepushpushcmpjne•and
axah,<5ah,6axnoes6al,ahah,8cl}3ah,clcl,ahch,chsi'sij'ofísel' op<readarraysiah,al
ahs3
sisimodregrm 1sifínOñ,
ah,0chnoesaobaxex-ah}0bhnoesbah,3
;instrucciones MOVZX,MOVSX
jponer operandos
-AEETiDTCE -TT - H-231.
movjmp
noesb; andmov
siOb; xorpushmovcali
POP
movstosbpoppopcmpjnemovdec
noOb:calimovstosbmovaddadcírnovcal]incmovadd
noesaob;andmovpushmovcalipopmov
procel : pushinccalípopjmp
casofcS:xor
short siQbbl,3d,blch,chsisi,offeetoperOfii3readarraysiTil,' '
exaxaKObhnobbah,]
dishort procel
addbstral,1,'
bXjlbx,Ubxscxal,[si+bx]convhexexal,l,ax,12short fínOfl
ah,3cl,ahsisi,oífset operO:íb3readarraysiah}3sisimodregirnsishort finOfl
ex, ex
¡instrucciones BSF,BSR
;poner operando
¡poner segundo operando
¡instraciones BSF,BSR
¡poner operandos
PÉNDICE H - IÍESKNS.ASM: H - 2 1 2
movcalimovmovstosbmovandcalimovaddmovadd
íinOfliaddjmp
sijOffset operOfcSreadarraysi, offset reg3al,"
cl,ahex, 7readarrayax,lax,32cx,lcx,12cx,l.finOtoSf
;instrucción BSWAP
;poner operandos
nocasoOfhnov bl,ah ;opcodecali codSbit ;obíiene b iís 3,4,5 en bJ(bits 0,1,2)and ah,7cmp ah,5ja mayqueS ;bifiircar si superior (de O a 5 son sumas)mov cl,blxoi" ch,chpush simov si, offset operlcali readarray ;]ee addjOrjadCjSbbjandjSubjXorjCmp de acuerdopop si ;a elcmp ah,3 ;de O a 3 trabaja con un registro y direccionamja mayque3mov dx,oífset atastrmov astring,dxni ov dx, offset atbstrmov bsíring,dxcali modregrm ;coloca operandosjmp short :ñnOto3f
mayque3 ; ;reg con inmediatomov a^ah.and al,l ;al=wcali accdata ;genera string de datos de acc con. operando inmediatojmp short fínOtoSf
mayquc5:cmp ah,6ja mayque6 ;valor 6 es pushpush sicmp blj3ja codmq3rnov si} offset operpp ;para leer pushxor ex, ex
APÉNDICE H - DKSENS.ASM H - 213
cali readarraymov sijOÍfset segreg ; para leer registro de segmento E o Cmov cljblcali readarraymov al^S1
síosbjrnp short fín6
codmq3; rnov si, offset segregmov cl,b1and ex, 3cali readarray ;para leer reg de seg S,Dmov aXj':S'stosw
fin6: mov ex,],rnov aljlpop sijmp short fmOto3f
mayquc6:push sicmp b!33ja cm3mov si, offset operppmov ex,! ;popcalí readarraymov sijOÍfset segregrnov cI5blcali readarray ;IeerE,S o D de acuerdo a elmov aVS1
stosbjmp short :fin7
crn3: mov si3ofíset oper2mov cl,bland ex, 3cal] readarray ;dAA,das,aaasaas de auerdo a el
fin7: mov cx,lmov al51pop si
fmOlo3f:push axxor al, alstosbpop axreta.
caseOtoSf endp
case40to5f proc near
APfilíDÍCE If - DESEKS-ASM H - 2 1 4
mov b!,ahand bl,18hmov el, 3shr bl,clmov cl,blxor ch,chm ov si, offset oper3cali readarray
¡instniccion.es INC,DEC1PUSHJPOP
cmp 12,1 ¡registro extendido?jne shor! noregextmov si,ofísetreg3jmp short careg
noregext:mov si, offset reg2
careg; mov al,1 'stosbmov cl,ahand ex, 7cali readarrayxor al, alstosbmov a,\,.1add ax,12mov cx.,3add cx,12retn
case40to5f endp
case60to6f proc nearmov dXjOffset atastrmov astríng,dxmov dx, offset atbsírmov bstríng,dxcmp ah,68hjb mena68rnaya6bcmp ah,6bhja m.ena68maya6bmov cl,ahand cx,lpiish siinov sijOfísef operpicali readarraypop simov ex,.!mov dl,ahand ah,ljnz simodregrm
;no•
¡poner operando
¡instrucciones PUSH}1MUL
APÉNDICE H - I)ESKNS.AS1WH - 2 1 5
addmovtestjnzmovaddjmp
simodregrm:addcalipushrnovmovstosbPOP
nomodregrm:andpushaddmovaddaddmovanclJnZcmpjnepushaddmovaddmovmovcalimovcalipop
sinextl :incmovmovcalimov
unbytel ;inccalipop
cx,12al,0
dl,2short nomodregrm ¡solo tiene un
a1,lax,12short nomodregrm ;solo tien.e un
ah,2
operando
operando
modregrm ¡poner primeros operandosaxah,alal,',' ¡poner una coma
ax
dl,2axdl,lbx,U ¡apuntar al opcodebx,13bx,cx ¡apuntar a los datosax,[si-í-bx]dl,2unbylel.12,1 ¡datos de 32 bits?sinextl ¡noaxbx,2ax,[si+bx]
cx,2bl,alal,ahconvhex ¡poner lercei* operandoal,blconvhexax
exbl,alal,ahconvhexa],bl
exconvhexax
de 32 bits
APÉNDICE H - DESENS J\SM ,, , i f
jmp shoit fsn6l
mena68maya<5b:cmp ah,64hjae rnaqueSmov el, alancl cx,3piish simov sijOÍFset operpba ¡instrucciones PUSHA,POPA,BOUND, ARPLcal] readarraypop simov ex, 3test ah,2jz esOI.mov ah,lcali modregrm ;poner operandos
esOI: jmp frn.61
maqueS:cmp ahj6chjb desconocido ¡ínslrucción no reconocidapusb simov si,offset operios ;insuiicciones INS,OUTSand al ,2shr al, 1mov c]}a]xor cb,chcali readarray ;leer el mnemotécnicopop siand abjlcali wob ¡poner el carácter de palabra, doble palabrajmp short finól
desconocido;cali. incógnita ¡instrucción no reconocida
fínG.l: push axxor al,alstosbpop axretn
endp
case70to7f proc nearmov al,T ¡instrucciones JO^OJQ.TK^JZ^IKZ^TBE^TAJS,
;.TNP,IL5.TGK;IL1Í5.TGstosb
APÉNDICE ü - DESENS-ASlVr H - 217
pushmovmovandcalipopcmpjbmovmovjmp
esb: xormov
esw: calipushxorstosbpopretn
case? Oto 7f
case80to83calimovxorpushmov
calipopmovandcaliaddpushxorstosbpopretn
case80to83
case84to87movandshrpushmov
sisi, offset oper4cl,ah
ex, 15readíirray ;leer el mnemolécnico de acuerdo al valor en elsiah,80hesbal,lex, 4sh orí eswal, alcx,2realadr ¡calcular Ja dirección real del saltoax
ax,ax
ax
endp
proc nearcodSllinccl,blch,chsisijOfísetoperl instrucciones ADD,OR,ADC,SBB,AND
;SUB3XORSCMPreadan'aysid1,ahdi, 3 ;swdatadic ;poner dato direcloax512ax
al, al
ax
endp
proc nearcl,ah
cx,2cl,lsisi.offset opertx ;tns tracciones TEST,XCHG
AFEWDICE Jí - DESENS.ASMH - Z I S
cali readarraypop siand ah,lor ah,2 ¡obtener dvvmov dx,ofTset atastrmov astring,dxmov dx, offset atbsírmov bstringjdxcali modregrmpush axxor al, alstosbpop axretn
case84to87 endp
case88to8b proc nearpush simov si, offset operrn?xor ex, excali readarraypop siand ah,3mov dx, offset atastrmov astring,dxmov dx, offset atbstrmov bstríng,dxcali modregrmpush axxor al, alstosbpop axretn
case88to8b endp
case8cto8f proc nearpush sitest ah,ljnz leapopcali codSll.incmov si} offset operm?xor ex, excmp bl;5jbe validoinc ex
valido: cali readarraymov si,ofí"sel segreg
¡poner operandos
¡mov;poner el mnemolécnico
¡poner operandos
;rnov
;inslmcción no reconocida
APÉNDICE H - DESEKSJVSMH - 2 1 . 9
shl bl,ladd si,bxpush espush dipush dspop esmov di3offsetatasírmov astring,dimovsbmov alj'S1
sfosbmov di, offset atbstrmov bstringjdipop dipop esmov al,lpop sicali modrmmov dh,ahand dh,2 ;d
¡preparar espacio para primer operando
¡preparar espacio para segundo operando
¡leer operando correspon diente a MOD y R/M
cali order ¡ordenarlos operandosjmp short fmSctoSf
leapop: test ah,2jz esleacali codSUinc ¡obtener el bl los bits 5,637 del segundoor bl,bl ¡byte del opcodejz espopmov si}offset operm?mov ex, 1cali readarraymov al/ 'stosbjmp short inclmod
espop: mov si}olíset operppmov ex, 1.cali readarray
inclmod:pop simov dx, offset atbstrmov bstring,dxmov al,lcal] modrmcali addbstrjmp short fmSctoSf
eslea: mov si}offset operíeaxor cx,cx ¡leacali readarraymov dx, offset atastr
;???¡instrucción no válida
¡pop
¡determinar e] operando
¡prepara los espacios temporales para
AlíENDICE H - DESETS-ASIvrJ I - 220
raovmovmovmovpopcali
finSctoSf:pushxorstosbpopreln
caseSctoSf
astring,dxdx, offset atbstrbstring,dxah,3simodregnn
axa],al
ax
endp
;los operandos
¡ubicarlos operandos
case90 proc nearmov si,offset opernopxorcalixorstosbmovmovreta.
case90 endp
case91to97movxoraddcalimovstosbmovandmovcmpjemov
espalabra;xorstosbmovaddmovaddreln
ex, ex ;nopreadarray ;sin operandosal, al
;poner cero a continuaciónal, 1 ;poner tipo de instrucciónex,! ¿longitud de instrucción Ibyte
proc ncarsi,ofísel: operxaxex, ex ;xchg axex, 12readarray ; mnemotécnicoax,',' ¡poner una coma
cl,ahcx,7si, offset reg2 ;poner segundo registro operando.12,0espalabrasi,oífsetreg3cali readarrayal, al
al,lax,12cx,.lcx,12
APÉNDICE H - K-221
case91to97 endp
case98to99movxormovcmp
movandjnzínc
wd: cal]movaddpushxorstosbPopaddredi
case98to99
case9a procpushmovmovcalipopcalipushxorstosbpop axretn
case9a endp
case9b proc nearmov si,offset operwaixor ex, ex ;waitcal.] readarray
al, al
proc nearsi,o:ffsef operccex, exal,ah12,0wdex, 2al 1 'w41 I, J, , V V
wdexreadarraycx,lcx,12axal, al
axax;I2
endp
nearsisi, offset operjccx,lreadarraysiabsolutoax
al, al
;instnicción CWD
;instrcución
;instracción CALL
jponer dirección, absoluta del cali
;poner un O al final de la instrucción
xorstosbmovmovreln
case9b endp
a1,255CX31
ATENDIÓ! Jf - DESENS.AXM H - 222
case9cto9f proc nearmov si,offset opeomov cl,ahand ex, 3cali readarraycmp 12,1je esppdmov ax,46hstosvvjmp noesppd
esppd:mov aXjDFstoswmov al,''stosb
noesppd:mov a 1,1mov ex, 1add cx,12retn
case9clo9f endp
¡instrucciones PUSH,PQP;LAH, S AH
¡trabajo con el registro de banderas
;trabajo conel registro de banderas extendido
;longiíud déla instrucción¡sumar el prefijo de datos de 32 brls
caseaOtoaS proc nearpush simov memop, 1 ¡trabajo con memoriamov si,offsel: operm?xor cx,cx ¡MOV del acumulador con memoria direccionndacali readarray ¡direccionada directíiemntepop simov al,1' ¡poner un espaciostosbmov al,ahand al,lmov dx, offset: regíjz prfílm ov dx, ofTs e t: reg2cmp 12,0je prfilm ov dx, offset reg3
prfil: push a»xtest ah,2j^ aprcali ponbmov a],','stosbcali pona ¡poner el registrojmp short finaOtoaS
¡registro tipo byte
¡registro tipo palabra
¡registro extendido
¡poner primero la localidad de memoria¡instrucción del tipo mov [####],ax
Tí - DESENS.ASM H-223
¡poner primero el registro¡instrucción del tipo mov ax, [####]
¡ponerla dirección de memoria
npr: cali. ponamov al, Vstosbcali ponb
fínaOtoaS:xor al, alstosbpop axmov ex, 3add cx,12add ax,12reta
pona: xor ex,expush simov si,dxcali readarraypop sireln
ponb; mov a],'['stosbmov bx,Uadd bx,12acld bx,13inc bxpush 12mov 12,0cali conv2hex jconvertJr número hexadecimal en ASCITpop 12mov al,1]1
stosbreta
caseaOloaS endp
;pone el registro en la línea de instrucción.
;clx apunta al arreglo de nombres de registros
;pone la dirección de memoria del tipo [####];el número entre corchetes puede se byte, word
;o doble word
casea4toa7 proc nearmov si,offset opercmxor ex, extest ah,2jnz escmpsinc ex
escmps: cali readarraycali wobpush axxor al, alstosbpop axreta
casea4toa7 endp
¡instrucción CMPS
¡instrucción MOVS
jponer el tipo de datos que manejan
APÉNDICE u - DKSENS.ASM:
casea8toa9 proc nearpnsh simov si, offset: opeitxxor cx,cx ;instrucción TESTcali readarraymov al,ahand al, 1pop sicali accdata ¿acumulador con dato inmediatopush axsor al, alstosbpop axretn
casea8toa9 endp
cíiseaatoab proc nearjnov sijOÍfsel opersíoxor cx,cx ;STOScali readarraycali wob ;Hpo de operandos con los qiie Irabajapush axxor al, al ;almacenarel cero al final déla instrucciónstosbpop axretn
caseaatoab cndp
caseactoaf proc nearmov sijOfíset operslxor GXjCx ;instnicción. SCAStest ah,2jnz esscasinc ex ;instrucci,ón LODS
esscas: cali readarraycali wob ;tipo de datospush axxor al, alstosbpop axretn,
caseactoaf endp
casebOíobf proc nearpush simov si, offset opeim?xor cx,cx jinstricción MOV registro con. dato inmediato
u _
APÉNDICE JI - DESKNS.ASMJ-l - 225
esrl:
eslw:
eslb;
calimovstosbmovandmovshrmov
jzmovcmpjemov
movandpushcalimovstosbpoppoppushmovaddaddmovorjzcmpjeaddmovcalimovcalimovcalimovcalixorstosbpopaddaddaddrctn
casebOtobf
readarrayal,"
al,ahal, 8cl,3al, el.si,offsetregl ¡registro de 1 byteesrlsijOffset: reg2 ;reg¡stro de palabra12,0esrlsi,oífset:reg3 ¡registro de doble palabrac],ahcx,7axreadarray ;se lee el eregistroal,',1
axsiaxbx,llbx,1.2bx,13cl,a1al, aleslb12,0eslwcx,2al,[si+bx+4] ¡agregar el dato inmediato sea byte,convhex ¡palabra o doble palabraal,[si-fbx+3]convhexal3[sí+bx-l-2]convhexal,[si>bx+J,jconvhexal, al
axcx,2cx,12ax,12 ¡ax entrega el lipo de datos con el que se trabaja
endp
APÉNDICE If - DESEHS-ASM u _
casecOtocl proc nearcali codSUinc ¡obtener bits 5,6,7 de segundo byte del opcodemov cl,bl ;en los bytes 0,1,2 de blxor ch,chpush simov sí,offseí operó ¡instrucciones ROI^RO^RCI^RCR, SHL, SHR, S AR
cali readarraypop símov al,' 'stosbmov aljahand al, 1mov dx, offset. atbstrmov bstríng,dxcali rnodnn. ¡obtener el primer operando; registro o memoriacali addbstr ¡poner el primer operandopush axmov al, V ;poner un acomastosbmov bx,cxmov a1,[si+bx]cal] convhex jagrgar el segundo operando que es un dato inmediato
xor al, alstosbpop a,x ;poner cero al finalinc exadd ax,12retn
casecOtocl endp
casec2toc3 proc nearpush sim ov si, offset opeanxor ex, ex ;instmcci ón RETNcali readarraypop si.cali datret ;poner dirección de retorno si es que es necesariapush axxor al, alstosbpop axretn
casec2toc3 end
ABKNDICE ir - DESENS.AXM: H - 227
casec4toc5 proc nearpush simov . si,oJTsetoper.líxor cx,cx ¡instrucción LDStest ah,1jr\7. esldsinc ex ¡instrucción LES
eslds: cali readarraypop simov aXjOffset alaslrmov astring,axmov aXjOlíset; atbstrmov bstring,axmov ah,3cali modregrm ¡obtener y colocar operandospush axxor al, alstosbpop axretn
cascc4toc5 endp
casecíStoc? proc nearcali cod311incpush simov si,ofTset operm?xoror bl,bljz esmovinc ex
esmov; cali readarraypop simov dl,ahand di,lcali datadicadd ax,12push axxor al, alstosbpop axretn
casec6ioc7 endp
¡instrucción MOV de dato inmediato a memoria
;???
;sw¡poner eí operando y el dato inmediato
casec8toc9pushmovmov
proc nearsisi, offset operelcl,ah.
¡instrucciones ENTER y LE AVE
APKKDICE H - DESKNS.ASM ¡j _ 22»
and cx,lcali readarraypop sicmp c],lje Íinc8c9.mov al,''stosbmov bXjlcali conv2hexmov al,',' ;poner el dato inmediatostosbmov al,[si+3] ;poner segundo dato inmediatocali convhexrnov ex, 4 ¡longitud de la instrucción 4 bytes
fínc8c9:mov al, 1retn
casec8toc9 endp
casecatocb proc nearpush simov sijOffsetoperrfxor cx,cx ;instrucción RETFcali readarraypop sical] datret ;Poner cblo inmediato tipo doble palabra sipush ax ;es necesarioxor al, alstosbpop axretn
casecatocb endp
casecc proc nearmov sijOffset operiSxor cx,cx ;Tnstruccíón INT 3cal! readarrayxor al, alsíosbmov al,2 ;intrucción tipo doble wordmov cx,l ;longjtud de la instrucción un byteretn
casecc endp
casecd proc nearpush simov si, offset operint
APÉNDICE IT - DESEKS-ASM i r _ 229
xor ex, ex ;Is1mcción,INTcali readarraypop simov bx,Hmov aI,[si-t-bx-¡-rjcaü convhex ;poner el número de la instrucciónxor ai, aistosbmov al, 2mov cx,2 ;longitiid de ia instriucciónretn
casecd endp
casece proc nearmov sijOffset operioxor ex, ex ;insíruccióncali readarrayxor al, aistosbmov alj2mov ex, 1retn
casece endp
casecf proc nearmov si,offset operirxor cx,cx ¡instrucción IRETcali readarrayxor al, alstosbmov al,2mov cx,lre In.
casecf endp
casedOtod3 proc nearcall cod3Uincmov cljblxor ch,cbpush simov si,ofíset oper6 ;Instmcciones ROL,ROR,RCL,RCR, SRL, SHR, SARcal) readarraypop simov al,1!
stosbmov ai5ahand al.l
APÉNDICE H - UKSENS-ASM .
m ov dx, offset atbstrmov bstring,dxcali modnn jobtener el. primer operandocali addbstr ;poner el primer operandopush axmov al,','stosbtest ah,2jz eslmov aXjl.C1 ;poner el registro elsloswjmp sh oit fin dOtod3
esl: mov al,M.' ;poner 1stosb
findOtocB:xor al, alstosbpop axadd ax,12refn
casedOtodS endp
cased4tod5 proc nearpush simov sijOÍfset" operaaxor ex,ex ;instrucción A-ADtest ah,1jnz esaadinc ex ¿Instrucción AAM
esaad: cali readarraypop simov bx,llmov bl, [si+bx+T]cmp bl,10 ;si segundo byte es igiial a diez entonces es normalje normmov al,1'stosbmov al,blcali convhex ;caso contrario ponemos el dato a continuación
norm; xor al,alstosbmov ex, 2reta.
cased4tod5 endp
cased6 proc nearcali incógnita ;No hay esta instrucción
APEKDICE K - DESENS.ASM j-| -231
retncased6 endp
case<17 proc nearmov si, offset operxlaxor cx,cx ;instrucción XLAT sin operan doscali readarrayxor al, alstosbmov cXjlretn
caseclv endp
casedStodf proc nearand ah,7 •**** Instrucciones del coprocesador matemáticocali cod31.1inc ;obtiene bits 3,4,5 en bl de] segundo byte
;del opcodecali detectmem ;obtíene bits 6,7 en di del segundo byte del opcodecmp ah,0jne notceromov ci,bi ;casos ESCOOOxor ch,chcmp di, 3je nohaymempush simov si,offset opOOOa instrucciones
cali readan*aypop si.mov al,2cali copmem ;poner operando; dirección de memoriajmp Íind8
nohaymem:push simov si,oíFset opOOOb jinsírucciones FADD sl',FMULst
;FSUBR st,FSUB st,FDAOl stFDIV st '' * i J J
cali readaiTaypop simov a1,Vcmp bl,2jb nocompcmp bl,4jae nocompmov al,1'
nocomp:stosbcali copreg ;poner operando: registro del coprocesador
APÉNDICE 3i - DESENS.ASM: jj _ 232
jmp findS
notcero: cmp ah,ljne no hiñopush bx ;casos ESCOGÍmov bx3Uadd bx,12a cid bx,J3mov dh,[si+bx+l]cmp db,0d0hpop bxjae nohaymemlmov cl,bixor cb,chpiish simov si,offset opOOla ¡instrucciones ELD,FXCH snFST.FSTP.FLDENV,
;KLDCW3FSTENV5FSTC\cali readan'aypop sicmp di, 3je poneregcopmov al,2cali copmem ;poner operando: memoriacmp bl,4jb no255mov a1,ltest bl,ljnz no255mov al, 25 5jmp £nd8
poneregcop:mov aI3';'slosbcali copreg ;poner operando: regjslro del coprocesador
no255: jmp FindS
nohaymeml:push si.mov si,ofíset opOOlc jinstrucciones F2XM1)FYL2X)FPTAN3FPATANJ
ÍKXXRACT,KPÍREMa 3KDECSXP5FINCSXP)FP.REÍvrj
;FXL2XP13FSQRT5FSTNCOS3FRKÍDINT3FSCALE)
;FSTN,FCOS; no tiene operandoscmp db,0fí)bjae esfmov si,ofTse1:opQOlb ;inslrucciones FNOP,FABS3FTST3FXAIVÍ3HJ^.1.)
esf: mov cl,db ;no tienen operandos
AEETTOICE H - DESENS.ASM H-233
andcaliPopmovmovjmp
notuno; cmpjnemovxorcmpjepushmov
caliPopmovcalijmp
nohayrnem2:movpushmovcalípopmovmov
cx30fhreadarraysicx,2al,4
fmd8ah,2
notdoscl,bl
ch,chdl,3nohaymem2si^offset opOlOa ¡instrucciones FIADD^^FICOM^ICOMP,
;FISUB3FrSUBR3EIDW)KrDIVRreadarraysial,2copmem ¡agregar dirección de memoria
find8
cx30sisi3offset opOlOb ¡instmcción FTJCOMPPreadan-ay ¡sin operandossicx32al, 4
findg
notdos: cmp ah33jne nottrescmp di, 3je nohaymem3mov cl,blxor chjChpush simov si3offset opOlla ¡instrucciones FILDJFTST3FrSTP3FI.D)FSTPcali readarraypop simov al, 2cali copmem ¡agregar dirección de memoriacmp blj5jb findSmov al, 4jmp findS
nohaymemS:
APÉNDICE H - DESETÍSASM ]-[ _ 234
push bxmov bx,13add bx}12add bx,13mov cl,[si+bx+l]pop bxand ex, 7push simov s^offset opO 1 Ib pntrucciones FEK^FDIS^FCLE^FINIT^SHTPMcali readarray ;sin operandosP°P s^mov ex, 2mov al,255jmp £nd8
nottrcs:cmp ah,4jne notcuatromov cljblxor ch,chcmp di, 3je nohaymem4push simov si,ofiFsetGpOOQa ^nslrucciones FADD,FN/rüL,FCOM)FCOMPíFSUBl
cali readarray ;con operandos cíe memoria de 64 bitspop simov al,3cali copmem ;poner dirección de memoriajmp fmdS
nohaymem4;push simov si,offset- opOOOb jinstrucciones FADDjFMUI^FCOMjFCOMP,
cali readarray ; de la fonna Mnemotécnico st(i),sl'pop sisub di, 2cali copreg ;poner registro del coprocesadormov al,Vstosbmov ax,'ts' ;ponera continuación ststoswmov al,4jmp
notcuaTro:
APÉNDICE H - DESENS.ASM ., ~,{¡-
cmp ah.5jne notcincoctnp d]33je nohaymemSmov c!3blxor ch,chpush sim.ov si, offset oplOla ¡instrucciones
KLD)FST)FSTPJFRSTOR,FSAYEJFSTSWcali- readarraypop simov al,3 ¡indica 64 bitscali copmem ¡poner dirección, de memoria de 64 bits o máscmp b!34
mov a.1,255 ;al. indica má de 64bitscmp b!57jne findSmov al,l ¡indica 16 bitsjmp findS
nohaymemS:mov c!3blxor ch;chpush simov si,offset oplOlb ¡instrucciones FFREE3FST3FSTP
¡FUCOM s1,FUCO]VrP stcali readarraypop simov al,''cmp bl,4jb nofiícommov al,',1
nofiícom:stosbcali copreg ¡poner registro del coprocesadorjrop short findS
notcinco:cmp ah,6jne notseiscm.p di, 3je nohayrnemC)mov cl,blxor chjchpush simov si,offset opOl Oa ¡instrucciones FIADD3FIMULIrn:COM,FrCOMP,
;]cali readarray
APÉNDICE H - DESENSJiSir H - 236
pop simov al,l ¿datos de 16 bitscali copmem ;poner dirección de memoriajmp short fíndS
nohaymemíS:mov cl}blxor ch,chpush simov s^ofíset opl lOb ¡instrucciones FADDP,FMUI^ÍFCOMPPÍFSUBRP,
cali readarraypop simov al ,4cmp bl,3je firidSmov al,' 'stosbcali copregmov al /,'stosbmov aXj'ts'stosvvmov al, 4jmp short :find8
;poner registro de] coprocesador
;potier st
notseis:mov cl,b1xor ch,chpush simov sijofíset opl Ha ¡instrucciones
cali readarraypop simov al,l ;datos de 16 bitscali copmem ;poner dirección de memoriacmp b]}4jb short íindSmov al, 4and bl,lsub al,bl
push axxor al, alsíosbpop axretn
casedStodf endp
¡almacenar O
APÉNDICE H - M ¿~
caseeGtoeSpushmovmovandxorcmpjnecalí
jmpesloop: inc
calitestjnztestjzmovstosbjmp
esne: movstosw
pondir: popxormovcalipushxorstosbPOP
retncaseeGtoeS
casee4toe7movandpushmovtestjzxorcalipopmovaddaddmovmov
proc nearsisi, offset operjlal,ahal,3ex, ex ;ijistnicciónJCXZal,3esloopreadarrayshort pondirex ¡Instrucción LOOPreadarrayah,2pondirah,.lesnealj'E1 ;instnicción LOOPE
short pondirax)rEN1 instrucción LOOPNE
sial, alex, 2realadr ¡calcular 3^ poner la dirección real del saltoax
al, al
ax
endp
proc nearal,ah
al,lsisij offset operoioah,2esincx,cx ;OUTreadarraysibx,Ubx,12bx,)3dx,axaljsi+bx+l]
APÉNDICE H - DESEHS-ASir -,, _
calimovcmp
jemovstoswmovstosbjmp
esa: stoswormovjz
eseaxx: movesal: stosb
jmpesin: mov
calimovmovcmpjemovstoswjmp
soloa: stosbcoma: or
mov
jzmov
esregal ¡stosbmovstosbpopmovaddaddmovcal]
J5ne4toe7:xorstosbmovmovaddaddrctn
convhex ¡poner número de puertoax,'A,'12,0 ;es dato de 32 bits?esa ;noas, -E,1 ;si
al/A1 ;dato de 1.6 bits
short eseaxx
di, diaVU ;es dato de Sbitsesala]5'X'
short fine4toe7cx,.l ¡Instrucción IN ACC,Puertoreadarraydx,axa1,'A! ¡dato de J 6 bits12,0 ;es dato de 32 bits?soloa ;noax,'AE' ;si
short coma
d1,d1al, 'U ;dato de 8 bitsesregalal,'X!
al,',' ¡ponerla coma
sibx,11bx,12bx,13al,[si+bx+l]convhex ;poner el número cíe
al}al
ax,dxex, 2
ex, 12ax,12
puerto
APÉNDICE H - DESENS.ASM
casee4loe7
casee8toe9pushmovxortestjnzinc
esjmp: calipopmovmovcalipushxorstosbpopreta
casee8toe9
caseea procpushmovxorcalipopcalipushxorstosbpopreta
caseea endp
caseeb procpushmovxorcalipopxormovcalipushxorstosb
endp
proc nearsisi,offset operjccx,cx ;instmicción .TTvIP cercaah,lesjmpex ;instrucción CALL cercanoreadarraysial,l.cx,3realadr ¡calcular y poner la dirección real del saltoaxal, al
ax
endp
nearsisi, offset operjccx,cx ;.TMP lejosreadarraysiabsoluto ;poner número tipo ####:####axal, al
ax
nearsisi, offset operjccXjCX ;instrucción JMP cortoreadarraysial,alcx,2realadr ¡calcular y poner dirección real del saltoaxal, al
H - 239
APÉNDICE H - DESENS.ASMH-240
popretn
caseeb endp
caseectoefmovandmovtest
jzmovcalimovmovstosbmovcmp
Je
stosbunicoa: mov
stosbmovorjnzmov
esrax; stosbjmp
esin_: movcal]movmovcmpjestosb
unicoa_: movstosbmovorjnzmov
esrgax: movstoswmovstosw
finectoef:movxor
ax
proc near
al,!si,offset operoioah,2esin_cx}2 ;OUT dxreadairaydx,axal ' 'ai, ,
ai,'E ;ponerEAX12,0unicoa
al/A
alj'X1 ;poner AXd1,d1esraxal,'L' ¡poner AL
short finectoefcx,l jinstnicción IN ACC,DXreadarraydx,ax
12,0unicoa_
al/A1
dl,dlesrgaxal/U
axXD'
ex, 1al, al
APÉNDICE H - DESENS-ASM H-241.
stosbaddmovaddretn
caseectoef
casefO procmovxorcalixorstosbmovmovretn
casefO endp
cx,12ax,dxax,12
endp
nearsijOffset operllíex, exreadarray
al,255cx,l
;LOCK;sin argumentos
;longitud de datos no definida
casefl proc nearcali incógnitaretn
casefl endp
;longílud no reconocida
casef2tof3pushxortestjzmovmovandcmpjeinc
esrepne:movfinf2tof3:
movcalíxorstosbpopmovmovretn
casef2tof3
proc nearsiex, exahslesrepnebx,il
;¡nstnicción REPE
a^Oaóhfiní2toí3ex ¡instrucción REPshort finf2tof3
cx,2 jinsTnicción REPNE
si,offse1 operrrrreadarrayal, al
sial,255ex,!.
endp
AEKNDTCK K - DESEKSJVSM H - 242
casef4 proc nearmov si,ofíset operhltxor cx,cx ;instnicciónHLT, sin argumentoscali readíirrayxor al, alstosbmov al,255 ;longitud de datos no específicamov cx,lretnendp
casefS proc nearmov si,offset opéreme
;insírucción CMC, sin argumentosxorcalixorstosbmovmovretn.
casefS endp
CXjCX
readarrayal, al
CX31
casef6tof7 proc nearcali cod311inc 'mov cl,blxor ch,chpush simov si,offset oper? ^instrucciones
calipopor
jzmovstosbmovmovmovandcali.cali
pondat; movanclcali
readarraysib1,b1pon da fal,"
dx, offset atbstrbstringjdxal,ahal, 3modrm ;halla el operando de acuero a MOD y R/Maddbstr ;poner el operandoshortfinf6tof7dl,ah
datadic ;dato inmediato para Tesl
push ax
APÉNDICE H - DESENS.ASM U - 243
xor al, alstosbpop axadd ax,l2reta
casef6tof7 endp
casefSlofdmovmovandcalixorstosbmovmovretn
casefStoixl endp
proc nearsi,offsel operg ¡instrucciónc1,ah ; sin operandoscx,7readarrayal,al
cx,l
casefetoff proc nearcali codSUincpush simov si,ofíset oper9 ¡instrucciones INC,DEC,CALL,CALL FAR,
;.TMPS.1MP FAR,PUSHmov al,ahand al,ljnz normalcmp bl,2jb normalmov ex, 7jmp sh ort fínfetoff
normal; mov cl,blxor ch,chxorcmpJe
cmpjne
espec: movftnferoíf:
cali readarraypop simov di, al
al,"
dh,dh
especcl;5fínfetoffdh,2
¡requieren operandos
movstosbmovmov
ax, offset atbstrbstring,ax
APÉNDICE K - DESERS.ASM
mov ax,dxcali modrmcal] addbslrxor al, alstosbmov ax,dxor ah}ahjz same
al,ah
H - 2 4 4
movsame: retncasefetoff endp
;obtener operando de acuerdo a MOD y R/M
public desensDetdesensDet: proc near
;Este procedimiento genera un string a partir del código de máquina apuntado;porDS:SI, desde ES:DI, terminado en O, consistente en:; - Cuatro caracteres que representan al valor inicial de SI en hex.; - Cinco carateres del mnemotécnico de la instrucción.; - Veintiún caracteres de parámetros del mnemotécnico.;Ademas, se retorna:; AL tipo de instrucción (0,1,2,3,4 o 255); CX longitud de instrucción
jpush dicidmovpushmovcalipopcal]cal]pushpushpushpushpushpushmovmovmovrepne
jemovmov
ax,siaxal,ahconvhex
axconvhexdes en s ;axbxexdxsidsbx,diex, 8al,"scasb
;poner el primer byle dedesplazamiento
;poner el segundo byte de dezplazaminetoobtiene el mnemotécicoylos operandos
¡Dl comienzo del mnemotécnico;buscar espacio en blanco hasta el octavo
; carácter;si no se lo encuentra hay parámetros
ConParamdi,bxcx,8 ;busco un 0 hasta el octavo carácter
APÉNDICE H - DESEHS.ASM H - 245
movrepnej^eaddmovdecrepmovstosbjmp
ConParam:movmovmovrepnecmpjb
jemovmovmovsubmovsubmovmovmovmovrepnedecmovaddstd
CicDer: lodsbstosbcrapjaemov
CicSpc: cmpjestosb
al,0scasbConParam ;si no se lo encuentra, hay parámetroscx,38 ;poner 38 espacios al final del único mnemoal,"distosbal,0 ;poner un O al final
FinDesDet
di,bxex, 8
;recuperar el comienzo del mnemotécnico;buscar un espacio
scasbex,!. ;en que posición esta el espacio?sexta ;si CX^O, octava posición; mover parámetros
;una posición a la izquierdaPonSpcFin ;si CX-1, séptima posición, no se deben mover
;los parámetros;ci CX>^2, sexta o menos.;en este caso, moverlos parámetros a la; derecha
ax,esds,axdi,bxdx,7dx,didi,bxbx,cxcx,43al,0scasbdisi, didi,dx
;DX—número de posiciones por mover a la derecha
;BX=comjenzo de los parámetros
;buscar el fin de string
; dirección inversa
si3bx ;se llego al comienzo de los parámetros?CicDer ;mover el stringai;1
di, siPonSpcFin
short CicSpc
Sexta: mov ax,esmov ds,axmov si, di
;mover los parámetros una posición a la izq.
APÉNDICE H - DESENS.ASM H - 246
dec diCiclzq: lodsb
stosbcmp al, Ojne CicTzq
PonSpcFin:cidmovmovmovrepnedecmovrepmovstosb
FinDesDet;poppopPopPopPoppoppopreta
DesensDetend
di3bxcx354-al,0scasbdial," :stosbal,0
5
dssidxexbxaxdi
endp
;buscar la posición del cero
;poner espacio en blanco
;poner un cero
APÉNDICE H - EKSAMBLA-ASM H _ 247
MODULO ENSAMBLA.ASM
.**#***#********PJ^Q(^£jyy^]7N^
.model small
.486
; ÁREA PARA DATOS
Í
.data
transit db 32 dup (?)
mnemo db VJ}d\03T3USh',63'POp'57}!Gr',8db 'ADc',1 GH3'SBb'3 1 SH/ANd'^OHdb 'SUb'^SH^DAs'^FH^XOr'^OH/db 1CMp1538H!fNEAr',39H3tFAr'!3AH3lPTr'!3BHdb 1BYTe'I3CH,1WORd1}3DH,T)WORdl,3EH5'AAstJ3FHdb mc'340HI(DEc1J48HJ'SHOR^50HílQWORd!J51HJ'NOtf,52H11NEgI,53Hdb
db !.TNAe',72H,fJNb')73H3%f372H3'JAeV73Hdb 72^74^ '.TNz^SH^JNa'^éH^JNBe'JTHdb !JPe137AH,'.TPo'37BH,'.TNGe',7CH3'.TKl',7DHdb IJNgl,7EH5'JNLe')7FH3IJo',70H51.TNo1371Hdb IJcl,72H3MNc'373HIfJe'374H3!JNe'375Hdb I,TBet)76H,IJa1,77H3'.Ts!,78H,1JNs',79Hdb '.Tp!57AH3'.TNTp!}7BH31Jl',7CH!!JGeI37DHdb
db !TESt',84H,1XCHgf386H;!jVÍOV388H,fLEa!,8DHdb 1NOpI)90H5'C.Bw1,98H,'CWd1;99H,'CAU'59AH;WArt159BHdb fPUSHf,9CH3FPOFf,9DH,tSAHf39EH,FLAHf,9FHdb !MOVSbt3OA4H,fMOVSw1,OA5HJ(avtPSb',OA6H;1CMPSw'iOA7Hdb !STOSb'3OAAH3'STOSwt,OABH,^ODSb',OACH3!LODSw')OADHdb lSCASblJOAEH;SCASwl3OAKHJfREt'5OC2H}'RETn1,OC2Hdb 'LEsfJOC4H,rLDs'3OC5H3!RETf3OCAH31Nt(,OCCHdb r!NTo')OCEH,fIREt1,OCEE,rROl1,OPOH;llOr13ODlH
db rRC]l3OD2H,'RCrJ3OD3H3fAAjTi!,OD4H3'AAd13OD5H
APÉNDICE H - ENSAMBLAJES!! H-248
db 1XLAl*1OD7HrfEScIíOD8H;iSHl',ODCH1fSH:rl1ODDHdb fSAllJODCH3'SAr',ODFHiILOOPNe1,OEOH,fLOOPNz1}OEOHdb FLOOPe!,OElH,(LOOPz',OElH5!LOOpfIOE2HI'JCXzt)OE3Hdb TInl)OE4H,1OUf,OE6H)'JMp'5OEAHJrLOCk1;OFOHdb 1REPNe',OF2H,'REPNz;OF2H,!REp1,OF3H,!REPe',OF3HJtREPz'íOF3Hdb !HLt1,OF4H,'CMcl!OF5H,ICLc1)OF8H,1STc';OF9Hdb tCUl,OFAHí'STit1OFBH;iCLd!1OFCH11STdl1OEDHdb OFFH
regs db 'ALCLDTJ^LAHCHDHBH1
db 'AXCXDXBXSPBPSIDrdb 'EAXECXEDXEBXESPEBPESIEDI1
sregs db ESCSSSDSFSGS'
loners db 27H;2FH}37H,3FHI90H,98H,99H,9BHI9CH,9DH,9EH,9FHdb OA4H,OA5H,OA6H5OA7H3OAAH,OABH5OACH,OADH;OAEH,OAFHdb OCEH}OCFH,OD4H?OD5H,OD7Hdb OF4H3OF5H,OF8H,OF9H,OFAH,OFBH)OFCH)OFDH
oners db 6 ,40^48^520,53^54^5511,5611,5711db 70HJ71H,72H,73H,74H575H,76H,77Hdb 78H,79H,7AH)7BH;7CH,7DH,7EH!7FHdb 9AH,OC2H,OCAH,OCCH,OEOH,OE1H,OE2H,OE3H,OEAH
ÁREA PARA CÓDIGO
.code
NEsp equ 10delspc proc near
;Este procedimiento salta los espacios y los TABs en el string por¡ensamblar y deja SI apuntando al primer byte que no sea vin espacio.
;
;Entrada: DS:SI apunta al punto del string desde eí cual; se desea proceder.¡Salida: DS:SI apunta al primer byte que no es un espacio.; CY es 1 si hay más de NEsp espacios (error), en; cuyo caso DS:SIno es alterado
push axpush expush bpmov ex, NEspmov bp,si
;máximo NEsp espacios
APÉNDICE H - EKSAMBLA-ASM H-249
busc: lodsbor
jzcmpJe
cmpjne
spac: loop
errdel: movstcjmp
encont: deccíe
fíndl: poppoppopretn
delspc endp
aJ,alerrdelal,"Spacal,9encontbusc
si,bp
short ;findlsi
bpexax
:si se llega al final del string;h.ay un espacio?
;si, saltarlo;hayunTAB?
;no, hecho;saltar el espacio y ver sig. car.
:apuntar al carácter válido
encnem proc near
;Este procedimienío encuentra el pseudocodlgo del mnemotecnico que está al¿comienzo del string por ensamblarse,:
^Entrada: DS:SI apunta al string, que debe terminar en 0.; ES:DI es la dirección en donde se pondrá e] pseudocodlgo.
J
;Salida: DS:SI apunta al final del mnemotecnico + 2 en el string sí; este fue encontrado (pues debe terminar con espacio); ES:DI apunta al final del pseudocodlgo + 1; CY es ] si el mnemotécaico es inválido o si hay error: como en DELSPC 3 en cuyo caso DSrSIy ES:DI no son; alterados (excepto si había espacios desde DS:SJ); AX contiene el pseudocódigo (AL~03 AH= cod.)
caHjepushpushpushpushmovmovmovmov
delspcfínenc2bxdxesdiax,@dataes,ax
;encontrar el mnemotecnico;en caso de error, terminar
;hacer que ES:DI apunte a los mnemotécnicosdi, offset mnemodx,si ¡preservar el comienzo del mnemotecnico
AEENDICE H-251
pop esfínencl:pop dx
pop bxfinenc2:retnencnem endp
public encregencreg proc near
;Este procedimiento encuentra el código del registro al que apunta DS:SL3
;Entrada: DS :SI apunta al ascii del registro
Salida: DS:SI es cambiado según DELSPCAH es alteradoAL código del registroCY 1 si no es un registro o si hay error de DELSPC
7
cali delspcje fínencregl ;push expush bxpush espush dimov [email protected] es3axmov di, offset regsmov Eax,[si]and Eax,0dfdfdfh
mov cx324srchregrm ov Ebx, es : [di]
cmp ex, 8jbe rupGcmp ax, DJÍje foundreginc diinc diloop srchregstc :si rn
sí hay demasiados espacios, fin
;apuníar ES :DI a la tabla de registros;LO DIGITADO ascii del reg en AX
;en mayúsculas
;de la tabla
o se lo encontró, errorshort errreg
rupO; andcmp
Je
incincincloop
eax,ebxfoundregdididisrchreg
APÉNDICE H - EKSAMHLA.ASM H - 253
¡encontrar el código del registro
malsreg:stc ¡si no se lo encontré^ errorjmp sho.rt errsreg
foundsreg:mov a],[si+2] ¡tercer carácterand al,0dfh ¡hacerlo mayusc\ilacmp al,'A1 ¡si es una letra, nialjb oksregcmp alj'Z'jbe malsreg
oksreg: mov al,6sub alj elor al,40hcíe
errsreg:pop dipop es
fínencsreg:pop ex
íinencsregl:reta
encsreg endp
ascahex proc near5 : :- :
¡Este procedimiento transforma el stríng en AX (con AL, — MSD) a un byte¡en AL, CT - 1 si no hay tal hex en AX.) ~
push excmp ah/fja errhexcmp ah,'a'jb tstaland ahjOdfh
tstal: cmp aljTja errhexcmp al,'a'jb trnsand ai,0dfh
trns; cmp ah/A'jb numahsub ah/A'-^'-l
numah: cmp al5'A! ¡lo mismo con ALjb numalsub al,'A'-'9l-l
numal: sub aXj'OO' ¡pasar de ascii a numéricocmp al, 16jae errhexcmp ah,16
¡transformar el carácter en AH a mayúscula
¡transformar el carácter en AL a mayúscula¡ajustar el carácter en AH si es alfabético
APÉNDICE H - EUTSAMETAASM H-254
jaemovshlorcíejmp
errhex; stcfinhex: pop
retnascahex endp
errhexcl,4al,clal;ah
short fínhex
ex
icondensar e] número
esletr? proc near
;Este procedimiento determina si el carácter contenido en. AL es un dígito;o una letra, en cuyo caso CY = O, y de lo contrario, CY = 1.;AL es alterado.1 : : ~ — : ' :
cmp ayO'jb noesltcmp al/9'jbe siesltand al5Gdfhcmp al,'A'jb noesltcmp aJj'Z'jbe sieslt
noeslt: stcretn
sieslt: cíeretn
esíetr? endp
public eshex?eshex? proc near
¡mayúscula
;Este procedimiento determina si el string al que apunta DS :SI es un número;hexadecimal; en cuyo caso encuentra su valor.i;Entrada: DS:SI apunta al string, excluyendo signos 4-, - o espaciosj;SaIida: AL ~ 16 si el número es de 1 o 2 digitos, 32 en otro caso; AH = longitud del string del número; BX = valor del número; CY - 1 si lo apuntado por DS:SI no es un número o si es un; número de mas de 32 bits
APÉNDICE H - ETÍSAMBLAASM H - 255
pushxor
trycero:cmpjneincjmp
noceroin :movorjzmovmovcalijncmovxorjmp
noproblem:movcalijemovcalijemovcalije
movcalíjestcjmp
N4Dig; movcalijemovmovcalijemovmovmovjmp
tresdig:movmovcali
dxbx,bxbyte ptrfsí+bxyo* ¿buscar ceros inicialesnoceroinbx ¿contarlos en BXshort trycero
dh,bl ¿número de ceros en DIíbx,bxnoproblem. ;si no hay ceros inicialesab,[si+bx]al/O1
ascahex ;si el string era solo ceros3 ya no debenoproblem ¿haber mas caracteres hexadecimales válidosax,16bx,bx ;salir con cerofinnum
al,[si+bx+l.]esletr?undigal,[si+bx+2]esletr?dosdigal,[si+bx-i-3]esletr?tresdig
al^si+bx+4]esletr? ¿tiene más de 4 dígitos?N4Dig ;no; OK
;si} errorshort errnum.ax,[si+bx] ¿el número tiene 4 dígitosascahexerrnumdl}alax,[si+bx-t-2]ascahexermumbl,albh,dlax,420h ;AL=325 AH-4short íirmumal5lO' ¿número de tres dígitosah}[sH-bx]ascahex
APÉNDICE H - ENSAMELA-ASM H - 256
dosdig:
undig:
finnwn
je errnummov dlsalmov ax,[si+bx+l]cali ascahexje errnummov b1,almov bh,dlmov ax,320h ;AL=32, AH=3jmp short finnutnmov ax5[si+bx] ¿número de dos dígitoscali ascahexje errnumrnov bl?alxor bb,bhmov ax,210h ;AL^16, AH=2jmp short finnummov al/O1
mov ah,[si+bx]cali ascahexje errnummov bl,alxor bh,bhmov ax, 1 lOh ; AL=1 6, AH=1: add ah}dh ¿incluir los ceros en la longitudcmp ah,2jbe longbytmov al,20h
longbyt:clcerrnum: pop dx
eshex?
esreg?
retoendp
proc near
;Este procedimiento es similar al anterior: encuentra si el string al que¿apunta DS:SJ es uno de los registros BX, BP} SI o DI.?¿Entrada: DS:SI apunta al string excluyendo signos (+ o -) y espaciosi
;Salida: CY=1 si hay error, caso contrario:; AH = 2 (longitud obvia del string); AL- 1 si SI; 2 si DI; 4siBX
8 si BP3 :
mov ax,[si]
AEEKDICE H - ENSAMBIAASM H-258
shlmovcaliJclodsbcmpjnecalijnc
errml: jmpnopref: xorcorchetes:
xorxormovlodsbcmpjnecali
Jccmp
Jne
inccali
Jc
analiz: cal]Jc
movjmp
nohl: calijnc
errm2: jmptsfmin: cmp
jneinccali
Jc
cal]jenegmov
rdyrmm: xortestjzmovxoradd
al, eldh;aldelspcerrml
al,1:'errmldelspccorcheteserrmemdh,dh
d!5dlbXjbxcx,bx
al/Cerrm]delspcerrmlbyte ptr[sitstminsidelspcerrml.eshex?nohl,cx,bxshortrdyresreg?rdynumerrmembyte ptrfsi'analizsidelspcerrm2eshex?errm2bxcx,bxdí,aldl,alerrm2al5ahah}ahsi,ax
;en dh
;hay los dos puntos reglamentarios?;no
¡codificar inexistencia de sreg
¡inicializar primera parte del códigopnicializar desplazamiento
;el carácter actual debe ser el;corchete reglamentario
pío;si, ignorarlo
;hay un número hex?;no;si5 preservar su valor
um;hay un registro reglamentario?
;si;no5 error
¡/-'¡inicia con un signo -?¡no
;si; lo siguiente solo puede ser un número
;encontrar el negativo;preservarlo
¡poner el bit correspondiente en DL;estaba ya puesto, implicando duplicación?
;si, error¡longitud del string
¡ajustar SI
APÉNDICE H - ENSAMBLAASM H - 260
jnc rdynum3errm4: jmpIstmin3;cmp
jnecalijecalijenegmov
rdynum3:xortestjzmovxoraddcalije
lodsbcmpjne
condensar:movandcmpjemovandcmpjemovandcmpjemovand
jz
xortestjnzmovxorandcmpjne
errmemal,'-'errm4delspcerrm4eshex?errm4bxcx,bxdl,aldl,alerrm4al,ahah,ahsi,axdelspcerrm4
a!,']'errm4
al,dlal,3al,3errmemal,dlal, 3 2al, 12errmemal,dlal,30ha!330hernnemal,dlal,3fherrmem
ah,ahdl,2sbOal,dlal,.1al, 5al,5bit!
;despues de un - solo puede haber un número
;poner el bit apropiado; duplicación?
;si, error;longitud leída hasta ahora
jajustar SI
;ya se ha leído 3 cosas, debe haber;un corchete Analizador
jdeterminarsi el código;en DL es incongruente;si DL = OOKEDCBA, entonces
;e1Tor = -A~B-C~D-E~F + AJ3 + CD + EF
;inilici alizar código condensado;bitO - ~AC -i- B
APÉNDICE H - EHSAMELA.ASM H-261
sbO: orbitl: test
jnzmovandjnz
sbl: orbit2; mov
andjzmovandjnz
sb2: orbit3: mov
xorandcmp
Je
testjzmovandjz
sb3: orbit4: test
jzandjzor
fjncond:movmovorstoswmovstoswcíejmp
errmem: movstc
íinmem: poppoppoppoppopreta
encmem endp
ah,ldi, 8 ;bitl=~A~B-sbla], dia1,3bit2ah,2al, di ;bit2 = ~A~B -al_33sb2aí,d]al, 12bit3an,4al}dl ;bit3 = ~A~B~<al,27hal,2fhal,2fhsb3d!516bit4a!5dlal,7bit4ah,8dl,32 ;bit4 - (A + Bfinconddl,15fin con dab,16dl,ab
ax5dxal,60h
ax,cx
short finmemsi,bp
bpdxexbxax
(A + B + C)B
C + D)F
APÉNDICE H - EEÍSAMBULASM ,,- -+,•••,rl - ¿o.>
stosbmov ax,bxstoswjmp shott noerrhex
unbyte: rnov ah;blstosw
noerrhex;cJc
ímenchex;pop dxpop r?xpop axretn
enchex endp
enspasol proc near
^;Este procedimiento ejecuta el primer paso de compilación, es decir, la¡traducción de un string alfanumérico a seudocódigos que serán transformados;a código verdadero por otro procedimiento.3
¡Entrada: DS:SI apunta al string por compilarse, que debe terminar; enO.; ES:DI apunta al lugar donde se desea el seudocódigo;
¡Salida: DS:SI es alterado; ES;DT es alterado; CY set si hay error3
push axpusb bxpush expush dxcali encsreg ;es la instrucción un prefijo como ES: ?je nosregpref ;noinc si ;si, proceder en consecuenciainc sicali delspcmov ah5a1 ¡preservar códigolodsbcmp al,':' ;por sintaxis, debe haber :jne errpasolmov a!3ahstosbjmp short bienpasol
nosregpref:
APÉNDICE H - H - 264
calijecmpjbcmpjacalijecalijecmpjbcmpjacalijecalijecmpjbcmpjbe
nopreflr:cmpjbcmpjbecmp
Je
cmp
je
bienmne:movmovmov.movmov
Jone?: cmpJeincloopjmp
eslonermovmov
calijnc
encnemerrpasolah,0f0hnopreflrah,0f3hnopreflrdelspcb.ienpasolencnemerrpasolah,Qfí)hnopreflrah,0f3hnopreftrdelspcbienpasolencnemerrpasolahjOfOhnopreflrah,0f3herrpasol
ah,39hbienmneah,3eherrpasolah,50herrpasolah,51herrpasol
dx,dsbx,@datads,bx
;lo primero debe ser un mnemotécnico
;es un prefijo REP o LOCK?
;si, buscar siguiente mnemotécnico;si no hay más que el prefijo, terminar
;es un segundo prefijo REP o LOCK?
;si, buscar siguiente mnemotécnico;si no hay .mas que e] segundo prefijo, terminar
;no puede haber un tercer prefijo
;el mnemotécnico inicial no puede ser NEAR,;PTR, BYTE, etc
;preservarDS
bx; offset Ion erscx,35ah,[bx]eslonerbxJone?
¡averiguar si e] mnemotécnico es uno de los;que no aceptan argumentos;si
shorí hayargds,dxbyte ptr es
delspcerrpaso.l
:[di-2],l ;marcarjo como loner¡apuntar al punto inmediatamente después
;del mnemotécnico y buscar el fin de string;si hay mas caracteres válidos, error
APÉNDICE K - H - 265
bienpasol:mov aljQffhstosbcíejmp short finpasol
errpasol:stc
finpasol:pop dxpop expop bxpop axreta.
hayarg: .movmov
ou e?; cmpjeincloop
esoner: movcmpjecmp
admite dp:ormovjmp
sol oun o:mov
dosarg: xorargs: mov
calijnccmp
JecmpjecmpJe
jmpenarg: cali
jnccali
bx, offset onersex,35 ¡averiguar si el mnemotécnico es uno de losah,[bx] ¡que aceptan un solo argumentoesoner ¡sibxone?short dosargbyte ptr es:[di-2],2 ¡marcarlo como onerah,9ab " ¡CALL?admitedp ¡si, puede haber dos puntosah,0eah ¡.TÍvIP?solouno ¡no
byte ptr es:[di-2],4 ¡marcarlo como JMP o CALLcl,2 ¡marcar que puede haber un argumento dobleshort args ¡de dirección absoluta
cl,l ¡marcar que debe haber solo un argumentoshort argscljCl ¡marcar que debe haber dos argumentosds,dxdelspcenarg ¡confirmar presencia de argumentosah,0c0h ¡su no presencia solo es admisible conbienpasol ¡RET, RETN o RETFah,0c2hbienpasolahjOcahbienpasolshort errpasolencmem ¡buscar argumentossegargencreg
APÉNDICE H - ENSAMBLAJE!
Jcstosbincincjmp
.noreg] : cali
Jc
stosbincincjmp
nosreglrcalljnccali
Jc
calicalijnccali
Jc
segarg: or
izcalijecmpjnelodsbcmpjnecalijejmp
haydos: calijelodsbcmpjnecalijnccalijestosbincinc
bienl: jmpnoreg2: calí
noregl
sisishoit segargencsregnosregl
sisishort segargenchexsegargencnemenpasolencnemencmemsegargenchexerrpasolel, el ;ihaydosdelspcbienld,2 ;errpl
;s(al,1;' ;s<errplenchexerrpl
bi enpasol
deispcerrp]
al,1/ ;e!errplencmembienlencregJioreg2
sisibienpasolencsreg-
¡buscar por ejemplo BYT.E PTR
;el PTR es opcional
;puede también ser un número (para saltos)
;dos argumentos?;si;no, uno solo
;era JMP o CALL?yio
;solo se admiten dos argumentos aquí si están¡separados por :
;si hay un solo ai-gumento, error
;el separador entre argumentos es la coma
¡buscar segundo argumento
AEEKDICE H - ENSAMBIAASM H -268
push]odsbcmpjemovmovmovshrmovjzdec
jzdecjzdecjzdecjzlodswjmp
esdatab;lodsbxorjmp
esinstnlodsbjmp
esregis:movand.movjmp
essregi;movandmovjmp
esmemor:movmovshlandandorlodsbxchgmovlodswmov
rdytipo:clcjmp
fininst:stc
ex
a1,0fíh ;íro de instrucción?fininstch,ahah,al.cl.5al,c] ;obtener el tipodi, al ;en DLesinsíralesregisalessregialesmemoralesdatab
;es dato de wordshort rdytipo
;es dato de byteah,ahshort rdytipo
;es mnemotécnicoshortrdj'tipoal,ah ;es registroa1,0fhah;chshort rdj'tipoal,ah ;es registro de segmentoal,3ah,chshort rdytipo
al,ah ;es memoriacJ,3
31,01
al,0c0hah,7ahsal
a],ahbx,ax
cx34
short fintipo
APÉNDICE H - EKSAMELA-ASM
fin tipo ;pop exretn
tipo enclp
gelpref proc near
i.
;Este procedimiento obtiene el prefijo de redefínición de segmento a partir¿del número de registro de segmento.i¿Entrada: BH = xPSrxxxx con P = presencia de prefijoí
;Salida: AH = O sí no hay prefijo, o; prefijoi
xor ah,ahtest bh,40hjz íingtprnov ah,bhshr ah,land ah,]Jíhor íih,26h
íingtp; retngetpref endppref? proc near
¿Este procedimiento determina si debe incluirse un prefijo de redefínición;de segmento antes del opcode, del cual solo debe haber .1 byte, y ES:DJ;debe estar apuntando a la dirección siguiente a dicho byte. Hace la¿inclusión y los ajustes del caso cíe ser necesario.a;Jintrada: AH O si no debe haber prefijo; opcode del prefijo en caso contrario; ES:£>T dirección del bj'te de opcode + .13
¿Salida: AL es inalterado o contiene ei opcode; DI es ajustado¿ C!X incrementado en 3 sí hay prefijoj
cmp ah,0 ¿hay preSjo?je noprefijomov al,ah ¿sí, ajustarxchg a^es^di-]]stosbirte ex
noprefijo;reín
enclp
KíyitK ü - iiSSAAlULAJüai J_| _
sizedisp proc nearj;Determina dados los bits 6 y 7 de AL, que debe tener el byte de uiodregr/m,;el tamaño en bytes del desplazamiento u offset Luego incluye esle;desplazamiento en el opcode.;
¡Entrada: DL o DX desplazamiento; AL byte de modo de díreccionamiento; BS:DI apunta al Jugar del opcode donde va el desplazamiento
¿Salida: AX es alterado; ES:DJ es ajustado; CX incrementado según el desplazamiento5
test aljOcOh ¿obtener el inodJz despl? ;sí es 00, averiguar si hay desplazamientoand al,0c0hcmp al30c0h ;es 11?je nodesp ;si} tampoco hay desplazamientoinc excmp al,40h ;es 01?jne dosbyt ;nomov a!3dl ;si, desplazamiento de un bj^testosbjmp short nodesp
despl?: and al;7 ;si mod = 00 y r/m = 110,cmp al,6 ;el modo es directojne nodesp
dosbyt; mov ax,dx ;desplazamiento de dos bytesstoswinc ex
nodesp: relnsizedisp endp
sizedata proc near
¿Similar al anterior: determina el tamaño del dato según el bit O de AL: y lo¿coloca en el opcode.i¿Entrada: AL su bit O es w; BP dato; ES:DI apunta al lugar del opcode donde debe ir el dato5
¿Salida: AX es alterado¿ DI es ajustado¿ CX incrementado según los datos
APÉNDICE H - ENSAMBLA-ASIir j ¡ _ ¿yj
inc exTest alj] jw~ J /mov aXjbpjnz dosdata ;sislosb ;nojmp short fsdata
dosdata:inc exstosw
fsdata: retnsizedata. endp
modrm proc near3;Este procedimiento analiza el pseudocodigo de modo de direccionamiento y;genera datos necesarios para Ja compilación.
¡Entrada: DS:SI debe apuntar al pseudocodigo de modo de dir.3
;Salida: AH prefijo de redefinición, de haberlo, o O; BL- -MdOOOr/m; BH = hOOOOOOw; h-validez de w; DX desplazamiento, de haberlo; si no, es alterado; CL incrementado en ] si jiohay error; CH -O; C i set si hay error, en cuyo caso los registros; quedan inalterados
push bx
push expush dxpush sipush bppush axloclsbdec sitest al,0e0h ;mnemo?jnz mrmnomne ;no
cali tipoje emnodrrncmp al,3ch iB^H^?jb emnodrmje bytptí-cmp al,3eh ;WORD o DWORD?ja errmodnnmov dh,81h pnarcarwordjmp short elpír
bytptr: mov dh,80h jmarcarbj^te
APÉNDICE K - EHSAMBLA-ASvr ] I - 273
pop bppop sipop dxpop expop bxstcretn
modrm endp
modregrm proc near
;Este procedimiento genera datos necesarios para el. ensamblado de instrucciones;que tienen dos operadores (como ADD), dados los pseudocódigos generados en eljpriiner paso de compilación.
;Entrada
i
;Salida:
DS:SI debe apuntar a los pseudocódigos de los operadores.
AL - OOOOOOdwAH prefijo de redefinición, de haberlo, o OBL byte cíe modo de dirección amientoDX desplazamiento de haberlo, si no, es alteradoCX incrementado en 1 si no hay errorCY set si hay error, en cuyo caso los registros quedan
inalterados
push axpush expush dxpush sipush bppush bxlodsbdec siand al,0e0hcmp a1,20h ;reg?jne mrrnoregcali tipocali jnodrmje errmrrcali arreglaje emnrror als2 ;d~l
shoit bienmrrmimoreg:
cali modrm.je errmrrmov bp,dx
APÉNDICE H - EHSAMHIAASM
errarr: stcretn
modregrm endp
modrmdata proc near
ir _
¿Similar al anterior, cuando el. segundo operador es un dato inmediato. Produce¿resultados diferentes si el primer operador es un acumulador.
J
¿Entrada: AL = xxCODxxx; DS:SI debe apuntar a los pseudocodigos de los operadores
;Salida: AL = OOOOOOsw; AH prefijo de redefinición, de haberlo, o O; BL - mdOOOr/m OR COD; DX desplazamiento, de haberlo, si no, es alterado; BP data; CX incrementado en 1 si no hay error
; o:; AL = OOOOOJ.Ow; B.P data; CX inalterado
3
; CY set si hay error, en cuyo caso Jos registros quedan: inalterados
pushpushpushpushpushpushmovlodsbdecmovandcmpjnetestjnzlodsbmovcalicmpjbje
exdxsibpbxaxch,al
siah,alal,20h ;reg?al,20hnoacah,7noac
bl,altipodl,4 ;dato?emnrdmrdok
APÉNDICE H - ENSAMBLAJE! H - 276
testjnzcmpja
mrdok: movmovandshrshrshrormovpopmovaddpoppopretn
noac; movcalijemovmovmovcalicmpjbjneor
nosext: testjztestjnzcmpjnecmpjajmp
mrdnoesp:andorcmpjneor
mrdrnok: xchgmovand
bl.8mrdokax,255errmrdbp,axa],b!al, 8al,lal, 3.a1,lal,4b],alaxal,blsp,6dxex
al, enmodrmerrmrdch,alal, dibp,axTipodl,4- ;dato?errmrdnosextbh,2 ;sign extend: s=lbh,80h ;definiclo size?mrdnoespbh,lmrdmokdi, 5mrdmokax3255errmrdshort mrdmok
bh,2bh,80hdi, 5mrdmokbh,l
bp,axdl,alch}38h
APÉNDICE H - ENSAMBLA-ASM H - 2 7 7
ormovandaddmovpopmovxoraddderetn
errmrd: poppoppoppoppoppopstcretn
jmodrmdata
bl,chal,bha!,3sp,2ch,blbxbl,ch
ch,chsp,8
axbxbpsidxex
endp
delptr proc near
;EL mnemotécnico PTR es innecesario en todos los casos. Si. DS :SI apunta;al pseudocodlgo de este mnemoíecmico, este procedimiento Jo salta y deja;a ST apuntando al siguiente pseudocodlgo; en otro caso, no hace nada.3
noptr:sipír:
delptr
pushpushpushpushmovcalijeorjnzcmpjemov
poppoppoppopretn.endp
axbxdxbpbp,si
tiponoptrdl,dlnoptra!53bbsiptrsi,bpbpdxbxax
;mnemo?
;PTR?
APÉNDICE H - ENSAMBLAJVSai [_| _ 273
jmpsh? proc neari¡Este procedimiento determina si. la distancia en tre AX y DI esta entre;+1 27 y -.1 28, en cuyo caso pone esta distancia en AX y CY = 0; de lo¡contrario, CY= 1.
subcmp aXj.127jg notshrfcmp aXj-128jl notshrtcíeretn
notshrt:stcretn
jmpsh? endp
enspaso2 proc near
;Este procedimiento ejecuta el segundo paso de compilación, es decir, la¡traducción de .los pseudocódigos a un código verdadero.
í
¡Entrada: DS:SI apunta al pseudocódigo; liS:DT apunta al lugar donde se desea el código
3
¡Salida: DS:SI es alterado; ES:DI es ajustado¡ CX longitud del código; CY set si hay error, en cuyo caso los registros; quedan inalterados
push.pushpushpushpushpushpushxor
startp2;calljeorjnztest
jzcmpje
axbxdxhpsidiex
ex, extipoer2dl,dlprsrg?ah,lnoesJonal,0d4hdosb
¡longitud inicial = 0¡determinar tipo de pseudocódigo inicial
¡es una instrucción?¡no, puede ser sreg¡es un loner?¡no¡es AAM?
¡si
AEENDtCE H - ENSAMBLA-ASVI H - 279
cmp al,0d5h ¡es AAD?jne imb ¡no
dosb; mov ah,0ah ¡es AAM o AAD, instrucciones cuyo opcode esstosw ¡de 2 bytesadd cx,2 ¡incrementar longitud en 2jmp bienpaso2
unb: stosbinc exjmp bienpaso2
prsrg?; cmp dl,2 ¡sreg?¡no, errorer2jne
shl al,.Ishl al,]shl al,]or al,26hstosbinc exjmp bienpaso2
er2: jmp errp2
noeslon :cmp al, 70hjb nojcondcmp al,7fhja nojcond
sal! ore!: ¡sistosbcali tipoje er2cmp dl,4jb er2dec axcali jmpsh?ic er2stosbadd cx,2jmp bienpaso2
nojcond:cmp al,0e0hjb nolpjcxcmp al,0e3hjbe saltorel
nolpjcx:cmp al,8dhjne diflea
regmemdisp:stosbcali modregrmje er2
¡hallar el prefijo
;es un salto condicional?
¡lo siguiente es data?¡no, error
¡calcular distancia relativa¡y determinar si el salto es posible
;U)OP o JCXZ?
;LKA?
¡hallar el código de los argumentos
APÉNDICE II - ENSAMBLAJ\SM u - 280
bp2;diflea:
cmpjnecalimovstosbcaüincjmpcmpjbcmpjbe
al,3er2pref?a!3bl
sizedispexbienpaso2al,0c4hnoldslesa],0c5h
;dy w deben ser 1
;byte de modo de dirección amiento
¿LDSoLES?
regmemdispnoldsles:
cmpjbcmpjastosbinclodsbcmpjedecjmp
al.OfDhalterablesal,OJ3halterables
1
ex
al,0f£hbp2sistartp2
jprefijo REP o LOCK?
si, incluir el prefijo
;empezar otra vez con lo que sigue al prefijo
alterables:
sioner:
nojc:
nori:
testjnzjmp
: testjzjmpcmpjbjmp
cmp
jamovlodsbdecmovandcmpjemovcalije
ah,2sionernoonerah,4nojcjmp o calialJOc2hnoriretointal,7nopushpopdh,al
sibl,atHOeOhb1,2Ghpprega1,dhmoclrmppnomem
;oner?
;.1MP o CALL?
;es oner.;si no es .RET o INT
;PUSH o POP?;no
;reg?;si
;no, mem?;no
APÉNDICE H - ENSAMBLAJVSMH-28I
cmpjecmpmovJe
movespopl: stosb
inccal]cmpjeor
espop2: movstosbcalijmp
er2a: jmp
ppnomem:callcmpjecmpjaeshlshlsh]orcmpjeand
espop4: stosbincjmp
ppreg: testjzandorcmpjeand
espopS: stosb
bb,80her2aal, 7al,8fh.espoplal,0ffb
expref?al,8fhespop2bl,30ha!3bl
sizedispbienpaso2errp2
tipodl,0er2adl,4er2aal,lal,la1,lal, 7dh,7espop4al,0feb
exbienpaso2
al, 8er2aal,7al,58hdh,7espop3al50f7h
inc ex
jmp
nopusbpop:cmp
bienpaso2
al,48h
;no, error;POP?
;si, dejar su código;no, código de PUSH
;no, compensar byte de direcc.
;es sreg
;regde 16 bits?;no, error
;dejar solo los tres LSBits;poner beader de] bj'te
;TNC o DEC?
APÉNDICE H - ENSAMBLA.ASM 11-282
jaJDOV
lodsbdecandcmpJe
movcalijetestjzorxchgstosbcalicmpJe
oresincl: jnov
síosbcaliincjmp
noincdecah,al
sial,0e8ha1328}iincdecregal,ahmodrmer2abh,80her2abh30fehbhtal
pref?bh,40hesinclbl,8a1,bl
sizedispexbienpaso2
;registro de 16 bits?
;debe especificarse size
jgiiardar código
;TNC?
incdecreg:jodsband al, 7or a],ahstosbinc exjmp bienpaso2
noincdec:cali modnnje er2atest bh,80hjz er2bor bh,0f<5hxchg aljbhstosbinc exmov al,bhand a], 7shl al,lshí al,lshl al, 3
;aislar registro
;es NOT o NEO o etc.
;debe especificarse el size
¡guardar código
AEEKDICE H - ENSAMBLA-ASM H -283
or al,blstosbcali sizedispjmp bienpaso2
er2b: jmp errp2retointrcmp a]50cch
jne esretcali tipocmp di ,4jb er2bcmp ax,255ja er2binc excmp a]53je esint3mov ah,almov al,0cdbstoswinc exjmp bienpaso2
esintS: mov a^Occh.stosbjmp bienpaso2
esret: inc exmov bl,alcali tipojne conoffmov al,blinc alstosb
bp2a: jmp bienpaso2conoff: cmp d!54
jb er2bjne retwomov ab,almovstoswinc excmpje bp2axor al, a]stosbinc exjmp bienpaso2
retwo; cmp bJ,Oc2hje peque?
¡obtener byte de dir. completo
;INT?;no
;lo siguiente es un dato?
;TNT3?
;no; dos bytes
;si, un bute
¡preservar código
¡si no hay un fin, con offset
;opcode adecuado
¡error si lo siguiente no es un dato;si el dato es word
¡RETN?
;no, un byte mas
APÉNDICE H - ETíSAMBLAJXSM H - 285
jmp short latalistaesfar: mov dh,3lalalista:
cali delptrcali tipoje ejcmp d!32 ;sreg?je ejcmp dl,l ¡reg?jne cvialargtest al, 8 ;de 16 bits?jz ej ;no., error
cualarg:cmp dl,4 ;datos?jae jdatjmp jnodat
jdat: push clx ;sipush axcal] tipoje jdat8o!6cmp dl,4 ;dos datos?jae jdat32pop axpop dxjmp errj
j da 13 2: mov bx,axpop axpop dxcmp dh,3je errjcmp dhj2je errjxchg aijChstosbxchg ch,alxchg aXjbxstosw.mov ax,bxstoswa cid el, 5jmp shorí jbien
jdaí8o!6:pop axpop dxcmp dh,3 ;far?je errjcmp dh,2 ;near?
;dato de 32 bits
;shorr?
;near?
;solo en este caso, el código es inalterado
APÉNDICE H - H - 2S6
jecmp
Je
cmpjnesubcalijnedecjmp
jnear: subsub
yaresta:movcmp
Je
incesca1U:xchg
sTosbaddxchgstosvvjmp
jsh?; cmpjnesubsuborjzcmpjne
jshort: movmovstoswincinc
jbien; xorjmp
errj: xor
jneardh,ljsh?chjOeahjnearax,2jmpsh?jshortaxshortyarestaax,3ax9dibl,0e8hch,9ahescalllblb1,al
cl,3al,bl
short jbiench,0eaherrj ;:ax,2ax,diah,ahjshortah.Offlienj
ah,alal,0ebh
c]el
ch,chbienpaso2ch,ch
;catcular distancia
;so1o se admite SHORT en JMP
jmp errp2
jnodat; cmp ;reg?jne noregl.6or dh,dh ;no debe haber restricciones deBYTEPTR, elejne errjmov bl,almov ;
APÉNDICE H - T2ÍSAMBLAASM: H-287
stosbincmovandorcmpjeorjmp
esjmpreg:or
fjd: stosbincjmp
noreg!6:cmpjesubmovpushpushcalimovmovincincpopjetestjztestjz
noesps: cmpjneor
nojfar: movstosbinccal]cmpjeor
jmpesjmpmem:
orfjm: mov
stosbcali
3
elal,blal,7al,0c0hchjOeabesjmpregal, 3 Ohshort fjd
al,20h
elsbortjbiendh,lenjsi, 4al,dhbpexmodrmbp,spch,[bp+l]spspbpenjbh,80bnoespsbh,3enjal,3nojfarbl,8aI,OfEh
elpref?ch,0eahesjmpmembl}.1.0bshort fjm
bl,20bal,bl
sizedisp
opcode - FF
;aislar número del registro;mod= 11ymp?
;es mem, short es inadmisible
;restaurar pseudocódigo
;especificado size?;no, word por default
;word?
;far?
;marcar FARjopcode
ymp?
APÉNDICE H - EKSAMBLAJiSlVI H - 288
jmp shortjbien
nooner: cmpjaemovcalijeorstosbcali3T10V
stosbcaliincjmp
er2h: jmpconinmed:
calijetestjzorstosbcaliinc
JWsinacc; or
stosbcalixchgstosbcalimovshrxorcaliincjmp
mayque4üh:cmpjnecaUjeandorstosbÍT1C
als40hmayque40hbh;aimodregrmconinmedal,bh
pref?al,bl
sizedispexbienpaso2errp2
modnndataer2hal, 4 ¡operación con acumulador?sinacc jnoal,bh
sizedataexbienpaso2al,80h
pref?bl,al
sizedispal,bla!3lal,.lsizedataexbienpaso2
al,84h ;TEST?noestestmodregrmtdat?alj.al}84h ;generar código
ex
APÉNDICE H -H-289
tdat?:
taccd:
calimovstosbcal]jmp
xorcalijetestjnzorstosbinccal]movmovstosbcalimovcalijmpandorstosbincca.lljmp
pref?al,bl
sizedispbienpaso2al } almodrmdataer2fal,4taccdal,0f6h
expref?bh,alal,bl
sizedispal,bhsizedatabienpaso2al,]al,0a8h
exsizedatabienpaso2
noestest:
xreg:
cmpjnecalijeorjzcmpjecmpjaecmpJe
subjmptestjnzdec
al,86bnoesxchgtipoer2fd]5dler2fd!52er2fdl,4er2fdl;lxregsi, 4
;XCHG?
;mnemo?;si, error;sreg?;si, error;datos?;si, error;reg?
píoshortxmergal, 8xrlíSsi :
p-eg de ] 6 "
,noshort xmerg
APÉNDICE H - ENSAMBLAJVSM H-290
xr.1,6: mov ah,alcali lipoje er2for d1,d1jz er2fcmp di ,2je er2fcmp di, 4je er2fcmp di, 1je x2regsub si, 5jrap shorl xmerg
er2f: jmp errp2x2reg: test al, 8
jz er2fcmp ah,8je rgenalcmp al, 8je rgenah
;el segundo operando tampoco;puede sermnemo, sreg.ni datos
;reg?
;no
;segundo reg. de 16 bits?¡no, error por incompatibilidad;primerreg. acumulador?
;no, y el segundo?
sub si,2 ;no, ninguno es acumuladorjmp short xmerg
rgenah: mov al,ahrgenal: and al,7
or al,90hstosbinc exjmp bienpaso2
xmerg: cali modregrmje er2for a1,86hstosbinc excali pref?mov al,blstosbcali sizedispjmp bienpaso2
noesxchg:cmp al,88hje siesmovjmp noesmov
;MQV?
; Lo siguiente es el procesamiento de MOV, que es bastante complejo-siesmov:push sisi
tipoer2f
APÉNDICE H - ENSAMBLAASM
or d1,d1jnz mnomnepop sijmp mesmem
mnomne; cmp dl,lje msiregjmp mnoreg
al,7mnoacmodrm
H - 293
msireg; testjnzcalicmpjnetest
mnoacbh,80hmacany
shlshlshlmovandxorjnzmov
macany; shrshrshrorstosbinccaliPopjmp
mnoac; popcalijejmp
nocí; lodsbandmovcalijecmpjecmp
jbcmpjnetest
bh,lbh,lbh,ldl,ala1,gal,bher2eal, dia1,lal,.lal,lal50a0h
exsizedispaxbienpaso2simodregrmnocímcasol
al, 15bj,altipoer2ed!52ra2sregd1,4er2ed!35m2byteb1,8
;niTjemo?
;reg?
;si, acumulador?
;seg, open [disp]?
;size especificado?
;sizes contradictorios?;si, error
jyolver a obtener el reg
;seg. oper, sreg?
;seg. oper. dato?
;de word?
;si, compatible?
AEENDICE H - ENSAMBLA-ASMT H - 292
jzm2byte; mov
movorstosbincmovshrshrshrcalijmp
m2sreg; testjzmov.movstosb.incmovsWshlsMandororstosbincjmp
er2e: jmpmnoreg: cmp
jnepopmovcal]jecmpjecmpjeorjnzcmpjbcmpJa
calicali
er2ebp,ax
al,bla],0b0b
exa1,b1al,]al,1.
al,Jsizedatabienpaso2bl,8er2ebh,alal38cb
exal,bhal,lal,lal,lbl,7a1,blal,0c0h
exbienpaso2erq>2
d1,2mnosregdxdh,altipoer2ed1,lm2rdl,3m2mdl,dler2edl,3dher2edl,3eher2edelptrtipa
;preservar ciato;caso 3
;primer operador compatible?
;generar byte de direccionamiento
;pn"mer oper. sreg?
;restaurar slack
;segundo oper. reg?
;seg. oper. mem?
;seg. oper mnemo?
;WORD o DWORD?
AEENDICE H - ENSAMBLAJES!! H -293
m2m;
m2r;
cmpjne
movmovstosbinccalicalimovsn]shlshlorstosbmovcali
J™Ptest
jzmovmovstosbincmovshlshlshlandororstosbinc
dl,5er2ebp3ax
al,8eh
exgetprefpref?al,dhal,lal3.la1,lal,bl
dx,bpsizedispbienpaso2al, 8er2ed!3alal,8eh
c,\h
al,],alslal,l
d!37al,dl
a!30c0h
ex
;despues mera?
;generar byte de dirección amiento
jmp bienpaso2mnosreg:pop si.
cmp dl,3jne er2d
mesmem: push si
;mem?;no, no mas opciones
calijemovcalícmpjecmpjnetestjnz
modrmerrmbp,dstipod]32m2srdi,].mtry.l 2al, 7mtryl2
;seg, oper. sreg?
;seg. oper. reg?
;si, es acumulador con [disp]?
APÉNDICE H - ENSAMBLAJiSM H - 295
inccal]1TJQV
stosbcal]jmp
mtry2; xorcalijetestjnzorstosbincmovcalimovstosbcal]movcal]
-.««.>~ — Hinj J7 Ul
noesmov:cmpjnecalicmpjbcmp
movshrshrshrorstosbincmovcalijecal]andsblsnJshlor
expref?al,bl
sizedisphienpaso2al, almodtmdataer2dal,4er2d ;so]o se admite una de las formasal30cóh
exbh,alpref?a],bl
sizedispal;bbsizedatabienpaso2
UUi JJA tJWCfed.irUC.IILU UÍP WIW V
al,0d8h ;ESC?noesesctipodi, 4 ;el primer operador debe ser un datoer2dax,3fh ;deC>bitser2dah,al
a1,la1,la]50d8h
exa],ahmodnner2cpref?
a1,lal,la1,laLbl
APÉNDICE H - EBSAMBLAASM H - 297
errs:er2c:
xorjrnp
esinouí:cmp
iconr:
esout:
jecalicmpjnetestJnzshrshrshrormovcalicmp
Je
cmpjbcmpjamovmovstoswincincjmpcmpjnemovorstosbincjmpcalicmpjecmpj^cmp
jamovcalicmpjnetest
ch.cherrp2
a!30e6h ;OUT?esouttipo ;no, JNdl,ler2cal,7errp2al,lal,lal5lal,0e4hbl,altipodl,liconrdl,4errp2ax,255errp2ah,alal}bl
exexshort bienpaso2al, 10 ;DX?errp2al,b1al, 8
exshort bienpaso2tipodl,loconrdl}4errp2ax5255errp2ah,altipodl,lerrp2al,7
APÉNDICE H - ENSAMEEAASM jr _ jgo
jnz eirp2shr al,lshr a], ]shr al,lor al,0e6hstoswinc exinc exjmp short bienpaso2
oconr; cmp al, 10 ;DX?jne errp2cali tipocmp dljljne errp2test' al, 7jne errp2shr a 1,1shr al,],shr al,Jor al,0eehstosbinc exjmp short bienpaso2
errp2: pop expop dipop sistcjmp shortfinp2
bienpaso2;add sp,(5cíe
jSnp2: pop bppop dxpop bx
retn.enspaso2 endp
publio assem
assem proc near!
;Este es el ensamblador, que llama a los pasos 1 y 2 de compilación.5
¡Entrada: DS:SI apunta al stnng por compilarse
APÉNDICE K -
•Salida:
H - 299
liS:DI apunta al lugar donde se desea el código
DS:SI es alteradoES:DI es alteradoCX longitud del códigoCY set si hay error
í
pushpushpushcidmovmovmovcalijemovpoppoppopcaUretn
assem endperror: pop
POP
popretn.
esdiax
íix,dses,axdi, offset transiten sp a solerrorsi,offset transitaxdiesenspaso2
axdies
end
APÉNDICE H- MEMOHIAJVSM |_[ _ ^QQ
MODULO iVIEMORIA-ASM
.model small.486
ÁREA PARA CÓDIGO
.code
public llenarllenar proc near
¡Este procedimiento llena un bloque de memoria con un valor de byte; determina do.;Entrada: ESiDI apunta al inicio del bloque; CX contiene el tamaño de] bloque; AL contiene el valor por ponerse en el bloque5
llenar
cidpushpushrep
P°PPopretnendp
exdisíosbdiCX
public buscarbuscar proc near
¡Este procedimiento busca un stríng en un bloque de memona.¡Entrada: ES:DT apunta al inicio del bloque; CX máximo número de b}4es que deben ser explorados; DS:SJ apunta al string por buscarse; BX longitud del string3
¡Salida: ES:DI apunta al string que se encontró, o al ílnal del bloque¡ si no se lo encontró; CX >0 si se encontró, O si no se encontró
APÉNDICE H-A1EMOHÜUVSM H - 3 0 I
cidBuscaSír:
pushpushpuslimovrepepoppoppopjeincdecjnz
FinSrch:retnbuscar endp
exsidicx,bxcmpsbdisiex
FinS ren-díexBuscaStr
public copiarcopiar proc near
;Este procedimiento copia un bloque de un lugar a otro en la memoria.¿Entrada: DS:SJ apunta al inicio del bloque por copiarse; ES;DT apunta al inicio del destino; CX .numero de bytes por copiar
push- sipush dipush excmp di, sije fincopiarja invcopiarcidrep jnovsbjmp sh ott fin copi ar
invcopianadd si,cxadd di, exdec sidec disldrep movsbcid
fincopiar:pop expop dipop siretn
copiar endpend
APÉNDICE H-MEMORIAJVSM r» _
PROCEDIMIENTO CBILD486.ASM 1
dosseg.mode] large ;small
ÁREA PARA CÓDIGO
.code
¡Este es un overlay que Ja permite a un programa bajar de nivel haciendo EXEC;de este programa, tras haber instalado un handler de 63H que traslada el;control al programa con la función 80h.
sfarf: rnov ax^OSOhint 63h
mov ah,4ch jnunca Hega aqui, esfó es solo por si seint 21h ;ejecuta este programa sin e] handler de laencl start ¡interrupción 21h instalado,end
AEENDICE jr-JMMACASM H - 303
MACROS DNIMAC.ASM
Macros usados en eí archivo INICIAL. ASM
;Macro Parámetros Función.
; actuar; ayuda;bufcla;curs; explica;getkey;gefmnacjgetxpr;guarpantallajiluminaop;inbuff;indinac;lmppntpnenaba;menarr;mender;menizq;menulinea;memivent;mostrar;movbuf;nocurspiunrve]jopcion?;pchar;pmenu;posdir;restpantalla;ruh"najsalvareg;statusf
salta a una de las dir. en una tabladir,nlin,co1or presenta ventana con instrucciones
pnclave,pbuf encuentra Ja posición de un bu'fferx pone un "cursor" en x,24pnclave muestra Ja explicacion(PNCLAVE)
recibe dato del teclado (BIOS)da el # del macro con nombre en NOMBUF
obtiene ultimo nibble oO en BUFFJiRguarda una pantallaresalta la opción actual
dir recibe string desde teclado (BIOS)da una lista de los macros en e] índice
Jimpia la pantallacursor abajo en ventana de subopc,
cursor arribacursor a la derechacursor a la izquierda
pnclave muestra menu(PNCLAyE)muestra menú en forma de ventana
pdir,plin,pcol muestra pregunta y espera respuestapbufl,pbuf2 PBUFJ <--PBUF2x pone atributo normal en x,24pbuiT5pniv}pnum pone PNUM en PBUF(PNTV)
espera que se elija una opcióncar escribe CAR (DOS)pnlin,pcolor muestra menú string apuntado por AXpvarx,pvary,dir conviene pos. de pantalla en dirección
restaura ultima pantalla salvadapasa control al usuario y lo recibepush a todo
muestra fase del programamuestra datos importante del usuario
;traereg pop a todo;valida? ve si una opción es del menú del usuario
APÉNDICE H- ttOMACASUT
;subrut
|.[ _ 39 .j
subnitinas de todos los inacros
***************¡Busca el AL-esimo elemento de la tabla de direcciones¡que ira después de MTABLA para saltar a esa dirección.actuar macro
local mtablapush bxjnov bXjQiTset mtablacali mactpop bxjmp dword ptr diract
mtabla:endm.
.****** ***************¡Escribe NLIN lineas separadas por ceros desde DIR en COLOR.¡Ocupa columnas 1 a 78 y las filas del centro de la pantalla.ayuda macro dir,nlin,color
push axpush exmov cl,nlinmov ch, colormov ax, offset dircali maypop expop axendm
-****** TJTTFCT A ***************¡Busca PBUF en TABBUF y pone su ubicación en PNCLAVEbufóla macro pnclave,pbuf
push sipush ax
si, offset pbufmbcaljinbcbytepnclave,alaxsi
m ovcalimovmovpoppopendm.
.****** CURS ***************
¡pone el atributo de (x,24) en inverso.curs macro x
push. ax
APÉNDICE H-DJIMACJvSM H - 306
endm
.****** TNJRTTp]7 ***************
;Recibe desde el teclado el buffer DIR cuya longitud se indica en;el primer byte del buffer. En el segundo byte se obtendrá eljnumero de bytes recibidos. Solo se aceptan letras o números.;Para edición, solo Backspace. Pita si se ha llegado al limite.inbuff macro dir
push simov sijOfíset dircali mibpop siendm
-****** JWQM^C ***************;Llena la lista LTSMAC en base al índice de macros;en AREAMAC. Reemplaza los ceros por espacios (20H).indmac macro
cali mi.mendm
.****** TA/JPpMT' ***************
;Borra la pan tallaImppnt macro
push dipush expush axmov cx32000mov di, Omov ax,0720hrep stoswpop axpop expop diendm
***************;Mueve cursor abajo en la ventana de subopciones.menarr macro
cali mmabendm
***************^Similar a MENABA.menaba macro
cali mmaendm
APÉNDICE TT __
.****** ]v.rBNDER ***************¡Mueve cursor de opción actual a la derecha.mender rnacro
cali mmclendm
.****** A/IFNTZO ***************¡Similar a MENDER.menizq macro
cali mmiendm
A/rRNTJL INli A *************¡Muestra menú (PNCLAVE)menulinea macro pnclave
push exinov cl,pn clavecali mmlpop exendm
**************¡Muestra menu^CLAX^l) en forma de ventana.menuvent macro
cali mmvendm
MOSTRAR ***************¡Muestra pregunta apuntada por PDIR y espera respuesta. La pregunta;debe tener esta forma: Mensaje, O, # de respuestas, lista de¡respuestas. En AL saíe el numero de la respuesta elegida,mostrar macro pdir,plin,pcol
push axmov ah3plinmov al,pcolmov moslin,ahmov moscoljalmov ax, oífset pdircaj] mmospop axmov aLmnmosendm
***************¡Mueve PBUF1 a PBUF2.movbuf macro pbuf2,pbufl,
push si
APÉNDICE li-iiiiinHwjuii>i TT -íf\Q
push dimov si,offset pbuflm ov di, offset pbuf2cali mmbpop dipop siendm
XfOCURS ***************;pone el atributo de (x,24) en normal,nocurs macro x
pushmovmovcali
POP
endm
axaljXab,bnnormmcuax
5
¡Pone PNUM en el buffer PBUF en el nivel PNTV.nunivel macro pbuf,pniv}pnum
push expush dxmov cljpnivmov chjpnijmmov dx} ofí'set pb ufcali mnnpop dxpop exendm
OPCIÓN? ***************¡Espera que se digite una opción. Saca en MOPACT el numero de;opcion. Las opciones son: Kechas,ENTER,/vOJ/>'K,ALiAP y oíros.¡Ademas es aquí donde se almacenan los datos al grabar macros;y se leen de] macro en vez del teclado al correr o probarlos.opción? macro
cali mopendm
;Usa función del DOS para escribir CAR en pantalla.pchar macro car
push dxmov dl,cítrcali mpchpop dx
APÉNDICE H-HÍEVIAC-ASM H - 309
en clin
.****** pJyT£]vJTJ ***************
¡Muestra menú apuntado por AX. Al salir MPMPRX¡da la dirección del primer byte luego del 0.pmenu macro pnlin,pcolor
push expush dxmov cljpnlinmov clh}pcolorcal] mpmpop dxpop exendm
.***#** pOSDJR ***************
;Da la dirección PDIR correspondiente a (PVARX,PVARY)¡para acceso directo a la memoria de video.posdir macro pvarx,pvary,pdir
push axpush bxpush exmov cl,pvarymov bl,pvarxcall mpdmov bx,mpddirmov pdir,bxpop expop bxpop axendm
**********;Trae de PANBUF la ventana que flie salvada en GUARPANTAJXA.restpan talla macro
cal] mrpcali funcionesendm
RUTINA ***************
;Pone la dirección de la rutina(NCLAVE) cíe usuario en DIRS AL y la de¡regreso en MRAUX2 y A/DR.AUX3. Pasa control al usuario, que debe regresar¡poniendo RETORNO al fin cíe su rulina para regresar a MRUT1.niíina macro
mov conclavemov al3nin.fbufmu] el
APÉNDICE M-HíJilACASM H - 3] O
addaddmovmovmovmovmovmovmovmovmovmovmov
jmpmrutl; mov
cmpjemovmovmov
mrut2:endm
ax'j offset tabinfax'j4si,axbx,[si]al,[si4-2]tiprut,alrnrauxl,albp, offset dirsalds:[bp],bxds:[bp+2],csbx, offset mrutlmraux23csmraux3,bxdword p1r dirsalal/fipruta^mrauxJmrut2contraer, Offhx,ly,o
¡busco dir. de rutina(nclave)
;y lipo denitina.¡Preparo el salto.
¡guardo lipo de rutina.
¡Preparo dir. de regreso.
¡Control al usuario.¡Regreso a FLUJO.
¡Ha cambiado TIPRUT?
¡si, cod. de error de rnacros,¡ademas X,Y previos pueden¡estar errados.
.****** g/v.UVARJEG **************¡Pusb a todo,salvareg macro
push eaxpush ebxpnsb ecxpush edxpush esppush ebppush esipush edipush dspush espush ssendm
******* STATUSF ***************
¡Presenta 6 bytes apuntados por FASEPTR en (73,23)¡Se usa para indicar Ja fase actual del programa,statusf macro
cali msfendm
.****** ***************
APÉNDICE H-DOMAC-ASM H - 3] 1
¡Presenta 6 bytes apuntados por VAIPTR en (73,24);Se usa para mostrar importantes datos del usuario.statusv macro
cali msvendm
***************.******;Pop a todo.traereg macro
pop sspop espop dspop edipop esípop ebppop esppop edxpop ecxpop ebxpop eaxendm
.****** \?AJ TDA? ***************
;Si en OPCIÓN? se dígito una opción distinta de las que maneja¡normalmente, ACTUAR manda el ílujo acá para ver si es una opción¡puesta por el usuario en el memi. Si es asi, AL-^numero de opción.;Si el primer byte después de la ultima opción del menú es FF se;supone que la ultima es la "opción de escape" para todas las¡posibilidades que no consten en el menú.valida? macro
cali mv?mov al,tnv?auxendm
.****** SUBRUT
;Este es un macro que contiene todas las subrutinas llamadas por los¡otros macros de este archivo. Se hizo de esta manera para evitar el;uso de demasiadas banderas, y que su ausencia no produzca "Phase¡errors" al momento del ensamblado.subrut macro
inact:salvaregdec almov cl,2muí eladd ax.bx
¡pongo el AL-esimo elemento de la¡tabla en DIRACTy CS en DIRACT+2¡para hacer el JMP al regresar.
AEEKDICE H-ESTMAOASM H-312
movpushmovmovpopmovmovtraeregretn
bp, offset diractsisi,axbXjCS^si]sids;[bp]jbxds:[bp-f-2]5cs
may:
mayl
rnay2:
dxbxbx,axdl,23di, el
; centro el texto en pantalla:;linea inicial" (23-#lineas)/2 -1
di
pushpushmovmovsubshrdecmovdec maylinmov maycoljchmov ax, offset blancopmenu maylinjmaycol ;primero una linea en blanco.inc maylinmov mpmprx5bx:mov ax,mpmprx ;Ahora el resto de lineas. MPlVlPRX
pmenu may^Xmaycol ;da la dirección del primer byteinc maylin ;despues del 0.dec eljnz may2mov ax, offset blancopmenu maylin,maycol ;Linea en blanco al final.pop bxpop dxretn
mbc;salvaregmov al,nmaxbuf ;Busca un buffer en la tabla TABBUFcmp al, O ;y entrega el numero clavejne mbcO ;que servirá para obtener toda lajmp mbc4 ;informacion necesaria acerca de la
mbcO: mov mbcmenu,0 ;opcion representada por el buffer.mov mbcbuf}si ;Si el buffer no existe, c!ave~KF.mov tnbcpos, offset tabbuf
rnbcl: mov mbcbyteiOmov bx,mbcbuf
APÉNDICE H-IHIMACJiSM
mbc3:
mbc2:
mbc4:mbc5:
movincmovxormovincmovcmpjnzcmpjnzmovjmpíncmovcmpjeaddjmpmovmov
traeregretn
ah,[bxlbxbp,mbcpos
chjChcl,mbcbytembcbytedi,cxah,ds:[bp+di]mbc2mbcbyte, 8mbc3al, mbcmenumbc5mbcmenuah,nmaxbufah, mbcmenumbc4mbcpoSjSmbclaljOfthmbcbyle,aí
iticu:salvareg ;Pone el atributo dado por AH enposciir 0,245mcudir ;la posición (AL,24)mov sí,mcudírmov bh.ahmov el, 2muí eladd si,axinc simov es:[si],bhtraeregretn
mex:satvareg ;Busca en TABINF la dirección de lamov a!3niníbuf ¡explicación y la pone en linea 23.muí cíadd ax5oífset tabinfmov bx,axmov íix,[bx"Jpmenu 24jColexptraeregretn
APÉNDICE H - 314
mgk:
repetir:;Uso función del BTOS que espera
mov ah,0bhint 21hcmp al, Oje verraton
siguiente:mov ah,Qint 16hjmp short íinmgk
verraton:cali pantallacmp bXjGffhje repetir
finmgk:cmp ax}3bOOhjne nofl.mov ventjl
nofl:mov getword,axtraeregreí
;que se pulse una. tecla.
rngn:
ragn]
salvarespushpushpopmovinccmpjemovaddmovmovmuíaddincraovrepejneaddmovjmpmov
s ^Busca si el nombre en NOMBUF estaes ;en la lista de raacros y da su numerocls ;+80h en NUMMAC si asi ocurre. Si eses ;nuevo, da el # del primero libre.dh,0ffh ;Si ya no hay espacio, da FF.
dhdh,8mgn2si, offset nombufsi,2 ;bytes O y 1 son de uso de otro macro.di, offset areainacal}8dhdi,axdi ;byte O es la longitud del macro.cx,7cmpsb ;comparo.
;si no es igual, comparo otro.;macro viejo.
;Busco primero libre.mgn4dh50ifh
APETCDICE H-315
mgn21: inccmp
Je
dhdh,8mgn3
mov di,offset areamacmov al, 8
dhcli,axal50ex, 8scasbmgn21
mov rmmmac5dh ;macro nuevo,jmp mgn4
mgn3: mov nummac}0ffh ;macro nuevo sin sitio.mgn4: pop es
traeregretn
max:
muíaddmovmovrepe
mgxJ
salvaregmovshrxormovaddmovmovshrshrshrshrcmp
jzmovmovtraeregretn
el, nivelcl,lch}chsi, offset:si, exal, [si]ah,ajah,lah,lah,lah,lah,0mgxlal,ahxprev}al
;se divide NIVEL/2, se suma a dirección¡inicia] de BUFFER, y se obtiene el msn¡distinto de O en ese byte.;Ese es el ultimo nibbleOQ en BUFFER
mgp:salva reg ;paso pantalla a PANBUF.xor si, simov dí} offset panbufmov bx,dsmov es,bxmov ds,videosegmov cx,3680rep movsbtraereg
APÉNDICE H - INIMACJVSM H-316
mío:
retn
salvnreg ¡Resalta la opción actual, dada por X.mov es}vjdeosegmov dl,co1lactmov al,x
inio!3: posdir l,l,iniodírmov syniodirmov di, sipush espop dsmov c],al
mio.1.31: loclswcmp al,2Ghje mió] 31sub si, 2dec eljz mió 16
mió! 4: loclswcmp al,20hjne mió] 4
miol5: lodswcmp al,20hje miolSdec sídec sidec eljnz mió 14
mió] 6: mov di,silodsvvmov ah,dlcmp al,20hje mió 17cmp al, Oje mió] 7stoswjmp mio!6
mio.l 7: traeregretn
;collact=video inverso
¡trabajo directo en pantalla.;busco la X-esima palabra en la
;linea 23 y cambio su atributo.
;salto espacios iniciales.
;salto palabras.
;resalto palabra.
mib:salvareg ¡obtengo string desde teclado.mov cl,[si] ;maximo # de caracteresmov cb,0 ; contadormov dXjSi ;puntero auxiliaradd si,2 ;b>tes O y 1 de uso del macro
APÉNDICE H-317
jnejmp
; cmpjne
mibl:
mib2:
mib21
mib22: cmpjbcmpjnbcmpjbcmpjbcmpjbcmp
posdir l,24,mibdirmov bx,mibdirmov mibx,chinc mibxcure mibxgelkeycmp al,08h
mib2.1mib4a^Odhmib22mibSal,3Ghmib2al,7bhmib2a1,3ahrnibSa1,4lhmib2al,5bhmibSa1,6lhmib2al,20h
;direccion de primer carácter
submibS: nocurs mibx
cmp ch3cljne mibSlpchar 07hjmp mibl
mibSl: mov [si],alinc simov es:[bx],aladd bx,2inc chjmp mibl
mib4: nocurs mibxcmp ch,0jne mib41pchar 07h
;Backspace?
;Enter?
;es un numero?
;"9"<aK'fA"?
;es una mayúscula?
;es minúscula, hacer mayúscula
;contador=maxtmo?
;si, beep.
;AL al buffer;apunto prox. dirección
;AL a pantalla¡apunto prox. dirección
;contador-Kl.
;buffervacio?
;si, beep.
mib41 decmovsubmovdec
miblsi ;borro ultimo carácterbyte ptr[si],0 ;en el bufferbXj2 ;y en pantallabyfeptres;[>;]32Qhch ;contador-lmibl
APÉNDICE H - 318
mib5: nocurs mibxmov si}dxinc simov [sijjChtraeregretn
mim:salvaregpush espush clspop esmov si, offsetmov dijOffsetmov di, 8
miml: inc simov al,20hstosbmov el, 7
mim2; lodsbcmp al,0jne mim 3mov al,2eh
mim3: stosbdec eljnz mim2dec dijnz mimlpop estraeregretn
mmab;
;fin de rutina; byíe 1¡indica # de bytes recibidos.
;pone la lista de macros actual;en LJSMAC. Reemplaza los 00 con;2E (puntos).
areamaclismac
salvaregmov conclave!. ¡Busca el # de subopciones que tienemov al,ninfbuf ;el menú de la opción actual dada pormuí el ;NCLAVE1. Si Y supera ese #, Y-0.add axsoffset tabinfinc axinc axpush bxmov bx,axmov si,[bx]pop bx
mmabl: lodsbcmp al;0jne mmabl
APÉNDICE H- IKIMACJiSM H-319
lodsbincinccmpjne.mov
mmab2; traeregreín
mina:salvaregmov cmovmuíaddincincpushmov
alyal,ymmab2y50
al,ninfbufelaXjOffset tabinfaxaxbxbx,ax
;Busca # de subopc. de menu(NCLAVEl);Si Y=FF, Y igual a ese #.
mov si,[bx]pop bx
tnmal: íodsbcmp al, Ojne mmallodsbdec ycmp y,>0fírijne mma2mov y, al
mtna2: traeregretn
mmd:salvaregmov conclave ;Busca # de opciones de menú actual,mov a^ninfbuf ;Si X supera ese valor, X~l.muí el ;Siempre Y=0.add aXjOffset tabinfinc axinc axpush bxmov bx,axmov si,[bx]pop bx
mmdl: íodsbcmp al, Ojne mmdllodsbinc al
APÉNDICE H - UíEMAC-ASM a-320
me xcmp aljXjne mmd2mov x,l
mmd2; mov y,0traere
;a la derecha.
mrm;retn
salvaregmov conclavemovmu]addincíncpushmovmovpop
elax^offset tabinfaxaxbx
;^u.sca # de opciones de menú, actual.;Si XK>> X igual a ese #. Siempre Y=0.
si,[bx]bx
mmil; lodsbcmp al,0jne mmillodsbdec x
x>0_mrnÍ2
mov x,almmi2; mov y,0
traeregretii
mml:
meincmovmov
pushpushmov
otraletra:lodsbcmpjnelodsb
salvaregmov al,ninfbu.f ¡Muestra e! menu(CL) y resalta lamxil el ;opcion actual.add, ax,oííset tabinf
axaxbx.ax
saxsi>ax
otraletra
APÉNDICE H-INWAGASM H-321
movpoppoppmenu. ^ilumina op
traeregretn
numeroop^laxsi
mmv:salvaresmov c],nclave1mov al,ninfbuf
elax,offset tabinf
muíaddaddmovcmp
;Muestra ventana se subopc.¡primero veo si la opción;tiene algún submenn,
;Si es asi, la rutina;debeserdetipo3.
bx,axbyteptr[bx]>3
J2, mmv3jmp mmv?
mmv3; mov conclavemov al,ninfbvrf
elax,offset tabinfaxaxbx
muíaddincincpushmov bx>amov si}[bpop bxmov cl}0mov <n,x
mmv30: lodsb
;Ahora busco la dirección;del menú al que pertenece
;esta opción en
elal,20hmmv3Qx,lmrnvSlel
nccmpjecmpjnzdecmovjmp
mmv3 1 ; decmmv32; lodsb
inc elcmp aljne mmv32
rnmv33; lodsbinc el
;Sr apunta al inicio del menú,;Yoy a contar los bytes hasta;la opción actual (x) para saber;columna inicial de ventana,;SaIto espacios iniciales
;pero los cuento.
;si x^l ya tengo la columna.
mmv4di ;DL- cuantas opc mas debo saltar.
;Cuento bytes hasta encontrar;un espacio (CL contador).
;sumo espacios entre opciones
APÉNDICE H - IN1MACA.SM ti-322
cmp al»20hje mmv33dec dijnz mmv32dec elmov
mmv4; movmov conclave!mov alsninfbufmu.1 eladd ax^ofTset tabinfinc axinc axpush bxmov bx,axmov sí}[bx]pop bxpusb si
mmv40: lodsbcmp al,20hje mmv4Qdec simov cx,1
mmv4'|; lodsbcmp al,20hjz mmv42cmp a!,0jne mmv410mov mmvlin,c]jmp mmv5
mmv410: inc chcmp cb^mmvcarjb mmv41mov mmvcar,,chjmp mmv41
mmv42; lodsbcmp al,20hje mmv42cmp a 1,0jne mmv43mov mmvlin,cljmp mmv5
mmy43: inc elmov ch,0dec sijmp mmv41
mmv5: pop sí
;nna opc menos que saltar
¡Termino. Ventana empieza en;cohimna anterior.
;Ahora busco dirección de menú;asociado a la opción actual
;enTABÍNF
;SI apunta a primer byte;de ese menú
;no tomo en cuenta los;espacios iniciales.
;Veo cuantas filas y columnas;ocupa Ja ventana;Los espacios no cuentan
;tennina si AL^O
;# de subopciones d.el menú.
;CH; # de car de subopcion;MMYCAK; máximo CH logrado
;saltar espacios
¡termina si A.C=Q
;# de subopciones del menú
;otra subopcion;# de car= O
APÉNDICE H.-INEMA.C.ASM H - 323
;Busco la linea inicial;de la ventana incluidas;dos lineas de recuadro.
;servirá después
mov al,mmylininc alinc al
mov a\add. ab,al
mov miTivlin^ahmov mmvlinl,ahinc mmvcarposdir mmvxlsmmv]m,mmvdir ;dir. de esquina superiormov di,mmvdir ;ízqxjierda en pantallamov es/videoseg
mov al,esqiimov ah,co!venstoswmov aljinsupmov c^mmvcarxor ch^chrep stosw
mov al>esqidstosw
mmy50; ÜEC mmvlinmov blsmmvlin
cmp bl,2je mmv6posdir mm\'xlímmvlin)mmvctir ;escribirlas subopcionesmov di,mmvdir
;pero antes el recuadro.;long cíe la linea
;dibujar esa esquina;en coior d.e ventana
a linea superior
;dibuja esq. sup, der.
;proxima linea
;linea inferior si BL=22
mov al,Hn1atmov bljmmvcarstosw
mmySOl; lodsbcmp al^Ohje mmv501dec si
mmv51; lodsbstoswdec blcmp al ,2 Ohje mmv$2cmp al, Ojne rnmv51dec didec dimov al,2 Ohstosw
mmv52; cmp bl>Qje mmv53mov
;no tomo en cuenta los;espacios iniciales
;leo b3"te del menú;lo escribo en pantalla
;He terminado la opción?
;He terminado el mentí?
;en ,gse caso borro el OOH;que escribí
; y pongo un " "
;lleno el resto de la linea;COTI espacios
APÉNDICE H - INIMACASM I I - 324
rnmv521: stoswdec bljr\z mmv521
mmv53; mov al,linlatstosw
mmv54; lodsbcmp al,2Qhjz mmv54dec sijmp mmv50
mrov6: posdir mmvxl,mov di,mmvdir
mov a!,esqsimov ah,co1venStoswmov
;y termino con recuadro,
¡sallo espacios
¡dibuja linea inferior
movxorrep
movstoswcmp
alj insupc!smmvcarchjchStpswa^esqsd
bl,mmvlmlbl,aimmvlin,bLmmvxl,!d^mmvdir
bl,mmvcar
;fín de dibujo de ventana,¡existe subopcion seleccionada?
;no» termina trabajo,¡si, resaltarla cambiando
¡el atributo de la linea.
y,ojz mmv?
mov al,vmmv63: mov
submovposdir
movmovaddmovmov
mmv64: stosbinc didec bljnz mmv64
mmv?; traeregretn
mmos:salvaregpmenu mosÜn^noscol ¡Presenta pregunta y espera respuesta.mov sí,ax
mmosO: lodsbcmp a 1,0jne mmosQmov
APKNDICK H-IMMAOASM H - 325
¡comparo y si no es ninguna de las¡posibles, vuelve a pedir respuesta.
mmosl: lodsb ¡Obtengo el # de opciones.mov cl,almov dljíilgetkey ¡obtengo respuesta.cmp als'a' ¡minúsculas --> mayúsculas,je mmosl 1cmp aVz'-Hjnc mmosl 1sub al>2Qh
mmosl 1; mov bx,axmmos2; mov al,[si]
inc si
sub cIJje mmos4cmp aljOje rnmosS
mmosS; cmp al>bljne mmos2jmp mmos5
mmos4; mov si}mdiropjmp mmos!
mmosS; sub dl»clmov mnmos,djtraeregrem
mmb;saivaregpush dspop esmov cxj8rep movsbtraeregretn
de respuesta en M,Mv10S.
¡mueve 3 bytes.
mnn:
mnn4; movmnnl; shr
saivaregtest cl.ljz mnnlmov ai, 16muí chcmp al,0jnz mnn4mov ch,Qfhmov alsOñ"hjmp mnnl
ch>al
¡pongo CHen el Ct-esimo nibbie¡del bu ffer apuntado por "DX,
cU
i U - IMMACASM H -326
mov Dl jCixor bh,bhadd bx,dxcmp ch,0jz mnn5cmp aÍ3Offhjnz mnn2
mnn5; and [bx],chjmp mnn3
mnn2; or [bx],chrnnn3: traereg
retn
mop:salvaregmov cl,nclavelmov al,ninfbufmuí el
¡maneja opciones.¡Primero veo de que tipo es la¡opción actual. (Esto es usado
¡al salir de este macro).add ax,oíTset tabínfadd ax}6mov sí,axmov a1,[si]mov íipnitl ,alcmp bmacjje mopljmp mop2
mopl : mov al,longmacinc alcmp aljContmacjne moplOmov bmac,0mov Iaseptr}orTsetstatus fjmp mop2
¡Corriendo/probando macro?
¡si.
¡termino?
¡si,fnorm ¡fase normal
moplO: mov sijOffsetbufñnac ¡estoy en macro,pusVi axmov al,contmacxor ah.,ahadd. ax,axadd si,axpop axmov bx,[si]inc contmaccmp Qontmcr,0í:í:hje mop 12cmp bver,0je mopl 3
¡leodatode'BUFFJVlAC
¡fín de ejecución por¡flujo ambiguo?
¡probando macro?
AJ'KNniCE II - IWMACASM 13-327
mopll; getkeycmp al,crje moplocmp al, ctrl kjne mopll
mop!2; mov bmac,Qmov bver>Qmov bx,0ff00hmovstatusf
;sis espero ya sea;ENTER para seguir
;oAK para terminar.
;termino prueba,
;no ejecuto ultima opciónfaseptr,offset fhorm ;fase normal.
jmp mopjmop2; getkey
cmp bgmac»0jnejmp
mop21; movcmpjecmpjemovxoraddadd
mop21mop3
contmcr,0fí"hmop22
;tomo el valor del bufTer;en vez del teclado.
;no es macro,dato d.e teclado,;grabando macro?
;si, fin macro por razones de;rutina de macros d.e usuario?
;si\termíno de grabar?mop22bljContmac ;grabo dato en BUFFMAC
bx,bxbx^offset buffmacds:[bx],axcontmaccontmac,maxmacmop23mop3
;y cuento # de datos. No eje-;cuto la primera en exceso.
movinccmpjeJmP
mop23; mov bx,axdec contmac ;exced.i el límite,mov ax,offset blancopmenu 24,colexpmov ax,offsel escmcrpmenu 23,collact
mop231: gelkeymov ax,get\vord
al,Tbh ;ESC?mon231
al,nummac ;paso datos íil área d.e macros.
cmpjne
mop22; movmov clsSmuí eladd ax,offset areamacpush espush dspop es
U - INIMAC-AS.M H - 328
¡long, del macro,
¡y nombre
¡ahora paso BUFFMAC;nl ajea que empieza
mov di>axmov ai,contmacmov [ci']>alinc d.imov sijOffset nombmacmov c,x,7rep movsbmov al,mimmacmov c]>2*maxmí¡cmuí el ;con MAC]. Cada macroadd ax.offeet rrmcl ¡ocupa 2*MAXMAC bytes' * -i -f
mov d,Í,ax ;o MAXMAC wordsmov sisorTset butTmacmov cx,maxmacrep movswpop esmov bgmaCjO ¡termina grabaciónmov faseptr,offset fhorm ¡fase normal.statusf
¡ejecuto la ultima opción¡es un car.especial?
mov ax,bxmop3; Qinp aljO
je mop32mop31; cmp al,cr
jne mop311mov als5jmp mop4
mop311: Qmp aljQÍrlojne mop312rnov a 157
jmp mop4mop312; cmp al^ctrlp
jne mop3l3mov alsSjmp mop4
mop313; cmp al,ctrlivjne mop31.4mov a 1,9jmp mop4
mop314; cmp a!,lbhjne mop315mov al, 10jmp mop4
mop315; mov mopaux,almov a1j6jmp mop4
mop32: cmp ah,fleizqjne mop321
;no, es Enter?
;es A0?
;es AP?
¡es AFC?
;es ESC?
;es otro?
;es <--
APÉNDICE II - 1NIMACASM H - 329
mov aljjmp mop4
mop321; cmp ah,flederjne mop322mov a 1,2jmp mop4
mop322; cmp ah,,flearrjne mop323mov al,3jmp mop4
mop323; cmp ahsfleabajne mop324mov al,4jmp mop4
mop324; mov mopaux.l,ahmov rnopauXjOmov al,6
mop4; movcmpjne mop5restpantalla
mpp5; traeregretn
;es ~>
;es flecha arriba?
;es flecha abajo?
;es otro.
;tengo ventana de opciones?
pantalla.
mpch:
mpm:
salvaregmov ah52int 21 htraeregretn
salvaregpu.sh dx
;Uso rutina del DOS para escribir DC.
mov
movmuímovmovpopmovpushmovmovreppop
51, a xaljonglin
eles,v¡deosegdi,axdx.ah,dhcíial,20hcx^SOStQS\
di
;pone'un stringterminad.o en O;e:n linea, Q,L con atributo OH,;EL string es apuntado por AX.
;borro la línea.
APKNI11CE H-INIMACASM i_, _ -,-ír,
inc di¡nc di
inpmO; lodsb ;pongo el string,cmp al,0je mpmlStpswjmp mprnO
mpm i : mov mpmprx,si ;MPIvíPRX apunta a próximo string.traeregretn
mpd:salvaregmov al,16Q ¡Dirección = C1>*160 -f- BL.muí elxor bh,bhadd axjbxadd ax.bxmov mpddir^xtraeregreln
mrp:salvareg ;Paso PANBUFa pantalla.xor dijdimov es,videosegmov síjoffsel panbuf
rep movsbtraeregretn
msf;salvaregmov si/aseptr ;FASEPTR tiene la dirección de unposdir VS^^msfdir ;stn"rig de 6 byíes que debe sermov di,msfd,ir ¡mostrado en la posición (73,24).mov cx>6mov ahjcollact
msfl; lodsbstos\d.ec exjnz msfltraeregretn
msv:salvareg
mov si,valptr ; VALPTR tiene ia dirección de un string
APÉNDICE H-BTIMACASM e-331
posd.ir 67,24,msfdír ;d.e 6 byíes en eS qu.e el usuario puedemov di,msfdir ;poner algo para aparecer en (67,24).mov cx_,6mov a
msvl; lodsbstoswdec ex.jnz msvltraeregretn
mv?;salvaregrnov conclavemov a^ninfbu.fmuí elad.d ax,offset tabinfinc ax
;Bu,sca si la elección esta;en el menú del usuario.
mepushmovmovpop
mv?1: lodsbcmpjnelodsbmovmovpushpushmov
xoraddcmpjnemov
m,V?ll; pgp
popmovcmpjbcmpjasub
mv?2; movmv?21; lodsb
axbxbx,ax3<>[bx]bx
aI,Qmv?1
cl^a Idl,alsi&K
Tnv?aux1 jOah.,alisi,axbyíe ptr[si]my?llmv?auxl,alaxsía^mopauxal'a'mv?2alj'z1
mv?2aJ»20hbl,al
;ST apunta al menú
;&r apunta a primera opción;AL tiene el # de opciones
;si el primer byte después;de las opciones validas
;es 'FF, entonces evacuar;las teclas no validas
fh ;por la ultima opción,
;d.ejoMV?AXJXl, como bandera
;A las minu.sculas
;la,s hago mayúsculas.
APÉNDICE H-INIMACASM H-332
cmp al,blje mv?3dec eljnz mv?21cmp mv?aux1 ,0je my?22mov al,mv?aux.lmov mv?aux,alxor ah,ahjmp mv?4
my?22; or al,ljmp my?4
mv?3: d.ec elsub dljdmov mv?aux,d:lxor ah^ab
mv?4: traeregretn
;veo si opción es valida
;no fije valida, veo si hayiruíina de escane> l ....... • -,r ^
;si ha}r esa nitina;salgo con respuesta
;yZF=l
;no esa
;opcion valida,;guardo respuesta
;y salgo con ZF=1
endm
AJMitXDICE ll-MPRO-AS.M H - 333
JVIACRO MPROASM
iMacro Parámetros Función
;fí Jimac.rosalta a la, Ar.-esjrna dir, de urja tabla
SÍÍÍ?. Trjflorri v dñ \\n
;getdata x^;getdata2 x^;getline buíT;limpln nu;lmppnt;print x,y,d.ir(atrib;rest23;salva23;usrpro;sbrpro
lee un bin, hex o declee un dato en hex (para mamona relativa)
lee un síring del tecladoborra una linea
borra pantallapone un texto en pantalla
restaura linea 23salva linea 23intercambia pantallas de usuario y PROsu.brutinas de los otros maceo
•};Macro-instuicciones para macro-comandos
;Macro Parámetros Función
;cerrmcr;creamcr d.irnom;grabmcr¡getkey;ínimcr dirnom¡Impmcr;rtodo;stodo;sbrmcr
cierra archivo de macroscrea archivo de macrosgraba y cierra archivo de macroslee teclad.o o buífer de macrosabre y lee (o crea) archivo de macrospone O en las áreas de macros
pop todopu.sh todosvjbnitinas de los otros macros
***************;Lee el A.C-esimo elemento de la tabla TABACT y salta a la dirección;dada por ese elemento, AL=Q para el primer elemento de la tabla.actuar macro
local tabactpush símov ah}0
APÉNDICE IJ-MPRO-ASM
add ax,axmov síjoffset tabacta cid si4axmov ax3cs:[si]pop sijmp ax
tabact;end.m
**************
;Da u.n mensaje de fin de macro y espera un ESC para seguirfínmacro macro
cali rfípmendm
QRTQU'AR ***************
;Ue en GCASCtt un ASCH del teclado o buffer de magros. En GCCOD;sale el siguiente código: O, hay dato valido en GCASCTI. 1 , ENTER. 2}
;TAB. 3, SHIFT TAB. 4, ESC, 5, alguna fiíncion o tecla especial, cuyo;ASCn extendido sale en GCASCTT. Para que ENTER, TAB, SHTFT TAB y;ESC sean aceptados como datos normales, se debe presionar antes Fl 0.getchar macro
calí rgchend.m
.#***** rj'píTDATA ***************
¡Lee d.atos del teclado o buffer de macros en BUFF. En BUFF se tiene;;# de byíes pedidos» # de datos leídos, datos, # convertido en hex;(4 bytes). Hace eco en pantalla en (X,Y). Qe acuerdo al TIPO;recibe datos en bin ('b'), hex ('h% clec ('d')> La longitud de;BUFF debe ser adecuada; bin, cualquiera; he.x, 2 O 4 bytes; dec, 3;o 5 bytes. Si se presiona DEL o BS se borra el ultimo dato ingresado.;ENTER es esperado para confirmar un dato y convertirlo en hex. En;GCCOD sale un código si ocurre lo sigujente; O, hay un dato correcto al;fínal de BUFF. 1, flecha arriba. 2, flecha abajo. 3, -flecha derecha»;4, flecha izquierda, 5, TAB. 6, SHTFT TAB. 7, ESC. 8, PGUP. 9 PGDN.;Cualquier otro dato es procesado para ver sí es valido incluirlo en el;bu.ffer. Se produce un BEEP si un dato es invalido O ai llegar a los;1 imites. Si al ingreso a la subniífna GDT^ESET es l,bnfrer y variables;son iniciaHzad.as. Si es O, no lo son, y se puede segiiir recibiendo;el mismo dato. Los números binarios no son convertidos en hex,getdata macro x^buff^'po
push bxpush expush dxmov bXjOffsetbuíTmov cl,x
AP&VIJICE n-Mi'RO-ASM H - 335
mov ch,ymov
pop d.xpop expop bxendm
OETDATA2 ***************
;Lee datos del teclado. 'En BUFF se tiene;;# de bytes pedjdos, # d.e datos leídos, datos, # convertido en hex;(4 bytes). Hace eco en pantalla en (X,Y). pe acuerdo al TÍPQ;recibe d.atos en bin ('b')3 hex ('h'), dec ('d'), La. longitud de;BUFF debe ser adecuada; bin, cualquiera; hex, 2 0 4 bytes; dec> 3;o 5 bytes. Si se presiona T^ET,, o BS se borra el ultimo dato ingresado.;ENTER, es esperado para confirmar \ dato y convertirlo en hex. En;GCCOD sale un código si ocurre lo siguiente; O, hay un dato correcto a!;final de BUFF. 1, flecha arriba. 2, flecha abajo, 3, flecha derecha,;4, flecha izquierda. 5, TAB. 6, SHTFT TAB. 7, ESC. %, PGUP. 9 PGDN.;Cualquier otro dato es procesado para ver si es valido incluirlo en el;bu.ffer. Se produce un BEEP si un dato es invalido o al llegar a losDimites. Si al ingreso a la subrutina GD"RBSET es I jbuffer y variables;son inicializad.as. Si es O, no lo son, y se puede seguir recibiendo;el mismo dato. Los números binarios no son convertidos en hex.getd.ata2 macro x^buf^tipo
push bxpush expush dxmov bx^ffset bufPmov cl,xmov ch,ymov disipojmp rgdj ;sucede algo extranio s¡ se lo hace con cali
virus; pop dx. ;en el retomo no regresa acá (se cuelga)pop expop bxen din
.#*#*** GFTf INF ***************
;Lee del teclado un buffer BUFF (ASCII)» que tiene este formato; Numero;de bytes pedidos, nurnero de bytes realmente ingresados, texto. Pí)ra;edic¡on se acepta Backspace o Qelete. HNTER para terminar el texto.;Bn GCCOD sale un código; 1, se dígito ENTER. (buffer valido). 2, TAB.;3, SHIFT TAB. 4, ESC y 5, especial, l^ste macro usa GBTCHAR para;recibir datos. Bn X, Y recibe !a posición en que debe hacer eco.getline macro x
push sípush ex
APENMICF, H-MPRO.ASM ir
mov cl,xmov ch,ymov s^ofTset buffcal] rglpop expop siendm
.****** T ' r s " ***************
;Borra la linea KUMy pone en ella el atribtito A.TRÍBlimpln macro Tium,atrit>
push ax;iTiOV al,num
pop axendrn
. :{; 3fh :j: 3^ Jf: | Ayf PPf\•' I ' JjCJíí>i'VíTcTc;T:;t::T:3Tí:TíífC3IC3f:3Í:í> '
¡Borra la pantallaImppnl rnacro
push expiísh dirvticrv **"v¡y\JÍ>*I a<^
ITVOV PXT OAní^¿lis/ * ^í*^^** v v
mov dj,0mov ax,0720breppop axpop dipop exencím
y ***************.****** pD'fWT ***************
;Bscribe eí texto apuntado por E>TR en !a pantalla a partir de;(X»Y) con atributo ATRIB, E3 texto debe termiirar eorv un O,print macro x^dir^atrib
posdirpush sipush axmov si,offset dirmov fih^aíribcali rprtpop axpop sí
APEN1J1CE 11-MI'llO.ASM
.****** O AT "WA.T3 ***************^ kJ/r*-JW • / »•*-•»>
sa!va23 macro
ndm
.#***** 'DRQ.TOT. ***************
ndm
.****** jJS^^RO ***************
;íntereambia las pantallas de usuario y $el programausrpro macro
cal] ufsrpinmuesíra 1 jVisibíejr
endm
;lnicio de macros para macros de Usuario.****** P P D R 1 2 ***************
¡Cierra e! archivo cuyo bandle es MCRHAND.cernncr macro
cal! rcmerendm
.******: CR.EAMCR ***************
;Crea el archivo cuyo nombre esta dado por el ASCIIZ;que empieza en OIRNOM. Pone el handle en MCRHAND.creamcr macro dirnom
push dxmov dx^ffset dirnomcali remepop dx.encim
.****** "RAf ***************
;Graba en el archivo cuyo handle es MCRHVVND los 1 Q8ÍÍ bytes que;empíezan en A.RF.AMAC y contienen el índice y datos del macro manejados;por FLUJO; y ios 204§ bytes que empiezan en MQRDAT y que componen;el área de datos de los macros que el usuario ha dado en respuesta;a rutinas del programa usuario de FLUJO.;Codígos de error en AX; 05 todo bien; 1, no hay archivo abierto,grabmcr macro
cali rgmend.m
Al'ÜNIMCE 1-1 -MPRO.ASM {J _ 335
.****** GFTKFY ***************¡Es la fu.ncion de teclado elemental intervenida para poder;leer un dato de! teclado o del bufíer de macross y poder¡grabar un dato en ese buffersi es necesario. Su. salida;es GBTWQRD que tiene el código ASOT extendido de una tecla,;S¡ se estaba grabando macro y se termino el espacio para el;macro> se pone el byte de iníerface en FF y MCRERR. en 1.getkey macro
cali rgkendm
¡Recibe a partir de DTRNQM un ASCíIZ con el nombre del archivo¡de macros. Traía de abrir el archivo. Si existe, lo lee en¡AREAMAC (1088 bytes) y en MCR'DAT (siguientes 2048 byíes).¡Guarda el handle en MCRHA.ND.Codigos de error extendidos en AX.;Si detecla que un archivo no es demacres»sale AX=FF,¡Pone valor ARBAMAC-H088 en DÍRKMAC. En [OtRNMAC] esta el # del;macro actual y el siguiente byte es el de interface, que debe¡hacerse FF cuando deba terminarse la grabación de un macro.ínimcr macro dirnom
pu.sh dxmov dx^ffset dirnomcali rimpop dxendm
.****** 'L'jvfpjyiCR. ***************
¡limpia las áreas de macrosImpmcr macro
cali rlmc.rendm
***************rtodo macro
pop eaxpop ebxpop ecxpop edxpop esipop edipop esppop ebppop dspop esendm
AlMiNUICK 11 -MPRO.A.SM H - 339
***************
stodo macropush espush dspush ebppush esppush e dipush esipush edxpush ecxpush ebxpush eaxendm
***************
sbrpro macro
ÁREA PARA DATOS MACRO SBRPRO
.dala
gdíabj d.b '0123456789A13CDBFatedefGgnPpXxSs;-K' ;para memoria relativabadinst db 'instrucción incorrecta, iníenle otra vez',0dhexseg d.d, O ¡almaceno segmento para memoria relativadhexoffdd O ¿almaceno offset para memoria relativasignl db O ;ley signossign2 db O ;ley signosprevsi dvv O ¡puntero buffer dhexlvlrreaderr db O ;error al leer catos de dhexMrposini d.\ O ¿posición inicial de datos en clhexMrposfín dw O ;posicion final de dhexMr para fin de laxoposmedjum d.b O ;0 o 1 .alerta que se cambio d.e seg. a offsetsignopos db O ;signo para sumar a seg, v offsetsignobef db O ;s¡gno para sumar a seg. u. offset
;(+ = Q) (-=1.)xxxx dd. O ¡registro para almacenar datos o registros
gccod db O ;codigo de tecla especial pulsadagdresetdb 1 ;GGTQATA inicia! iza variables?gcascií db O ;resviltado de GBTCHARgdtab d.b '01234567S9ABCQEI7abcdefpant dw 2000 dup(0720h) ;b;iffers para guardar pantallas (USRPR.Q)pantr dw 2QQO dup(Q72Qn)
APÉNDICE H-MPRO-ASM jj _ 340
pant? db 1 ;PANT tiene pantalla sirglx. db O ;x,y para geílinergly db Ofínbufmcr db 'Fin del buffer \ fín del macro. Presiona ESC,',0buf23 d\ SO d\]p(Q) ;para guardar la línea 23soluc db 1500d,up(0)
ÁREA, PARA COPÍQO RACRO SBRPB.O
.code
rfínrn; stodosa!va23 ;salvo linea 23íirapln 23/eyersprint 1 Sjfínbufrner/eyers
rfírim 1 ; getkey ;recibo ESC para salirmoy ax,get\vordcmp al»lbhjne rfínmlrest23 ;restauro linea 23rtodoretn
rgch; ppu.sh dx
rgchl; mov dljgetkeycmpjne rgch 11fÍT!i~nacrojmp rgcbl
;Ieo datg de teclado o buffer;errpr en macro en (jETKEY?
;si.rgchl 1 ; mov aXjgeíword
cmp a',0 ;es tecla especial?je rgch3 ;si.
rgch2; cmp al,0dh ;ENTER?rgchfdi
einccmp a!59je rgchfínc di
dial,lbh
je rgchf
inc
;TAB?
;ESC?
H - 3 4 1
;F10?;sí.
;SKIFT TA.B?
mov d1,0 ;eswi ASCMvamov dh,a!jmp rgchf
rgch3: mov dlt5mov dh;ahcmp ah,6§je rgch31cmp ah,15jne rgchfmov dl,3jmp rgchf
rgchSlrmov dl,0getkey
ni crerTj irgch32
fínmacrojmp rgch31
rgch32: mov ax,getwordmov dh,a1cmp al.lbh ;!5SC?je rgchfcmp aUOdh ;ENTER?je rgchfcmp als9 ;TAB?'je rgchfjmp rgch!
rgchf: mov gccod^dlmov gcascíi,dhpop dx,pop axretn
rgdJ; stodocmp gdresetj ;im'cializo variables?jne rgd2J ;no.mov dh,[bx] ;# de datos pedidos,mov n!>0movmov si»2mov a I,'O'
rgdlj; TOOVinc sidec dhjn^ rgd.l,r
mov dhex$eg>Qmov d.hexoffiO
;inicia1ixo buffer
I1-MPHO.AS-MH - 342
püshamovmovmovmovmovmov
rgd20j: movincdecjnzpopa
bx,offset d.hex3dh>[bx]al.O[bx+l]>alsi,2als'Q'[si+bx],alsidhrgd20j
rgd2J; getkeymov gccod,0
rgd21,í; movcmpjne
rgd.3,1; movcmp
pushmovsubpushxormovmovpoppopjmp
rgdSgj; inccmpjnepushmovaddpushxormovmovpoppop
ax,get\vorda.1,0 ;tecla especial?rgd4Jgccod, 1ah>72 ;flccha arriba?rgd.3Sjsisí,offset auíoseg
eaxeax, eaxax,[si]xxxxseg,eax
eaxsí
;f]echa abajo?gccod.
rgd37jsi
[si],leaxeax,eaxax,[si]xxxxseg,eaxeax
rgdfj
rgd37j; inc gccod
AJ'líNDICE II -MPRO-ASM rl - ,.,H - J3 j
cmp ah>77 ;->?je rgd2,í ;no hacer nadainc gccgdcmp ah,75 ;<-?je rgd2J ;no hacer nadaadd gQcod,2cmp í!h,1£ ;SHTFTTAB?je rgdfTadd gccod»2cmp ah,73 ;PGUP?jne rgd35jpush si
mov sijof&et autooffsub [s'JjoShpush eaxxor eax,eaxmov ax,[si]mov xxxxof^eaxpop eaxpop siJmP
rgd35j: inc gccodcmp ah,$1jne rgd36jpush símov si,offsel auíooffadd [si],68hpush eaxxor eax,eaxmov ax,[si]mov xxxxofT,eaxpop eaxpop sijmp
rgd.36j: cmp ah,§3jne rgd2Jjmp rgddJ
rgd4,í; cmp al>8 ;BS?jne rgd.41 Ujmp rgddJ
rgd411 J; cmp al}0dh ;ENTER,?jne rgd412,íjmp rgdeJ
rgd412J; cmp als9 ;TAB?jne rgd.413J
Al'KNllICE H-AIPROjVSM H - 344
mov gccod>5jmp rgdffi
rgd4I3J; cmp a!,lbh ;BSC?jne rgd44,.ímov gccodjjmp rgd.fT
rgd44J; ;heximov dh(0 ;veo si dato es correcto.mov sJ,ofTset gdtabJ
rgd.441 J: cmp a!,[si] ;consta en la tabla?je rgd46Jinc siEne dhcmp dh,35 ;acabo la tabla?jne rgd44Ujmp rgd,b,T ;no fue valido.
rgd46J: mov ax,get\vordmov dh,a5cali rgd.OJ ;pH"=^, BX~>inicio buffercmp a!,1 ;exceso de datos?jne rgdSJ
rgdbJ; push dx ;BESPmov ah,2mov d!,7i ni 21 hpop dxjmp rgd2J
rgd5,í; cali rgd.Oljmp rgd2J
rgddj; cmp byteptr[bx+l]fO ;DELHTE. Buffer vacio?je rgdb,Tcal! rgd02cali rgdOl ;Presento dato en ventana (en asen, no transformación)jmp rgd2J ;A. esperar por otra tecla
rgde.í; push ex ;rutina que analiza los términos ingresadospush dx ;eri dhexMR (para acceso a memoria relativa)mov ch30movmov cl,[bx]sub cl^almov si,bxpush bx.add. hx,29movpop bxadd si\
APKNIJICE H-MI-IÍO.ASM H-345
ST
lodsbcmpjecmpjne
rgd70; jmprgd71: cmp
jecmpjíie
rgd72; jmprgd73; cmp
jecmpjne
rgd74; jmprgd75; cmp
al>'Xl
rgd70 jaXjbXjCXjdxal,'x'rgd71regpgx.al,1?'rgd72 ;bp,ip»spí»Vp'rgd73regpgpal»'í'rgd74 ;si,d¡al, 'i'rgd75regpgial/S'
cmp a!,'s'
mov S!,prevsilodsbdec sijmp number?
rgd76; jmp regsegnumber?; cmp als'-1 ;entonces se traía de un dato (hex)
cali rgd.0003 ;sumo registros o datos a dhexsegyerase; pusha ;dependiendo de posmeduim;borro buffer y salto
mov bx,offset d.hex3 ;a iniciomov dh,[bx]mov al}0mov H
;borro buffer d.hex3mov
rgdlQ3; movme sidec dh
JTiz rgd!03popajmp inicio
rgd.73; cmp al,1;'je dosp ;se trata entonces de";"
d.hex03; ;aqui almaceno ipaxíiiio 4 #5 en hex hasta hallarmov b^offset dhe,x3 ;un "+' o "-'*síno BBEP y buelve a co"d. in¡c.
rgd4603; mov dhjal
APÉNDICE H-MPRO.ASM •"• "
add si>cxmovmovcmp ctjl)jne iniciolmov readerr,!
fínO; pop dxpop exrtodojmp virus
iniciol: mov prevsi\sidec prevsi
imcio; mov si,prevsi ;injcío de laxoinc sicmp súposfmjne nextO
mov bjtjQffset dhex3cmp byte ptr [bx-H],0
cali rgdQOQ3 ;entonces bviffer contiene datospusha ;borro bxifjer y síílto a inigiomov bx^ffset dbex3 ;a: ingresar nuevos d.atosmovmovmov
mov al>0rgdl 05; mov [si+bx]tal iborro buffer dhexS
inc sidec dnjnz rgd105popa
rgdlOó: mov posuu\mov reacieTTjOm QV posm edñim^Omov signopos.Omov s¡gnobe£,Qjmp fínO
nextO; lodsbdec simov prevsissicmp al,';'jbe number? ;se permite máximo 4 dígitos en hex
H - 3-47
cali rgdQOS ¡almacena y rota n-! veces donde n^ datosemp n!»l ;pedídos (n=4)jne rgd503
finí; push d>- ;exceso de datosmov ah,2mov d¡>7inl - 21hpop dxprint O^^badinst.normalcali errorOmov dhexseg,Qmov dhexoffjOmov signobefjQmov sfgnopos,0jmp fínO ;fín de lazo
rgd503:jmp inicio ; a leer nuevo dato de d.hexMr
RGP003; push bx ;nitina que almacena y rota n-1 veces datopush ex ;d,e dhe^Mr si dato en hexmov fil^x]cmp al,[bx-H]mov a!,lje rgdOfí)3inc byíe ptr [bxH-1] ;incremento contadormov sijbxmov bx»!
rgdP103:mov al,[bx-f-si-í-2] ;roto n-1 vecesmov [bx+si+lkalinc b!cmp bl,[si]jb rgd.0103mov [bx+si+]]5dh ;ÍJicHiyo nuevo datomov a3,0
rgdOfDS: pop expop bxretn
DOSP; cmp súposiní ;síai inicio de buíTer";" ÍTicorrectoje fin]mov bx,offset dhex3cmp byte ptr [bx+1 ],0je dospl ¡entonces fue registrocal! rgd,0003 jentonces buffer contiene datospusha ;borro biiPíery salto a iniciomov bx,orTset d.hex3mov dli,[bx]mov al,0
APÉNDICE H-MPRO.ASM ,, _ , 0
mov [bx.+l],almov SÍ ,2mov als'0'
rgdl 04; mov [si+bx],al ¡borro buffer dhex3inc sidec dhjnz rgdl04popa
dospl; mov posmedíum,! ;passo a analizar el offset de mem. re!.mov dhexofZ,0mov signopos,Qmov signobef,Qjmp inicio ¡en buffer dhexMr
í; pusha ;s;imo registros o datos a dhexseg y dhexoffsignlow ;dependiendo de posmedium.Borro bu.ffer y salto a inicio
push bxmov bx,offset dhex3cmp byte ptr [bx+l],0pop bxjrie r¡ext9poparetn ¡entonces no hacer conversión
next.9; mov bx>offset dhex3 ;a iniciomov si,bxmov d1,[bx]mov dh,0add si>2add si^dx ;ST apunta a posición de datos a convertirse
rgd(5l03: mov aU[bx+2] ; en hexcali rg403Q3 ¡convierto MSBmov c1s4shl d.h,clmov [si-M]sdhmov al}[bx+3]cali rgd0303acidadd bx,2
rgd.6203; movcali rgd0303mov el ,4shlmovmovcali rgd0303'add [si],dh
0\
o o
ft rf
f-lfc u
a?,
yT
J 0>
BS a a> te
o E4-
T £ ^
'j_
, ¿3
C/
J(C
O
CC
1C
fc.
oX P
5
C
US
77,
CO
-£
§ -
a: §
P
- £
g. £
P
P
§., I
«»í-ii.
i—
W
—
—'•>
t>
• —
i
* x
£ g
a>-
^ f
c t^
€
S g t
xT
xf
w 3
->CO
CO
-1
-'-
^3
¿3w
o
T
Í ée
g
•o'
Eí
2Q
.ao
oS
-£
--
5¿
Bí
££
&a
e'
4>
O
C5
CSU
QJ
oO
O
°-
C "°
C C
..
E
es
E c
es wv
C5
P tft
0)
caU
D..
C
O a> C
T-x;
wO
C5
SI
'í^
CL
J
J> w a>
tfl
• " x
v
I •,
s, s
a) x
tíi
bB
£.
H ^ u
-o
x,
íS
"•..
«
" x
(-••
X
X.
X
a>
-&
xce
es
c*
rC
: =í
. S
<u
cu
a> T
J" cti
. (u
«s
&C
L.
O-,
a. c
a, o
.,rn
o
o.£
SO
H
_o &
APEMHCE ir-MPRO-ASM H - 350
cmp al,1-1
je signospush axmov í1
mov signobef5alpop axretn
signos:pushmovmovpopmovincmovcmp
jecmpjemovcmpjemov
nosignos: retnesmas; mov
retn
ax ;ley de signosal^signopossignobef,al
axsignl,alsiai ¿si]aV-1
leysignosaV+'leysignosalssignl31,'+'esmassignopos,! ;signo "-"
signopQSjO ¡SIGNO
leysignos; niov prevsi\simovandcmp
jemovpushmovmov
P°PJ™P
esmenos; movpushmovmovpop
sign^ja!aUsignlal,29hesmenossignopos,0axal,signQpossignl^alax-fínbufP?
signopos,!axaí5signopossignl.a]ax
-Rnbuff?; push. bxadd bx,cmp bx,,
APENDTCK IT-MPRQ.ASM H-351
popjnereta
lazosign; incmov
bxlaz;osign
s
cmp 3V+1
je leysignoscmp al.,1-'
jmp nosignosRGDQ303; rnov d.i,offset gd.tab
mov dh>0rgdOS 103; cmp al,[di]
je rgd03203inc cliinc dhcmp dh,22jne rgd.03103
rgd.03203; cmp db,]^jb rgd.Q3fí)3sub dh,6
rgd03fü3; rernREGPQX; inc prevsi
mov bx,offset dhex3byteptr[bx-M],0fínlaxa!5signopossignobef,al.
ax
;busco AL en gd,tab y traigo vibicacion
cmpjne
;longitiid de registro;se trata de ax,bx5cx,dx-;error?
movmovpop
decdeclodsbcrnpjecmpjne
rgdSO: pushandpushmovmovpop
P°Pjmp
regbx?; cmp
sisi
rgd.80aVa1
regbx?regax
eax.eax.,regaxxxxx,eaxeaxregaxrgdOjb
APÉNDICE H-MPUO.ASMH-352
jecmpjne
rgd$l; pushandpushmovmovpoppopjmp
regcx?; cmpjecmpjne
rgdS2; pushand.pushmovmovpop
P°Pjmp
regdx?: pushandpushmovmovpoppop
RJ3GPGP; incmovcmpjnepUShmovmovpopd.ecdeclodsbcmpjecmpjne
rgdíH
regcx?regbxregbx^Offffheaxeax^regbxxxxx_eax
eaxregbxrgdOjb
rgd82
regdx?regcx
eaxeax,regcxxxxx,eaxeaxregcxrgcíOjbregdx
eaxeaxyegdxxxxx3eaxeaxregdxrgdOjb
prevsibx,offset dhex3byteptr [bx-H],finíaxalssignopossignobefjalaxsisi
rgd.83
regíp?
¡longitud de registro;registros bp.ip^sp¡error?
qsndpulí
qsnd3UÍ"
dujosf
'[tí dujoqspoj
1S
15
XG dodAOaiAOUJqsnd
¿JOJU3Í i
is'ip s04SiH3i f C^sqp J3Sjj.üeyq AOLU
duifdod
xes dodXBO'XXXX AOlU
AOlU
qsnd
qsndduifdod
xB3 dodAoaiAOLU
qsndpulí
qsnd
dato3f
:¿diSai
esc-H
dtufdoddod
Xe3eXXXX AOLLt
AOLU
qsndpUB
qsnd
KSVOÍUIK-ll ';
Al'ENDICE H-MPUO-VSMrl - 3s4
mov eax/egdimov xxxx.eaxpop eaxpop regdíjmp rgdOjb
regsi?; push regsiand regsi.Offffnpush eaxmov eaXjregsímov xxxx.eaxpop eaxpop regsijmp rgdOjb
REGSEG: inc prevsi ¡longitud de registromov bx^offset dhex3 ¿registros d.sses/s»gs»ssscscmp byle pír [bx-H],Q ¡error?jne fmIpush axmov aljSignoposmov signobefjalpop axdec sidec silodsbcmp al>'D'je rgd.S6cmp aVd1
jne reges?rgd§6; push eax
xor eax,eaxmov ax/egdsmov xxxx?eaxpop eaxjmp rgdOjb
reges?; cmp alj'R'je rgd«S7cmp al.'e'jne regfs?
rgd.87; push eaxxor eax,eaxmov ax,regesmov xxxx,eaxpop eaxjmp rgdOjb
regfs?; cmp al,'F'je rgd88
APICNIÍICF, IÍ-MPIÍO.ASM H-355
cmpjne
rgdSS; pushxormovmovpopjmp
reggs?; cmp
cmpjne
rgdS9; pushxormovrnovP°PJmP
regss?; cmpjecmpjne
rgdSa; pushxormovmov
P°Pjmp
reges?; pushxormovmovpop
a!,'freggs?
eax,eaxax,regfsxxxx.eaxeaxrgdOjbai/G1
rgd89aí^'g1
regss?eaxeax,eaxax,reggsxxxx,eaxeaxrgd.Ojb
al/s1
reges?eaxeax,eaxax,regssxxxx,eaxeaxrgdOjbeaxeax,eaxax,regcsxxxx,eaxeax
R.GDQJB; cmp posmedjum.O
cmpjepushmovsubrnovmovpopjmp
esleiljsignobefjQesmas2jeaxeax,dhexoffea.x,xxxxdhexorT,eaxau.tooff.eaxeaxinicio
esmas2j:push eaxmov e<ix.d.hexoff
APÉNDICE IT-MFRO.AS.\ II - 356
addmovmov
P°PJTTlp
esleftj: cmpjepushmovsubmovinpvpopjmp
estnas3j;pushmovaddmovmov
P°Pjmp
rgd.fj; rtodojmp
dhexoTfseaxantooff^axeaxiniciosignobef,0esmas3
eax,dhexsegeax,xxxxdhexseg,eíix.
eaxinicioeax.
eax,d,hexseg;left
dhexseg,eaxciLitoseg,eaxeaxinicio
virus
;iniciajizo variables?o.
;# de datos pedidos.
;inicializo buffet
rgd; stodocmp gdresetjjne rgd2mov dh,[bx]mov a 1,0mov [bx-H],almov siy2mov al.'O'
rgdl; mov¡nc s¡dec dhjn.2; rgdl
rgd2; getkeymovcmp mcterr5ljne rgd21fínmacrojmp rgd2
rgd21: mov ax,getwordcmp al,0 ;leclív especial?jne rgd4
rgd3; mov gccod,!cmp ah,72 ^flecha arriba?
;error en m
APÉNDICE H -I I - 357
jeinccmp
jeínccmpjeinccmpjeaddcmpjeaddcmpjeinccmpjecmpjnejmp
rgd3£ jmprgd.4; cmp
jnejmp
rgd41 1 : cmpjnejmp
rgd412; cmpjnemovjmp
rgd413; cmpjnemovjmp
rgd42; cmpjne
rgd43: cmpjecmp
jejmp
rgd431;jmprgd,44; cmp
ine
rgd3fgccod.ah^SQ ;flecna abajo?rgdSfgccoda.h,77 ;->?rgdSfgccodíir],75 ;<-?rgdSfgccod»2ah.15 ;SHTFTTAB?rgdSfgccod}2ahJ3 ;PGUP?rgdSfgccodah.81 ;PGDN?rgdSfah,83 ;OBUrgd2
rgd.d.rgdfal,3 ;BS?
rgd411rgdda!,0dh ;BNTER.7
rgd412rgde91,9 ;TAB?
rgd413gccod^rgdfal,lbh ;ESC?
rgd42gccodjrgdfdl,'b' ;binario?rgd44ai;0' ¡es'O'o'l1?rgd431al.'l1
rgd431rgd.b ;dato no valido, beep,rgd46di;iV ;hex?
L'J -
jv,
w
o.
3 s
3
Cu
.C
CT
O
V/-J ~
o»
*ftl •as S-
ívJ
- •o o o •o o •o •o •o
o I 3
S
3o-
oa
3 1
en CL
Ui
to
O -
o
ow —
' X •
•o •o -o •o •o -o •o •o •o
TI
-O
o
!5'
ÍD cS CL 4.
C/i to
tro o 7i— M •-t-
Ui
K)
o
" '
' — >•
3 3
3X
J §
-7
3
- »
c3
u
— i
L*-l
i ¡ "
CL
|1" w
- n
cr
o
I i
2.
<.
, -J
-fD
'3
,C
L0
0-o
-i
-i -i
ce
CP e
ra-C
L
;CL 0.
N
rv
N+i.
4.
4.
Vi
Vi
4^-
(__:
—
*'
tO
s'Ii'I
-«'i|
Ii'-|
^
-o
<
< '
-o ^
Ít§
"H-Ía
|-§
=tt
§s
g§
|°|&
ro
^ v— f
c
&Q n.
^-f-
w .
v .
O
3 w .
., .
os
o
ü"
.CL "
•_
3o
o
ni
M
o
«
3
0
0- w
•cr
,w
r- o
pi
t
ff
1 8-
«as
<E
,—
^b
<
L ni
u
M<— *
- "
j -•*
"t¿
— -<
ii
—•c
r ss
íí *.;
CL
^"
-i-
O
-T O
. "
«
CD -
.E:
-^. o
as
«->
— i
.
.i-L .rn
"^
S
Ti
•^f-
4-í
-J
0
'.-ri
O w n o -i .0 o
•S'S
3-
o
d
o•T
O
r»
-°-
CL
^
a-
rr4
Í-L
u4i-
104i.
10
<f
•0= n as cr O as 1 £3 -O
00
lí-( CL
-fc-
-£-
3'
<D*
0
0
3 T3
írt
-i--W
-a
CL „
—•
7T
14^
Mto
i-rj o o 3 53-
SS ^h <^ 3 •£T •(-+-
SJ cr 93 -o
3 o < tn O 5 •íí
to CL
as cr
3 o -.-• CL ^~
v
O
^* • re o « 'CL
as «-t-
O íí M .n o 3 .fp o <-f- p
í i•— i n 3 i r- a O !T.
'S
o
APKN11ICE 11-ALPRO.ASMI I - 359
rgd45b: incmovmovsubmuífiddjncjmp
rgd45c: incmovmovsubmuíaddjncjmp
rgd45d: incmovmovsubmuíaddjncjmp
rgd45e; Incmovmovsubmuíaddjncjmp
rgd.45j: ¡ncmovmovsubmuíaddjnc
si
rgd45g; incmovmovsubmuíaddjnc
eajUQQQQQQQcl,[si]
cl,30hecx
rgd45osíeas, 1000000cl,[si]
cl,30h
rgd45drgd45osíea&lQOQQOcl,M
ci,30hecx
rgd45ergd45osi
^ 10000
cl,30hecx.
rgd.45jrgd45o
si
cl.SOhecxedí>eaxrgd.45grgd45osieax.100
ecxedi,eaxrgd45h
¡s out :gc;-t7pS-idiufsu f
xu'ip ppiíX'3 [tlUI
qO£'[3 qns[¡S]*|0 AOU-1
AOÜTJS OU1
AOUI r
O'.vp cfuioyo |íuu
O'lp AOLU
[lS]*[0 AOLU
0000 1 '
-
xq'is AOUIxp qstidyo qsnd
diufdod
xos dodxps dod
lp3*[lS] AOUI
tS OUt
ofppe
qsndqp*p AOLU
x-ps dod,duifoüfppeI'niuqtis
AOUIAOUI
is o u i :duir
APENIHCIi H-Ml'RO-ASM H - 361
mov c ] > s ]sub cl,3Qhmuí exadd dj,íixjnc rgd4551jmp rgd45o ;overflow
rgd4551: cmp byte ptr[bx],3jne rgd.456cmp ñhyQje rgd.456jmp rgd45o ;overflow
rgd456; inc simov ax»10mov cl,[si]snb cl,30hmuí exsdd di,axjnc rgd.4561jmp rgd45o ;overf!ow
rgd456l ; cmp byte ptr[bx],3jne rgd457cmp ah,0e
jmprgd457; pop
movniigh
addjncjmp
rgd457rgd45o
dj,cxrgd4571rgd45o
;o verf! ow
;ove.rflowrgd4571 ; cmp byte pír[bx]s3
jne rgd.45fcmp ahsO
rgd45fergd45o: pop
poppop
jmprgd45f: Jnc
movpoppoppop
rgd46; movmovcalicmp
;overflowecxedxrgdbsi[si],dí
dxexdxax,get\vorddh>alrgclO BX~>¡n¡cio buffer
;exceso de datos?
ATENDIÓ; II-MPRO.ASM H - 362
rgdb;
rgd.5:
rgd.d;
rgde;
rgd.6:
rgdól;
rgd.62;
rgdf;
jnepushmovmov¡nipopJ™Pcalijmpcmpjecalicalijmpcmpjejmpmovmovmovaddaddcmp
je
cmpjemovcalimovshlmovmovcaliaddaddmovcalimovshlmovmovcaliadd
rtodoretn
rgdSdx ;BSEPah>2dl,721hdxrgd2rgdOlrgd2byte ptr[bx+l],Q ;QEU5TE. BufFer vacio?rgdbrgd02rgdOlrgd2dl.'h1 ;hex?rgd.6 ;a los binarios no los transformo yrgdf ;los dec. llegan ya transformados.si,bx ;convierto en hex.d1,[bx]dhjOsi\si}dxdl,2rgd62
byte ptr [bx]>SrgdE61als[bxH-2] ¡convierto MSBrgd.03
cl,4dh.cl[si-M],dhal,[bx-t-3]rgd03[si-M],dh ;MSB transformadobx52aljfbx+2] ;convied:o LSBrgdOScl,4dh.cl[si]5dhal,[bx-í-3]rgdOS[si],dh
APIÍNDIC1Í 11-MPIlO-ASMH - 363
rgdE61:movcalimovshlmovmovcajladdmovcalimovshlmovmovcaliaddadd
movcalimovshlmovmovcaliadcíadd
movcalimovshlmovmovcaliaddrtodoretn
al,[b.x+2]rgd03cl,4dM[si+3],dhal,[bx+3]rgd.03
[si+3],dhal,[bx+4]rgd03Clj4rjh,cl
[Si+2],dhal,[bx+5]rgd03[si+2]sdhbx,4
alt[bxH-2]rgd03c]44dh.cl[si-M],dhalj[bx+3]rgd03[s¡+I],dhbx,2
aI,[bx+2]rgd03cl,4dh,cl[sildhalj[bx-i-3]rgd03[si]sdh
¡convierto MS3
rgdOj; push bxpush ex
mov als[bx]cmp al,[bx+1]mov aljje rgd,0fl
;MSB transformado¡convierto LSB
;LSB transformado
¡convierto MSB
¡convierto LSB
para que reg. EIP solo acepte¡pone DH en el buffer apunl, por BX
¡ya no hay espacio?
inc byte p1r[bx+l] ¡incremento contador
APÉNDICE li-iMPHO-ASM jj _ 3^4
mov si,bxmov b,x}l
rgdOU; rnov a1,[bx+si-K2] ;rota a la izquierda n-1 vecesmov [bx+si+l]^l ;donde n=# de datos pedjdo$,inc blcmp b1,[si]jb rgdOlj
rgdOnj; mov [bx+si+l],dh ¡incluyo nuevo dato.mov al,G
rgdQfJ; pop expop bxretn
rgdO; push bxpush ex ¡esto para que reg. EJTP solo aceptecmp cua]2,Q ¡16 bits (dl=# de reg.)jne rgdOlOmov al ,4 ¡esto ya no pues bx contiene el # decmp al,[bx+13 ¡datos a ser leídosmov a!5lje rgdQf
rgaOTO;mov al,[bx] ¡pone OH en eí buffer apunt porBXcmp a!5[bxri-1] ¡ya no hay espacio?mov al,lje rgdQfinc byteptr[bx-í-1] ¡incremento contadormov si4bxmov bx,lcmp byíe ptr[s!3..1je rgdOn
rgdO!; mov aI,[bx+si+2] ;rota a la izquierda n-1 vecesmov [bx+si-f~l],al ¡donde n=# de datos pedidos.inc blcmp bl^si]jb rgdOl
rgd.On; mov [bx+si-H^dh ¡incluyo nuevo d,ato,mov a^O
rgd.Of: pop expop bx,retn
rgdOl; push ex ¡presento buffer en pantallapush dxposdjr cl.3chmov di,pddirmov bp}d.imov cl,fbxl
APBXOICK H-.MPRÍXASMH-365
movmov
rgdOl !;stosbincloopmovmovsubmovaddaddmovaddaddmovcmpje
rgd,Q12;lodsbstosbíncloop
rgdQ13;popP°Pretn
rgd02; pushdecmovmovmovcmpje
rgd021; movmovdeccmpjne
rgd022; movpopretn
rgdQS; movmov
rgdQS 1; crnpjeincinccmpjne
cri>0al,'J ¡primero borro
dirgdOUal,[bx-H]d,[bx]
c!5ajsíjbxsi,2si,cxdi,bp
cx}cxdi, excUbx+1]cl,0rgd013
¡muestro el numero
dirgdOUdx
ex
bx ¡rota a la derechabyte ptr[bx"H] ;dismipuyo contadorsi,bxbls[sí] 1bh 0* ibI91rgd,022nls[bx-f-si][bx+si+l]3albx.bl,lrgd021byleptr[bx-í-si-M],'Ol
bx
di^rfset gdtab ¡Busco AL en GQTABdh,0 ;y traigo ubicación en.DH,al5[di]
rgd032didhd.h.22rgd031
AI'liNDICE H-MPRO-VSM H - 366
rgd032; cmpjbsub
dh,16rgd03fdh,6
rgd.03 f; retn
rg¡:
rgla;rg l l ;
pushpushpushmovmovcmpjnemovincmovmovincmovmovmovrepmov
movmov
cali
diexbxrglx,clrgly,chgdresetjrg!adi,sidicl,[si]ch,0exax,dsessaxal,0stosb
;rec¡bo un stnng desde teclado;S'! apunta al inicio del buffer
;iniciali>-0 el buffer?
;limpia el buffer
;CX=^ car.
essvídeosegbh,0cls[si-H]curs24
getchar
rglM:
movrnovstosbmovmovcmpjecmp
jecmpjejmpmovcmpjecmpjemovmovaddmov
a^atrprevdi\dirprev
;pongo cursor;recíbo un dato del teclado
¡quito cursor
cl,[si] ;num. máximo d.e caracteresbl,[si+l] ;num. actual de caracteresgccod,5rg!2gccod.,1rg¡3gccod,0rglllrg!3a^gcasciíal,8rgldbl,c1rglb[bx+sj>2],clsbl
cl,rglxch,rg]y
;cgr. especial?
;ENTER?
¡ascii normal?
¡TAB, SFTÍFT TAB y ESC;
¡Backspace?
;ñn del buffer?
al ;no, guardo dato;eco a pantalla
salir.
id'xvJOSJno |9p UOlOÍSOd OJ4U3Í10U3!
¿opuejuoq jinStes opsadí
¿31313a-
xo dod¡p dod
qso.|SSJ9A9/[B AOLU
AOLU
AOLU
-jB AOUI
ip ouiaippd'l'p AOUI
X[Sj(L¡0 AOLU
x¡Sjcp ppeip qsnd
xo qsnd
ipaitp dod
xo dodxq dod
[[Sj dLLlf
qsojs, ,'[6 AOLU
aippd'ip AOLULjO'[0 JlpSOd
K[Sa*qo AOUL[O 03p
X[Sj*[o ppujq' jO AOLU
AOLU
qi^j af
O'iq CÍLÜSC[3i dLUf
3Í
diuf
L t(B AOLU
¿<[P AOUI
i iSa duifout
qso^sAoai
JIppd(lp AOLU
- H 1VSVOU.IIV- II 'j
APÉNDICE H-.-MPRO.ASMH - 368
rll: push expush diposdir 0,almov di,pddirmov al,1'UlQv cXj8Qrep stoswpop di
P°Pretn
;djr de inicio de linea;AL tiene el " y AH el atributo
¡borra linea
ex
rlmp; push dipush axpush exmov di,0
movmovreojpoppoppopretn
cx.2000ax}072Qhstoswexaxdi
;car: espacio, atributo; normal.;borra pantalla.
rprt; push diiriov di,pddír ¡dirección de inicio
rprtl; lodsbcmp al,0 ¡termino?je rprt2stosw ¡AL tiene ef ASCFÍ, AH el atributojmp rprtl
rprt2; pop diretn
' pushpush
P°Pmovmovmovmovrepmovmovmovpopreta
esdsesds^vídeoseg51,23*160di,offsetbuf23CM^O
movsw
ds,axes,videoseg
es
APKÍímCE TI-MI-RO-ASM H - 369
rres23: mov si,offse1 buf23mov ¿¡,23*160mov cx>80rep movswretn
rusrp:pushpushpushmovcmpjnemovjmp
rusrp 1 ; movnisrp2: mov
movmovmovrepmovmovmovmovcmpjnemovjmp
rusrpS; movrusrp4; mov
rep
;Si PANT?=1) la pantalla a mostrarse esta en;PANT> sino en PANTR. Uno de estos buffers;es cambiado con la memoria de video.
;datos actuales en PANT ?
sdiexsi, Opant?,1
rusrnld.i, offset pantr ;si
rusrp2di.offset pant ;no, datos actuales enax,@data ;guardo la pantalla enes.ax ;el buíferque no esta en uso.ds.videoseg
movswdi,0 ;PANT o PANTR a pantallaax,@datadssaxessvideosegpant?,! ;datos actuales en PANT ?nisrpSsijOffsetpa.nt ;sirusrp4sisoífset pantr ;nos en PA"NTRcx>2000
movsw
rusrp6: xor pant?,lpop expop dipop sireln
;toggle bandera PANT?
endm
;Subnrnnas para macros de manejo de macros de UsuariosSBRMCR ***************
2048 dup(O) ¡datos manejados por programa usuario.data
mcrdat db
APÉNDICE 11-MPIlO.ASM íí - 370
controldirnmacmcrhandgelvvordmcrerr
dbd\dwdwdb
0,00000
;Para ver si archivo es de macros (FQ);díreccion # de macro actual;handle d.e archivo de macros;salída de GETKEY;para sacar código de error.
.coderemen stodo
mov bx,mcrhand ;obtengo el handleymov ah>3eh ;cierro el archivoint 21hrtodoretn
reme; stodomovmovintmovríodoretn
ah,3ch ;creo archivo de macros.
21hmcrhand.ax
rgm: stodocmpjnemovjmp
rgml; movmovmovmovmovmovmovintmovmovmovintmovmovmovintmov
rgmf; rtodomovmov
mcrhandjO ;habia archivo de macros abierto?rgml ;si, continuo.mcrerr,! ;no salgo con código de errorrgmfQontrolj'Pcontrol+1,'0'ah,42h ;fíjo puntero de R/Wcx,0 ;al inicio del archivo.d^Ob\%mcrhandal,021 hcx,1088 ;escribo primera parle del archivodx,ofTset areamacah54Qh21 hcx',2050 ¡escribo segunda partedXjQffset mcrdatah,40h21 h
íih,0
APÉNDICE II-MPRO.ASM ri -j-iiJrl - ó í \n
rgk; stodomov mcrerrjQmov bXjdirnmac ;veo si puedo entrara macroscmp byleptrfbx+lkQffhje rgkncmp bgmac,0 ;grabando macros?jne rgk2 ;si,cmp bmaCjO ;no, corriendo o probando macros?jne rgkl ;si.
rgkn: cali rgkO ;no, rutina, normal de teclado.jmp rgkP
rgkl; mov sí,offeet mcrdat ;leo dato de buffermov hXjdirnmacmov dh,[bx]mov dJ,Q ;DX=# de macro * 256add sijdx ;SI apunta a macro actualmov d1,[bxmov bl,dlmov bh,0add bx,bxmov amov get\vord,ax ;paso dato como leído de teclado.mov bxjdirnmacinc byte ptr[bx-f-l]cmp byteptr[bx-H],30h ;fín?je rgkocmp bver,0 ;probando?je rgkf ;no, salgo.push get\vord ;si,espero ENTER para conñrmar.
rgkl 1; cali rgkOmov ax3get\vord ;es ENTER?cmp aljOdhjne rgk:11 ;no, espero un ENTER.pop getword ;si, salgo.jmp rgkf
rgk2; mov sijOffset mcrdat ;leo dato de tecladomov bx,dirnmacmov dh,[bx]mov di,0 ;DX=# de macro * 256add si,dx ;SF apunta a macro actualmov dl,[bx;+l]mov bl,dlmov bh,0add bx.bxcali rgkO ;guardo dato en
Al'EMHCIv TT-MPRO.ASMB - 372
movmovmovínccmpjbmovmov
rgkf": rtodoretn
ax%get\vord
rgk3:
bx\dimmacbyteptr[bx+1]byte ptr[bx-H ],80h ;termino área de macros?rgkf ;no.byte ptrjl^x-H^Offh ;si, mando estos valores comomcrerr,! ;¡nd¡cacion de fín de macro
rgkO;stodocmp ventjOje repetirrgkOmov aljVentnuevacmp aljVentactualje repetirrgkOmov amp
repetirrgkO:movintcmpje
•fínmgkO
ah.Obh21hal>0verratonmgkO
I6h
notabVentnuevaVentnu e va >6fínmgkO
movintcmpjneinc
cmpjnemovjmp
notab:cmpjnedeccmpjnemovjmp
verratonmgkO:cali pantallacmp b.^Offhje repetirrgkO
; espera que se pulse una tecla.
fínmgkO
axsOfOOhfinmgkQVenfNuevaVentNueva.OffhfínmgkOVentNueva,5vShort fínmgkO
; H -MPRO.ASM || _ 373
fínmgkO;mov get\vord,axrtodo
ret
rim; stod.O ¡intento abriré! archivomov bxsoffset areamacadd bx,1QS8 ;inicializo DIRNMACmov dirnmac,bxmov ahjSdhmov a],02hint 21hjnc riml ;íodobienmov ah,59h ;error, veo de que tipo es.mov bx,0int 21hmov mcren^al ;salgo con código de error extendidojmp rimf
riml; mov mcrhand,axmov bx^axmov ah,42h ;veo si es de macrosmov cx.,0mov dx33136mov al,0int 21hmov cx»2mov bx^crhandmov dx,offset controlmov ah,3fh ;REA-Qint 21hcrup control,'F'jne riml 1cmp coníro!-H ,'Q'je rim 12
rim U; mov ah,3eh ;no paso chequeomov bxsmcrhand ;cierro archivoint 21hmov mcrerr.,0ffhjmp rimf
rim 12; mov bx.mcrhand ;es de macrosmov ah342h ;L$BEKmov cx^Omov dx%0mov al,0int 21hmov dx»offset areamacmov c
APIÜS'DICE I-J -AM'RO-ASMH - 374
movintmovmovmovEntmov
rimf; rtod.omovmovretn
;KEAD2 i hdx^offsel mcrdatcx,2Q50 ;leo segunda parte del archivoah,3fh2 i hmcreríiO
ah30
rimen push dipush expush axmov di,offset areamacmov c.XjlO^Smov al,Qpush espush dspop esrep stosbmov di,offset mcrdatmov crep stosbpop espop axpop expop diretn
endm
APENIHCE H - pRovrrr.ASM -rr _
MACRO PROVNT.ASM
Rutinas para manejo de ventanas
;Macro Parámetros Función.
;hexasc hex en AL => ascíi en BX;idvnt diras^dirresjongres identifica archivo y área de ventanas;popall pop a todo¡posdir xsy calcula dirección en memoria de video;pushall push a todo;ynt riombre3ripo muestra o actualiza una ventana;sbrvnt subnrtinas de los otros macros
.###### HEXASC ***************;E1 byte en AL se convierte en dos bytes ASCII en BXhexasc macro
cali rhaendm
;Este macro recibe el nombre del archivo de ventanas en un ASCÜZ que¡inicia en DIRASC. Abre el archivo, trae todos los grupos principales;al área que empieza en DTRRES y guarda DTRRBS y LONGRBS en el índice.;En AX salen códigos de error: 00 todo bien3 01 error al abrir archivo,;02 si se encuentra que no es un archivo de ventanas, y;03 error por falta de espacio (LONGRES= 6 grupos para Índice -i- # de;gaipos principales + 1 grupo para una tabla de residencia actual 4- al;menos 4 grupos para secundarios, a menos que todas las ventanas seanprincipales). Nota; Un gnipo=256 bytes.idvnt macro dirasCjdirres^ongres
push dxpush dipush bxmov d^offeet dirascmov di,ofíset dirresmov bljongrescal] rivpop bxpop dipop dx
APFJÍH1CEH - PRO\7iT.ASM TT _
endm
.****** PQPAU ***************
popal! macíopop eaxpop ebxpop ecxpop edxpop esipop edipop ebppop esppop dspop esendm
POSDl'R ***************;Convierte la posición (X,Y) en una dirección en;PDDIR para acceso directo a la memoria de video.posdir macro x,y
push exmov cl,xmov ch,ycail rpdpop exendm
.***#*# pus^j/^'f 7 ***************
pushaJI macropush espush dspush esppush ebppush edipush esipush edxpush ecxpush ebxpush eaxendm
***************;BX apunta al nombre de la ventana. Si existe y es principal, sus;grupos en el área de residentes son los mismos que tenia en el;archivo. Sí es secundaria ve si es residente, caso en que sus grupos;estan en la entrada en el índice. Si no es residente, se la trae al;area de residentes y se la marca como tal, borrando la residencia
APKNTHCK H - PUOVNT.ASAI
;de las ventanas sobre las que esta ventana se coloque. Muestra la;venlana y donde se encuentren vanables se las ¡een del área apuntada;por AX;SÍ. Existen dos TÍPQs de llenado; 'h', hexadecimal, c/byte;se muestra en dos variables de la ventana y 'a1, ASCÍI, c/byte se¡muestra como tal en pantalla.;En AX sale un código de error; O, todo bien; 1, nombre no existe.vnt macro tipo
mov tipvnt,típQcali rvntendm
II -377
SBRWTsbrvnt macrotabha db 'OY1Y2Y3Y4Y5Y6Y7Y8Y91
rha: push axpush expush dxmov bx,offset tabhamov di,aland al,0f0hmov ah,0mov el, 16dív elpush dsmov ex, esmov ds,cxxlatmov ch,almov al,dland al,Qíh ¡nibble menos significativoxlat ¡Traduzco a ASCHpop dsmov el,almov bx,cxpop dxpop expop axretn
;n¡bble mas significativo
;lo paso a la parte menos signif.
;hago DS=CS para que funcione el XLAT
¡traduzco a ASCIT
dirind d\riv: push
Osi
push exmov si\bxmov ah,3dhmov a],0int
¡dirección del indjce
¡abro archivo
H - 378
jncmovjmp
rivl: movmovmovmovintmovmovmovmovmovmovmovmov
rivll: addincdecjnzcmpjemov
rivl terror.
rivfbx,ax ¡handleah,3fh ;Ieo entradas O, 1 y 2,dx,di
21h[dB-13]»b,\ Aguardo handlebx,si[di+12]}bl ¿guardo LONGRES[di-HO^di ;giiardo DÍRKESdirínd^díb.x-,24 ¡chequeo paridad del archivo
¡paridad de ventanas no se cumple
rivl 2; movmovmov
rivl3: addincdecjnzcmpjemovjmp
rív2; movcmpjeadd
riv2!; addinccmpjbemovjmp
rív3: movadd
al,0aí,[di+bx]bxelrivl 1
rivl 2ax,2rivfbx,36cl,32
als[di+bx]bx
elrivl 3als[dí+bx]riv2ax,2 ¡paridad de grupos no se cumple
rivfals[di+9] ;# de grupos principalesa1,[di+l] ;= total de grupos?riv21al,4 ;-f-4 grupos mínimo de secundariasal,6 ;+6 de índiceal ;+l para tabla de residencia
HVJ
rivfdx,didx,72
;muy poco espacio
¡todo bien, leo resto del índice
APKTíniCEH- 1'llOWr.ASM H - 379
movmovmovint
riv4: movaddmovmovmovintmovaddmovmovaddrnov
riv5: addmovmovmovmovmovmovdec
rivf":movpopPOPretn
pddir dwrpd: push
pushmovm u íaddmovaddmovpoppopretn
segvar dwoffVar dwtipvnt dbdirent dwmiTngrp dbcolumna db
CX.J536-72bx,[di-H3]ans3fh21hdx,didx,1536chs[di+9]clsOah,3fh21hch,[dJ+9]ch,6[di-H5],chch,[di+8]di,48bp}di
hand.le
;leo todos los principales
;CX=# d.e grupos principales*256.= # de byles por leer.
¿preparo numero de próximo grupo;a usarse de área de residentes
;copio los # de grupos en el archivo;a ios grupos en memoria para;las CH ventanas principales
bp,24 ;y las marco como residentesdi,bpbyteptr[dH-8],3bx,[di+16][di+20],bxbx,[di+18][dí+22]sbx
chriv5
exsi
Oaxexal, 160 ;80*2 bytes por lineachc1,cl ;+ 2 veces el # de columnach,G
ax,cxpddír,axexax
OOOOoo
;segmento donde están las variables;offset de la variable actual¡tipo: 'h1, 'a1 o ¥;direccion de entrada de vent actual;# de gnipos que faltan por traer¿columna escrita actualmente
APÉNDICE IT- PROVNT.ASM H - 380
linea dbrmmbyte dw
rvnt; pushallmovmovmovmovaddpushpushpopmovmov
rvnt]; addmovincmovmov
rvntl 0; movinclodsbdec
cmpjnecrnpjejmp
rvnlO; cmpjbepopmovjmp
rvntl 1; popmovmovmovmuíaddmovmovcmpjnejmp
rvnt2; cmpjne
¡línea escrita actualmente;# de byte mostrado del grupo actual
segvar,axoffvar5sidí5dirind
di,48esdses
¡dirección del Índice;ultima ventana valida
¡voy a buscar el nombre en las entradasidel índice.
bp,dibp,24di»bp ¡ubico entrada indicada pordh ;PHsi,bxcx,9 ¡nombre de 8 bytesah,es;[di] ¡leo 1 byte del nombre de una ventanadi
¡leo 1 byte del nombre buscadoexrvntl. 1
rvnlOal,0rvntl 1
rvntlOdbsdlrvntlesnumbyte,!
¡nombres iguales?
¡nombres diferentes¡iguales?
¡busco en todas las ventanas?¡no, sigo,01/05/89
¡si, nombre no existe,¡error — 1
rvntfesdi,dirind[di+6],dh ¡guardo # ventana actuala!324dh ¡ubico entrada actual ydi,ax ¡DS:DT apunta a ventana actualdirent,didh3[di-h8] ¡veo si es P o S.dh,3rvnt2 ¡S.
rvnt4 ¡P.dh,2 ;ffiopidaría. Reside?rvnt20
APÉNDICES- PRO\7>T.ASMH - 381
jmprvnt20: mov
movmovrnovdecmovmovaddmovrnov
rvnt21: cmpjemovpushaddmovcmp
jecmpjepushmovmu!addmovpop
rvnt22: movmovpopincmovsubcmpjbemovaddmov
rvnt23; movínccmpjne
rvntS: movrvntSlj mov
cmpjemov
rvnt4 ;si.dI3[dH-9] ¿no, ubicarla ventana.byte ptr[dí4-8]>2 ;doy residencia a Ja ventanasi,d¡rind ¿DS;SÍ apunta al Índiceab,[si4-12] ;nbico tabla de residenciaab ;AX tiene el offset de la tablaal,0 ¿respecto del inicio del índicebp3sibp,ax ;DS;BP apunta a ia tablacl5[si-H 5] ¿CL = # grupo que va a ser dadobx,l6 ;a la ventana actualbyte plr[di+bx],G ¿termino ventana?rvntS ¿si.
¿no, leer valor en Tablabpbp,cxal>ds;[bp]aljtsi-Kj] ¿01/05/89: No quitarse la residenciarvnl22 ¿a sí misma,a!30 ¿grupo estaba libre?rvnt22 ¿si.si ¿no, quito residencia a la ventanaah>24ahsi,axbyte ptr[si+8]sOsia]>[si-!-6] ¿ventana actúa!ds:[bp],al ¿a la tabla de residencia
el ¿preparo próximo grupo a usarseah,[si+]2]ah,2clsahrvnt23 ¿01/05/89ab,[sí+9] ¿termino área de residentesah36 l==> voy a inicio de área dec^ah ¿secundarias[si+15]sct
bl ¿ya reviso cuatro grupos?bl^Orvnt21 ¿no, volver.bx3!6dh}[dB-bxJ ¿lpp.# de grupodh,0 ' ¿terniino?rvnt4 ¿si.dl,0 ¿no. CX;DX=uffset des^
- PROVTÍT.ASMH - 382
movmovmovpushmovintpopmovmovaddmovmovpushmovintpopinccmpjne
rvnt4: movmovmovmovmovmovmovmovmovmovaddposdirmov
rvnt4J: lodsv/cmpjestoswjmp
rvnt42: pushmovmovmovpopinccmpjestosw
jmp
cx,0aI3Qah,42hbxbx,[si+13]21 hbx
;inicio de archivo
¡LSBEíC
dhi[di+bx+4] ;DS:DX apunta a bufferde lecturadl.Odx,sicx>256ahs3fhbxbx,[si+13]2 Ib.bxblbl.20rvntSlax,[di-H2]lineaban
;Leo un grupo del disco
;R£AD
;ya leyó 4 gnipos?;nos sigo leyendo.
;esq. sup. izq.
columna3alaI,[di+9]numgrp,alniimbyte50si;dirindah,[di+20]bp9dia!30si,ax
;# de grupos
;# de byte actual
;AX posición primer gnipo
;ST apunta al grupocolumnajineadf,pddir
al,lrvnt42
;variable?;si.
;no, mostrar carácter.rvnt44dsbx.ofíVards,segvarals[bx]dsofTvartipvnt,'h'rvnt43
;leo una variable
;ventana hexadecimal?;si.
;no, ventana ascii.rvnt44
II - 383
rvnt43: hexascmov al,bhstoswlodswmovstoswincmovcalicmpjeadd
rvn431: cmp al,lje rvntS
rvnt44; cali rvntOcmp al,ljeinc
movcmpjaeincmovmov
al,bl
columnadx,sirvntOdxasirvn431si,2
¡AL se convierte en ascii en BX
¡muestro mitad mas significativa.¡Leo atributo siguiente.Supongo
;queAL—1 (otra variable) y¡muestro la otra mitad.
¡Con DX veré si hubo cambio de guipo.¡ve sí guipo actual ya termino.¡Hubo cambio de guipo?
¡no, SI apunta correctamente.¡si, hago que SI apunte bien,¡termino la ventana?¡sí, salir.
¡no, seguir.al,l ¡termino ventana?rvnt5 ¡si.columnaal,ds;[bpH4] ¡termino linea?al,cohimnarvnt41 ¡no, continuar.01/05/89linea ¡si, nueva linea.al,ds;[bp-H2] ¡primera columna.columna,al
posdir columnajineamov di,pddirmov al,ds:[bp-H5] ¡termino ventana?cmp aljineajb rvntSjmp rvnt41 ¡no, continuar.
nfnt5; mov numbyte,0 ¡si, salir.rvntf: popa U
mov aXjTiumbyteretn
rvntO; pushaddcmpjbdeccmp
jne rvntOlmov al,ljmp rvnlOSrvntO 1; mov al^numgrpmov alsds;[bp+9]sub a!3ahmov ah,0
bp ¡varia contadores y ve si es necesarionumbyte,2 ¡empezar otro guipo. Altera AX.numbyíeJQQh ¡termino un grupo?rvnt02 ¡no.
numgrp ¡si, un grupo menos por mostrarTiiimgrpjO ¡termino?
¡no.¡si, salgo con AL=1.
¡leo un # de grupo
I I - PKO'W.ASM
add bp,axmov ahjdsrCbp-t-20] ;AX=posicion de nuevo gnipomov al,0mov T]umbytesOmov si,dirindadd si,ax ;ST apunta a nuevo gruporvnt02; mov al,0 ;AL=0 í=> no termina aunrvnt03; pop bp
/' retn
endm
APIÍNDICE IT - MOUSF-ASM
MACHOS MOUSE.ASM
* Archivo: MQUSE.ASM ** Descripción; Macros para interfase de ratón (modo texto ) ** Lenguaje Ensamblador ** Traducido del código fuente escrito en el libro: ** EZZEL, Ben» "Turbo C-H- Programming: An Object-Oriented Approach", ** Addison-Wesley, USA, 1990. TSBN; 0-201-55023-7 ** Historia: ** Autor. Versión Modificaciones *
a.t. 1.0 Conversión a lenguaje Ensamblador *
;Para usar éste macro es necesario que el ratón se encuentre previamente¿instalado con un controlador (mouse.com o mouse.sys).¡Existen funciones para el ratón en modo gráfico que son similares a las que;se presentan aquí a escepción de la función para la forma del cursor.¡También de acuerdo al fabricante del ratón existen otras funciones adiciona-;!es. Aquí solo se incluyen las que generalmente está presentes en todo con-¡trolador.;E1 ratón se utiliza con la Interrupción 51 (33h) del Bios, en caso de no;estar instalado el mouse la dirección de salto de ésta interrupción estará¡con un IRET o no contendrá nada, por lo que en ese caso no se recomienda que;se ejecuten las "funciones del ratón aquí listadas. Para controlar la presen-tía o no del ratón en el sistema se usa la variable PRESENTEX (x valor de 1;a JO) en cada uno;de IQS macros de tal forma que si PreseníeX es cero no se ejecuta el macro¡PRESENTE! se pone en Uno en el macro Mreseteo que es el que detecta 3a pre-¡sencia del ratón.
¡Forma de llamar a cada macro; mreseteo Nombrel>arg25arg3 (arg2 debe ser variable tipo word)
Mmuestra argl,arg2^ (argl puede ser variable o valor
fl - MOlJStvASM JT _
; inmediato, arg2 debe ser variable; ambas tipo \vord); TTiposicion Nombre2,arg3; mmovera Nombrel,arg3; mpresionado arg],Nombre35arg3 (argl variable o valor inmediato tipo\vord); miiberado argl^NombreS^rgS (argl variable o valor inmediato tipo \vord); IVMimil Nombre I.sarg3; Mylimív Nombre! ,arg3; formacursor arglsNombrel,arg3 (argl word valor inmediato, registro,variable); mmovimiento Nombrel,arg3; mbrillante argl ,arg3 (argl variable o valor inmediato tipo word); MoveRatio Nombrel,arg3; mocultar Nombre3,arg3; mvelocídad argl ,arg3 (argl variable o valor inmediato tipo word)t>;En todos los casos "arg3" es una variable tipo byte que se define en el pro-;cedimiento que va a usar estos macros, se usa para indicar la presencia o;no del ratón, para condicionar la ejecución o no de los macros.
; Para emplear los macros defína variables (en el procedimiento desde el que; va ha usar los macros) del siguiente tipo:5
;* Para los macros: MreseíeOjMmoverajívDOimitjMYlJjiiit.MmovimientOjMoveratio;* ???! STRUCT ;???] indica cualquier nombre;* vari! d\vO ;;* var12d\vO ;;*???! ENDS;* nombre! ???! <0,0> ; esta línea realmente crea la variable "nombre 1" tipo;* ; estructura ???! con valores inicÍÉiles O.*i;* Para los Macros; Mposicion, FormaCursor;* ???2 STRUCUT ;???2 indica cualquier nombre;* var21 dvvQ;* var22 d\ O;* var23 d\vO;* ???2 BNDS;* nombre? ???2 <0,0)0> ; esta línea realmente crea la variable "nombre2" tipo;* ; estructura ???2 con valores iniciales O.*j;* Para macros: MPresionadosMliberado3Mocultar;* 7773 STRUCUT ;???3 indica cualquier nombre;* var31 d\vO;* var32 d^v O;* var33 d\vO
APESI1ICI-; H - MOII.Sr.ASM
;* var34 d\ O;* ???3 ENDS;* nombreS ???3 <0,0)0J0> 1Q&% !mea realmente crea la variable "nombreS" tipo;* ;estructura ???3 con valores iniciales O
; macro; mreseteo.; Descripción; Llama al driver de.! ratón, reseteando el driver a las; condiciones por defecto y retornando el estado del ratón; en el registro AX (-1 *frYfh* si el ratón está presente,; O si no está disponible). Si el ratón está presente,; el cursor del ratón se activa. El registro BX retorna el; número de botones del ratón (2 o 3). Ambos resultados son; retornados en la estructura Result (present,buttons).; Entrada : Ninguno; Salida ; Resultado; vari 1 ->Mouse presente (FFFF presesnte); (0000 ausente ): vari2 -> Número de botones
mreseteo macro Resultado^visiblejpresenlellocal Hnmreseleopush axpush bxmov ax,0 ¡función Ceromov rnvisíble,ax- ;mvisible indica si el puntero está (1)0
;no (0) visibleint 51mov Resultado.vari 1 ,ax ;pasardatos de retorno a la variablemov R.esu!tado,varl2,bx ;tipo estructura, Resultado .cmp a^Oje fjnmreseteomov presente!,! ;si ratón está presente entonces presente! — 1Mmuestra ^mvisible^resentel ;13amada al macro que muestra el cursorfmmreseteo:pop bxpop ax
Endm
;/* macro ; Mmuestra; Descripción: Muestra u Oculta el cursor del ratón invocando a ¡as; funciones 1 y 2 del ratón, respectivamente. En ei momento; que se actualiza la pantalla en el área donde se encuentra el; cursor del ratón, este cursor debs ser ocultado antes de
APÉNDICE U - MOUSEJiSM H - 388
; redibujar la pantalla y luego debí? ser mostrado de nuevo. De; otra manera, los efectos son sorpresivos e indeseables,; El ocultamientQ del ratón "no" afecta ías operaciones de; seguimiento de su posición y de operación de los botones,; entrada;; sbowstat -> valores 1 o O (mostrar | ocultar);*/ Salida: invisible!. -> Indica si el ratón está o no (1 o 0); visible;Se debe tener cuidado las veces que se realiza la función de ocultar el ratón;ya que por cada acuitamiento se debe hacer una función de mostrar. Si por;algún motivo se realizan 4 llamadas a ocultar se deben hacer 4 llamadas a;la función 1 para volver a mostrar,;Por ésta razón se usa la variable Showstata que indica el estado del ratón;con O se indica que está oculto y en caso de llamar a la función de ocultar,¡ésta no se realiza por que ya está oculto.
Mmuestra macro showstat,mvisiblel>presente2
¡existe ratón?;no
¡se dése mostrar u ocultar?
;ocuítar;función mostrar el puntero
;el puntero ya está visible?;si;no
¡indicar que ya está visible
¡función ocultar el puntero;ya estaba oculto?
local fmm3fínlmpushcmpjnemovorjzmovcmpjeintmovjmp
fínm;movcmpjeintmov
finlrn;pop
endir?
axpresentes, 1fínlmax,showstatax,axfínmax,lm visible 1,1fínlm51mvisiblel,!
short finí m
ax,2 ¡ra.visiblel50fínlm51m^sible^O
ax
;no¡indicar que ya está oculto
;/* Macro : mposicion; Pescripción; Reporta la posición del cursor del ratón y el estado de; sus botones. Las coordenadas de la posición son reportadas; en pixeles. Los bits correspondientes al estado de los; botones, empezando por 05 son colocados en 1 si el botón; ha sido presionado y en O si está libre.; entrada ; Ninguno
APETÍDICE H - MOUSEASMH - 389
; Salida ; Pos: var21-> Indica e] botón presionado; var22 -> Indica la posición en x; var23 -> Indica la posición en y¡ButtonStatus: el primer bit corresponde al botón izquierdo; (Birttonstatus - 1 se presionó botón izquierdo)¡ el segundo bit corresponde al botón derecho); (Buttonstatus - 2 se presionó botón derecho); el tercer bit corresponde al botón centtral; (Buttonstatus — 4 se presionó botón centra!)¡No siempres se cumple éste orden
rnposicion macro Pos5presente3localcmpjnepushpushpushpushmovintmovmovmovpop
P°Ppoppop
fín;end.m
fin ¡variable localpresentes J ¡ratón presente?
fín ¡noax ¡sbxcxdxax,351;Pos.var21,bxPos.var22,cxPos.var23,dx
dxexbxax
;i
¡función 3 obtener posición del puntero;y estado de los botones
¡estado de los botones¡Coordenada x¡Coordenada y
;/* ni a ero ; mm overa¡ Descripción; Mueve el cursor del ratón a una posición específica de la; pantalla. Las coordenadas usadas son absolutas., en pixeles.; entrada;Moví;; varll, var!2 -> coordenadas x e y de la nueva¡ posición del puntero del ratón¡Aunque las coordenadas se dan en pixels el puntero del ratón se ubica en las¡coordenadas del espacio del carácter más cercano.i; Salida ; Ninguna
mmQvera macro Movl>presente4local fincmp presente^! ¡ratón presente?
APENDICK H - H-390
jne fínpushpushpushmovmovmovintpop dxpop expop ax
frn;endm
;noaxexdxax,4 ¡función 4, mover puntero deí ratón
dx,Movl.varl2 ;51;
; /* Macro ; mpresíonado; Retorna información acerca del botón requerido:; Bstado actual (liberado, presionado); Número de veces que ha sido presionado desde la última llamada; a esta función; Posición del ratón al momento de presionar el botón; Resetea información, de cpnteo y posición; Función 5 del ratón; entrada; buttons -> Sí botón del cual se requiere la información; (O = izquierdo, 1 = derecho, 2 = centro); Salida : Pressed;var31 -> Estado de botón (Activado(1)3Desactivado(0)); var32 -> Número de activaciones desde última llamada; var33,var34 -> Cordenadas x, y respectivamente al momento; de activación del botón; Pressed.var31 entrega el número de veces que se ha presionado el botón desde; la última llamada a ésta función. Si las llamadas son muy cercanas entre; ellas siempre se detctará una sola pulsación. Si se quiere utilizar el ratón; con doble click se debe insertar retardo entre cada llamada para dar el; tiempo necesario al doble click (retardos entre 300 y 600 milisegundos).
mpresionado macro buttons>Pressedspresente£local fín ;variable locai para el macrocmp presente5il ;raíón presente?jne fín ;nopush axpush bxpush expush dxmov ax,5 ;función 5, información de botónmov hx^buttons ;g£querimiento para el botónint 51 t ; ' ''mov Pressed.var319a2^;pasjrresultados a la variable tipo
APÉNDICE H - MOUSEjVSM H - 391
movnsovrnovpoppoppopP°P
fin;endm
Pressed,var32>bx ¡estructura PressedPressed, var3 3,exPre3sed.var34»dxdxexbxax
; /* roacro '• mliberado; "Retoma información de liberación de botórj del ratón; Función 6 del ratón?; entrada: botón -> El botón del cual se requiere la información; Salida ; Relased: var31 •> Estado de botón (Activado(l),Desactivado(0)); var32 -> Número de activaciones desde ultima llamada; var33,var34 -> Cordeladas x, y respectivamente al; momento de liberar el botón5;La diferencia de ésta función con ía anterior es que entrega las coordenadas;del puntero del ratón al momento de liberar el botón indicadomliberado macro boton,Releasedspresente6
localcmpjnepushpushpushpusbmovmovintmovmovmovmovpoppoppoppop
fin:endm
finpresente^! ¡ratón presente?fin ;noaxbxexdxaxj<5 ;bxsbotori ¡Requerirniento para el botón51Released.var313axReleas e d.var32,bxReleased.var33,c?c ;Released.var34,dx;dxex.bxax
; /* Macro : Mxlimit
APÉNDICE H - MOUSEASM H - 392
; Asigna rango horizontal mínimo y máximo para el puntero del ratón.; El puntero del ratón solo se puede mover dentro deí rango; Función 7 del ratón; entrada; Xlimit; vari 1 -> cordenada x mínima de moviminío del cursor; vari 2 -> cprdenada x-máxima de moviminto del cxirsor
Mxlimit macro Xíimit,presente7local fín
presente?, 1 ;ratóü presente?fín ;noaxexdxax,7 ;función 7, restringir área de mov. del punterocx>XKmit,varn ;dx,Xl im.it. vari 2 ;
51dxexax
jne
pushpushmovmovmovintpopP°PP°P
fin;endm
;/* Macro ; Mylimit; Asigna rango vertical mínimo y máximo para el cursor.; Mueve el cursor del ratón dentro del rango; Función 8 del ratón; entrada; Ylimit; vari 1 -> cordenada y mínima de moviminto del cursor; (en pixels); var!2 -> cordenada y máxima de moviminto del cursor; (en pixels); El cursor sólo puede desplazarce dentro de los límites indicados.
Mylimit macro Ylimit5presente8local fíncmp presente^ 1 ;r3"tón presente?jnepushpushpushmovmovmovintpoppoppop
fín ;noaxexdxax,8 ;fínción 8, limites verticales del mov, delex, Ylimit vari 1 ¡puntero del ratóndx,Y]imit.varl2 ;
51dxexax
APKNDICE B - MOTISKASM
fin:endm
;/* Macro ; formacursor; Asigna e! tipo de cursor en modo texto, O — software, 1 = hardware; Cursor software: entrada 2 y 3 son las máscaras de pantalla y cursor; Cursor hardware; entrada 2 y 3 especifican las líneas de inicio y fin
10 del ratón; entrada : hardsoft -> Software, hardware; Cursor; variable tipo estructura; vari 1 -> máscara de pantalla/línea de inicio; var!2 -> máscara de cursor/línea de fin; salida ; ninguna?; Para el cursor "hardware" vari I indica la línea de inicio del cur-;sor dentro del cuadro que comprende un carácter, mientras que el segundo;valor indica la línea final. En este caso el cursor es rectangular. Para mo-;nítor monocromático el rango va de O a 7 y para CGA de O a 14.; Para el cursor "software" los bits de la máscara de pantalla hacen un AND;lógico con el carácter existente en ía pantalla, éste resultado hace un XOR¡lógico con la máscara del cursor y el resultado es el que se presentará en¡pantalla. Cada bit de la palabra de máscara de pantalla y de cursor repre-;senta lo siguiente;; B't Descripción; Q..7 Código de carácter Ascii extendido para la forma; del cursor; 8. .10 Color de presenta ción( Ver atributos para colory; B/N); 1 1 Intesnsidad de brillo (l=alta, O^baja); 12,. 1 4 Color de foi?do(ver atributos); 1$ Parpadeo (1) sin parpadeop (0); Valores recomendados para la máscara del cursor son; TFQQh, FFFFh o en gene¡raí los § bits menos significativos deben ser todos Uno o todos Cero. Para la¡máscara del cursor los 8 bits superiores deben ser cero, con los 8 menos síg-;nifícativos de acuerdo a la forma del cursor deseanda. Para obtener un cursor¡transparente se recomienda la máscara de pantalla 77FFhy la máscara de¡cursor 770Qh
5
formacursor macro hardsoít.,Cursor.[presente9local fincrnp presente?, 1 ¡está presente el ratón?
¡nojnefínpushpushpushpushmov
axbxexdxax,10 ¡función Oah
AP15ST1ICK II - MOUSKA-SM H - 394
roovmovmovintpoppoppopP°P
fín:endrn
bxjiardsoft ;
dx,cursor.varl2 ;51dxexbxax
;/* maero : mmovimiento; Reporta el movimiento en pasos de! cursor desde la última llamada; Función 11 del ratón; Entrada ; Ninguna; Salida: Movemení; var21 -> canteo de pasos en x; var22 -> conteo de pasos en y1
;Los valores de salida indican el número de pasos que se ha movido el¡puntero en el sentido vertical y horizontal desde Ja última llamada a este¡macro.¡Para los ratones más antiguos cada paso representa l/ .IOO de pulgada;(100 mikey/pulgada), los más actuales tienen 1/200 pulgada porpaso (200¡mikey/pulgada, y hasta 320 rnilcey/piilgada para ratones de alta resolución,;no es muy usada.mmovimiento macro Movementspreseníe1.0
local fín ¡variable loca] para este macropresentelOJ ¡ratón presente?fín ;noaxcxdxaxj 1 ¡función 1151
Movemení.var21,ex ¡pasar parámetros de salida a la variableMovement.var22,dx ¡tipo estructura Movementdxexax
cmpjnepushpushpushmovintmovmovpopP°PP°P
fín:endm
;/* Macro: mbriliante; Funciones 13 y 14 del ratón; entrada : Seí -> aclivar(l), Desactivar(O); Activa/Desactiva la Emiilacíój) del ñincionamiento de lápiz óptico
Al'ENDICK II - MOUS&A&U
; (con AH-13 se activa); Entrada; Set: O — activar; 1 = desactivar;esta función no es muy utilizadambrillante macro Setspresente1.1.
loca! fín
H-395
cmpjnepushmovcmpjemov
fínset:intpop
fín:endm
preserfinaxax,13setjlfínsetax,14
51ax
iteUjJ
; Encendido (OH)
; Apagado (OFF)
macro ; MmoveRatioMovimiento pixel a pixel con radio R/8Función 1 5 del ratónentrada Rario ; vari 1 -> determina en la dirección horizontal
cuántos pasos/pulgada requiere moveresefísicamente el mouse para que el punterose desplace 8 pixels
vari 2 -> determina en la dirección verticalcuántos pasos/pulgada requiere moveresefísicamente el mouse para que el punterose desplace 8
;Se recomienda para ua ratón de 2QQMikeys/puIgada usar para Xsize un valor de;8 Mikey/8pixel y para Ysize 1 6 Mikey/Spixel, con esto el cursor cubre ]a pan-;ta!la al rodaren un espacio de 352 x2,Q pulgadas.
Mmoveratio macro Ratio.preseníel^local fíncmp presente!2J ;ratón presente
;nojnepushpusxpushmovmovmovint
fínaxexdxax. 1 5cx,RadxaRa
51
¡función 15x^Ratio.varl 1 ;pasar parámetros de entrada a CX
H -326-
dxexax
poppop
P°Pfin:endm
; Macro ; moculíar; Selecciona el área donde el ratón, permanece oculto; Función 16 del ratón; entrada; Conceal: var31 , var32) var33, var34; -> demarcan los valores izquierdo, dercho, arriba, abajo: del área de ocultamiento
mocultarlocalcmpjnepushpushpushpushpushmovmovmovmovmovintpoppoppop
p°ppop
fín:endm
macro Concea],presentel3finpreséntelo,!
finaxexdxsidiAXJ6;cx,Conceal.var31 ;dx,ConceaI.var32 ;si,Conceal.var33 ;di,Concea!.var34 ;51disidx.exax
;/* Macro : mvelocidad; Asigna la velocidad de desplazamiento del ratón, en mickeys/segundo; para acelerar ]a respuesta al movimiento del ratón; Función ] 9 del ratón; entrada: Speed -> Valor umbral de velocidad desde la que se aplica; la aceleración al movimiento del ratón.; (tvfikey/pulgada);AI momento que e] cursor exeda la velocidad umbral la velocidad se duplica;en algunos ratones mientras que en otros aumenta-de acuerdo a una curva;determinada.
SOJOTÍUI-Qp OAItp-HÍ [3p UUf *
uipuo
Xlí
xpTí
poods'xp¿
xpX13
irg
'^juosojd
ííoddodluí
AO11J
AOUI
i[ündi[snd
oufduio
CUOUKI puppopAiu
WSVJSAOW • H
APÉNDICE H - DESENS-ASM j_[ _ 245
mov al,0repne scasbjne ConParam ¡si no se lo encuentra, hay parámetrosadd • cx,38 ¡poner38 espacios al final del único mnemomov al,1'dec direp stosbmov al,O ;poner un O al finalstosbjmp FinDesDet
ConParam:mov di,bx ¡recuperar el comienzo del mnemotécnicomov cx,8 ¡buscar un espaciomov al,1'repne scasbcmp cx,l ¡en que posición esta el espacio?jb sexta ¡si CX=0, octava posición; mover parámetros
;una posición a la izquierdaje PonSpcFin ¡si CX—1, séptima posición, no se deben movermov cx,di ¡los parámetrosmov ax,es ;ci CX>=2, sexta o menos.mov ds,ax ¡en este caso, mover los parámetros a lasub di,bx ¡derechamov dx,7sub dx3di ¡DX^número de posiciones por mover a la derechamov di,bxmov bx,cx ¡BX-comienzo de los parámetrosmov cx;43mov al, Orepne scasb ¡buscar el fin de stringdec dimov si, diadd di,dxstd ¡dirección inversa
CicDer: lodsbstosbcmp si,bx ¡se llego al comienzo de los parámetros?jae CicDer ¡mover el stringmov al,' '
CicSpc: cmp di,sije PonSpcFinstosbjmp short CicSpc
Sexta: rnov ax,es ¡mover los parámetros una posición a la izq.mov ds,axmov si, di
AEENDICE II - ENSAMBLA-ASM jj _ 247
MODULO ENSAMBLA.ASM
.model small
.486
ÁREA PARA DATOS
.data
transit db 32 dup (?)
mnemo db 'ADdl,0,IPUSh'I6I'POp'í7}'Or',8db !ADc',10H}!SBb!I18H,!ANd'320H!'DAa!,27Hdb 'SUb'a28HJÜAs!í2FH9IXOr's30H,IAAa1,37Hdb !CMp')38H!(NEAr'339H,tFAr1!3AH,lPTrT33BHdb 'BYTe')3CH,!WORd1,3DH,'DWORd133EH)1AAs';3KHdb ÜNtf^HjDEc^Et'SHORI1, SOH/QWORd', 51H, *NOf , 52H, "NEg", 53Hdb !IvrUl1,54H)TlVÍXJl1!55H)!DIV,56H,!rDIV!57H
db lJNAe',72H3fJKbl,73H3f,Tb',72ÍT3'JAe1373Hdb IJz'J74H,IJNzI)75HsIJNaIs76HífINBe(577Hdb 1.TPe',7AHII.TPo',7BHí1.TNGet,7CH,!.TNl',7DHdb IJNg'97EH,'JNLeIí7I!H,IJoIí70H,IJNoI,71Hdb lJcV72H3'.TNcf,73H3tJe!,74H!!.m'eI! 75Hdb 1,TBeT)76H,1Ja!,77H)7s';78H,fJNs'579Hdb 1Jp[I7AH)'JNp!37BH3!Jl137CH3fJGe;7DHd b I J L e ' 7 E H I J "
db 'TESt!,84Hí'XCHgf,86H,IMOV)88K5^Ea',8DHdb rNOp1í90H3'CBw',98H5'CWd1,99H3'CALr59AH;WAIt1í9BHdb rPUSHf39CH3FPOPf39DH3'SAHf,9EH3(LAHf,9FHdb 1MOVSb',OA4H,1MOVSw'3OA5HJ'CMPSb',OA6HI1CMPSw1)OA7Hdb 1STOSb13OAAH3'STOSw',OABH,t-ODSb(,OACH1!LODSw',OADHdb 1SCASbI,OAEH,'SCASw')OAFH,lREt'JOC2H,fRETnt)OC2Hdb 'LEs'3OC4H3rLDs'3OC5H3'RETf,OCAH;rlNtt3OCCHdb !INTo'3OCEH3lIREí';OCEH;lROr;ODOH,1ROr!)OPlH
db rRCr3OD2H3FRCrI,OD3HIfAAjn!3OD4H3!AAd!3OP5H
APÉNDICE II - ENSAMHEA.ASM H - 248
db lXLAt',OD7H,'ESc')OD8HJ'SHl1IODCH)tSHr),ODDHclb 1SA]1)ODCH,1SAr')ODFH,ILOOPNe1,OEOH,1LOOPNz1,OEO?Idb !LOOPe!,OElH3!LOOP7:jOElHJ.OOpt,OE2H,'JCXz',OE3Hclb 1n1)OE4HJ1OUt1,OE6H)1.nvípt,OEAH51LOCk15OFOHclb [REPNe!,OF2H;REPNz^OF2H)!REp1JOF3H)!REPe1)OF3H,1.REPz'íOF3Hdb 1HLt'5OF4H,1CMc')OF5H)lCLc15OF8H,1STc1,OF9Hdb lCIJtíOFAH,lSTil1OFBH,tCLd1lOFCH,ISTdlIOKDHdb OFFH
regs db 'ALCLDXBLAHCHDHBH1
db 'AXCXDXBXSPBPSIDrdb 'EAXECXEDXEBXESPEBPESIEDr
sregs db 'ESCSSSDSFSGS1
loners clb 27H,2FHI37H)3FHJ90H,98H)99H)9BH)9CH,9DH,9EH}9FHdb OA4H,OA5H,OA6H9OA7H,OAAH9OABH,OACHSOADHÍOAEH,OAFHdb OCEH,OCKHJOD4HÍOD5H,QD7Hdb OF4H9OF5H,OF8H1OF9H9OFAH,OFBH9OFCHSOFDH
oners db 6,7,40^480,52H, 53H, 54H, 55H, 56H, 57Hdb 70H,71H!72H,73H)74H,75H,76H577Hclb 78H)79H,7AHÍ7BHÍ7CH,7DHJ7EHJ7FHclb 9AH,OC2HJOCAI1J,OCCT-I,OEOH,OE1H)OE2H5OE3H,OEAH
ÁREA PARA CÓDIGO
.code
NEsp equ 10delspc proc near
;Este procedimiento salta los espacios y los TABs en el string por;ensamblar y deja SI apuntando al primer byte que no sea un espacio.5
¿Entrada: DS:SI apunta al punto del string desde el cual; se desea proceder.¿Salida: DS:SI apunta al primer byte que no es un espacio.; GY es 1 si hay más de NEsp espacios (error), en; cuyo caso DSrSIno es alterado
push. axpush expush bpmov cx,NEspmov bp,si
¿máximo NEsp espacios
APÉNDICE R - ENSAMBLAASM I I - 249
busc: loclsbor al, aljz errdelcmp al,''je spaccmp al,9jne encont
spac: loop busc
errdel: mov si,bpstcjmp short findl
encont: dec sicíe
findl: pop bppop expop axreln
delspc endp
;si se llega al final del stringun espacio?
;si, saltarlo;bay un TAB?;no, hecho
;saltar el espacio y ver sig. car.
;apuntar al carácter válido
encnem proc near
í
;Este procedimiento encuentra el pseudocódigo del mnemotecnico que está al;comienzo del string por ensamblarse.
3
;Entrada: DS:SI apunta al string, que debe terminar en 0., ES:DJ es la dirección en donde se pondrá el pseudocódigo.
•>;Salida: DS:SI apunta al final del mnemotecnico 4- 2 en el string si; este .fue encontrado (pues debe terminar con espacio); ES:DI apunta al final del pseudocódigo + .1; CY es J si el mnemotecnico es inválido o si hay error; como en DELSPC 3 en cuyo caso DS:SIy ES:DIno son; alterados (excepto si había espacios désele DSrS.T); AX contiene el pseudocódigo (AL=0, AH== cod.)
calijepushpushpushpushmovmovmovmov
delspcfinenc2bxdxesdiax,@dataes,ax
;encontrar el mnemotecnico;en caso de error, terminar
;hacer que ES;DI apunte a los mnemotécnicosdi, offset mnemodx,si ¡preservar el comienzo del mnemotecnico
APÉNDICE H - ENSAMBLA-ASS,!
pop esfínenclipop dx
pop bxfinenc2:retnencnem endp
public encregencreg proc near
H - 251
;Este procedimiento encuentra el código del registro al que apunta DS:SI.í;Entrada : DS :SI apunta al ascü del registro
¡Salida: DSiSIes cambiado según DELSPC; AH es alterado; AL código de] registro; CY 1 si no es un registro o si hay error de DELSPC
cali delspcje finencreglpush expush bxpush espush di
;si hay demasiados espacios, fm
mov ax,@datamov es,axmov dijOffsetregs japuntar ESJ3I a la tabla de registrosmov JiaXjlsiJ ;LCanc! Eax,0dfdfdfh
mov cXj24srchregrmov Ebx,es:[di]
cmp ex, 8jbe rupOcmp ax,bxje foundreginc diinc diloop srchregstc ;si no sejmp shorl: errreg
rupO: and ebx,0fffirrhcmp eax,ebxje foundreginc diinc diinc diloop srchreg
JDJü-J JADO aso.;en mayúsculas
;de la tabla
lo encontró, error
AEETÍDICE H - ENSMEBLA-ASM H-253
malsreg;stc ;si no se lo encontró, errorjmp short errsreg
foundsreg:mov al,[si+2] ¡tercer carácterand aljOdfh ¡hacerlo mayúsculacmp al,'A1 ¡si es una letra, maljb oksregcmp al/Z1
jbe malsregoksreg: mov al,6
sub al,cl ¡encontrar el código del registroor al,40hcíe
errsreg:pop dipop es
finencsreg:pop ex
finencsregl:retn
encsreg endp
ascahex proc near
¡Esle procedimiento transforma el string en AX (con AL = MSD) a un byte¡en AL, CY = 1 si no hay tal hex en AX.
push excmp ah,'fja errhexcmp ah,'a'jb tstaland ah,0dfh
tstal: cmp al}'fja errhexcmp al,'a1
jb trnsand al,0dfh
trns: cmp ah,'A'jb numahsub arVA'-'9'-l
numah: cmp al,'A* ¡lo mismo con ALjb numalsub aVA'-'9'-l
numal: sub ax,'00' ¡pasar de ascii a numéricocmp al, 16jae errhexcmp ah,16
;transfonnar el carácter en AJí a mayúscula
¡transformar el carácter en AL a mayúscula¿ajusfar el carácter en AH si es alfabético
APÉNDICE H - EHSAMBLAASM ÍI - 254
jae.movshíorcíejmp
errhex: stcíinhex: pop
retnascahex endp
errhexc],4al,c1al,ah
short íinhex
ex
;condensar el número
esletr? proc near
;Este procedimiento determina si el carácter contenido en. AL es un. dígito;o una letra, en cayo caso CY - O, y de lo contrario, CY = 1.¿AL es alterado.
cmp al/O'jb noesltcmp a!3'9'jbe siesltand al,0dfh ¿mayúsculacmp al,'A'jb noesltcmp al}'Z'jbe sieslt
noeslt: stcretn
sieslt: cíeretn.
esleír? endp
public eshex?eshex? proc near:
¿Este procedimiento determina si el string al que apunta DS :SI es un número¿hexadecimal, en cuyo caso encuentra su valor.3
¿Entrada: DS:SI apunta al string. excluyendo signos +, - o espacios
¿Salida: AL = 16 si el número es de 1 o 2 dígitos, 32 en otro caso; AH = longitud del string del número; BX = valor del número; CY = 1. si lo apuntado por DS:ST no es un número o si es un; número de mas de 32 bits
APÉNDICE H - EKSAMBUVASMH - 255
pushxor
trycero:cmpjneinc
jmpnoceroin:
movorjzmovmovcalijncmovxorjmp
noproblem:movcalijemovcalijemovcalije
movcalijestcjmp
N4Dig: movcalijemovmovcalijemovmovmovjmp
tresdigrmovmovcali
dxbx,bxbyte ptrfsi-i-bxyO' ¡buscar ceros inicialesnoceroinbx ;short trycero
contarlos en BX
dh,bl ¡número de ceros er¡ DHbx,bxnoproblemah,fsi4-bx]al,'G'
ascahexnoproblemax}16bx,bx ;fmnum
al,[si+bx+l]esletr?undigal,[si+bx+2]esletr?doscligal,[si+bx-i-3]esletr?tresdig
al,[si+bx+4]esletr?N4Dig
short errnumax,[si+bx]ascahexerrnumd1sa1ax,[st+bx+2]ascahexerrnumb1,albh,dlax,420hshort fínnum
;si no hay ceros iniciales
¡si el stríng era solo ceros, ya no debe;haber mas caracteres hexadecimales válidos
salir con cero
¡tiene más de 4 dígitos?¡no, OK
¡si, error
¡el número tiene 4 dígitos
¡AL-32, AH-4
alj'O' ¡número de tres dígitosah,[si-t-bx]ascahex
APÉNDICE H - EKSAMBLA.ASM H - 256
JC
movmovcalijemovmovmovjmp
dosdig: movcalijemovxormovjmp
undig: movmovcalijemovxormov
finnum: addcrnpjbemov
longbyt:clcerrnum: pop
retneshex? endp
esreg? proc
errnumdl,alax,[si4-bx-Kl]ascahexermumbl,albh5dlax,320h ;AL=32, AH-3short finnumax,[si+bx] ;número de dos dígitosascahexerrnumbl,albh,bhax,210h ;AL=16, AH=2short finnumal,'0'ah,[si-i-bx]ascahexermumbl,albh,bhax,110h ;AL=16, AH=1ah,dh ;ijicluir]os ceros en la longitudah,2longbyl:a1,20h
dx
near
;Este procedimiento es similar al anterior: encuentra si el slring al que;apunta DS:SJ es uno de ]os registros BX, BP, SI o DI.5
¿Entrada: DS:SI apunta al string excluyendo signos (-f o -) y espaciosi;Salida: CT=1 si hay error, caso contrario:; AH = 2 (longitud obvia del slring); AL-] si SI; 2 si DI; 4 si BX; 8 si BP3 -
mov ax. [si]
APÉNDICE H - ENSAMBIAJiSM - 258
shlmovcaliJclodsbcmpjnecalijnc
errml: jmpnopref: xorcorchetes:
xorxormovlodsbcmpjnecalijecmpjneinccali
Jc
analiz: calijemovjmp
noh.l : calijnc
errm2: jmptstmin: cmp
jneinccali
Jc
calijenegmov
rdynum: xortest
J7-movxoradd
al,cldh,aldelspcerrml
al,':'errmldelspccorcheteserrmemdh,dh
dl,díbx,bxcx,bx
«VE1errmjdelspcerrmlbyte ptr[sitstminsidelspcerrmleshex?nohlcx,bxshortrdyresreg?rdynumerrmembyte ptrfsi.analizsidelspcerrm2eshex?errm2bxcXjbxoll,aldl,alerrm2al,ahah,absi,ax
en dh
;hay los dos puntos reglamentarios?:no
¡codificar inexistencia de sreg
jinicializar primera parte del código;inicializar desplazamiento
;el carácter actual debe ser eljcorchete reglamentario
;no;si, ignorarlo
;hay un número hex?;no;si5 preservar su valor
um;hay un registro reglamentario?
;no, error|,'-';inicia con un signo -?
;no;si, lo siguiente solo puede ser un número
¿encontrar el negativopreservarlo
;poner el bit correspondiente en DLjestaba ya puesto, implicando duplicación?
;si, errorjlongrtud del string
;ajlistar SI
APÉNDICE H - ENSAMBLAJVSir II - 260
jnc rdynumSerrm4: jmptstmin3;cmp
jnecalijecalijenegmov
rdynurn3:xortestjzmovxoraddcalije
lodsbcmpjne
condensar:movandcmp
Je
movandcmpjemovandcmpjemovand
jz
xortestjnzmovxorandcmpjne
errrnemal,'-'errrn4dels'pcerrm4eshex?ernm4bxcx,bxdl,aldl,alernn4al,ahah,ahsi,axclelspcerrm4
al,']'emn4
al,dlal,3al,3errmemal, dia!512al,12errmemal, dial530haUOherrmemal,dla],3fherjinem
íih,ahdl,2sbOal,dlal,lal,5al,5biri
jdespues de un - solo puede haber un número
¡poner el bit apropiado¡duplicación?
;si, error¡longitud leída hasta ahora
; a justar SI
¡ya se ha leído 3 cosas, debe haber;un corchete Analizador
¡determinar si el código;en DL es incongruente¡si DL = OOKEDCBA, entonces
;error - + AB + CD -i- EF
¡inilicializar código condensado:bitO=~AC + B
dpU9 UI3UIOU3
XE
xqxoxpdq
dq'isuiouiugijous
¿(o>o + £L + y) =
puoouy
St*lPpuooug
¿'le
9C'IP
V)
a-o- +
iqs
doddoddoddod
dod :uiouiuE|:o;s
AOUI :U13UI-I-I3
duifop
MSOiS
AOUI
AiSOJS
JO
AOUI
AOUI: puooutiJO
zfptte
zfIS91
JO
AOUI
zf
9f
duiopUE
JOX
AOUI
JO
zufpue
AOUI
AOUI
jo :[qszuf
pUG
AOUI
zuf
jo :oqs
~ H rsswiaiws!¿a - H
APÉNDICE H - EKSAMBLAASM
stosbmov ax;bxstoswjmp shortnoerrhex
unbyte: rnov ah,blstossv
noerrhex;cíe
fin en cheje:pop dxpop bxpop axretn
enchex endp
enspasol proc near
ir _
;Este procedimiento ejecuta el primer paso de compilación, es decir, la;traducción de un stríng alfanumérico a seudocódigos que serán transfonnados;a código verdadero por otro procedimiento.3
;Entrada: DS:SI apunta al string por compilarse, que debe terminar; enO.; ES;DI apunta al lugar donde se desea el seudocódigo3
;SaIida: DS:SI es alterado; ES;DI es alterado\^ set si hay error
push. axpush bxpush expush dxcali encsreg ;es la instrucción un prefijo como ES; ?je nosregpref ;noinc si ;si, proceder en consecuenciainc sicali delspcmov ah,al ;preservar códigolodsbcmp al,';' ;por sintaxis, debe haber :jne errpasolmov a!3ahstosbjmp short bienpasol
nosregpref:
APÉNDICE H - H - 264
calijecmpjbcmp
J9
calijecalijecmpjbcmpJacalijecalijecmpjbcmpjbe
noprefir:cmpjbcmpjbecmpjecmpje
bienmneimovmovmov.movmov
lone?: cmpjej'ncloopjmp
eslonenmovmov
calijnc
encnemerrpasolah,0íí)bnoprefirah,Gf3hnoprefirdelspcbienpaso.1encnemerrpasolab,0ívhnoprefírah.OShnopreflrdelspcbienpasolencnemerrpasolah,OíDhnoprefirah,0r3hencaso 1
ab,39hbienmneah,3eherrpasolah,50herrpasolah,51herrpasol
dx,dsbx,@datads,bxbxs offset 1cx,35ah;[bx]eslonerbxlone?sh orí bayads}dxbyte ptr es
delspcerrpasol
;lo primero debe ser \m mnemotécnico
;es un prefijo RGP o LOCK?
;si, buscar siguiente mnemotécnico;si no -hay más que el prefijo, terminar
;es un segundo prefijo KEP o LQCK?
;si, buscar siguiente mnemotécnico;si no hay mas que el segundo prefijo, terminar
;no puede haber un tercer prefijo
;el mnemotécnico inicial no puede ser NEAR,;PTR, BYTE, etc
¡preservar .DS
¡averiguar si el mnemotécnico es uno cíe los¡que no aceptan argumentos
/
byte ptr es;[di-2],l, ¡marcarlo como loner¡apuntar al punto inmediatamente después
¡del mnemotécnico y buscar el fin de slring¡si hay mas caracteres válidos, error
APÉNDICE H - ENSAMBLA.ASM H-265
bienpasol:mov ;stosbcíejmp short finpasol
errpasol:stc
finpasol:pop dxpop expop bxpop axretn
hayarg: movmov
one?; cmpjeincloopjmp
esoner: movcmpjecmpjne
admitedp:ormovjmp
solouno:movjmp
dosarg: xorargs: mov
calijnccmpjecmpjecmpjejmp
enarg: calijnccali
bx, offset onerscx,35 ;averiguar si el mneinotécnico es uno de losah,[bx] ;que aceptan un solo argumentoesoner ;sibxone?shortdosíirgbyte ptr es:[di-2],2 ;marcar)o como onerah,9ah ;CAUJ?admitedp ;si, puede haber dos puntosah50eab ;,TMP?solouno ;no
byte ptr es:[di-2],4 ;marcarlo como JMP o CALLcl,2 ;rnarcar que puede haber un argumento dobleshort args ;de dirección absoluta
cl,.l. ;marcar que debe haber solo un argumentoshort argscl,cl ;marcar que debe haber dos argumentosds}dxdelspcenarg ;confinnar presencia de argumentosah,0c0h ;suno presencia solo es admisible conbienpasol, ;KET, ,RETN o RETFah,0c2hbienpasol.
bienpasolshort errpasolencmem jbuscar argumentossegargencreg
APÉNDICE H - ENSAMBLAJE! H-266
jestosbincincjmp
noreg] ; calijestosbincincjmp
nosregl;calljnccalijecalicalijnccalije
segarg: orjzcalijecmpjnelodsbcmpjnecalijejmp
hay dos: calijelodsbcmpjnecalijnccalijestosbincinc
bienj : jmpnoreg2: cali
noregl
sisishort segargencsregnosregl
sisishort segargenchexsegargencnemerrpasoj.encnernencmemsegargenchexerrpasolel, el ;<hay dosdelspcbienlcl,2 ;errpl
;s(al,1:1 ;s(
errplenchexerrplbienpasoJ
delspcerrpl
al// ;elerrplencmembienlencregnoreg2
sisibienpasolencsreg
;buscar por ejemplo BYTE PTR
;el PTR es opcional
;puede también ser un número (para saltos)
;dos argumentos?;si
;no, uno solo
;era JMP o CATX?;no
;solo se admiten dos argumentos aquí si están;separados por :
;si hay un solo argumento, error
;el separador entre argumentos es la coma
jbuscar segundo argumento
APÉNDICE H - ENSAMBLAAS&I H - 268
pushlodsbcmpjemovmovmovshrmovjzdecjzdecjzdecjzdecjzlodswJTTlp
esd*ttob:lodsbxor
;fin de instrucción?
esinsínlodsbjmp
esregis:movandmovjmp
essregi;movandmov
;obtener el tipo;en DL
esmemonmovmovshlandandorlodsbxchgmov.lodswrnov
rdytipo:clcjmp
ex
31,00}!
finjnstch,ahah,alcl,5al,c]d1,3lesinstra]esregisa]essregíalesmemoralesdatab
;es dato de wordshortrdylipo
;es dato de byteah,ahshortrdytipo
;es mnemotécnicoshortrd}4ipoal,ah ;es registroa1,0fhah,chshortrdytipoal,ah ;es registro de segmentoa1,3ah,chshortrdytipo
a],ah ;es memoriac],3
al,c1a1,0c0hah,7ah,al
al,ahbx,ax
ex, 4
shortfintipo
AFENDICE K - EHSAMBIAASM n 7^0
fir)1ipo;pop exretn
tipo endp
getpref proc near
:~ ~
;Este procedimiento obtiene el prefijo de redefínición de segmento a partir;del número de registro de segmento.
;Entrada: BH - xP Srxxxx con P ~ presencia de prefijo
5
;Salida: AH = O si no hay prefijo, o; prefijo5 -
xor ah,ahtest bri,40hjz fingtpmov ah,bhshr ah,land ah318hor ah,26h
fingtp: retngetpref" endppref? proc near
3
;Este procedimiento determina si debe incluirse un prenjo de redennición;de segmento antes del opcode, del cual solo debe haber j. byte, y ES:I>I:debe estar apuntando a la dirección siguiente a dicho byte. Haceía;inclusión y íos ajustes del caso de ser necesario.
3
;Enírada: ÁH O si no debe haber prefijo; opcode del prefijo en caso contrario; BSfDT dirección de] byte de opcode + 1
;Saiida: AL es inalterado o contiene el opcode; 1)1 es ajustado; CX incrementado en I sí hay prefijo
cmp ah.0 ;hay prenjo?je noprefíjomov aí,ah ;si, ajustarxchg al,es:[di-l']sfosbinc ex
noprefijo:retn
pref? endp
M - KKsÁMHuuüíaa. H - 270
sízedisp proc near);Determina dados los bits 6 y 7 de AL, que debe tener el byte de modregr/m,;el tamaño en bytes de] desplazamiento u offset. Luego incluye este¡desplazamiento en el opcode.
í
;Entrada: DL o DX desplazamiento; AL byte de modo de direccionamíento; ES:DI apunta al lugar del opcode donde va el desplazamientoj;Salida: AX es alterado; ES:DI es ajustado; CX incrementado según el desplazamíento3
test aljOcOh ;obtener el moujz despí? ;sí es 00, averiguar sí hay desplazamientoand al,0c0íícmp al,OcOTi ;es 1.1?je nodesp ;si, tampoco hay desplazamientoinc excmp a]340h ;es 01?jne dosbyt ;nomov al,di ;si, desplazamiento de un bytestosbjmp short nodesp
despJ?: and al,7 ;si mod ~ 00 y r/m = 110,cmp al,6 ;el modo es directojne nodesp
dosbyt; mov ax,dx ;desplazamiento de dos bytesstoswinc ex
nodesp: retnsuedisp endp
sizedata proc near5 —
;Similar al anterior: detennina el tamaño del dato según el bit O de AL: y lo;coloca en el opcode.
;Entrada: AL su bit O es w; BP dato; ES:OT apunta a] lugar del opcode donde debe ir el dato5
;SaIida: AX es alterado; DT es ajustado; CX incrementado según los datos
APÉNDICE II - EKSAMBLAJVSM H-271
me extest al, 3 ;w^mov ax,bpjnz dosdata ;sistosb ;nojmp short fsdata
dosdata :inc exstosw
fsdata; retnsizedata endp
modrm proc near
;Este procedimiento analiza el pseudocódigo de modo de direccionamiento y;genera datos necesarios para ]a compilación.
3
;Entrada: DS:SI debe apuntar al pseudocódigo de modo de dir.
Salida: AHBLBHDXCLCHCT
prefijo de redefinición, de haberío., o O
- hOOOOOOw; h-vaJidez de wdesplazamiento, de haberlo; si no, es alterado
incrementado en 1 si no hay error-Oset si hay error, en cuyo caso Jos registros
quedan inalterados
5
pushpushpushpushpushpush]odsbdectestjnzca]J
Jc
cmpjbjecmpjamovjmp
bytptr: mov
bxexdxsibpax
sial,0e0bmrmnomnetipoerrmodrmal,3cherrmodnTíbytpíral,3eherrmodrmdh,81h
short elptrdh580h
;mnemo?;no
;BYTE?
;WORD o DWORD?
;marcar word
;m arcar byte
APÉNDICE H - ENSAMBLA-ASM Hf-273
pop bppop sipop dxpop expop bxstcretn
modnn endp
modregrm proc near
;Este procedimiento genera datos necesarios para el ensamblado de instrucciones;que Tienen dos operadores (como ADD), dados los pseudocódigos generados en e];primerpaso de compilación.i
;Entrada: DS:SI debe apuntar a los pseudocódigos de Jos operadores.
ALAHBLDXCXCY
;SaIJda: AL - OOOOOOdwprefijo de .redefinición, de haberlo, o Obyfe de modo de dirección amientodesplazamiento de haberlo, si no; es alteradoincrementado en 1 si no hay errorset si hay error, en cuyo caso los registros quedan
; inalterados3 " " "
push axpush expush dxpush si.push bppush bxJodsbdec siand al,0e0hcmp al,20h ;reg?jne mrrnoregcali tipocalJ modrmje ernnrrcali arreglaje emnrror a\2 ;d=ljmp short bienmrr
mrrnoreg:cali modrmje crrmrrmov bp,dx
APÉNDICE H - EHSAMBLA-ASM H-275
errarr: stcretn
modregnn endp
modrmdata proc near
;Similar al anterior, cuando el segundo operador es un dato inmediato. Produce^resultados diferentes si el primer operador es un acumulador.5
;Entrada: AL = xxCODxxx; DS;SI debe apuntar a los pseudocódigos de jos operadores
; Salida: ALAHBLDXBPCX
ALBPCX
- OOOOOOswprefijo de redefmición, de haberlo, o-mdOOOr/mORCODdesplazamiento, de haberlo, si no, esdataincrementado en 1 si no hay error
o:- OOOOQlOwdatainalterado
0
alterado
CY set si hay error, en cuyo caso los registros quedaninalterados
pushpushpushpushpushpushmovlodsbdecmovandcmpjnetestjnzlodsbmovcalicmpjbje
exdxsibpbxaxch,al
siah,alal;20h ;reg?a1,20hnoacah,7noac
bl,altipodi, 4 ;dato?errmrdmrdok
APÉNDICE K - ENSAMBLAJE!H - 276
testjnzcmp
j»mrdok: mov
movandshrshrshrormovpopmovaddpop
POP
relnnoac: mov
calijemovmovmovcalicmpjbjneor
nosext; test
jztesl:jnzcmpjnecmpjajmp
mrdnoesp:andorcmpjneor
mrdmok: xchgmovand
bl,8mrdokax3255errmrdbp,axa],b]al, 8a1,laUíi!5lat,4bl,alaxalbisp,6dxex
al,chmodrmerrmrdch,alal, dibp,axtipodl,4 ;derrmrdnosextbh,2 ;sbh,80hmrdnoespbh,lmrdmokdi, 5mrdmokax,255errmrdshort mrdmok
bh,2bh,80hdi, 5mrdmokbh,l
bp,axdl,alch}38h
;sign exTend; s=l¡definido size?
APÉNDICE H - ENSAMBLAJE! H-277
ormovandaddmovpopmovxoraddcíeretn
errmrd: poppoppopPOP
poppopstcretn
modrmdata
bl,cha!5bhal,3sp,2ch,blbxbl,ch
ch,chsp,8
axbxbpsidxcx
endp
delplr proc near
;El mnemotécnico PTR es innecesario en todos los casos. Si DS:SI apunta;al pseudocódigo de este mnemotécnico, este procedimiento lo salta y deja;a ST apuntando al siguiente pseudocódigo; en otro caso, no hace nada.3
noptr:siplr:
delptr
pushpushpushpushmovcalijeorjnzcmpJe
movpop
Poppoppopretn.endp
axbxdxbpbp,si
tiponoptrdi, di.noptral,3bhsiptrsi,bpbpdxbxax
jmnerno?
;PTR?
APÉNDICE H - ENSAMEIAASai
jmpsh? proc near
H - 278
¿Este procedimiento determina si la distancia entre AX y DI esta entre¿+.127 y -128, en cuyo caso pone esta distancia en AX y CY = 0; de lo;conlTario3 CY = 1.
^sub ax,di.cmp ax3127jg notshrtcmp aXj-128j1 notshrtcíeretn
noíshit:stcretn
jmpsh? endp
enspaso2 proc near3 -
;Este procedimiento ejecuta el segundo paso de compilación, es decÍTj la•traducción de los pseudocódigos a un código verdadero.3¿Entrada: DS:SI apunta al pseudocódigo; ES:DI apunta al lugar donde se desea el código3
¿Salida: DS:ST es alterado; ES:DÍ es ajustado; CX longitud del código; CY set si hay error, en cuyo caso los registros; quedan inalterados3
pushpushpushpushpushpushpushxor
starlp2;calljeorjnztestjzcmpje
axbxdxbpsidiex
cx,cxtipoer2dl,dlprsrg?ah,]noeslona!50d4hdosb
¿longitud inicial = 0¿determinar tipo de pseudocódigo inicial
;es una instrucción?¿no, puede ser sreg¿es un íoner?
¿no¿es AAM?
¿si
APÉNDICE H - ENSAMHULASM H - 279
cmp al,0d5h ;es AAD?jne unb ;no
dosb: mov ah,0ah ;es AAM o AAD, instrucciones cuyo opcode esstosw ;de 2 bytesadd cx,2 ;incrementar longitud en 2jmp bienpaso2
unb: stosbinc exjmp bienpaso2
prsrg?; cmp dl,2 ;sreg?jne er2 ;no, errorshl aJ,lshl al,]shl al,lor a!326h ¡hallar el prefijostosbinc exjmp bienpaso2
er2: jmp errp2
n oeslon ;cmp al, 70hjb nojcondcmp aljTfhja nojcond
saltorel: ;stosbcalijecmpjbdec
;es un salto condicional?
tipoer2
er2ax
¡lo siguiente es data?;no, error
caD jmpsh? ¡calcular distancia relativaje er2 ;y determinar si el salto es posiblestosbadd cx52jmp bienpaso2
;LOOP o .TCXZ?
;LEA?
nojcond; cmpjb nolpjcxcmp a!50e3hjbe saltorel
nolpjcx:cmp al,8dh.jne diflea
regmemdisp:stosbcali modregrmje er2
¡hallar el código de los argumentos
APÉNDICE H - EKSAMBr.AJ\SM: H - 2SO
cmp al, 3jne er2cali pref?mov al,blstosbcali sizedisp.inc ex
bp2; jmp bienpaso2diflea: cmp al,0c4h
jb noldslescmp a],0c5hjbe regmemdisp
;d y w deben ser 1
;byte de modo de direccionamiento
;LDSoLES?
noklsles:cmp al,0fl)hcmp al,(ffi)h ¡prefijo REP o LOCK?jb alterablescmp al,OBhja alterablesstosb ;si, incluir el prefijoinc exlodsbcmp al,0f£hje bp2dec sijmp startp2 ¡empezar otra vez con lo que sigue al prefijo
alterables:testjnzjmp
sioner: testjz
nojc: cmp
non: cmpjamovlodsbdecmovandcmp
movcalije
ah,2sionernoonerah,4nojcjmpocallal,0c2hnoriretointa!,7nopushpopdb,al
sibl,albl,0e0hbl,20hppregal,dhmodrmppnomem
;oner?
;JMP o CAUL?
;es oner.;si no es .RET o INTT
;PUSH o POP?;no
;reg
;no5 mem?;no
APÉNDICE II - ENSAMBIJLASM H - 281
cmp bri,80hje er2acmp al, 7mov aís8:Sxje espoplmov a]sOfíh
espopl: stosbinc excali pref?cmp a],8fhje espop2or bl,30h
espop2: mov al;blstosbcaJJ sizedíspjmp bienpaso2
er2a: jmp errp2
ppnomem :call tipocmp d],0je er2acmp dl54jae er2ashJ al,lshl al, 1shi aUor al, 7crnp dhj7je espop4and al,0feh
espop4: stosbinc exjmp bienpaso2
ppreg: test a!58jz er2aand alj7or al,58hcmp dh,7je espop3and aj,0f7h
espop3: stosbinc exjmp bienpaso2
nopushpop:cmp a!348h
;si, ñ^l?;no; error;POP?
;si3 dejar su código;no, código de PUSH
^OP?
;no} compensar bytt de direcc,
;es sreg
;reg de .16 bits?;no3 error
;dejar solo Jos tres LSBits;poner header del byte
;ÍNC o DEC?
APÉNDICE H - ETTSAMBLA-ASM H-282
jamovlodsbdecandcmp
movcal]
noin edec-án, al
sialjOegha!528hincdecregal»ahmodrm
;reg^stro de .16 bits?
orxchgstosbcal]cmp
oresincl:mov
síosbcaliinc
bh,80her2abh,0fehbh,al
pref?bh,40besinclbl,8aj,bl
sizedispex
jmp bienpaso2
incdecreg;lodsband al, 7or a!3ahstosbinc exjmp bienpaso2
noincdec:cali modrmje er2atest bh,80hjz er2bor bh,0f6bxchg aí5bh.stosbinc exmov al,bhand al, 7shl al,lshl al,],shl al,]
;debe especificarse size
¡guardar código
;INC?
¡aislar registro
;esNOToKEGoetc.
;debe especificarse el size
;guardar código
APÉNDICE H - ENSAMHLAASM j_j _ 283
or al3bl ¡obtener byte de dir. completostosbcali sizedispjmp bienpaso2
er2b: jmp errp2retoint:cmp al}0cch ;TNT?
jne esret ;nocali tipo ;sicmp di,4- ;lo siguiente es un dato?jb er2bcmp ax,255ja er2binc excmp al,3 ;INT 3?je esint3mov ah,al ;no, dos bytesmov al,0cdhstoswinc exjmp bienpaso2
esintS: mov al,0cch ;si} un butestosb
bienpaso2
esret; inc ex.mov b1,al ¡preservar códigocali tipojnc conoff ;si no hay un fin, con offsetmov a],bjinc al ;opcode adecuadostosb
bp2a: jmp bienpaso2conoff: cmp dl,4
jb er2b ;error si lo siguiente no es un datojne retvvo ;si e] dato es wordmov ah,almov al,blstoswinc excmp aí,0c2h ;RETN?je bp2axor al,al ;no, un byte masstosbinc exjmp bienpaso2
relwo: cmp bl,0c2h ;RETN?je peque?
APÉNDICE H - ENSAMBLAASM H - 285
jmpesfar: movlatalista:
calicalijecmp
short latalista
delpírtipoejdl,2
cmp dl,ljne cualargtest al, 8jz ej
cualarg:cmp d1,4jae jdatjmp jnodat
jdat: push dxpush axcali tipoje jclat8ol<5cmp di, 4
jdat32axdxerrj
jdat32: mov bx,axpop axpop dxcmp dh,lje errjcmp dh,2je errjxchg a19chstosbxchg ch,alxchg ax,bxstoswmov ax,bxstoswadd c!35jmp shortjbien
poppopjmp
;sreg?
;reg?
;de!6bits?pío, error
;datos?
;s
;dos datos?
;dato de 32 bits
;short?
piear?
;solo en este caso, el código es inalterado
poppopcmpjecmp
axdxdh,3errjdh,2
;far?
;near?
APÉNDICE H - EKSAMBLA-ASM H - 286
jnearcmpJe
cmpjnesubcalijnedecjmp
jnear: subsub
yaresta:movcmpjeinc
escalll :xchgstosbaddxchgstoswJmP
jsh?; cmpjnesubsuborjzcmpjne
jshort: movmovstoswincinc
jbien: xorjmp
errj: xorjmp
jnodat; cmpjneorjnemovmov
dri5.ljsh?chjOeah ump?jnearax,2jmpsh? jcalcular distanciajsíiortaxshortyarestaax,3ax,dibl,0e8hch;9ah ;caU?escalllb]bl,al
cí,3a1,bl
short jbienchjOeah ymp?errj ;solo se admite SHORT en JMPax52ax,diab,ahjsbortah?0ííherrj
ab,alal,0ebh
elel
ch5chbienpaso2ch,cherrp2
dl,l ;reg?noregl6dh,dh pío debe haber restricciones de BYTE PTR, etcerrjb1,alal,0ííh.
APÉNDICE H - ENSAMBLA-ASM H - 287
stosbincmovandorcmpJeorjmp
esjmpreg:or
íjcl: stosbincjmp
noregl,6:cmpjesubmovpushpushcalimovmovincincPOPjetesl
jztest
jznoesps: cmp
jneor
nojfar: movstosbinccalicmpjeorjmp
esjmpmem:or
fjm: movstosbcali
5
elal,blal,7al,0c0hch,0eahesjmpregal, 3 Ohshort fjd
al,20h
elshortjbiendh,lerrjsi, 4al,dhbpexmodrmbp,spch.Cbp+.l]spspbpenjbhs80hnoespsbh53errja1,3nojfarbl,8a],0£Eh
elpref?ch,0eahesjmpmemb1,l,0hshort fjm
bl}20hal,bl
sizedisp
opeo de = FF
;aislar número;mod = .1.1.ymp?
del registro
;es rnem, short es inadmisible
¡restaurar pseudocódigo
¿especificado size?;no, \vord por defaulr
;word?
;far?
;m arcar FAR;opcode
yrnp?
APÉNDICE H - EKSAMBIAASM H-288
jrnp shortjbien
nooner: cmpjaemovcalijeorstosbcalimovstosbcaliincjmp
er2h: jmpconinmed:
cali
Jc
testjzorstosbcaliincjmp
sinacc: orstosbcalixcbgstosbcalimovshrxorcaliincjmp
mayque40h:cmpjnecalijeandorstosbinc
al,40hmayque40hbh5almodregrmconinmedal,bh
pref?al,bl
sizedispexbienpaso2enp2
modrmdataer2halj4 joperación con acumulador?sinacc ;noa1,bh
sizedataexbienpas<?231,801
pref?bl}al
sizedispal,b1al,].al,lsizedataexbienpaso2
a!384h ;TEST?noestestmodregrmtdat?al,].al,84h ;generar código
ex
APÉNDICE H - ENSAMBLAASM H - 289
calimovstosbcal]J^P
tdal?; xorcalijetestjnzorstosbinccal]movmovstosbcal]movcalijmp
taccd: andorstosbinccalijmp
noestest:cmpjnecalijeorjzcmp
Je
cmpjaecmpjesubjmp
xreg: testjnzdecjmp
pref?a1,bl
sizedispbienpaso2al, almodrmdataer2fal,4taccdal,0féh
expref?bh,alal,bl
sizedispal,bhsizedatabienpaso2a1,lai,0a8h
exsizedatabienpaso2
al,86b ;XCHG?noesxchgtipoer2fdi, di ;mnemo?er2f ;si, errordl,2 ;sreg?er2f ;si, errord1,4 ;datos?er2f ;si, errordi,] ;reg?xregsi, 4 -noshortxmergal, 8 ;regde 16 bits?xr.1.6si ;noshortxmerg
APÉNDICE X - ENSAMHIAASM H-290
xr!6: movcali
Jc
orjzcmpjecmpjecmp
Je
subjmp
er2f: jmpx2reg: test
j^cmpjecmpjesubjmp
rgenab: movrgenal: and
orsíosbincjmp
xmerg: calijeorstosbinccalimovstosbcalijmp
noesxchg:cmpjejmp
ah,altipoer2fdl,dler2fdl,2er2fdl,4er2fdl,lx2regsi, 5short xmergerrp2a!38er2fah,8rgenalal, 8rgenah
;e1 segundo operando tampoco;puede ser mnemo, sreg ni datos
;reg?
;no
;segundo reg. de 3 6 bits?;no, error por incompatibilidad;primer reg. acumulador?
;no5 y el segundo?
si,2 ;no; ninguno es acumuladorshort xmer£alsabal, 7al^Oh
exbienpaso2
modregrmer2fal^Sóh.
expref?al^bl
sizedispbienpaso2
al,88hsiesmovnoesmov
s
;MOV?
; Lo siguiente es el procesamiento de MOV, que es bastante complejo-siesmov:push si
cali tipoje er2f
APÉNDICE H - ENSAMBLA-ASMH-291
orjnzpop
J"iP
dl,dlmnomnesi
mesmemmnomne; cmp dl,l
jejmp
msireg: testjnzcal]cmpjnetestjzshlshlshl.movandxorjnzmov
macany: shrshrshrorstosbinccalipopjmp
mnoac: popcalijejmp
noel; lodsbandmovcalijecmpJe
cmpjbcmpjnetest
msiregmnoregal, 7mnoacmodrmbl,6mnoacbh,80hmacanybh,lbh,lbh,ldl,alal, 8al,bher2ea!3dlal,lal,lal,!al50a0h
exsizedispaxbienpaso2simodregrmnoelmeas oí
al, 15bl,altipoer2edl,2m2sregdi, 4er2edi, 5m2bytebl,8
;mnemo?
;reg?
;si, acumulador?
;seg. oper. [disp]?
;size especificado?
;sizes contradictorios?;si, error
;volver a obtener el reg
;seg, oper. sreg?
;segT oper. dato?
;de word?
;si, compatible?
AEEKDICE H - ENSAMBLA-ASM tí-292
jzm2byte; mov
movorstosbincmovshrshrshrcalijmp
m2sreg: testjzmovmovstosbíncmovshlsh!shlandororstosbincjmp
er2e: jmpmnoreg: cmp
jnepopmovcali
Jc
cmpjecmpjeorjnzcmpjbcmpjacalicali
er2ebpsax
al,blal,0b0h
exa],bla],lal,].aUsizedatabienpaso2b!,8er2ebh,ala!58ch
exal,bhal,].al,]a],lb1,7a1,blal.OcOh
exbienpaso2enp2dl,2
mnosregdxdh5altipoer2edl,.lm2rd!53m2mdí,dler2edl,3dher2edl,3eher2edelptrtipa
;preservar dato;caso 3
;priiner operador compatible?
;generar byte de direccionamiento
;primer oper. sreg?
;restanrar stack
;segiirjdo oper, reg?
;seg. oper, mem?
;seg. oper mnemo?
:WO.RDoDWORD?
AFHIÍDICE H - ENSAMBLA-ASM H - 293
m2m:
m2r:
cmpjne
movmovstosbinccalicalimovsbJshl.sblorsíosbmovcali
J™Ptestjzmov
movstosbincmovshlshlsblandor
dl,3er2ebp,ax
al,8eh.
exgetprefpref?al,dhal, 3.al, 3.al, 3.al,bl
dx,bpsizedispbienpaso2al, 8
er2edl,alal,8eh
exal,dhal, 1al, 3,al,],
di, 7a!3dl
jdespues meen.?
or al,QcGh jgenerar byle de direccionamientostosbinc exjmp bienpaso2
mnosreg:pop sicmp di, 3jne er2d
;mem?;no3 no mas opciones
mesmem: push sicali
jemovcalicmpJecmpjnetestjnz
modrmerrmbp,cíxtipod!52m2srdl,3,m1r>02aljmtry.12
;seg. oper. sreg?
;seg, oper, reg?
;si, es acumulador con [dispj?
AEEPTDICE H - ENSAMBLAJE! H - 295
inccaí!movstosbcali
J*"Pmtry2: xor
cali
Jc
test
jnzorstosbincmovcalimovstosbcalimovcalijmp
• _^_ ___— — Hin* — — — — — j_> |j y
noesmovicmpjnecalicmpjbcmpjamovsbrsbrsbrorstosbincmovcalijecaliandshlsblshlor
expref?a1,b1
sizedispbienpaso2al, almodrmdataer2daUer2d ;solo se admite una de las formasal,0c6b
exbb,alpref?al,bl
sizedispal^bhsizedatabienpaso2
al,0d8h ;ESC?noesesctipodl.4 ;el primer operador debe ser un datoer2dax,3fh ;de 6 bitser2dah,alal,lal,lal,!al,0d8b
exal}abínodmier2cpref?al, 7al,lal,!a1,laLbl
APÉNDICE H - H-297
errs:er2c:
xorjmp
esinout:cmp
iconr:
esout:
jecalicmpjnetestjnzshrshrshrormovcalicmpjecmpjbcmp
Ja
movmovstoswincincjmpcmpjnemovorstosbinc
jmpcal]cmpjecmpjbcmpjamovcalicmpjnetest
ch,cherrp2
a^Oeííh ;OUT?esouttipo ;no, INd1,Jer2ca!57errp2al,lal,la1,lal,0e4hbl,altipodl,liconrdl,4en-p2ax,255errp2ah,alal,b1
exexshortbienpaso2al, 10 ;DX?errp2al,blal, 8
exshortbienpaso2tipodl,loconrdl,4errp2ax,255errp2ah,altipodl,lerrp2al, 7
AEENDICE H - ENSAMBLAASS.! v. ,„„
jnz errp2shr aljlshr al,lshr al,lor aljOeiShstoswinc exinc exjmp short bienpaso2
oconr: cmp a1,lO ;OX?jne errp2cali tipocmp dl,ljne errp2testjneshrshrshrorstosbinc
al, 7errp2al,la1,lal,Jal,0eeh
exshort bienpíiso2
errp2: pop expop dipop sistcjmp short finp2
bienpaso2:add sp,6cíe
.iinp2: pop bppop dxpop bxpop axreta
enspaso2 enclp
public assem
assem proc near
;Este es el ensamblador, que llama a los pasos 1 y 2 de compilación.
¿Entrada: DS:Sr apunta al string por compilarse
APÉNDICE K - XNSAMBLA-ASU H-299
; JiS;DI apunta al lugar donde se desea el código3
;SaIida: DS:SI es alterado; ES:DT es alterado; CX longitud del código; CY set si hay error5
pushpushpushcidmovmovmovcal]jemovpoppoppopcaliretn
assem endperror: pop
poppopretn
esdiax
ax,dses,axdi, offset transitenspasolerrorsi, offset transitaxcliesenspaso2
axdies
end
APÉNDICE K-MEMORIA.ASM: j_¡ _
MODULO MEMORIA.ASM
.model small
.486
ÁREA PARA CÓDIGO
.code
public Uenarllenar proc near
¡Este procedimiento llena un bloque de memoria con un valor de byte¡determinado.¡Entrada: ES:DI apunta al inicio del bloque; CX contiene el tamaño de] bloque; AL contiene el valor por ponerse en el bloque
cidpush expush. clirep stosbpop dipop exretn
llenar endp
public buscarbuscar proc near
^¡Este procedimiento busca un string en un bloque de memoria.¡Entrada: ES:DI apunta al inicio del bloque; CX máximo número de bytes que deben ser explorados; DS:SI apunta ni string por buscarse; BX longitud del stringí¡Salida: ES:DI apunta al string que se encontró, o aí final del bloque; si no se lo encontró; CX >0 si se encontró, O si no se encontró
APÉNDICE H-MEMORIA-ASM11-301
cidBuscaStr:
pusbpushpushmovrepepoppoppopjeincdecjnz
FinSrchrretnbuscar endp
exsidicx,bxcmpsbdisiex
FinSrchdiexBuscaStr
public copiarcopiar proc near
;Este procedimiento copia un bloque de un lugar a otro en la memoria.jEntrada: DS:SI apunta a] inicio del bloque por copiarse; ES:"DT apunta al inicio del destino; CX numero de bytes por copiar
pushpushpushcmpjejacidrepjmp
sidiexdi, sifincopiarinvcopiar
movsbshortfmcopiar
invcopiar;add SL,CXadd di, exdec sidec distdrep movsbcid
fíncopianpop expop dipop siretn
copiar endpend
APETíDICE H-MEMORIA-ASM ,, _
PROCEDBVJIEINÍTO CjflXLD4S6.ASM
dosseg.model large ;small
ÁREA PARA CÓDIGO
.code
;Este es un overlay que la permite a un programa bajar de nivel haciendo EXEC;de este programa, tras haber instalado un handler de 63H que traslada el¡control al programa con la función 80h.
start; mov ax,8080hint <S3h
rnov ah,4ch ;nunca llega aquí, esto es solo por si seint 2]h jejecuta este programa sin e] handler de Jaend start ;intem.ipcion 21h instalado,end
APÉNDICE H-USTMACLASM 11 - 303
MAGROS INIMACASM
Macros usados en el archivo INTCIAL.ASM
:Macro Panimetros Función.
;actuar salta a una de las dir. en una tabla;ayuda dir,nlin,color presenta ventana con instrucciones;bufcJa pnclave,pbuf encuentra Ja posición de un buffer;curs x pone un "cursor" en x,24¡explica pnclave muestra Ja explica cion(PNCL A VE);getkey recibe dato del teclado (BIOS);getnmac da el # deí macro con nombre en NOMBUF;getxpr obtiene ultimo nibble <>0 en BUFFER;guarpantalla guarda una pantallajiluminaop resalta la opción actualp'nbuff dir recibe síríng desde teclado (BJQS);indmac da una lista de los macros en el índice;]mppnt limpia la pantalla;menaba cursor abajo en ventana de subopc.;menarr cursor arriba;mender cursor a la derecha;menizq cursor a Ja izquierda;menulinea pnclave n^ues1ramenu(PNCLA^^E);menuvent muestra menú en forma de ventana¡mostrar pdir,plin,pcol muestra pregunta y espera respuesta;movbuf pbufl ,pbu€> PBUF.1 <- PBUF2;nocurs x pone atributo normal en x}24;nunivel pbuf,pniv,pnum ponePNUM en PBUF(PNTV);opcion? espera que se elija una opción;pchar car escribe CAR (DOS);pmenu pnlin,pcolor muestra menú síring apuntado por AX;posdir pvarx,pvar}',dir convierte pos. de pantalla en dirección;restpantalla restaura ultima pantalla salvada;rutina pasa control a] usuario y lo recibe;salvareg push a todo;staíusf muestra fase del programa;statusv muestra datos importante del usuario;traereg pop a todo;valida? ve si una opción es del memí del usuario
AFEKDICE H - 304
;subrut subrutinas de todos los macros
.******
;Busca el AL-esimo elemento de la tabla de direcciones;que ira después de MTABLA para saltar a. esa dirección.actuar macro
local mtablabxbx¡ offset mtablamact
pushmovcalipopjmp dworcl ptr diract
mtabla:endm
.****** AYUDA ***************
^Escribe NLIN lineas separadas por ceros desde DIR en COLOR.;Ocupa columnas I. a 78 y las filas del centro de la pantalla,ayuda macro dir}nlin, color
push axexcl,nlinch, colorax, offset dirmay
pushmovmovmovcalipoppopendm
exax
.****** TJXJFCLA ***************;Busca PBUF en TABBUF y pone su ubicación en PNCLAVEbufcla macro pnclave,pbuf
push sipush axmov si, offset pbufcali mbcmov al,mbcbyTemov pnclave,alpop axpop siendm
-****** QTJRS ***************
;pone el atributo de (Xj24) en inverso.curs macro x
push ax
APÉNDICE H-INIMACJkSM i , _
endm
.******;Recibe desde el teclado el buffer DIR, cuya longitud se indica en¡el primer byte del buffer. En el segundo byte se obtendrá el¡numero de bytes recibidos. Solo se aceptan letras o números.¡Para edición, solo Backspace. Pita sí se ha llegado al limite.inbuff macro dtr
push simov si,offsetdircali mibpop siendm
.****** TJvJ^QJyf^Q ***************
;IJena la lista LJSMAC en base al índice de macros;en AREAMAC. Reemplaza los ceros por espacios (20H).indmac macro
cali mimendm
.****** T IviPPNT ***************
¡Bórrala pantallaImppnt macro
push dipush expush axmov ex, 2000mov di, Omov ax,Q720hrep stoswpop axpop expop diendm
**** ]vrF"NÍAn" ***************
¡Mueve cursor abajo en la ventana de subopciones.rnenarr macro
cali mmabendm
.****** ]y0n.^j"ii\j*j^ ** *************
¡Similar a MENABA.menaba macro
cali mmaendm
APÉNDICE H-OTttlACASM
.****** MENDliR ***************¿Mueve cursor de opción actual a ]a derecha.mender inacro
cali mmdendm
.#****# JVIENJZO ***************
¡Similar a MENDER.menizq macro
cail mmiendm
THRA *************
¡Muestra menú (PNCLAVE)menulinea macro pnclave
piísh exmov el, pnclavecali mmlpop exendm.
******* ]\/rj7]\TQyTil\rj' **************
¡Muestra menu(NCLAVE]) en forma de ventana.menuvent macro
cali mmvendm
* ****** MOSTRAR ***************
¡Muestra pregunta apuntada, por PDIR y espera respuesta. La pregunta;debe tener esta forma: Mensaje,Q,# de respuestas, lista de¡respuestas. En AL sale el numero de la respuesta elegida.mostrar macro pdir,plin5pcol
push axmov ahjplinmov aljpcolmov moslin,ahmov moscol5aímov ax, offset pdircali mmospop axmov aljinnmosendm
***************¡Mueve PBUF1 aPBXJF2.movbuf macro pbuf2,pbufl.
push si
APÉNDICE H - nmiAOASM . . ., ,, 0ti - ó\)3
disi, offset pbufldi, offset pbuf2mmbdisi
MQCLIRS ***************;pone el atributo de (x,24) en normal.nocurs macro x
axal,xah,bnnormmcuax
pushmovmovcalipopendm
***************
;Pone PNUM en el buffer PBUF en el nivelnunível macro pbuf,pnjv,pnum
push expush dxmov d,pnivmov ch,pnummov dx, offset pbufcali mnnpop dxpop exendrn
OPCIÓN? ***************¡Espera que se digite una opción. Saca en MOPACT el numero de;opcíon. Las opciones son: FIechas,E]\JTiR3/1OIAJC)/xL}/vP y otros.¡Ademas es aquí donde se almacenan los datos al grabar macros;y se leen del macro en vez deí Teclado al correr o probarlos.opción? macro
cali mopendm
PQJ-T/\}? ** ** ******** ***
¡Usa .función del DOS para escribir CAR. en pantalla.pchar macro car
push dxmov d1,carcali mpchpop dx
APÉNDICE H-UnMAOASM; ir -,,,«
endm
pJviENU ***************¡Muestra menú apuntado por AX. Al salir MPMPRX;da la dirección del primer byte luego del 0.pmenu macro pnlin,pcolor
push expush dxmov c^pntinmov clh,pcolorcalJ mpmpop dxpop exendm
PQSDTR ***************
;Da la dirección PDIR correspondiente a (PVARX,PVARY);para acceso directo a la memoria de video.posdir macro pvarx,pvaiy3pdir
push axpush bxpush exmov cl,pvarymov bl,pvarxcali mpdmov bx,mpddirmov pdir,bxpop expop bxpop axendm.
;Trae de PANBUF la ventana que fue salvada en GUARPANTALLA.restpanlalla míicro
cali mrpcali .funcionesendm
RUTINA ***************;Pone la dirección de la nitina(NCLAVE) de usuario en DTRSAL y la dejregreso en IVlRAUX2yív[RAUX3. Pasa control al usuario, que debe regresar;poniemlo RETORNO al fin de su rutina para regresar a MRUTl.rutina macro
mov conclavemov al,ninfbufmuí el
APÉNDICE H-3KIMACJISM H-310
addaddmovmovmov.movmovmovmov.movmovmovmovjmp
mrurl: movcmpjemovmovmov
rnrut2:endm
ax3 offset tabirtfax,4si,axbx,[si]al,[si+2]tiprut,almraux.1.,albp, offset dirsalds:[bp],bxds;[bp+2]5csbx, offset mrutlmraux23csmraux3,bxdword ptr dirsalaljíiprut"aljinrauxlmnit2contmcr,0f&ix,ly»o
¡busco dir. de rutina(nclave)
jytipo de rutina.¡Preparo el salto.
¡guardo tipo de rutina.
¡Preparo dir. de regreso.
¡Control al usuario.¡Regreso a FLUJO.
¡Ha cambiado TIPRUT?
¡si, cod. de error de macros,¡ademas X,Y previos pueden¡estar errados.
.****** SAT VARFGr **************
¡Push a todo,salvareg macro
push eaxpush ebxpush ecxpush edxpush esppush ebppush esipush edipush dspush espush ssendm
.****** STATUSF ***************¡Presenta 6 bytes apuntados por FASEPTR en (73,23)¡Se usa para indicar la fase actual del programa,stafusf macro
cali msfendm
.****** STATUSV ***************
APÉNDICE H-IBIMAC.ASM: H-3U
;Presenta 6 bytes apuntados por VALPTR en (73,24);Se usa para mostrar importantes datos del usuario.statusv macro
cali msvendm
.****** TRAEREGr ***************
;Pop a todo.traereg macro
pop sspop espop dspop edipop esipop ebppop esppop edxpop ecxpop ebxpop eaxendm
.****** VALIDA? ***************;Si en OPCIÓN? se dígito una opción distinta de las que manejajnormalmente, ACTUAR manda el flujo acá para ver si es una opción;puesta por el usuario en el menú. Si es asi, AL-numero de opción.;Si el primer byte después de la ultima opción del menú es FF se;supone que la ultima es la "opción de escape" para todas las;posibilidades que no consten en el menú.valida? macro
cal] mv?movendm.
SUBRUT *********;Este es un macro que contiene todas las subrutinas llamadas por los;otros macros de este archivo. Se hizo de esta manera para evitar el;uso de demasiadas banderas, y que su ausencia no produzca "Phase;errors" al momento del ensamblado.subrut macro
rnact:salvaregdec al ;pongo el AL-esimo elemento de lamov cl,2 ;tabla en DIRACT y CS en DIRACT+2muí el ;para hacer el JMP al regresar.add ax,bx
APÉNDICE H-IKEVIAC-ASir H-312
movpushmovmovpopmovmovtraeregretn
bpjQffsetdiractsisi,axbx,cs:[si]sids:[bp],bxds:[bp-t-2],cs
may:pushpushmovmovsi ibshrdecmovdecmovmov
dxbx
¡centro el Texto en pantalla:;linea inicial" (23-#lineas)/2 -1
dl,23dl,cldl,ldimaylin,dlmaylinmaycoljChax3offsef blanco
mayl: pmenu maylin,maycol ;primero una linea en blanco.inc maylinmov mpmprx,bx
may2: mov ax,mpmprx ¡Ahora el resto de lineas. MPMPRXpmenu may]in,maycol ;da la dirección del primer byTeinc maylin ¡después del 0.dec eljnz may2mov aXj offset blancopmenu maylin,maycol ;Linea en blanco al final.pop bxpop dxretn
mbc:
mbcO:
mbc]
salvaregmov aljTimaxbuf ¡Busca un buffer en la rabia TABBUFcmp al}0 ;y entrega el numero clavejne mbcO ¡que servirá para obtener toda lajmp mbc4 ¡informaciónnecesaria acerca délamov mbcmemijO ¡opción representada por el buffer.
mov mbcbuf,si ¡Si el buffer no existe, clave^FF.mov rnbcpos, offset tabbufmov mbcbyte,0mov bx,mbcbuf
APÉNDICE H- INIMACJVSMH-3 I3
mbc3;
mbc2:
mbc4:mbc5:
movincmovxormovincmovcmpjnzcmpjnzmovjmpincraovcmp
Je
addjmpmovmov
traeregretn
ah,[bx]bxbp,mbcposch,chcl,mbcbylembcbyledi,cxah,ds:[bp+di]mbc2mbcbyle, 8mbc3aI3mbcmenumbc5mbcmenuah,nmaxbufah,mbcmenumbc4mbcpos,8mbclaI,Qrfhmbcbyte3al.
mcu:salvareg ;Pone el alributo dado por AH enposdir 0,24,mcudir ;la posición (AL,24)mov síjincudir
bh,ahcl,2elS¡,Í1X
sies:[si],bh
movmovmu]addincmovtraeregreín
mex:salvareg ;Busca en TABINF la dirección de lamov al,ninfbuf ^explicación y la pone en linea 23-muí eladd ax,offset tabinfmov bx,axmov ax,[bx]pmenii 2traeregretn
APÉNDICE H-TTÍIMAC-ASM H-314
mgk:saívareg ;Uso función del BIOS que espera
repetir:mov ah,0bhint 2.1hcinp al, Oje verraton
siguiente:mov ah}G ;que se pulse una tecla.int 16hjmp short finmgk
verraton:cali pantallacmp bx,Qffhje repetir
finmgk:cmp ax'jSbOOhjne noflmov vent,]
non:mov getword,axtraeregret
mgn:salvareg
mgn.l ;
mgn2;
pushpushpopmovinccmp
jemovaddmovmovmuíaddincmovrepejneaddmovjmpmov
esdsesclh,0ffh
dhdh}8mgn2si, offsetsi, 2di, offsetal, 8dhdi,axdicx,7cmpsbmgn]dh,80h
nummacmgn 4dh,0fíh
;Busca si el nombre en. NOMBUF esta;en la lista de macros y da su numero;-t-8Gh en NXJMMAC sí asi ocurre. Si es;nuevo, da el # del primero libre.
;Si ya no hay espacio} da FF.
nombuf;bytes 0 y 1 son de uso de otro macro.
areamac
;byte 0 es la longitud del macro.
; comparo.;si no es iguíil, comparo otro.;macro viejo.
,dh
;Busco primero libre.
APÉNDICE K-TKTMAtLASW H-3 I5
mgn21: inc dhcmp dh,8je mgn3mov di, offset aremnacmov al, 8muí dbadd di,axmov al,0mov ex, 8repe scasbjne mgn.21mov nummac,dh ;macro nuevo.jmp mgn4
mgn3: mov nummac,01íh ;macro nuevo sin sitio.mgn4: pop es
traeregretn
mgx:saivareg ;se divide NIVEL/2, se suma a direcciónmov cl,nivel ;inicial de BUFFER, y se obtiene el msnsbr cl,l ; distinto de 0 en ese byte.sor ch,cb ;Ese es el ultimo nibbleOOmov si, offset bufferadd si, exmov al, [si]mov ah,ajsbr ab, 1shr ab,1sbr ab,lsbr ab}lcmp ah,0jz mgxlmov al,ab
mgxl : mov xprev,altraeregretn
en BUFFER
mgp:saivareg ;paso pantalla a PANBUF.xormovmovmovmovmovrep
si, sidi, offset panbufbx,dsesjbxds,videosegcx,3680
movsbtraereg
APÉNDICEtí-316
di, siesdscJ,a]
retn
mió;salvaregmov emov dl,collactmov a],x
miol3: posdir l,l,miodirmov si,TTiiodirmovpush
popmov
mio.131.: lodswcmp al,20hje mío] 31sub si, 2dec eljz mi o.16
mío] 4: lodswcmp a!320hjne
mío 15: lodswcmp
jedecdecdecjnz
mio.16: movlodswmovcmpJecmpjesloswjmp
mió! 4
mi o. 15sisielmió 14di,si
ah,dlal,20hmio.1 7al, Omió] 7
miol6mió] 7; traereg
reín
¡Resalta la opción actual, dada porX.
;collact=video inverso
¡trabajo directo en pantalla.;busco la X-esima palabra en la
¡linea 23 y cambio su aíributo.
mib:
;saUo espacios iniciales.
jsalto palabras.
;resalto palabra.
salvareg ¡obtengo string desde teclado.mov el,[si] ¡máximo # de caracteresmov ch,0 ¡contadormov dXjSi ;puntero auxiliaradd sí,2 ;bytes O y 1 de uso del macro
APÉNDICE It-IHIMAdASMH-317
posdir l,24jmibdirmov bx,mibdir
¡dirección de primer carácter
mibl:
mib2:
mib21
mib22
mib3:
mibSl
mib4:
mib4.1
mov mibXjChinc mibxcurs mibxgetkeycmp al,08hjne mib21jmp mib4
: cmp al,0dhjne mib22jmp mib5
:: cmp al,30hjb mib2cmp at,7bhjnb mib2cmp al,3ahjb mib3cmp al}41hjb mib2cmp al,5bhjb mib3cmp a1,61hjb mib2sub al}20hnocurs mibxcmp chjdjne mibSlpchar 07hjmp mibl
; mov [si], alinc simov es:[bx],aladd bx,2inc chjmp miblnocurs mibxcmp ch,0jne mib41pchar 07hjmp mibl
: dec simov byte ptr[si]sub bx,2mov byte ptr es:dec chjmp mibl
¡Bactíspace?
;Enter?
;<"0"?
;>"z"?
;es un numero?
;"9"<aK"A"?
;es una mayúscula?
;"Z"<aK"a"?
;es minúscula, hacer mayúscula
; contador^m aximo?
;si, beep.
;AL al buffer¡apunto prox. dirección
;AL a pantalla¡apunto prox. dirección
;contador+l
;bufíer vacio?
;si5 beep.
¡borro ultimo carácter30 ¡en el buffer
¡y en pantalla:[bx],20h¡contador-1
AEEKDICE II-INIMA.C-ASWFT-318
mib5: nocurs mibxmov si,dxinc simov [síjjChtraeregretn
mim:salvaregpush espush dspop esmov si, offsetmov di, offsetmov 011,8
miml: inc simov alj20hstosbmov cls7
mim2: lodsbcmp al,0jne mim3mov al.>2eh
mim3 : stosbdec eljnz mim2dec dijnz mimlpop estraeregretn
mmab:salvareg
\fm de rutina; byte 1jindica # de bytes recibidos.
;pone la lista de macros actual;en LISMAC. Reemplaza los 00 con;2E (puntos).
areamaclismac
mov conclave!. ;Busca el # de subopciones que tienemov al}ninfbuf ;el menú de la opción actual dada pormuí eladd ax5offsetinc axinc axpush bxmov bx,axmov si,[bx]pop bx
mmabl: lodsbcmp al,0jne mmabl
jNCLAVEl. Si Y supera ese #, Y=0.tabinf
APÉNDICE H-INIMAC-ASMH - 319
al,ninfbufelax, offset tabínfaxaxbxbx,axsí,[bx]bx
;Busca # de subopc. de menu(NCLAVEl);Si Y=FF, Y igual a ese #.
lodííbinc alinc ycmp al,yjne Ttunab2mov y, O
mmab2: traeregretn
inma:salvaregmov cl,nclavelmovmuí.addincincpushmovmovPOP
mmal: lodsbcmp al, Ojne mmallodsbdec ycmp y,0fflijne mma2mov y, al
mrna2: traeregretn
mmd:salvaregmov conclave ;Busca O- de opciones de menú actualmov aljiíinfbuf ;Si X supera ese valor, X~l.
el ;SiempreY=0.ax,offset tabinfaxaxbx
bx,axsi,[bx]bx
muíaddincincpushmovmovPOP
mmdl: lodsbcmp a 1,0jne mmdllodsbinc al
APENUICE II-IN1MAOAXMH-320
IT1C
cmpjnemov
mmd2; movtraere
X
al,xmmd2
;a la derecha.
mmi;retn
salvaregmov conclavemov aUninfbuf
# de opciones d.e menú, actual.;S¡ X=Q, X igual a ese #. Siempre Y=0.
mmil :
muíaddincincpushmovmovpoplodsb
cmp
elax,offsaxaxbxbx^nxsi,[bx]bx
al»0jne mmil
mm¡2;
lodsbdeccmpjnemovmov
traeregretn
X
x,0mmi2xv»ly,o
. tabinf
roml:
meincmovmov
pushpu.shmov
otra letra;lodsbcmpjnelodsb
salvaregmov al.ninfbuf ;Muestra el menu(CL) y resalta lamu] el ;opcíon actual.add, ax,offset tabinf
axax
sax
otraletra
APÉNDICE ri - INIMACASM H - 321
movpoppoppmenu 1iluminaop
traeresretn
Tiumeroop,alaxsi
mmv:salvaregmov c],nclave1mov al»nmfbufmu! elad.d. aXjOffset tabinf
;Muestra ventana se subopc.;primero veo si Ja opción;tiene algu.n submenu,
;Si es asi, la rutina;debe ser de tipo 3.
addmovcmp
ax,6bx,axbyteptr[bx]»3mmv3
jmp inrnv?mmv3; mov conclave
mov al sninfbufmuí eladdincincpushmovmov
;Ahora busco la dirección;del menú al que pertenece
;esta opción en TABINF,ax'jOffset tabinfaxaxbxbx,axsi,[bx]bx01,0dl,x
movmov
mmv30: lodsbinc elcmp alje mmv30cmp x,ljr\z mmv3 1d.ec elmovjmp
mmv31: dec .mmv32; lodsb
inc elcmp al,20hjne mmv32
mmv33: lodsbinc el
;ST apunta al inicio del menú.;Voy a contar los bytes hasta;la opción actual (x) para saber;cohimna inicial de ventana.;Salto espacios iniciales
;pero los cuento.
;si x=l ya tengo la columna
mmv4d.l ;DU cuantas opc mas debo sa.ltar.
;Cuento bytes hasta encontrar;un espacio (CL contador).
;sumo espacios entre opciones
APÉNDICE II-UsTMACASMH-322
cmp als20hje mmv33clec dijnz mmv32dec elmov mmvx.ljCl
mmv4: IHOV m m vea r,0mov conclave!movmu.1addincincpushmovmovpoppush
a1,ninfbufelax,offset tabinfaxaxbxbx,axsi,[bx]bxsi
mm\'40: lodsbcmp al>20hje mmv4Qdec simov cx,l
mmv41; lodsbcmp a.l>2Qhjx mmv42cmp al,0jne mmv410mov mmvlin(cljmp mmv5
mmv410: inc chcmp ch,mmvcarjb mmv41mov mmvca^chjmp mmv41
mrnv42: lodsbcmp al ,2 Ohje mmv42cmpjnemov
;ima opc menos que saltar
¡Termino. Ventana empieza en¡columna anterior.
;Ahora busco dirección de menú¡asociado a la opción actual
;en TABtNF
jmpmmv43; inc
movdecjmp
mmv5: pop
al,0mmv43mmvlin,clmrnv5el
ch,0simmv41si
;Sí apunta a primer byte;de ese menn
;no tomo en cuenta los¡espacios iniciales.
;Veo cuantas filas y columnas;ocupa la ventana;tos espacios no cuentan
¡termina si AL=0
;# de su.bopciones d.e! menú.
;CH: # de car de subopcion;MMYCA:R; máximo CH logrado
¡saltar espacios
¡termina si AL=0
;# de su.bopciones del menú
¡Otra subopcion¡# de car = 0
APÉNDICE TI - liSTMACASM11 - 323
mov aijirnnvlininc alinc ai
mov ahjadd. ah,al
mov mmvlin^hmov mmvlin1,ahinc mmvcar
;Busco la linea inicial¡de la ventana incluidas;dos lineas de recuadro.
¡servirá después
posdir rnmvx.l,rnmvlin>mmvdir ;d.ir. de esquina superiormov dijinmvdirmov es,videoseg
al>esqüahjCoiven
movmovStoswmov al.linsupmov cljirnnvcar
ch,chst'oswal^esqid
¡izquierda en pantalla
¡dibujar esa esquina¡en color de ventana
¡dibuja linea superior
xorrep
movstosw
mmv50; DBC mmvlinmov blsmmv1in
cmp bl,2je mmv6posdir inmvxl^nmvlin^nmvd.ir ;escribir las su.bopcionesmov dijinmvdir
;pero antes el recuadro,;longde la linea
;dibuja esq. sup, der.
¡próxima línea
¡linea inferior si BL=22
mov aljinlatmov blsmmvcarstosw
mmv5Q1: lodsbcmp al,20hje mmv501dec si
mmv51: lodsbstoswdec blcmp a!,2Qhje mmv52cmp a 1,0jne mmv51dec didec dimov al,20hstosw
mmv52; cmp bl>0je mmv53mov al,20h
;no tomo en cuenta los¡espacios iniciales
¡leo byt'e del menú¡lo escribo en p
¡H"e terminado la opción?
¡He terminado el menú?
¡en e,se caso borro el OOK¡que escribí
; y pongo un " "
¡lleno el resto de la linea¡con espacios
APENIMCE H-INl.MAOASM
mmv52l; stoswdec bljnz mmv521
mmv53; mov al}lin!at ¡y termino con recuadro.stosw
mmv54; lodsb ¡salto espacioscmp al,2Qbjz mmv54dec sijmp mmv50
mmv6: posdir mm\'xl)mmvlin)mmvd.ir ¡dibuja linea inferiormov di5mmvdir
mov a!,esqsimov ahscolvenstoswmov aljinsupmov cl.,mmvcarxor ch,chrep 3tosw
mov al,esqsd.stosw ¡Fin de dibujo de ventana,cmp y,0 ¡existe subopcion seleccionada?jz mmv? ¡no, termina trabajo.
mov al,y ¡si, resaltaría cambiandommv63: mov b^mmvlinl ¡el atributo de la linea.
sub bl,almov mmvlin.,bLposdir mmvxljmmvHn^nmvdir
mov di5mmvdirmov ax.,3add di^axmov bl,mmvcarmov al^colact
mmv64; stosbinc didec bljnz mmv64
mmv7; traeregreín
mmos:salvaregpmenu moslin,moscol ¡Presenta pregunta y espera respuesta.mov si,ax
mmosO: lodsbcmp a 1,0jne mmosOmov mdirop-.si
H - INIMACAS.M H - 325
mmosl: lodsbmov cl,almov dl,aígetkeycmp alj'a1
je mmosl icmp al/z'-Hjnc mmosl 1sub afs20h
mmosl 1: mov bx,axmmos2; mov ai,[si]
inc sisub cl»lje mmos4cmp al>0je mmosS
mmosS; cmp a!,bljne mmos2jmp mmosS
mmos4: mov si^nd.iropjmp mmQsl
mmos5; sub dl,clmov mnmos,djtraeregretn
mmb;saivaregpush dspop esmov c(\:,8rep movsbtraeregretn
;Qbter>go el # de opciones.
¡obtengo respuesta.¿minúsculas --> mayúsculas.
;comparo y si no es ninguna de las;posibles> vuelve a pedir respuesta.
de respuesta en MNMOS.
;mueve 3 bytes.
mnn;
movmuícmpjnzmovmovjmp
mnn4; movm n n l ; shr
saivaregtest cl,l'¡z mnnl
al,16cha^Omnn4ch.Ofhal.Offhmnnlch^al
;pongo CH en el CL-esimo nibble;del buffer apuntado por "DX,
APEN1JÍCE Il-IN'IMACASMI I - 326
mnn5;
mnn2;mnn3;
mop:
mopl:
mopl 0
mov bl»clxo>" bh,bhadd bx,dxcmp ch,Qjz mnn5cmp al,Qffhjnz mnn2and [bxjjCh
jmp mnn3or [bx],chtraeregretn
salvareg ¡maneja opciones.mov conclave! ;Primero veo de que tipo es lamov al,ninfbu.f ¡opción actual. (Esto es usadomuí el ¡al salir de este macro).ad.d ax.offset tabinfadd ax,6mov si,axmov al,[si]mov tipru.tl,alcmp bmac,1 ¡Corriendo/probando macra?je mopljmp mop2mov al,longmac ¡si.
inc alcmp al,contmac ¡tennino?jne moplOmov bmac,0 ¡si,mov faseptr^offset fnorm ;Pase normalstatusfjmp mop2: mov si}ofTsetbufFmac ¡estoy en macro,push ax ¡leo dato de BUFFMACmov aljContmacxor ah,ahadd ax.axadd si,axpop axmov bx,[si]inc contmaccmp contmcr,0ffh ;fin de ejecución porje mopl 2 ¡flujo ambiguo?cmp bver,0 ¡probando macro?je moplS
APÉNDICE ÍT-ENIA1ACASMH-327
bver>QbN,Offl)Oh
mopll: getkeycmp íü,crje moplScmp a!,ctrlkjne mopll
mop!2; movmovmovmovstatus P
mopl3; movjmp mop3
mop2; getkeycmp bgmac.Ojnejmp
mop21; movcmpjecmpjemovxoraddaddmovinccmpjeJmP
mop23: movd.ecmov
¡si, espero ya sea¡ENTER para seguir
;o AK para terminar,
¡termino prueba,
¡no ejecuto ultima opciónfaseptTjOfTset fhorm ;fase normal
nx.hx
mop21mop3bx,0ff00hcontmcr,0ffhmop22al>ctrlkmop22bljContmacbh,bh
¡tomo el valor del birffer¡en ve?, del teclado,
¡no es macro,dato d.e teclado.¡grabando macro?
¡si, fín macro por razones de¡rutina de macros de usuario?
¡si,1ermino de grabar?
¡grabo dato en 8UFFMAC
bx,offset bulTmacds;[bx],axcontmaccontmac,maxmacmop23mop3
contmacax,offseí blanco
pmenu 24,colexpmov ax,offset escmcrpmenu 23,coSlact
mop231: getkeymov ax,get\vordcmp al,l bhjne
mop22; movmovmu!
;y cuento # de datos. "No eje-¡cuto la, primera en exceso.
¡excedí el limite.
í)l,nu.mmaccl,8el
add a^offset areamacpush espusn dspop es
;ESC?
¡paso datos al área d.e macros.
Al'KNDICE II - IMMACLA-SMH-328
mov di,axmov al,contmacmov [di]>a1inc dímov si,ofTset nombmac.mov cxs7rep movsbmov al,nummacmovm u.ladd
;long. del macro,
;y nombre
;ahora paso BUFKMAC;al área que empieza
el ;con MAC1. Cada macroax%offse1 macl ;ocupa 2*MAXMAC bytes
movmov
;o MAXMAC wordssisoffset buffmac
;ejecuto la ultima opción;es un car.especial?
;nos es Enter?
mov cx,maxmacrep inovswpop esmov bgmac,0 ¡termina grabaciónmov faseptr.oFfsetfnorm ;fase normal.stafusfmov ax,bx
mop3; gmp al,0je mop32
mopSI: cmp al^crjne mop311mov als5jmp mop4
mop311; Qmp aljCtrlo ;es A0?jne mop312mov fl'57jmp mgp4
mop312;cmp alsctrlp ;esAP?jne mop313mov alsSjmp mop4
mop313; cmp al,ctrlk ;es AFC?jne mop314mov al ,9jmp mop4
mop314: cmp aí j ibh ;es ESC?jne mop315mov al, 10jmp mop4
I ;es otro?
;es <-
mop315: TTIQVmov al>6jmp mop4
mop32; cmp an5fleizqjne mop321
APÉNDICE II - INIMACAS.M
mov a 1,1jrnp mop4
rnop321; cmp ah,f¡ederjne mop322mov al>2jmp mop4
mop322; cmp ah^flearrjne mop323mov al>3jmp mop4
mop323: cmp aheleabajne mop324mov alj4jmp mop4
mop324; mov mopauxl^ahmov mopaux,Qmov al ,6
mop4; mov mopact,alcmp bopcjjne mop5resí pantalla
mop5; traeregretn
U - 329
;es -->?
;es flecha arriba?
;es flecha abajo?
;es otro.
;tengo ventana de opciones?
;si,recupero pantalla.
mpch:
mpm:
salvaregmov ah,2inl 21htraeregretn
salvaregpush dxxor cK,chmov s¡,axmov ayonglinm ul elmov essvideosegmov di,axpop dxmov ah,dbpush dimov al,20hmov ex, 80rep stoswpop di
;Uso rutina del DOS para escribir DL.
;pone un stringterminad.o en O:en línea C¡- con atributo DH,;EL string es apuntado por AX.
;borro la linea.
APÉNDICE U - INLMACASM ,, ,-„
ínc diinc dí
mpmO; lodsb ;pongo el string,cmp al,Oje mpm 1Stoswjmp mpmO
mpml: mov mpmprx^si ;MPMPRX apunta a próximo string,traeregretn
mpd.:salvaregmov als160 ;Direccion-W160 + BL.muí elxor bh,bhadd ax,bxad.d. ax,bxmov mpddir,íixtraeregretn
.mrp:salvareg ;Paso PANBÜF a pantalla.xor di,dimov es,videOsSegmov sisofísel panbuf1TÍOV c(Vj36SOrep movsbtraeregretn
msf:salvaregmov si/aseptr ;FASEPTR tiene la dirección de unposdir 73)24>msfdir ;string de 6 byles q\ie debe sermov di,msfd.ir pnostrado en la posición (73,24).mov cx56mov ahjCollact
msfl; lodsbstos\dec exjnz msfltraeregretn
msv:saivareg
mov s¡,valptr ;VALPTR tiene la dirección de un string
APÉNDICE 11 - IN1A1ACAS.M
posdir 67)24,msrd.ir ;de 6 bytes en el que el usuario puedemov di>msfd.ír ;poner algo para aparecer en (67,24),mov c(x,6mov a
msvl: lodsbstoswdec exjnx msvltraeregretn
H-331
mv?;salvaregmov conclavemov aljnínfbur"muí eladd ax,offset tabinfinc axínc axpush bxmov bx}axmov si,[bx]pop bx
mv?l; lodsbcmp al,Qjne mv?llodsbmov cl,almov dl,alpush sípush ax.mov nwVauxl,xor ah5ahad.d s¡,axcmp bytejne mv? l lmov mv?au,x!(al
mv?ll; pop a-xpop simov al,mopauxcmp al^'a'jb mv?2cmp aI5'2T
ja mv?2sub alj20h
my?2: mov bl,almv?21; lodsb
;Busca si la elección esta;en el menú del usuario.
;ST apunta al menú
;SÍ apunta a primera opción;AL tiene el # de opciones
;si el primer byte después;de las opciones validas
;es FF5 entonces evacuar;las teclas no validas
;porla "ultima opción,
;dejo MV7AXJX1 como bandera
;A, las minúsculas
;las hago mayúsculas.
ll-INIMACAS.M H - 332
cmp al,blje rnv?3d.ec eljnz mv?21cmp mv?au.x5,0je mv?22mov al,mv?auxlmov mv?aux,aJxor ah,ahjmp mv?4
mv?22: or al,fjmp mv?4
mv?3; dec elsub d!,c1mov mvVauXjd.lxor ah}ah
: traeregretn
;veo s¡ opción es valida
;no fu.e valida, veo si hay¿rutina de escape
;sí hay esa rutina;salgocon respuesta
;no ha,y esa
;opcion valida,;guardo respuesta
;y salgo con ZF=
endm
APÉNDICE H-MI-RO-ASM H - 333
¡MACRO MPRO.ASM
;Mücro Parámetros Función
; actuar;í?ni;n.acr9;getchfir;getdata x,ysburl>tipo;getd.ata2 x,y,l;geílinebulT;limpln num}atrib;1 m ppnt;prínf x,;rest23;salva23;usrpro;sbrpro
salía a, la, AT,-e,sirn3, dir. de ana, tabJa,teríPÍiíñ macro y d?. un. mensajelee un ASCHleerjn bin5 hex o declee un dato en hex (para mamona relativa)lee un string del tecladoborra una linea
borra pantallapone u,n texto en pantalla
restaura, línea 23salva linea 23intercambia pantallas de usuario y PROsubru.tinas de los otros macro
.***************************************b;Macro-instruccíones para macro-comandos.***************************************
;Macro Parámetros Función.
;cerrmcr;creamcr d,¡mom;grabmcr;getkey;inirncr dirnom;lmpmcr;rtodo;stodo;sbrmcr
cierra archivo de macroscrea archivo de macrosgraba y cierra archivo de macroslee teclado o bu/fer de magrosabre y lee (o crea) archivo de macrospone O en las áreas de macros
pop todopush todosubnrtmas de los otros macros
.*****# ACTUAR ***************
¡Lee e¡ AC-esimo elemento de la tabla TABACT y salta a la dirección;dada por ese elemento. ALK) para el primer elemento de la tabla,actuar macro
local tabactpush simov ah,0
APÉNDICE H-Ml-HO-ASMH- 334
aclcl ax,axmov si,offset tabactadd si,axmov ax,cs:[si]pop sijmp ax
tabact:end.m
.##**** "FI.NMACRQ **************;Da un mensaje de fin de macro y espera un ESC para seguirfinmacro macro
cali rfínmendm
.****** ("¡FTCHAR ***************
;Lee en GCASCU un ASCÍT del teclado o butTer de magros. En GCCQD;sale el siguiente código; O, hay dato valido en GCASCTT. 1, ENTER. 2,;TAB, 3, SHIFT TAB, 4S ESC. 5, alguna función o tecla especial» cuyo;ASCIT extendido sale en GCASCCT. Para que ENTER, TAB, SHTFT TAB y;ESC sean aceptados como datos normales, se debe presionar antes F1 0.getchar macro
cali rgchend.m
.****** npTDATA ***************
;Lee datos del teclado o bu.ffer de macros en BUFF. En BUFF se tiene;;# de bytes pedidos» # de datos leídos, datos, # convertido en hex;(4 bytes). Hace eco en pantalla en (X,Y). De acuerdo al TÍPO;recibe datos en bin (V), "hex ('h')s dec ('d'Xl-íi longitud dejBUPF debe ser adecuada: bin, cualquiera; hex, 2 0 4 bytes; dec, 3;o 5 bytes. Si se presiona DEL o BS se borra el ultimo dato ingresado.;B]SJTER es esperado para confirmar un dato y convertirlo en hex. En;GCCOD sale un código si ocurre lo siguiente: O, hay un dato correcto a!;fínal de'BUFF. ls flecha arriba. 2,-flecha abajo, 3, flecha derecha,;4, flecha izquierda. 5, TAB. 6, SHTFT TAB. 7, ESC. 8, PGUP. 9 PGON.;Cualquier otro dato es procesado para ver si es valido incluirlo en el;bu.Ffer. Se produce un 3EEP sí un dato es invalido o ai llegar a. los;1 imites. Si al ingreso a la subnrlina GDRESET es T , buffer y variables;son inicial izadas. Si es O, no lo son, y se puede seguir recibiendo;el mismo dato. Los mimeros bínanos no son convertidos en hex.getd.ata macro x,y,buff,tipo
push bxpush exp;ish dxmov bx,offset buffmov cl,x
Al-ENTllCE II-MPRO.ASM J-| _ 335
mov ch,ymov d'jíípocali rgdpop d.xpop expop bxendm
.*#***# GFTDATA2 ***************;Lee dalos del teclado. Bn BUPF se tiene;;# d.e bytes pedidos, # de, datos leídos, dalos, # convertido en hex;(4 bytes). Hace eco en pantalla en (X,Y), 'De acuerdo al TIPO;recibe datos en bin ('b')3 hex ('h'), dec ('d'), La longitud, de;B'UFF debe ser adecuada: bin, cualquiera; hex, 2 0 4 byles; dec> 3;o 5 bytes. Si se presiona QEL o BS se borra el ultimo dato ingresado,;ENTER. es esperado para confirmar un dato y convertirlo en hex. En;GCCQD sale un código si ocurre lo siguiente: O, hay un dato correcto al;fínal de BlJFF. 1, flecha arriba, 25 flecha abajo. 3, flecha derecha.;4, Hecha izquierda. 5, TA.B. 6, SHTFT TAB, 7, RSC. 3, PGUP. 9 PGDN.;Cualquier otro dato es procesado para ver si es valido incluirlo en el;bu,ffer. Se produce un BTOP si un dato es invalido o al llegara los;lirnites. Si al ingreso a la subnitina GDR-BSET es 1, buffery variables;son inicial ¡xadas. Si es O, no lo son, y se puede seguir recibiendo;el mismo dato. Los números binarios no son convertidos en hex,getdata2 macro x^bu.r^tipo
push bxpush expush dxmov bx,offsetbu.ffmov cl^xmov ch,ymov dl.tipojmp rgdj ;suced,e ajgo extranio si se lo hace con cali
virus: pop dx ;en el retorno no regresa acá (se cuelga)pop expop bxendm
.####** fipyr TÍSTP ***************;Lee del teclado un buffer 3UFF (ASCH)} que tiene este formato: Numero;de bytes pedidos, numero de bytes realmente ingresados, texto. Para;edicion se acepta 13ackspace o Qelete. BNTBR para terminar el texto.;Bn GCCOD sale un código: 1, se digüo BNTER. (buffer valido), 2, TAB.;3, SHTFT TAB. 4, ESC y 5, especial, l^e macro usa GBTCKAR para;recibir datos. Bn X^ Y recibe la posición en que debe hacer eco.getÜne macro x,y,bufT
push sipush ex
í.l¡pU3
is <JodXE dod
•i ,i'l I • t'MA4J.VLJ | j ti U
^LífU ií A.ÜU.Í
-l!p -ÍSSjjO'lS AOU1
3fB LfSrtC!
is isnd
_IULJC!'O un uos jtíüíuiísi sqsp opc^ ¡a 'ai'yiV oinqujtó u<35 (A*X)-3p jií-iKd ti etj^ued ííj us >[j£¡ jod ope^uncíe OP-ÍS.) ¡s óquosgí
*******
ui'pusxo dodíp dodXB dod
O* l "*i
xs qsndíp qsnd
XA . fOii/-!O VÍÍM1XJ
0-íotíai lu»•>» i V** 1 1 »>/"! «» ti i itíj Ib|-v»tíL« til tiJLj
r-,i *******
XE dodr i i f i Ví>»
IlJ ü0"« I .t IV*< 1 11 A f\l >VJUJ.b Utí /lUlAI
AOÍXIqsud
oaatíui u[duitjsuod
*********>(:***** c ******
tupugjs dod
xo dod
jjnq j3sjjoeis AOLUACL[5 A O Ul
X * 3 AOLU
9££ ~ H? c fc ri