Ensamblador Utilizado NASM
Enviado por hikarivic • 7 de Mayo de 2013 • 2.885 Palabras (12 Páginas) • 504 Visitas
; Ensamblador utilizado NASM
;
;
[BITS 16] ; Set 16 bit code generation
SEGMENT junk ; Segment containing code
..start: ; The two dots tell the linker to Start Here.
mov ax,data ; Move segment address of data segment into AX
mov ds,ax ; Copy address from AX into DS
mov es,ax ;
mov ax,stack ; Move segment address of stack segment into AX
mov ss,ax ; Copy address from AX into SS
mov sp,stacktop ; Point SP to the top of the stack
;==============================|
; MAIN |
;==============================|
Inicio:
call Reset ; Limpiar variables
call Menu ; Imprimir menu
Opcion:
call GetCh ; Leer caracter de seleccion de opcion del menu
cmp al, 27 ; es ESC ?
je Fin ; terminal si es ESC
cmp al, '1' ; es ASCII 1?
jne Opt2 ; saltar si no es igual
call DoSuma ; ingresar los datos y operar la suma
jmp Inicio ; repetir el ciclo
Opt2:
cmp al, '2' ; es ASCII 2
jne Opt3 ; saltar si no es igual
call DoResta ; ingresar datos y operar la resta
jmp Inicio ; repetir el ciclo
Opt3:
cmp al, '3' ; es ASCII 3
jne Opt4 ; saltar si no es igual
call DoMulti ; ingreasar datos y operar la multiplicacion
jmp Inicio ; repetir el ciclo
Opt4:
cmp al, '4' ; es ASCII 4
jne Opcion ; si no repetir el ingreso de caracter
call DoDiv ; ingresar datos y operar la division
jmp Inicio ; repetir ciclo
Fin:
mov ax, 04C00H ; salir
int 21H ; fin de programa
;======================================================================
; funcion DoDiv
; ingresa datos y opera la division
DoDiv:
call NewLine ;
mov dx, Msg13 ;
call Writeln ;
Call NewLine ;
mov dx, Msg6 ;
call Write ;
mov cx, 10 ; 10 digitos
mov di, OpA ; guardarlo en memoria OpA
call Read128BitNum ; llamar a la funcion que lee el numero
Call NewLine ;
mov dx, Msg7 ;
call Write ;
mov cx, 10 ; 10 digitos
mov di, OpB ; guardarlo en memoria OpB
call Read128BitNum ; llamar a la funcion que lee el numero
mov si, OpB ; parametros para comparar el operador B
mov di, Cero128Bits ; con cero, division por cero?
call Cmp128Bits ; compara dos numeros de 128bits
je DoDivFin ; si el B == 0 error division por cero
Call NewLine ;
mov si, OpA ; parametros de la division
mov di, OpB ; etc
mov bx, prd ; resultado
call Div128Bits ; funcion que divide dos numeros
mov dx, Msg8 ;
call Write ;
mov si, prd ; resultado de la division en binario
mov cx, 20 ;
mov bx, Res ;
call Write128BitS ; funcion que convierte de binario a decimal
mov si,Res ; en Res esta guardado el numero en decimal como cadena
call WriteNum ; imprimir el numero en pantalla
Call NewLine ;
Call NewLine ;
ret ;
DoDivFin:
Call NewLine ; Exception, en caso de division por cer
mov dx, Msg14 ; imprimir un mensaje extra de error
call Writeln ; y regresar sin hacer nada.
ret ;
;======================================================================
; funcion DoMulti
; ingresa datos y opera la multiplicacion
DoMulti:
call NewLine ;
mov dx, Msg12 ;
call Writeln ;
Call NewLine ;
mov dx, Msg6 ;
call Write ;
mov cx, 10 ; ingresar un numero de
mov di, OpA ; 10 digitos y guardarlo
call Read128BitNum ; en binario en OpA
Call NewLine ;
mov dx, Msg7 ;
call Write ;
mov cx, 10 ; Ingresar numero de 10
mov di, OpB ; digitos en binario y guardarlo
call Read128BitNum ; en OpB
Call NewLine ;
mov si, OpA ;
mov di, OpB ;
mov bx, prd ; resultado de la multiplicacion
call Mult128Bits ; realizar la multiplicacion
mov dx, Msg8 ;
call Write ;
mov si, prd ;
mov cx, 20 ;
mov bx, Res ;
call Write128BitS ; convertir de binario a decimal
mov si,Res ;
call WriteNum ; imprimir el resultado en pantalla
Call NewLine ;
Call NewLine ;
ret ;
;======================================================================
; funcion DoResta
; ingresa datos y opera
DoResta:
call NewLine ;
mov dx, Msg11 ;
call Writeln ;
Call NewLine ;
mov dx, Msg6 ;
call Write ;
mov cx, 20 ;
mov di, OpA ;
call Read128BitNum ;
Call NewLine ;
mov dx, Msg7 ;
call Write ;
mov cx, 20 ;
mov di, OpB ;
call Read128BitNum ;
Call NewLine ;
mov si, OpA ;
mov di, OpB ;
mov bx, prd ;
call Resta128Bits ;
mov dx, Msg8 ;
call Write ;
mov si, prd ;
mov cx, 20 ;
mov bx, Res ;
call Write128BitS ;
mov si,Res ;
call WriteNum ;
Call NewLine ;
Call NewLine ;
ret ;
;======================================================================
...