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 datosCODE 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 p>
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 p>
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 p>
RET //Regresar
SALIDA ENDP
CÓDIGO FINALIZA
FINAL PRINCIPAL