.model small ; Define el modelo de memoria pequeño para el programa .stack 100h ; Reserva 256 bytes para la pila .data ; Sección de datos donde se definen todas las variables num1 dw ? ; Define una variable de palabra (16 bits) para el primer número num2 dw ? ; Define una variable de palabra (16 bits) para el segundo número result dw ? ; Define una variable de palabra (16 bits) para el resultado opCode db ? ; Define una variable de byte para el código de operación msg1 db 'Calculadora Simple', 0Dh, 0Ah, '1: Suma', 0Dh, 0Ah, '2: Resta', 0Dh, 0Ah, '3: Multiplicacion', 0Dh, 0Ah, '4: Division', 0Dh, 0Ah, 'Seleccione operacion: $' ; Mensaje del menú msg2 db 'Ingrese el primer numero: $' ; Mensaje para solicitar el primer número msg3 db 'Ingrese el segundo numero: $' ; Mensaje para solicitar el segundo número msg4 db 'El resultado es: $' ; Mensaje para mostrar el resultado msgError db 'Error: Division por cero', 0Dh, 0Ah, '$' ; Mensaje de error para división por cero buffer db 5 ; Buffer para entrada de usuario .code ; Sección de código donde se define la lógica del programa main proc ; Procedimiento principal mov ax, @data ; Inicializa el segmento de datos mov ds, ax ; Mostrar menú y leer opción mov ah, 09h ; Función DOS para mostrar cadena lea dx, msg1 ; Carga la dirección del mensaje del menú en dx int 21h ; Interrupción DOS para mostrar el mensaje call LeerNumero ; Llama a la función para leer un número del usuario mov opCode, al ; Almacena el código de operación en opCode ; Leer el primer número mov ah, 09h lea dx, msg2 int 21h call LeerNumero mov num1, ax ; Almacena el primer número en num1 ; Leer el segundo número mov ah, 09h lea dx, msg3 int 21h call LeerNumero mov num2, ax ; Almacena el segundo número en num2 ; Realizar operación seleccionada cmp opCode, '1' ; Compara el código de operación con '1' je Suma ; Si es igual, salta a la etiqueta Suma cmp opCode, '2' je Resta cmp opCode, '3' je Multiplicacion cmp opCode, '4' je Division jmp Fin ; Si no es ninguna operación válida, salta al final Suma: ; Etiqueta para la operación de suma mov ax, num1 ; Carga el primer número en ax add ax, num2 ; Suma el segundo número a ax jmp MostrarResultado ; Salta a mostrar resultado Resta: ; Etiqueta para la operación de resta mov ax, num1 sub ax, num2 ; Resta el segundo número de ax jmp MostrarResultado Multiplicacion: ; Etiqueta para la operación de multiplicación mov ax, num1 imul num2 ; Multiplica ax por num2 jmp MostrarResultado Division: ; Etiqueta para la operación de división mov ax, num1 xor dx, dx ; Limpia dx para la división cmp num2, 0 ; Comprueba si el segundo número es cero je ErrorDivision ; Si es cero, salta a ErrorDivision idiv num2 ; Divide ax entre num2 jmp MostrarResultado ErrorDivision: ; Etiqueta para el error de división por cero mov ah, 09h lea dx, msgError int 21h ; Muestra el mensaje de error jmp Fin MostrarResultado: ; Etiqueta para mostrar el resultado mov ah, 09h lea dx, msg4 int 21h call MostrarNumero ; Llama a la función para mostrar el número jmp Fin LeerNumero proc ; Código para leer un número del usuario ; ... ret LeerNumero endp MostrarNumero proc ; Código para mostrar un número en pantalla ; ... ret MostrarNumero endp Fin: ; Etiqueta para el final del programa mov ah, 4Ch ; Función DOS para terminar el programa int 21h main endp end main ; Indica el final del archivo fuente
Write, Run & Share Assembly code online using OneCompiler's Assembly online compiler for free. It's one of the robust, feature-rich online compilers for Assembly language. Getting started with the OneCompiler's Assembly compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as Assembly
and start coding.
Assembly language(asm) is a low-level programming language, where the language instructions will be more similar to machine code instructions.
Every assembler may have it's own assembly language designed for a specific computers or an operating system.
Assembly language requires less execution time and memory. It is more helful for direct hardware manipulation, real-time critical applications. It is used in device drivers, low-level embedded systems etc.
Assembly language usually consists of three sections,
Data section
To initialize variables and constants, buffer size these values doesn't change at runtime.
bss section
To declare variables
text section
_start
specifies the starting of this section where the actually code is written.
There are various define directives to allocate space for variables for both initialized and uninitialized data.
variable-name define-directive initial-value
Define Directive | Description | Allocated Space |
---|---|---|
DB | Define Byte | 1 byte |
DW | Define Word | 2 bytes |
DD | Define Doubleword | 4 bytes |
DQ | Define Quadword | 8 bytes |
DT | Define Ten Bytes | 10 bytes |
Define Directive | Description |
---|---|
RESB | Reserve a Byte |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve a Quadword |
REST | Reserve a Ten Bytes |
Constants can be defined using
CONSTANT_NAME EQU regular-exp or value
%assign constant_name value
%define constant_name value
Loops are used to iterate a set of statements for a specific number of times.
mov ECX,n
L1:
;<loop body>
loop L1
where n specifies the no of times loops should iterate.
Procedure is a sub-routine which contains set of statements. Usually procedures are written when multiple calls are required to same set of statements which increases re-usuability and modularity.
procedure_name:
;procedure body
ret