Programación en ensamblador de cuatro operaciones aritméticas para números decimales de 2 dígitos
; Este programa fue compilado bajo el entorno integrado MASMPlus 1.2, depurado y ejecutado correctamente.
Segmento de Código
Supongamos CS: Código, DS: Código
-----------------; - ---------------------
Función: Mostrar la cadena de la dirección especificada (Str_Addr)
; Entrada:
p>
; Str_Addr = dirección de cadena (se requiere que esté en el segmento de datos)
; Uso: Salida Str_Addr
; : Salida PromptStr
Salida MACRO Str_Addr
lea dx, Str_Addr
mov ah, 9
int 21h
FinM
; - --------------------------------------- -------------
ASCII_Binary MACRO; Convierte dos dígitos para convertir código ASCII a número binario
mov dl, 10
lodsb
y al, 0fh
mul dl
mov dx, ax
lodsb
y al , 0fh
agregar al, dl
stosb
EndM
;------------- ----------------------—— p>
;
; Entrada: es: di=Guardar la primera dirección del número ingresado
; Salir: El número binario convertido se guarda en la unidad señalada por di
>Input_Dec Proc cerca
push cx
push bx
cld
mov cx, 2
@@ Input_Dec: mov ah, 7; acepta un carácter del teclado
int 21h
cmp al , '0'
jb @@Input_Dec ; inferior al número '0', vuelva a ingresar
cmp al, '9'
ja @@Input_Dec ; si es mayor que el número '9', vuelva a ingresar;
stosb ; Guardar
mov ah, 0eh ; Mostrar este número
xor bh, bh
int 10h
loop @@Input_Dec; aceptar el siguiente número
pop bx
pop cx
ret p>
Input_Dec EndP
; ------------------------------- --
; Función: Convertir el binario número sin signo en AX en código ASCII decimal explícito y enviarlo a la pantalla de visualización
; Entrada: AX=número binario p>
; Muestra el número de código ASCII convertido en el cursor actual. posición
Unsi_Dec_ASCII Proc cerca
empujar dx
empujar bx
empujar di
mov bx, 10
lea di, @@Temp_Save[5]
mov BYTE PTR [di], '$'
dec di
cld
@@Dividir: xor dx, dx
div bx
o dl, 30h
mov [di], dl
dec di
prueba ax, ax
jnz @@Divide
inc di
push di
pop dx
mov ah, 9 p>
int 21h
pop di
pop bx
pop dx
ret
@ @Temp_Save db 6 dup(?)
Unsi_Dec_ASCII EndP
; ------------------------- -------- /p>
; Entrada: Ninguna
; Salida: Si la entrada es 'y', se establece el indicador de acarreo si la entrada es 'n'; la bandera de acarreo se reinicia.
Yes_or_No proc Near
push dx
push ax
@@Input_Chr: mov ah, 7; entrada de teclado
int 21h
mov dl, al
and al, 0dfh
cmp al, 'Y'
jnz $ 5
stc
jmp $ 7
cmp al,'N'
jnz @@Input_Chr p >
clc
mov ah, 2
int 21h
pop ax
pop dx
ret
Sí_o_No Endp
; -------------------------- -----
; Operación de suma
Proc de adición cerca
mov ax, WORD ptr Número
add al, ah
xor ah, ah
llamar a Unsi_Dec_ASCII; mostrar suma
ret
Adición EndP
---- ---- -------------------------------------------------- -------------------------------------------- de la operación de resta--- -----------------------| >Proc de resta cerca
mov ax, WORD ptr Número
sub al , ah
xor ah, ah
llamar a Unsi_Dec_ASCII; mostrar diferencia
ret
Final de resta
; ------------------- ----------------
; Operación de multiplicación
Multiple Proc Near
mov ax, WORD ptr Number
mul ah
call Unsi_Dec_ASCII display product
ret
P final múltiple
-------- ---------------------------- ------------------
; Operación de división
Proc de división cerca
mov ax, WORD ptr Número
mov bl, ah
xor ah, ah
div bl
push ax
xor ah , ah
llama a Unsi_Dec_ASCII; muestra la parte entera del cociente
mov cx, 6; escribe el número de caracteres
mov al, '.'
mov ah, 0eh
@@Escribir
e_Dot: int 10h
loop @@Write_Dot
pop ax
xchg ah, al
o al, 30h
mov ah, 0eh
int 10h
ret
Fin de división
-------- - -------------------------------
prompt_Str db 13, 10, 10, 'Ingrese una expresión aritmética: ', 13, 10, '$'
Contin_Str db 13, 10, 10, 'Continue(Y/N)?$'
Número db ?, ?; Unidad de almacenamiento de operandos
Operadores db ' -*/'; Operador
Procedimiento dw Suma, Resta, Múltiple, División
Presione la tecla db 7, 13, 10, 10 , 'El archivo completo presiona cualquier tecla para salir...$'
Inicio: push cs
pop ds
push. cs
pop es
Input_Expre: salida request_Str; Solicitud para ingresar una expresión aritmética
lea di, Arith_Expre; dirección del búfer de expresión aritmética
llame a Input_Dec Ingrese un número decimal de dos dígitos, guárdelo en la unidad de memoria especificada
Input_Oper: mov ah, 7
int 21h
cmp al, ' '
jz Store_Oper
cmp al, '-'
jz Store_Oper
cmp al, '*'
jz Store_Oper
cmp al,'/'
jnz Input_Oper
Store_Oper: stosb; guardar
mov ah, 0eh; este número
p>
xor bh, bh
int 10h
call Input_Dec
mov al, '='
mov ah, 0eh
xor bh, bh
int 10h
lea si, Arith_Expre
lea di , Número; dirección de la unidad de almacenamiento del operando
ASCII_Binary; Convertir código ASCII de dos dígitos en número binario
inc si
ASCII_Binary
mov al, BYTE ptr Arith_Expre[ 2] ;Obtener operador
mes
v cx, 4
lea di, Operadores
mov bx, di
repnz scasb
xchg di, bx
sub bx, di
dec bx
shl bx, 1
llamar al procedimiento[bx]; llamar a la subrutina de operación correspondiente
Salida Contin_Str
call Yes_or_No
jc Input_Expre
; ------------------- - -------------------
Exit_Proc: Salida Press_Key; indica que la operación se completó, presione cualquier tecla para finalizar el programa
mov ah, 1
int 21h
mov ah, 4ch; finalizar programa
int 21h
Arith_Expre: ; buffer
Código FINALIZA
FIN Inicio La compilación termina aquí