ejemplos modo protegido.pdf


Vista previa del archivo PDF ejemplos-modo-protegido.pdf


Página 1...39 40 41424391

Vista previa de texto


;
;
;
;
;
;

Y se arma una rutina que escribe el número contenido en eax en formato
hexadecimal. Para ello se separa el número en nibles (grupos de 4
bits). A cada nible se le suma 0 ascii y si es mayor a 9 se le suma la
diferencia entre 9+1 y A ascii, de modo que, de ser 10 el valor del
dígito, se vea una A.
mov cx,8
correr:
rol eax,4
mov byte [edi],'0'
mov bl,al
and bl,0fh
add [edi],bl
cmp byte [edi],':'
jb ok
add byte [edi],'A'-':'
ok:
inc edi
inc edi
dec cx
jnz correr

;
; Se recuperan las variables y se retorna.
;
popad
pop ds
ret
;
; Esta rutina es la que se ocupa de cargar los registros, que estarán
; almacenados en la pila en el orden según el cual fueron pusheados.
; Vale aclarar que el código es de 16 bits, por eso el tamaño mínimo de
; datos a pushear es de 2 bytes. Por el contrario, de estar trabajando
; con pilas de 32 bits, al realizar un push ds u otro selector, el push
; ocupa 4 bytes en la pila, dos del ds y dos que deja libres para
; mantener la pila alineada en 4 bytes.
;
cargar_reg:
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_EAX],eax
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_EBX],ebx
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_ECX],ecx
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_EDX],edx
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_ESI],esi
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_EDI],edi
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_EBP],ebp
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_ESP],esp
mov ax,[esp+2]
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_EIP],ax
mov ax,[esp+2+2]
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_CS],ax
mov [excepciones+excepciones_struc.registros+\
registros_struc.reg_DS],ds