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
------- ---------- --------- - ---- p>
; Función: Establecer la posición del cursor
; Entrada: Cursor_Row=coordenada de fila; Cursor_Col: coordenada de columna)
SetCursor Proc. p>
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 p>
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 p>
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>
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 p>
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 p>
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í