Primero vamos con la de un solo dígito, este es su código:
org 100h
;suma numero de un solo digito
mov ax,8
mov bx,4
add ax,bx
mov bx,5
sub ax,bx
mov bx,3
inc bx
mov ax,6
Ahora veremos el de la suma con tres dígitos y su código:
ORG 100H
mov ax,80
mov bx,450
inc bx
add ax,80
mov cx,200
sub cx,bx
ret
jueves, 31 de enero de 2019
miércoles, 30 de enero de 2019
Ejemplo 3 emu8086
En este ejemplo estará el cursor esperando a que se de clic, aquí el código:
.MODEL tiny
NAME "HOLA A TODOS" ;esta linea es solo para ponerle el nombre
.DATA
DATO DB "HOLA MUNDO", 0Dh, 0Ah, 24h ;0Dh,0Ah,24h --> equivale a '\n' en c++
DATO2 DB 'HOLA MUNDO 2$'
;msg2 db "Hola alumnos"
;msg2 db "como estas"
.CODE
INICIO:
MOV DX,OFFSET DATO ;lee el contenido de la variable dato en el resultado dx
MOV AH,09 ; para imprimir el valor ah debe contener el valor 09
INT 21H ; lo muestra en el puerto del video
MOV ah,0
INT 16h ; esperando presionar cualquier letra equivalente a un get
MOV DX,OFFSET DATO2 ; lee el contenido de la variable dato 2 en el resultado dx
MOV AH,09 ; para imprimir el valor el valor ah debe contener el valor 09
INT 21h ; lo muestra en el puerto del video
RET ; retorna el control al sistema operativo
END
.MODEL tiny
NAME "HOLA A TODOS" ;esta linea es solo para ponerle el nombre
.DATA
DATO DB "HOLA MUNDO", 0Dh, 0Ah, 24h ;0Dh,0Ah,24h --> equivale a '\n' en c++
DATO2 DB 'HOLA MUNDO 2$'
;msg2 db "Hola alumnos"
;msg2 db "como estas"
.CODE
INICIO:
MOV DX,OFFSET DATO ;lee el contenido de la variable dato en el resultado dx
MOV AH,09 ; para imprimir el valor ah debe contener el valor 09
INT 21H ; lo muestra en el puerto del video
MOV ah,0
INT 16h ; esperando presionar cualquier letra equivalente a un get
MOV DX,OFFSET DATO2 ; lee el contenido de la variable dato 2 en el resultado dx
MOV AH,09 ; para imprimir el valor el valor ah debe contener el valor 09
INT 21h ; lo muestra en el puerto del video
RET ; retorna el control al sistema operativo
END
en esta imagen podemos ver que esta esperando al get |
ahora esta el segundo |
Ahora le hice una pequeña modificación al código para poder desplegar más de dos mensajes en pantalla, aquí el código:
.MODEL tiny
NAME "HOLA A TODOS" ;esta linea es solo para ponerle el nombre
.DATA
DATO DB "HOLA MUNDO", 0Dh, 0Ah, 24h ;0Dh,0Ah,24h --> equivale a '\n' en c++
DATO2 DB "HOLA MUNDO 2", 0Dh, 0Ah, 24h
DATO3 DB "HOLA DE PARTE DE MAGDIEL RUIZ$"
;msg2 db "Hola alumnos"
;msg2 db "como estas"
.CODE
INICIO:
MOV DX,OFFSET DATO ;lee el contenido de la variable dato en el resultado dx
MOV AH,09 ; para imprimir el valor ah debe contener el valor 09
INT 21H ; lo muestra en el puerto del video
MOV ah,0
INT 16h ; esperando presionar cualquier letra equivalente a un get
MOV DX,OFFSET DATO2 ; lee el contenido de la variable dato 2 en el resultado dx
MOV AH,09 ; para imprimir el valor el valor ah debe contener el valor 09
INT 21h ; lo muestra en el puerto del video
MOV ah,0
INT 16h ; esperando presionar cualquier letra equivalente a un get
MOV DX,OFFSET DATO3 ; lee el contenido de la variable dato 2 en el resultado dx
MOV AH,09 ; para imprimir el valor el valor ah debe contener el valor 09
INT 21h ; lo muestra en el puerto del video
RET ; retorna el control al sistema operativo
END
Ya cuenta 3 mensajes en pantalla |
Ejemplo 2 en emu8086
Ahora veremos el ejemplo del programa 2 de como mostrar "Hola Mundo!" pero en posición 0
CODIGO:
CODE SEGMENT
ASSUME CS:CODE, DS:CODE, SS:CODE, ES:CODE
ORG 100H
principio:
mov ah, 0Fh
mov ah, 0
int 10h
lea dx, mensaje_a_mostrar
mov ah, 9h
int 21h
int 20h
mensaje_a_mostrar db "Hola Mundo!$",0
CODE ENDS
end principio
CODIGO:
CODE SEGMENT
ASSUME CS:CODE, DS:CODE, SS:CODE, ES:CODE
ORG 100H
principio:
mov ah, 0Fh
mov ah, 0
int 10h
lea dx, mensaje_a_mostrar
mov ah, 9h
int 21h
int 20h
mensaje_a_mostrar db "Hola Mundo!$",0
CODE ENDS
end principio
Ensambladores online
Primero veremos como ensamblar en línea en esta liga, y aquí está el código:
; Simple example
; Writes Hello World to the output
JMP start
hello: DB "Magdiel Ruiz!" ; Variable
DB 0 ; String terminator
start:
MOV C, hello ; Point to var
MOV D, 232 ; Point to output
CALL print
HLT ; Stop execution
print: ; print(C:*from, D:*to)
PUSH A
PUSH B
MOV B, 0
.loop:
MOV A, [C] ; Get char from var
MOV [D], A ; Write to output
INC C
INC D
CMP B, [C] ; Check if end
JNZ .loop ; jump if not
POP B
POP A
RET
Lenguaje ensamblador en línea 1
Ahora veremos en el segundo lenguaje ensamblador en línea:
Lenguaje ensamblador en línea 2
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Magdiel RUiz',0xa ;our dear string
len equ $ - msg ;length of our dear string
Y por ultimo en el ultimo lenguaje ensamblador en línea:
Lenguaje ensamblador en línea 3
;nasm 2.11.08
section .data
hello: db 'Magdiel Ruiz!',10 ; 'Magdiel Ruiz!' plus a linefeed character
helloLen: equ $-hello ; Length of the 'Hello world!' string
section .text
global _start
_start:
mov eax,4 ; The system call for write (sys_write)
mov ebx,1 ; File descriptor 1 - standard output
mov ecx,hello ; Put the offset of hello in ecx
mov edx,helloLen ; helloLen is a constant, so we don't need to say
; mov edx,[helloLen] to get it's actual value
int 80h ; Call the kernel
mov eax,1 ; The system call for exit (sys_exit)
mov ebx,0 ; Exit with return code of 0 (no error)
int 80h;
; Simple example
; Writes Hello World to the output
JMP start
hello: DB "Magdiel Ruiz!" ; Variable
DB 0 ; String terminator
start:
MOV C, hello ; Point to var
MOV D, 232 ; Point to output
CALL print
HLT ; Stop execution
print: ; print(C:*from, D:*to)
PUSH A
PUSH B
MOV B, 0
.loop:
MOV A, [C] ; Get char from var
MOV [D], A ; Write to output
INC C
INC D
CMP B, [C] ; Check if end
JNZ .loop ; jump if not
POP B
POP A
RET
Lenguaje ensamblador en línea 1
Añadir leyenda |
Ahora veremos en el segundo lenguaje ensamblador en línea:
Lenguaje ensamblador en línea 2
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Magdiel RUiz',0xa ;our dear string
len equ $ - msg ;length of our dear string
Y por ultimo en el ultimo lenguaje ensamblador en línea:
Lenguaje ensamblador en línea 3
;nasm 2.11.08
section .data
hello: db 'Magdiel Ruiz!',10 ; 'Magdiel Ruiz!' plus a linefeed character
helloLen: equ $-hello ; Length of the 'Hello world!' string
section .text
global _start
_start:
mov eax,4 ; The system call for write (sys_write)
mov ebx,1 ; File descriptor 1 - standard output
mov ecx,hello ; Put the offset of hello in ecx
mov edx,helloLen ; helloLen is a constant, so we don't need to say
; mov edx,[helloLen] to get it's actual value
int 80h ; Call the kernel
mov eax,1 ; The system call for exit (sys_exit)
mov ebx,0 ; Exit with return code of 0 (no error)
int 80h;
martes, 29 de enero de 2019
Historia del lenguaje ensamblador
Para poder programar en Bajo nivel(Ensamblador) debemos conocer desde lo básico hasta lo mas complicado.
La primera computadora programable fue la ENIAC en 1946 pero se programaba mediante circuitos complejos que no eran nada funcionales. Después se empezó a utilizar el lenguaje maquina que son claves binaras que representan un CÓDIGO DE OPERACIÓN(OPCODE). Estas se almacenan en grupos de instrucciones llamados PROGRAMAS.
Esto llego a ser muy complicado debido a que se debían aprender series enormes de códigos binarios para realizar operaciones. Por ejemplo:
Para realizar la suma se tenia una instrucción binaria muy similar a "00101010010100101". Es por eso que se complicaba demasiado manejar este tipo de programación.
Actualmente manejamos lenguajes de Alto nivel que son relativamente sencillos a comparación con el lenguaje maquina. Pero no se llego al alto nivel desde el código binario, existe un lenguaje que nació para facilitar el binary code. Este se llama "LENGUAJE ENSAMBLADOR".
QUE ES EL LENGUAJE ENSAMBLADOR?
Es la primera abstracción del lenguaje maquina , consiste en asociar los OPCODE con palabras clave que sean fáciles de recordar para el programador.
A estas palabras clave se les llama MNEMÓNICOS.
Un programa ensamblador traduce el o convierte el codigo fuente(ensamblador) a codigo objeto(lenguaje maquina).
La computadora UNIVAC fue la primera en usar ensamblador.
¿Que necesito saber antes de usar lenguaje ensamblador?(OJO)
¿Que ventajas ofrece el lenguaje ensamblador?
-Optimizan al máximo los programas en tamaño y velocidad.
-Rápidos y compactos.
-No genera código predefinido como el alto nivel.
-No se necesita capacidades de memoria ni computadoras sofisticadas.
-Nos da habilidades de programación avanzada.
Que desventajas tiene?(OJO)
-Una instrucción mal interpetada puede generar un caos en nuestro equipo al grado de tener que reiniciar nuestra maquina.
-La insuficiencia de conocimientos básicos y de programación causa efectos impredecibles.
-Se vuelve mas complejo conforme se agregan rutinas y funciones.
-Se pueden usar con lenguajes de alto nivel(PROGRAMACIÓN HÍBRIDA).
Aplicaciones actuales.
Sistemas embebidos: Impresoras, cámaras, autos, armas, juguetes.
Tiempo real: Control de robots, manufactura, adquisición de datos.
Transporte: Barcos, aviones, sondas espaciales.
Entretenimiento: Graficación, multimedia, videojuegos.
DSP: Procesador digital de señal para operaciones a alta velocidad.
Procesamiento de señales, voz e imagen:
-aparatos médicos
-aparatos para datos sísmicos
-reproductores de audio
-módems
-cámaras digitales.
La primera computadora programable fue la ENIAC en 1946 pero se programaba mediante circuitos complejos que no eran nada funcionales. Después se empezó a utilizar el lenguaje maquina que son claves binaras que representan un CÓDIGO DE OPERACIÓN(OPCODE). Estas se almacenan en grupos de instrucciones llamados PROGRAMAS.
Esto llego a ser muy complicado debido a que se debían aprender series enormes de códigos binarios para realizar operaciones. Por ejemplo:
Para realizar la suma se tenia una instrucción binaria muy similar a "00101010010100101". Es por eso que se complicaba demasiado manejar este tipo de programación.
Actualmente manejamos lenguajes de Alto nivel que son relativamente sencillos a comparación con el lenguaje maquina. Pero no se llego al alto nivel desde el código binario, existe un lenguaje que nació para facilitar el binary code. Este se llama "LENGUAJE ENSAMBLADOR".
QUE ES EL LENGUAJE ENSAMBLADOR?
Es la primera abstracción del lenguaje maquina , consiste en asociar los OPCODE con palabras clave que sean fáciles de recordar para el programador.
A estas palabras clave se les llama MNEMÓNICOS.
Un programa ensamblador traduce el o convierte el codigo fuente(ensamblador) a codigo objeto(lenguaje maquina).
La computadora UNIVAC fue la primera en usar ensamblador.
¿Que necesito saber antes de usar lenguaje ensamblador?(OJO)
-Conocer a detalle como traba el micro.
-conocer a detalle como opera la computadora(Memoria, discos duros, dispositivos E/S)
-Lógica computacional.
-Manejar algún lenguaje de alto nivel(C, C++, C#, Pascal, Perl, VB, JAVA, etc...)
-Manejo del sistema binario y hexadecimal(suma, resta, multiplicación, división).
-Manejo del sistema binario y hexadecimal(suma, resta, multiplicación, división).
¿Que ventajas ofrece el lenguaje ensamblador?
-Optimizan al máximo los programas en tamaño y velocidad.
-Rápidos y compactos.
-No genera código predefinido como el alto nivel.
-No se necesita capacidades de memoria ni computadoras sofisticadas.
-Nos da habilidades de programación avanzada.
Que desventajas tiene?(OJO)
-Una instrucción mal interpetada puede generar un caos en nuestro equipo al grado de tener que reiniciar nuestra maquina.
-La insuficiencia de conocimientos básicos y de programación causa efectos impredecibles.
-Se vuelve mas complejo conforme se agregan rutinas y funciones.
-Se pueden usar con lenguajes de alto nivel(PROGRAMACIÓN HÍBRIDA).
Aplicaciones actuales.
Sistemas embebidos: Impresoras, cámaras, autos, armas, juguetes.
Tiempo real: Control de robots, manufactura, adquisición de datos.
Transporte: Barcos, aviones, sondas espaciales.
Entretenimiento: Graficación, multimedia, videojuegos.
DSP: Procesador digital de señal para operaciones a alta velocidad.
Procesamiento de señales, voz e imagen:
-aparatos médicos
-aparatos para datos sísmicos
-reproductores de audio
-módems
-cámaras digitales.
PROGRAMANDO EN EMU8086
Ahora vamos a programar en un programa llamado emu8086
este es el código:
.MODEL SMALL
.STACK
.DATA
CADENA1 DB 'HOLAMUNDO.$'
CADENA2 DB 'MAGDIELRUIZ.$'
.CODE
PROGRAMA:
MOV AX,@DATA
MOV DS,AX
MOV DX,OFFSET CADENA1
MOV AH,9
INT 21H
MOV DX,OFFSET CADENA2
MOV AH,9
INT 21H
END PROGRAMA
Ahora veamos el programa con su corrida
este es el código:
.MODEL SMALL
.STACK
.DATA
CADENA1 DB 'HOLAMUNDO.$'
CADENA2 DB 'MAGDIELRUIZ.$'
.CODE
PROGRAMA:
MOV AX,@DATA
MOV DS,AX
MOV DX,OFFSET CADENA1
MOV AH,9
INT 21H
MOV DX,OFFSET CADENA2
MOV AH,9
INT 21H
END PROGRAMA
Ahora veamos el programa con su corrida
Suscribirse a:
Entradas (Atom)