¡Diseño de cursos de lenguaje ensamblador en busca de soluciones! ¡Debajo del título!
Segmento de código
Asuma CS: Code, DS: Code
---- ------- --- ---------- -------
Función: Mostrar la cadena de la dirección especificada (Str_Addr)
;
; Str_Addr = dirección de cadena (obligatoria en el segmento de datos)
; Método de uso: Salida Str_Addr
; >Salida MACRO Str_Addr
push dx
; Salida MACRO Str_Addr
Salida MACRO Str_Addr
Salida MACRO Str_Addr
Push dx
lea dx, Str_Addr
mov ah, 9
int 21h
pop dx
EndM
---- ---------- ---------- -------
; Función: Generar un carácter
; Entrada: dl= carácter que se mostrará
Output_Chr proc Cerca de
push ax
mov ah, 02h
int 21h
pop ax
ret
Output_Chr endp
; - ---------- ---------- ----------
Función: retorno de carro de salida y salto de línea
; p>; Entrada: dl=carácter que se mostrará salida retorno de carro avance de línea
Output_CTLF proc Near
push ax
push dx
mov ah, 02h
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h p>
pop dx
pop ax
ret
Output_CTLF endp
;---- ----- --- -- ---------- -------
Función: Obtener la posición del cursor
Entrada: Ninguna
;; Salir: DH= número de línea, DL= número de columna
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
, DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB?
GetCursor EndP
--
----- ---------- ---------- ----
Función: Establecer la posición del cursor
; Entrada: Cursor_Row=coordenada de fila; Cursor_Col: coordenada de columna)
SetCursor Proc.
PUSH CX
PUSH BX
PUSH AX
MOV DH, Cursor_Row
MOV DL, Cursor_Col
XOR BX, BX
MOV AH, 2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
;---- ---------- ---------- -------
Función: Establece el valor inferior en AL Convierta el número binario de 4 dígitos a ASCII para mostrarlo en hexadecimal
; Ingrese: AL
Salga: AL= código ASCII convertido
AL_ASCII Proc Near
cmp al, 10; ALt; 10?
jb @@@To_ASCII; ALt; 10, procesado numéricamente
agregar ALgt;=10 , tratado como mayúscula
@@To_ASCII: agregue al, '0'; convertido a los números correspondientes o letras mayúsculas
ret
AL_ASCII EndP
; -- ---------- ---------- ---------
; Convertir los datos del byte en Código AL a ASCII para visualización hexadecimal
; Ingrese: AL
; Salir: AX= código ASCII convertido
Cierre del programa Byte_ASCII
push cx
mov cx, 4
xor ah, ah; establece AH en 0
shl ax, cl Shift AX 4 bits a la izquierda
shr al, cl; Desplazar AL hacia la derecha 4 bits
xchg ah, al
Llamar a AL_ASCII; llamar a la subrutina convierte el valor en AL a la codificación ASCII correspondiente
xchg ah, al
Llamar a AL_ASCII
xchg ah, al
pop cx
ret
Byte_ASCII EndP
--- ---------- --------- - ---------- --- -----
Función: Convertir los datos de bytes en AL en código ASCII mostrado en hexadecimal y mostrarlo en la posición actual del cursor
; p>; Salir: AX= código ASCII convertido
ByteD_ASCII Proc Near
push dx
push ax
Llamar a Byte_ASCII; el número de bytes en AL a ASCII visualización hexadecimal
p>
cmp al, '9'
jbe $ 7
mov dl, '0'
call Output_Chr muestra un carácter
mov dl, al
call Output_Chr; Mostrar un carácter
mov dl, ah
call Output_Chr; p> mov dl, 'H
call Output_Chr Mostrar un carácter
pop ax
pop dx
ret
ret
ByteD_ASCII EndP
------- ---------- ---------- -- --
Función: Convertir datos de palabras en AX a visualización de datos hexadecimales ASCII en la posición actual del cursor
Entrada: AX
WordD_ASCII Proc Near
; p>Push dx
Push ax
Push ax
xchg ah, al
Llamada Byte_ASCII; bytes en código AL a ASCII y mostrarlo en hexadecimal
cmp al, '9'
jbe $ 7
mov dl , '0'
llamar a Output_Chr; mostrar un carácter
mov dl, al
llamar a Output_Chr; mostrar un carácter
mov dl, ah
llamar a Output_ Chr; mostrar un carácter
pop ax
llamar a Byte_ASCII; convertir el número de bytes en código AL a ASCII, en dieciséis pantallas hexadecimales
mov dl, al
llamar a Output_Chr; mostrar un carácter
mov dl, ah
llamar a Output_Chr; mostrar un carácter
mov; dl,'H'
Llamar a Output_Chr; mostrar un carácter
pop ax
pop dx
ret
WordD_ASCII EndP
--------- ---------- ---------- - -
; Función: ingrese la dirección del segmento o la dirección de compensación de la unidad de almacenamiento
; Parámetros de entrada: Ninguno
Parámetros de salida: si presiona Enter directamente (no la dirección de entrada) o la dirección contiene caracteres no válidos, se establece el indicador de redondeo;
; de lo contrario, el indicador de redondeo se borra, BX = dirección válida
Input_Addr Proc Near
lea dx, Buffer; dirección del búfer de cadena
mov ah, 0ah
int 21h
lea si, Buffer[1] número real de caracteres de entrada Dirección
lodsb; leer el número real de caracteres de entrada
test al, 0ffh
jz @@Invalid
xor bx, bx;
Valor inicial
mov cl, al
xor ch, ch
@@Comprobación: lodsb lee el número de caracteres ingresados por carácter
<; p> cmp al, '0'; carácter lt; '0'?jb @@Letra; Sí, determina si es una letra
cmp al, '9'; lt;='9'?
jbe @@Valid; Sí, acumula direcciones válidas
@@Letra: mov ah, al
y ah, 0dfh
cmp ah, 'A'; carácter lt; ='A'?
jb @@Invalid Sí, carácter no válido
cmp ah, 'Z ' ; Carácter lt; 'Z'?
ja @@Invalid Sí, carácter no válido
@@Valid: y al, 0fh
push cx
mov cx, 4
shl bx, cl; desplaza la dirección efectiva a la izquierda en 4
o bl, al agregar los 4 bits inferiores
pop cx
loop @@Comprobando; siguiente bit
clc; feed flag clear
ret
@@Inválido: stc; configuración de la bandera del feed
ret
Input_Addr EndP
; -- - --------- -
Segment_Str db 'Ingrese una dirección de segmento (heximal):$'
Offset_Str db 13, 10, 'Ingrese una dirección de desplazamiento (heximal): $'
Memory_Addr dd?
La dirección de desplazamiento está al frente y la dirección del segmento está detrás
Press_Key db 7, 13, 10, 13, 10, 'Presione cualquier tecla para salir...$'
Inicio: push cs
pop ds
push cs
pop es; hacer que el segmento de datos, el segmento adicional y el segmento de código sean el mismo segmento
cld
p>Salida Segment_Str; Solicitar la dirección del segmento
llamar a GetCursor; tomar la posición del cursor
@@Segment: llamar a SetCursor;
call Input_Addr ;Ingrese la dirección
jc @@Segment ;Vuelva a escribir si la dirección no es válida
mov word ptr Memory_ Addr[2], bx ;Guardar dirección del segmento
Salida Offset_Str; Solicitar dirección de desplazamiento de entrada
llamar a GetCursor
@@Offset: llamar a SetCursor
llamar a Input_Addr
jc @@ Offset
mov word ptr Memory_Addr, bx; guardar la dirección de desplazamiento
Llamar a Output_CTLF Generar un retorno de carro, avance de línea
Llamar Output_CTLF
mov dl, '['
Llamar a Output_Chr
mov ax, word ptr Memory_Addr[2] obtiene la dirección del segmento de la unidad de almacenamiento
;Llamar a WordD_ASCII; poner AX en Convertir los datos de la palabra a código ASCII hexadecimal y mostrarlo en la posición actual del cursor
mov dl, ':
Llamar a Output_Chr
mov ax, word ptr Memory_Addr; Obtener la dirección de compensación de la unidad de almacenamiento
Llamar a WordD_ASCII
mov dl, ']'
Llamar a Output_Chr p>
mov dl , '='
Llamar a Output_Chr
lds si, Memory_Addr; cargar dirección válida
lodsb; cell
push cs
pop ds
call ByteD_ASCII; convierte datos de bytes en AL a datos de bytes en AL. Convierte datos de bytes en AL a código ASCII de visualización hexadecimal.
Tecla_Salida: Salida Pulsar_Tecla
mov
ah, 1
int 21h
Exit_Proc: mov ah, 4ch; Finalizar programa
int 21h
Búfer db 5; , búfer de entrada de dirección de desplazamiento
Código ENDS
END Inicio ;La compilación termina aquí