Red de conocimiento informático - Conocimiento sistemático - Implementación en lenguaje ensamblador de cuatro operaciones

Implementación en lenguaje ensamblador de cuatro operaciones

Segmento de código

Supongamos CS: código, DS: código

CR es igual a 000DH

LF es igual; 000AH

KBBack es igual a 0008H

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

; Función: Mostrar la cadena de la dirección especificada (Str_Addr)

; Entrada:

;

p>

; Método de uso: Salida Str_Addr

Ejemplo de uso: Salida PromptStr

Salida MACRO Str_Addr

lea dx , Str_Addr

mov ah, 9

int 21h

EndM

-- ---------- ------- --- ---------

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<; /p>

XOR BX, BX

MOV AH, 3

INT 10H

MOV Cursor_Row, DH

MOV Cursor_Col , 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: Salida de carro Retorno Avance de línea

enter_CTLF proc Cerca

empujar hacha

push dx

mov ah, 02h

mov dl, 0dh

int 21h

mov dl, 0ah

int 21h

pop dx

pop hacha

ret

ente

r_CTLF final

------- ---------- ---------- ---------- --- -

; Función: Generar un carácter

; Entrada: dl=Carácter que se mostrará

enter_Chr proc Cerca de

push ax

mov ah, 02h

int 21h

pop ax

ret

enter_Chr endp

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

; número en el teclado: ingrese un número decimal de N dígitos en el teclado Número,

; use instrucciones lógicas e instrucciones de desplazamiento para convertirlo en un número decimal y guardarlo en la unidad de almacenamiento especificada.

; Entrada: N=número de dígitos; di=la primera dirección para almacenar los dígitos de entrada

; Salida: El número binario convertido se almacena en la celda indicada por di

p>

Input_Digit Proc Near

presionar dx

presionar cx

presionar bx

presionar di

lea di, @@Save_Tmp

push di

cld

mov cx, N

push cx

@@Input .Digit Proc Near

: llamar a GetCursor; obtener la posición del cursor

mov ah, 1; aceptar un carácter del teclado.

int 21h

cmp al, CR ; Si se escribe un retorno de carro, el número que se ha escrito tiene menos de N dígitos

jz @@ASC_Dec ; Vaya al número que se ha escrito

cmp al, KBBack

jz @@KB_Back ; si se ingresa un carácter de retorno de carro

cmp al, '0; '

jb @@KBBack ; Si está bajo el número '0', vuelva a ingresar

cmp al,'9'

ja @@KBBack ; si está bajo el número '9', vuelva a ingresar

jmp @@Save_Dig

@@KB _Back:dec Cursor_Col

inc cx

dec di

@ @KBBack: llamar a SetCursor; establecer la posición del cursor

jmp @@Input

@@Save_Dig: y al, 0fh ; Convertir a número binario

stos

p>

stosb ; Guardar

bucle @@Input ; : mov ax, cx

pop cx

pop si

sub cx, ax el número real de dígitos ingresados

xor bp; , bp

xor dx, dx

xor ax, ax

jcxz @@Save_Ret; si se ingresa directamente sin ningún dígito, se considera que ingresa '0; '

dec cx; Realmente ingresado Reste un dígito del número de dígitos y prepárese para convertir la cadena de dígitos ingresada en un número binario

jcxz @@One_Digit; el número de dígito de entrada real y prepárese para convertir la cadena de dígitos de entrada en un número binario

jcxz @ @One_Digit; si el número de entrada tiene solo un dígito, guarde el número binario directamente

.

mov bx, 10

@@Mul_Ten: lodsb

cbw

agregar hacha, pb

mul bx

mov bp, ax

bucle @@Mul_Ten

@@One_Digit: lodsb

cbw

agregar hacha,

bp

@@Save_Ret: pop di

stosw

pop bx

pop cx

pop dx

ret

@@Save_Tmp db 16 dup(?)

Input_Digit EndP

------- --- ------- ---------- ----

; Función: Convertir números binarios con y sin signo en AX para borrar códigos decimales ASCII y enviarlos al pantalla de visualización

; Entrada: AX=número binario

; Salir: muestra el número convertido en la posición actual del cursor para mostrar el número ASCII convertido

p>

Dec_ASCII Proc Near

push dx

push bx

push di

.IF Firmado == 'y'

mov @@Carry_Yes, ' ' <

hacha de prueba, 8000h

jz $ 9

mov @@Carry_Yes, '- '

neg ax

.Endif

mov bx, 10

lea di, @@Temp_Save[6]

mov byte ptr [di], '$'

dec di

cld

@@Dividir: xor dx, dx

div bx

o dl, 30h

mov [di], dl

dec di

test ax, 0ffffh

p>

jnz @@Divide

.IF Firmado == 'y'

cmp @@Carry_Yes,'-'

jnz $ 6

mov byte ptr [di], '-'

dec di

.Endif

inc di

push di

pop dx

mov ah, 9

int 21h

pop di

pop bx

pop dx

ret

@@ Temp_Save db 7 dup(?)

@@Carry_Yes db ' '

Dec_ASCII EndP

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

