Red de conocimiento informático - Conocimiento sistemático - Programación en ensamblador de cuatro operaciones aritméticas para números decimales de 2 dígitos

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

;------------- ----------------------——

;

; 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

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

; 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

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

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í