Red de conocimiento informático - Conocimiento sistemático - ¡Diseño de cursos de lenguaje ensamblador en busca de soluciones! ¡Debajo del título!

¡Diseño de cursos de lenguaje ensamblador en busca de soluciones! ¡Debajo del título!

; Este programa se compila y ejecuta correctamente

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

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

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í