jueves, 31 de enero de 2019

Suma de un número y de tres números en emu8086

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


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

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


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

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)
-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).


¿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