N equ 3 ; El número de dígitos enteros decimales ingresados

DB 'n' con signo;

'y' = número con signo, 'n' = número sin signo

Número1 dw ?

Número2 dw ?

Period_Aft db 3 conserva el número de decimales;

prompt_One db 'Por favor, el primer número: $'

prompt_Two db 'Por favor, el segundo número: $'

Start.push cs

pop ds

push cs

pop es; hacer que el segmento de datos, el segmento adicional y el segmento de código sean iguales

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

; Ingrese dos números decimales

Mensaje de salida_Uno; el primer número

lea di, Número1; Dirección de la variable Número1

llame a Input_Digit; acepte la entrada de números de N dígitos desde el teclado

llame a enter_CTLF; return, salto de línea

Salida request_Two; Solicitar el primer número

lea di, Número2; Dirección de la variable Número1

Llamar a Input_Digit; entrada desde el teclado

Llamar a enter_CTLF; retorno de carro de salida y avance de línea

Llamar a enter_CTLF; generar N dígitos

llamar a enter_CTLF;

call enter_CTLF; Salida N dígitos

call enter_CTLF Salida de retorno de carro y avance de línea

-------- ---------- --- ------- ---------- ---

Operación de suma

mov ax, Número1

llamar a Dec_ASCII ;Convertir números binarios con y sin signo en AX a códigos ASCII decimales explícitos y enviarlos a la pantalla<

mov dl, ' '

llamar a enter_Chr ;mostrar un signo más

mov ax, Number2

llamar a Dec_ASCII; mostrar el segundo número

mov dl, '='

llamar a enter_Chr; signo igual

mov ax, Número1

agregar ax, Número2; Número1 Número2→AX

llamar a Dec_ASCII; enter_CTLF; retorno de carro de salida y avance de línea

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

; Operación de resta

mov ax, Número1

Llamar a Dec_ASCII Convertir valores binarios con y sin signo en número AX; código ASCII decimal inequívoco y enviado

para mostrar

mov dl, '-'

llamar a enter_Chr; mostrar el signo menos

mov ax, Number2

llamar a Dec_ASCII; Segundo número

mov dl, '="

Llamar a enter_Chr; mostrar signo igual

mov ax, Número1

sub ax, Número2 ; Número1-Número2→AX

Llamar a Dec_ASCII; mostrar valor de diferencia

Llamar a enter_CTLF y salto de línea de salida

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

; Multiplicación (realice la operación con anticipación) , De lo contrario, el producto puede exceder fácilmente el rango que el registro de 16 bits puede representar)

mov ax, Number1

call Dec_ASCII convierte números binarios con y sin signo en AX en claros; código ASCII decimal y enviarlo a la pantalla

mov dl,'*'

llamar a enter_Chr; mostrar signo de multiplicación

mov ax,Number2

llamar a Dec_ASCII; mostrar el segundo número

mov dl, '="

llamar a enter_Chr; mostrar el signo igual

mov ax, Número1

p>

.IF Firmado == 'y' ;Multiplicación de números con signo

imul Número2 ;Número1*Número2→AX

.ELSE ;Multiplicación de números sin signo

p>

mul Número2; Número1*Número2→AX

.Endif

Llame a Dec_ASCII; representado por un registro de 16 bits)

p>

Llamada a enter_CTLF; retorno de carro de salida y avance de línea

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

; Operación de división <

mov ax, Número1

Llame a Dec_ASCII; convierta el binario en AX a Los números con y sin signo se convierten a ASCII decimal inequívoco y se envían a la pantalla

mov dl, '/'

Llame a enter_Chr ; mostrar signo de división

mov ax , Número2

llamar a Dec_ASCII; mostrar el segundo número

mov dl, '="

llamar enter_Chr; muestra el signo igual

xor dx,dx

mov ax,Number1

.IF Signed == 'y' ;Multiplicación de números con signo

idiv Número2 ;Número1/Número2→AX (cociente), DX (resto)

.ELSE; Multiplicación de números sin signo

div Número1/Número2→AX (cociente) ), DX (resto)

.Endif

Llama a Dec_ASCII; muestra la parte entera del cociente

prueba dx,

0ffffh; Determinar si el resto es 0

jz Exit_Proc; Capaz de dividir y finalizar el programa

Push dx

mov dl, '.

llamar a enter_Chr; mostrar punto decimal

pop dx

mov bp, 10; multiplicar

mov cl, Period_Aft; /p>

xor ch, ch

Dec_Frac: mov ax, dx; el resto no es 0, trata con la parte decimal

mul bp; , continúa la división

div Número2; divide por el divisor y usa el cociente como un decimal del resultado

Push dx

o al, 30h

mov dl, al

Llamar a enter_ Chr; mostrar un decimal

pop dx

test dx, 0ffffh; 0

jz Exit_Proc; Capaz de realizar operaciones de división y finalizar el programa

bucle Dec_Frac

llamada enter_CTLF retorno de carro de salida y avance de línea

<; p>; --------- -------- ---------- --

Exit_Proc: mov ah, 4ch;

int 21h

Código FINALIZA

FIN Inicio La compilación termina aquí