lunes, 1 de abril de 2019

U2.- PRÁCTICA #7: PROGRAMA QUE MULTIPLICA DOS NÚMEROS

CÓDIGO EMU8086:

.model small ;Modelo de memoria m?s utilizado
.stack

.data        ;definición de datos(variables), donde se almacenara información
.code
   chr1  db ? ;primer digito
   chr2  db ? ;segundo digito
   chr3  db ? ;multiplo
   chr4  db ?
   r1    db ? ;resultado 1
   r2    db ? ;resultado 2
   r3    db ?
   r4    db ?
   ac    db 0 ;acarreo
   ac1   db 0
.startup
   ;cls
   mov ah,00h     ;Function(Set video mode)
   mov al,03      ;Mode 80x25 8x8 16
   int 10h        ;Interruption Video

   mov ah,01h     ;Function(character read) Guarda en AL
   int 21h        ;Interruption DOS functions
   sub al,30h     ;ajustamos valores
   mov chr1,al    ;[chr1].chr2 * chr3 = ac.r1.r2

   mov ah,01h     ;Function(character read) Guarda en AL
   int 21h        ;Interruption DOS functions
   sub al,30h     ;Ajustamos valores
   mov chr2,al    ;chr1.[chr2] * chr3 = ac.r1.r2

   mov ah,02h     ;Function(character to send to standard output)
   mov dl,'*'     ;Character to show
   int 21h

   mov ah,01h     ;Function(Read character) Guarda en AL
   int 21h        ;Interruption DOS Functions
   sub al,30h     ;Transform(0dec = 30hex)
   mov chr3,al    ;chr1.chr2 * [chr3] = ac.r1.r2
  
   mov ah,01h     ;Function(Read character) Guarda en AL
   int 21h        ;Interruption DOS Functions
   sub al,30h     ;Transform(0dec = 30hex)
   mov chr4,al    ;chr1.chr2 * [chr3] = ac.r1.r2

   mov ah,02h     ;Character to send to standar output
   mov dl,'='     ;
   int 21h        ;Interruption DOS functions

   ;Realizamos operaci?n   
  
   mov al,chr4  ;unidad del segundo numero
   mov bl,chr2  ;unidad del primer numero
   mul bl       ;multiplicar
   mov ah,0     ;limpiamos ah0
   aam          ;separamos de hex a dec
   mov ac1,ah   ;decenas del primera multiplicacion
   mov r4,al    ;unidades del primera multiplicacion
            
   mov al,chr4  ;unidades del segundo numero
   mov bl,chr1  ;decentas del primer numero
   mul bl       ;multiplicar
   mov r3,al    ;movemos el resultado de la operacion a r3
   mov bl,ac1   ;movemos el acarreo a bl
   add r3,bl    ;sumamos resultado mas acarreo
   mov ah,00h   ;limpiamos ah por residuos
   mov al,r3    ;movemos el resultado de la suma a al
   aam          ;separamos  de hex a dec
   mov r3,al    ;guardamos unidades en r3
   mov ac1,ah   ;guardamos decenas en ac1
  
      

   mov al,chr3    ;al = chr3
   mov bl,chr2    ;bl = chr2
   mul bl         ;AL = chr3*chr2 (BL*AL)
   mov Ah,0h      ;
   AAM            ;ASCII Adjusment
   mov ac,AH      ;ac = AH (Acarreo)
   mov r2,AL      ;r2 = AL       (Unidad del resultado)

   mov al,chr3    ;AL = chr3
   mov bl,chr1    ;BL = chr1
   mul bl         ;AL = chr1*chr3 (BL*AL)
   mov r1,al      ;r1 = AL       (Decena del resultado)
   mov bl,ac      ;BL = Acarreo anterior
   add r1,bl      ;r1 = r1+ac (r1 + Acarreo)
   mov ah,00h     ;
   mov al,r1      ;AL = r1 (Asignaci?n para el ajust)
   AAM            ;ASCII Adjustment
   mov r1,al      ;r1 = AL
   mov ac,ah      ;ac = AH (Acarreo para la Centena del resultado)
  
  
   ;suma final
   ;R4 resulta ser las unidades de mul y no se toma en cuenta ya que se pasa entero
  
  
   mov ax,0000h   ;limpiamos ax
  
   mov al,r3      ;movemos el segundo resultado de la primera mult a al
   mov bl,r2      ;movemos primer resultado de la segunda mult a bl
   add al,bl      ;sumamos
   mov ah,00h     ;limpiamos ah
   aam            ;separamos hex a dec
   mov r3,al      ;r3 guarda las decenas del resultado final
   mov r2,ah      ;r2 se utiliza como nuevo acarreo
  
   mov ax,0000h   ;''''
  
   mov al,ac1     ;movemos el acarreo de la primera mult a al
   mov bl,r1      ;movemos segundo resultado de la segunda mult a bl
   add al,r2      ;sumamos el nuevo  acarreo de la suma anterior  a al
   add al,bl      ;sumamos al a bl
   mov ah,00h     ;limpiamos el registro ah
   aam            ;separamos de hex a dec
   mov r1,al      ;r1 guarda las centenas
   mov r2,ah      ;ah se sigue utilizando como acarreo
  
   mov al,r2      ;movemos el acarreo a al
   mov bl,ac      ;movemos ac a bl
   add al,bl      ;sumamos al a bl
   ;aam            ;separamos hex a dec
   mov ac,al      ;mov al a ac como nuestro acarreo final
  

  
   ;Mostramos resultado
   mov ah,02h 
   mov dl,ac
   add dl,30h
   int 21h        ;Mostramos ac (millar)

   mov ah,02H
   mov dl,r1
   add dl,30h
   int 21h        ;Mostramos r1 (centena)

                 
  
   mov ah,02H
   mov dl,r3
   add dl,30h
   int 21h        ;Mostramos r3 (decena)
  
   mov ah,02H
   mov dl,r4
   add dl,30h
   int 21h        ;unidad
  
.exit
end



CORRIDA EN PANTALLA:




martes, 12 de marzo de 2019

U2- PRÁCTICA #5 DESPLIEGA LETRERO CON OFFSET

CÓDIGO EMU8086:

ORG 100H
include 'emu8086.inc'  

.DATA
DATO DB 10,13,'LETRERO$',10,13 

.CODE

MOV CX,4 

START:
    
    MOV DX, OFFSET DATO 
    MOV AH,09
    INT 21H
    LOOP START  

RET  
END     

    
CORRIDA EN PANTALLA

   

U2- PRÁCTICA #4 DESPLIEGA LETRERO CON LEA

CÓDIGO EMU8086:

ORG 100H
include 'emu8086.inc'  

.DATA
DATO DB 10,13,'LETRERO$',10,13 

.CODE

MOV CX,4 

START:
    LEA DX,DATO
    
    MOV AH,09
    INT 21H
    LOOP START  

RET  
END     

CORRIDA EN PANTALLA

U2- PRÁCTICA #3 DESPLIEGA LETREROS CON MACRO Y LOOP


CÓDIGO EMU8086:

ORG 100H
include 'emu8086.inc'

MOV CX,4 

START:
    PRINTN 'LETRERO'
    LOOP START  

RET

CORRIDA EN PANTALLA

jueves, 7 de marzo de 2019

U2-PRÁCTICA #2: VÍDEO SALTOS CONDICIONALES CMP, JC, JZ, JNZ

REFERENCIA VÍDEO: https://www.youtube.com/watch?v=Ng4YEb2Jtcg


CÓDIGO EMU8086:

INCLUDE 'emu8086.inc'
.MODEL SMALL
.STACK
.DATA
    num1 db 8
    num2 db 8
    msg1 db 'Numeros iguales','$'
    msg2 db 'Numeros 1 mayor','$'
    msg3 db 'Numeros 2 mayores','$'

.code
    main:
    mov ax, @data
    mov ds, ax 
      
    mov al, num1
    cmp al, num2
    
    jc mayor2
    jz igual
    jnz Mayor1
    
    
.exit

igual: 
    printn 'Son iguales'
    jmp fin

Mayor1:
    printn 'Es mayor el numero 2'  
    jmp fin
  
Mayor2:
   printn 'Es mayor el numero 1'
   mov ah, 09h
   lea dx, msg2
   int 21h
    
   jmp fin

fin:

END


CORRIDA EN PANTALLA




U2-PRÁCTICA #1: SALTOS CONDICIONALES



CÓDIGO EMU8086:

org 100h

mov ax, 5          ; set ax to 5. 
mov bx, 2          ; set bx to 2. 

jmp calc            ; go to 'calc'. 

back:jmp stop      ; go to 'stop'. 

calc:
add ax, bx         ; add bx to ax. 
jmp back           ; go 'back'. 

stop:

ret             ; return to operating system. 



UNIDAD 2: CICLOS CONDICIONALES

ReferenciaLenguaje ensamblador


En esta sección examinaremos unas cuantas de las estructuras condicionales más comunes que se utilizan en los lenguajes de programación de alto nivel. Veremos cómo puede traducirse fácilmente cada estructura a lenguaje ensamblador. Consideremos que una estructura condicional es una o más expresiones condicionales que activan una elección entre dos bifurcaciones lógicas distintas. Cada bifurcación hace que se ejecute una secuencia distinta de instrucciones.


FIGURA 6.1
La única manera de traducir esta instrucción IF en lenguaje ensamblador es utilizar una instrucción CMP seguida de uno o más saltos condicionales. Como op1 y op2 son operandos de memoria, hay que mover uno de ellos a un registro antes de ejecutar la instrucción CMP. El siguiente código implementa la instrucción IF de la manera más eficiente posible, invirtiendo la condición de igualdad y usando la instrucción JNE:

 mov eax,op1
 cmp eax,op2               ; ¿op1 == op2?
 jne L1                    ; sí: salta a L1
 jmp L2                    ; no: salta las asignaciones
 mov X,1                   ; sí: asigna X y Y


Si implementamos el operador  usando JE, el código resultante será menos compacto (seis instrucciones, en vez de cinco):

 mov eax,op1
 cmp eax,op2               ; ¿op1 == op2?
 je L1                     ; sí: salta a L1
 jmp L2                    ; no: salta las asignaciones
 mov X,1                   ; sí: asigna X y Y

LOOPS

Las instrucciones de bucle se usan para realizar estructuras repetitivas, y utilizan el registro CX como contador.

instructionoperation and jump conditionopposite instruction
LOOPdecrease cx, jump to label if cx not zero.DEC CX and JCXZ
LOOPEdecrease cx, jump to label if cx not zero and equal (zf = 1).LOOPNE
LOOPNEdecrease cx, jump to label if cx not zero and not equal (zf = 0).LOOPE
LOOPNZdecrease cx, jump to label if cx not zero and zf = 0.LOOPZ
LOOPZdecrease cx, jump to label if cx not zero and zf = 1.LOOPNZ
JCXZjump to label if cx is zero.OR CX, CX and JNZ



Las instrucciones de bucle se usan para realizar estructuras repetitivas, y utilizan el registro CX como contador.

LOOP esta instrucción hace que el programa salte a la dirección especificada (salto dentro del segmento), mientras que CX sea distinto de 0 y decrementa CX en 1 cada vez.

LOOP salto

Ejemplo:
MOV CX, 100
COMIENZO: …

LOOP COMIENZO; este bucle se repite 100

LOOPNE/LOOPNZ: esta instrucción salta a la dirección especificada mientras que CX sea distinto de 0 y si ZF = 0.

LOOPNE/LOOPNZ salto
Esta instrucción proporciona una ruptura del bucle adicional.

LOOPE/LOOPZ esta instrucción actúa como la anterior pero la condición adicional es ZF = 1.
LOOPE/LOOPZ salto

JCXZ esta instrucción realiza un salto si CX = 0.
JCXZ salto

Ninguna de estas instrucciones afecta al registro de estado.








miércoles, 6 de marzo de 2019

PRÁCTICA #17 RESTA DE DOS NÚMEROS

CÓDIGO EMU8086:

name 'resta dos numeros'

include 'emu8086.inc'

org 100h

.data

resta db 2 dup (?)

.code

restas proc

   printn ""   ;uso de macro de libreria, un espacio en blanco

   print "Introduce el primer numero: ";usa macro print

   call scan_num     ;Usa procedimiento de scan_num

   mov resta[0],cl  ;guarda el espacio en el arreglo

   printn ""   ;usa macro print

   print "Introduce el segundo numero: "

   call scan_num     ;

   sub resta[1],cl

   print " "

   xor ax,ax

   add al,resta[0]

   add al, resta[1]

   printn ""

   print "La resta es: "


   call print_num

restas endp


exit:

print " "

printn " "

printn "Presiona enter para salir..."

mov ah,0

int 16h

ret

define_print_string

define_print_num  ;Se uso el procedimiento

define_print_num_uns

define_scan_num  ;porque se uso el proc scan_num

end

ret


CORRIDA EN PANTALLA

PRÁCTICA #15: PROMEDIO DE 3 MATERIAS

CÓDIGO EMU8086:

name "calcula el promedio de tres materias"
include "emu8086.inc"
org 100h 

.data
pro db 4 dup (?)  

.code
promedio proc
    printn ""  
    print "introduce una calificacion: "
    call scan_num  
    mov pro[0],cl
    printn ""
    print "introduce la 2da calificacion: "
    call scan_num
    mov pro[1],cl
    printn ""
    print "introduce la 3ra calificacion: "
    call scan_num
    mov pro[2],cl
    printn ""
    print "numero de materias: "
    call scan_num
    mov pro[3],cl
    xor ax,ax
    add al,pro[0]
    add al,pro[1]
    add al,pro[2]
    div pro[3]
    printn ""
    print "promedio es= "
    call print_num
      
promedio endp

exit:
    printn ""
    printn ""
    print "presione para salir..."
    mov ah,0
    int 16h
    ret
define_print_string
define_print_num
define_print_num_uns
define_scan_num

end


CORRIDA EN PANTALLA


martes, 26 de febrero de 2019

PRÁCTICA #14: PROGRAMAS BIBLIOTECA DE FUNCIONES: EMU8086


Enlace:
Biblioteca de funciones comunes: emu8086.inc

Ejemplo #1.

Código emu8086:


include emu8086.inc

ORG    100h

PRINT 'Hello World!'

GOTOXY 10, 5

PUTC 65           ; 65 - is an ASCII code for 'A'
PUTC 'B'

RET               ; return to operating system.
END               ; directive to stop the compiler.

Corrida en pantalla:


Ejemplo  #2.

Código emu8086:
    ; demonstrate get_string and print_string
    ;----------------------------------------
    include 'emu8086.inc'
    ORG    100h
    
    LEA    SI, msg1       ; set up pointer (SI) to msg
                          ; to ask for the number
    CALL   print_string   ; print message that SI points to
    
    LEA    DI, buffer     ; set up pointer (DI) to input buffer
    MOV    DX, bufSize    ; set size of buffer
    CALL   get_string     ; get name & put in buffer
    
    LEA    SI, newln      ; point at CR/LF / Hello message 
    CALL   print_string   ; print message that SI points to
    
    RET                   ; return to operating system.
    
    ; data
    msg1   DB "Enter your name: ", 0  
    newln  DB 13, 10
           DB "Hello, "
    buffer DB 20 DUP (0)  ; input buffer for get_string   
    bufSize = $-buffer    ; calculates size of buffer
    
    DEFINE_GET_STRING
    DEFINE_PRINT_STRING
    END                   ; directive to stop the compiler.
Corrida en pantalla:


Ejemplo #3.

Código emu8086:

; demonstrate scan_num, print_num, pthis
;----------------------------------------
include 'emu8086.inc'
ORG    100h

LEA    SI, msg1       ; ask for the number
CALL   print_string   ;
CALL   scan_num       ; get number in CX.

MOV    AX, CX         ; copy the number to AX.

; print the following string:
CALL   pthis
DB  13, 10, 'You have entered: ', 0

CALL   print_num      ; print number in AX.

RET                   ; return to operating system.

; data
msg1   DB  'Enter the number: ', 0

; macros to define procs
DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS  ; required for print_num.
DEFINE_PTHIS

END                   ; directive to stop the compiler.

Corrida en pantalla:


PRÁCTICA #13: MACROS EMU8086



Código emu8086:

include 'emu8086.inc'


org 100h

.code
gotoxy 6,10 ;usando la macro de la libreria, agrega el cursor en esas pocisiones
print ""           ;macro que imprime una cadena
print "Hola mundo"   
gotoxy 6,12
printn "Hola mundo 2"  
print "Letrero fin" 

gotoxy 6,14  
putc 'A' 
print 'Dame un numero'
call scan_num 
define_scan_num

ret

Resultado corrida en pantalla:





lunes, 25 de febrero de 2019

VIDEO: REGISTROS DE BANDERAS


REFERENCIA VÍDEO: https://www.youtube.com/watch?v=4puXc5S2WOg

REGISTRO DE BANDERAS.

Es un registro de 16 Bits, de los cuales nueve sirven para indicar el estado actual de la máquina y el resultado del procesamiento.

Ejemplo Bandera #1 :

Código.

.MODEL SMALL
.STACK
.DATA

.CODE  
    MOV AL, 255
    MOV BL, 1
    ADD AL,BL

.EXIT 


END

Corrida en pantalla.





Ejemplo Bandera #2:

Código.

.MODEL SMALL
.STACK
.DATA

.CODE  
    MOV AL, 255
    MOV BL, 1
    SUB AL,BL

.EXIT 

END

Corrida en pantalla.


Ejemplo Bandera #3:

Código.

.MODEL SMALL
.STACK
.DATA

.CODE  
    MOV AL, 100
    MOV BL, 50
    ADD AL,BL

.EXIT 

END

Corrida en pantalla.





miércoles, 20 de febrero de 2019

PRÁCTICA #12 VÍDEO ENSAMBLADOR: SUMA DE DOS NÚMEROS

Para hacer uso cualquiera de las funciones de Emu8086.inc es necesario ingresar la siguiente linea de código al iniciar el programa en donde se vaya a implementar:

include 'emu8086.inc'

Emu8086.inc define los siguientes macros:
  • PUTC char: Imprime un solo caracter
  • GOTOXY col, row: Coloca el cursor en las coordenadas solicitadas
  • PRINT string: Imprime una cadena
  • PRINTN string: Imprime una cadena y tras imprimirla hace un salto de linea.

CÓDIGO EMU8086 "SUMA DE DOS NÚMEROS"

Referencia: Vídeo Suma de Dos Números

name "Suma dos numeros"
include "emu8086.inc"
org 100h

.data
suma db 2 dup (?)  ;Creamos un arreglo llamado suma de 2 espacios de tipo byte

.code
Sumas proc      ;Se crea un proceso de sumas y se piden los numeros
    printn " "
    print "Introduce el primer numero ==>" ;etiqueta para pedir el primer dato
    call scan_num  ;obtiene el dato que fue ingresado
    mov suma[0],cl   ;guarda el valor en cl,y lo manda al arreglo
    printn " "    ;agrega un salto de linea
    print "Introduce el segundo numero ==>" ;etiqueta para pedir el segundo dato
    call scan_num   ;
    mov suma[1],cl
    printn " "
    xor ax,ax     ;se limpia el registro ax
    add al,suma[0] ;se manda la suma al registro al
    add al,suma[1] ;se manda para poder imprimir
    printn " "
    print "La suma es: "
    call print_num ;imprime el valor de la suma
Sumas endp 

exit:       ;funcion para salir del programa
    printn " "
    printn " "
    print "Presiona enter para salir..";etiqueta con instruccion para salir del programa
    mov ah,0   
    int 16h
    ret 
    
   define_print_string   ;apartado de definicion de comandos emu8086.inc
   define_print_num
   define_print_num_uns
   define_scan_num           
   end

Muestra en pantalla de código en EMU8086:



Corrida en pantalla: