Red de conocimiento informático - Conocimiento sistemático - Detalles del ensamblador (ayúdenme a explicar cómo el ensamblador cuenta el número de cada carácter en la cadena de entrada)

Detalles del ensamblador (ayúdenme a explicar cómo el ensamblador cuenta el número de cada carácter en la cadena de entrada)

************************************************** * *******************************

El programa generará los caracteres ingresados ​​desde el teclado y mostrar los mismos caracteres y el número de caracteres idénticos.

********************************************* ***** ****************************************

Tenga en cuenta que la matriz x8086 es Si comenzó en 0 o 1, no lo recuerdo, comencé a contar en 0, ¡depende de lo que esté haciendo! Por favor vea...

SEGMENTO DE DATOS el segmento de datos comienza

BUFFER DB 100 define el primer tipo de base de datos de datos BUFFER, el valor es 100

DB? Defina un tipo de base de datos vacía.

DB 100 DUP(?). Define 100 tipos de bases de datos de datos, inicializa

CHARS DB 'INPUT:$' define la cadena "INPUT:" que termina en $

<. p>DATA ENDS final del segmento de datos

CODE SEGMENT segmento de código

Supongamos CS:CODE,DS: DAT Segment CODE DECLARATION CS

Definición PRINCIPAL PROC FAR " Función PRINCIPAL

****************************************** ** ************

Dirección del segmento de datos apilados PUSH DS

SUB AX,AX Zeroed AX, AX=0

PUSH AX apila AX, que en realidad se enviará a la pila 0

MOV AX,DATA coloca la dirección inicial del segmento de datos en AX

MOV DS,AX inicializa DS ( dirección del segmento de datos)

******** Lo anterior es fijo, es decir, el segmento de datos de inicialización del programa***** **

INICIO: MOV DX, OFFSET CHARS La primera dirección de CHARS y colóquela en DX

MOV AH,9 Coloque la función de interrupción de DOS número 9 en AH y úsela para mostrar la cadena almacenada en DX

Las llamadas INT 21H interrumpen 21

******* y superiores.

Se utiliza para mostrar la cadena "INPUT:" **********

MOV DX,OFFSET BUFFER toma la primera dirección del carácter CHARS y la coloca en DX

MOV AH,0AH coloca la función de interrupción de DOS número 0A en AH, que se utiliza para almacenar en búfer la entrada desde el teclado y guardarla en la dirección almacenada en DX

INT 21H llama a la interrupción 21

******* Lo anterior se utiliza para ingresar desde el búfer del teclado al BUFFER, y el contenido de entrada se colocará en BUFFER ************

MOV DL,0AH pone "avance de línea" en DL

La función MOV AH,2 02 generará un carácter desde DL

Las llamadas INT 21H interrumpen 21

******** Lo anterior se usa para el salto de línea 1, genera el carácter de salto de línea **********

MOV DL,0DH coloca el "carácter de retorno de carro" en DL

MOV AH, función 2 02, generará un carácter desde DL

INT 21H llama a 21 interrupción

******* Lo anterior se usa para el salto de línea 2, salida Carácter de retorno de carro************

********** Los dos anteriores se usan para saltos de línea** **********

MOV SI OFFSET BUFFER coloca los caracteres ingresados ​​desde el teclado y la dirección BUFFER en SI

INC SI apunta al segundo carácter

MOV AL, [SI] pone AL en AL

INC SI apunta al siguiente carácter

MOV DL,[SI] SI apunta al siguiente carácter de DL

MOV DH,[SI] también apunta a DH

MOV DI, SI DI apunta al tercer carácter de BUFFER

MOV CL,AL CL=AL =BUFFER[1]=100

MOV CH,0 CH=0

MOV BL,1 BL=1

MOV BH,0 BH=0

DEC CL CL menos 1

GO1: INC SI SI apunta hacia abajo Un carácter

CMP DL,[SI] Compara BUFFER[i] y BUFFER[i+] para ver si BUFFER[i] es igual

JNE TO1 Si no, vaya a TO1

INC BL Si es igual, BL se incrementará en 1.

TO1: LOOP GO1 recorre CX-1 y va a GO1

************ La función anterior atraviesa todos los caracteres en BUFFER y coincidirá con Put la misma cantidad de caracteres en BUFFER [1] en BL, **************

CALL OUTPUT llama a OUTPUT para generar un número de diez dígitos que podemos leer, y se muestra

MOV BL,1 BL=1

TO5: INC DI DI+1, procesamiento por lotes a la siguiente dirección, DI apunta al cuarto carácter de BUFFER

p>

DEC AL AL ​​​​menos 1, la primera vez es AL=99

CMP AL, se comparan 1 y 1.

JE TO3 Si es 1, vaya a TO3

CMP DH,[DI] Comparar con los caracteres DH, si BUFFER[1] es igual

JE TO5 Si es igual, regrese a TO5

MOV DL, [DI] Si no es igual, coloque el carácter señalado por DI en DL,

MOV SI,DI SI=DI ingrese SI

p>

MOV CL,AL CL=AL

MOV CH,0 CH=0, CX=CL

DEC CL=CL- 1

GO2: INC SI apunta al siguiente carácter

CMP [SI], DL compara con caracteres DL. ¿Es BUFFER[1] igual?

JNE TO2 Si es igual, devuelve TO2

INC BL BL=BL+1 Si es igual

MOV [SI],DH Pondrá los mismos caracteres en SI

TO2: LOOP GO2 CL=CL-1

SALIDA DE LLAMADA mostrará el mismo número de caracteres

MOV BL,1 BL recalcular, inicializar Debido a que es un carácter en sí mismo, si hay el mismo, deben ser dos caracteres idénticos

JMP TO5 Saltar a TO5

TO3: CMP DH, [DI ] Cuando AL=1, el bucle finaliza y saltará aquí

JE TO4 Si el valor de la dirección en DH y DI es el mismo en este momento, el bucle finaliza.

MOV DL,[DI] De lo contrario, [DI] se colocará en DL

MOV BL,1 Agregue 1 a BL porque solo queda un carácter y no hay el mismo carácter como él nunca más.

Número de carácter de salida de SALIDA DE LLAMADA.

TO4: RET

ENDP PRINCIPAL

-----------------------; ---

Función personalizada OUTPUT PROC

PUSH AX //

PUSH CX //

PUSHF //Guardar escena< / p>

MOV AH,2 llama a la función DOS 02 para generar el contenido de DL, es decir, salida BUFFER[1]

INT 21H llama a la interrupción INT 21

MOV DL ,20H Código ASCII de "espacio"

MOV AH,2 llama a la función DOS 02 y genera "espacio" en DL

INT 21H

MOV AL, BL AL =BL, el mismo número de caracteres

MOV AH,0 AX=AL

MOV CL,10 CL =10

DIV CL AX=AX/ CL=AL /10=BL/10, el cociente está en AL y el resto está en AH

ADD AH, 2 llama a la función 02 de DOS para convertir el DL en la salida del cociente AL en el dígito de las decenas de el número de repeticiones

p>

INT 21H

***** Dígito de decenas de salida****

MOV DL,CH

MOV AH,2

INT 21H

****** Salida de un solo dígito****

MOV DL MOV AH, 2

MOV AH, 2

INT 21H

********** y superiores se utilizan para el salto de línea 1, y la línea se genera el carácter de interrupción ***********

MOV DL,0DH

MOV AH,2

INT 21H

********** y superiores se utilizan para el retorno de carro 2 y la salida Enter************

POPF //Restaurar sitio

POP CX //

POP AX //Restaurar sitio

RET //Regresar

SALIDA ENDP

CÓDIGO FINALIZA

FINAL PRINCIPAL