miércoles, 11 de octubre de 2017

Prog de Potencia en Ensamblador



; Juan Pablo Vazquez Sonora, Jose Luis Vanoye Bocanegra, Karla Aldrete Tovar


.model small    ; se define el modelo de memoria
.stack 64       ; se define el tamano de la pila

.data ;define variables

nombre db "CALCULAR LA POTENCIA DE UN NUMERO", 13, 10, 13, 10, '$' ; Titulo del programa que aparece en pantalla del DOC
mensaje1 db "POR FAVOR INGRESE LA BASE: ",13,10,'$' ; Mensaje de ingreso de la potenciacion
mensaje2 db "POR FAVOR INGRESE EL EXPONENTE: ",13,10,'$' ; Mensaje al usuario para ingreso del exponente
mensaje3 db "EL RESULTADO ES: ", '$' ; Mensaje al imprimir el resultado de la operacion
pot db 1 ; Variable de tipo db
base db 0 ; Variable para guardar base
exp db 0 ; Variable para guardar exponente
byteh db 0
bytel db 0
salto db " ", 13,10,'$' ; Salto una fila

.code

inicio proc far
mov ax, @data ; Direccionamiento segmento de datos
    mov ds,ax ; Se guarda lo que esta en ax en el segmento datos

; limpia la pantalla
mov ah, 00
mov al, 03h
int 10h

; Inicializar registros
mov ah, 02h
mov bh, 00
mov dh, 00
mov dl, 00
int 10h

; Para mostrar el titulo
mov ah, 09h
lea dx, nombre
int 21h

        mov ah, 09h ; Para impresion de caracteres
        lea dx, salto ; para salto de filas
        int 21h
   
        mov ah, 09h
        lea dx, mensaje1 ; Solicitud de numero para la base
        int 21h
   
        mov ah, 01h ; Leer y mostrar el numero digitado
        int 21h
   
        sub al, 30h ; Para hacer la conversion ASCII
        mov base, al ; Se pasa a la variable base
        int 21h
   
        mov ah, 09h ; Para impresion de caracteres
        lea dx, salto ; Para salto de una fila
        int 21h
       
        ; Para solicitar exponente  
        mov ah, 09h
        lea dx, mensaje2
        int 21h
   
        ; Leer y mostrar el valor digitado
        mov ah, 01h
        int 21h
   
        sub al, 30h ; Para hacer la conversion ASCII
        mov exp, al ; Se pasa el exponente a la variable exp
        int 21h
   
        mov cl, exp ;Se cambia el registro cx con el numero de iteraciones
   
        product:
        mov al, base ; Se mueve el valor de la base al registro al
        mov bl, pot ; Se mueve a bl el valor de variable pot
        mul bl ; Se multiplica a bl
        mov pot, al ; Se pone el resultado en la variable pot
        loop product ; Se retorna a la etiqueta product si cx no es cero
   
        mov ah, 09h ; Para impresion de caracteres
        lea dx, mensaje3; Para salto de una fila
        int 21h
   
        mov al, pot
        aam
        mov bytel, al
        mov byteh, ah
   
        mov ah, 02h
   
        mov dl, byteh
        add dl, 30h
        int 21h
   
        mov dl, bytel
        add dl, 30h
        int 21h
        jmp salir
   
        salir: ; Retorna el mando al DOS
    mov ax, 4C00H
    int 21h
inicio endp
end inicio

martes, 10 de octubre de 2017

continua ejemplos de Ensamblador....



https://drive.google.com/drive/my-driverchivo PDF

bases de datos, archivos etc:

 los datos, indices, etc, de las mismas, se guardan en 2 o 3 archivos diferentes, en el sub-directorio 'data' del directorio donde tienes instalado mySQL.

jueves, 5 de octubre de 2017

ASCII a binario

;===========================================================================
;===========================================================================
; PROGRAMA : pe17_cbi.asm
; FUNCION : Convierte un conjunto de caracteres ASCII a Binario.
; REALIZADO POR : Prof. Juan Juárez Fuentes
; EDITADO POR : Ing. Álan Alexander Valdez Casas
; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
; FECHA : Septiembre 28 del 2017
;===========================================================================
; DECLARACION DE CONSTANTES
;===========================================================================
 CR EQU 13
 LF EQU 10
 IMPRIMIR EQU 9
 FIN EQU 4C00H
 DOS EQU 21H
 TAB EQU 09H
;===========================================================================
; DECLARACION DEL SEGMENTO DE DATOS
;===========================================================================
DATOS SEGMENT
    ASCII DB 'A'
    ASCII2 DB 'B'
    ASCII3 DB 'C'
    ASCII4 DB 'D'
    ASCII5 DB 'E'
    ASCII6 DB 'F'
    ASCII7 DB 'G'
    ASCII8 DB 'H'
    ESPACIO DB CR,LF," ", "$"
    BINARIO1 DB 8 DUP (100),"* ", "$", TAB, TAB
    BINARIO2 DB 8 DUP (100),"* ", "$", TAB, TAB
    BINARIO3 DB 8 DUP (100),"* ", "$", TAB, TAB
    BINARIO4 DB 8 DUP (100),"* ", "$", TAB, TAB
    BINARIO5 DB 8 DUP (100),"* ", "$", TAB, TAB
    BINARIO6 DB 8 DUP (100),"* ", "$", TAB, TAB
    BINARIO7 DB 8 DUP (100),"* ", "$", TAB, TAB
    BINARIO8 DB 8 DUP (100)," ", "$", TAB, TAB
MENSAJE1 DB CR,LF,TAB,"AC", "$"
MENSAJE2 DB CR,LF,TAB,"DC", "$"
DATOS ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE PILA
;===========================================================================
PILA SEGMENT STACK 'STACK'
  DW 128 DUP('P')
PILA ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE CODIGO
;===========================================================================
CODIGO SEGMENT ; Inicio del segmento de c?digo
;-----------------------------------------------------------------------
  pe17_cbi PROC FAR ; Inicio procedimiento pe15_cbi
;-------------------------------------------------------------------
ASSUME CS:CODIGO, SS:PILA, DS:DATOS ; EN DEBUG SE OBSERVA QUE HAST AAQUI
MOV AX, DATOS ; LOS SEGMENTOS DE PILA Y CODIGO YA TIENEN
MOV DS, AX ; SU VALORES FINALES, SOLO EL DE DATOS NO LO TIENE.
;-------------------------------------------------------------------
 LEA DX, MENSAJE1
 CALL ESCRIBE
;-------------------------------------------------------------------
 LEA DX, ESPACIO
 CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ASCII
CALL ESCRIBE ; Imprimimos el ASCII original
 LEA DX, ESPACIO
 CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
 CALL ESCRIBE
;-------------------------------------------------------------------

 LEA DX, BINARIO1 ; Imprimimos el n?mero binario ya convertidO
 LEA DX, ESPACIO
 CALL ESCRIBE
 LEA DX, BINARIO2
 LEA DX, ESPACIO
 CALL ESCRIBE
 LEA DX, BINARIO3 ; Imprimimos el n?mero binario ya convertidO
 LEA DX, ESPACIO
 CALL ESCRIBE
 LEA DX, BINARIO4
 LEA DX, ESPACIO
 CALL ESCRIBE
  LEA DX, BINARIO5 ; Imprimimos el n?mero binario ya convertidO
 LEA DX, ESPACIO
 CALL ESCRIBE
 LEA DX, BINARIO6
 LEA DX, ESPACIO
 CALL ESCRIBE
  LEA DX, BINARIO7 ; Imprimimos el n?mero binario ya convertidO
 LEA DX, ESPACIO
 CALL ESCRIBE
 LEA DX, BINARIO8
 LEA DX, ESPACIO
 CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
;-------------------------------------------------------------------

LEA SI, ASCII
LEA DI, BINARIO1
CALL ASCII2BIN
LEA SI, ASCII2
LEA DI, BINARIO2
CALL ASCII2BIN
LEA SI, ASCII3
LEA DI, BINARIO3
CALL ASCII2BIN
LEA SI, ASCII4
LEA DI, BINARIO4
CALL ASCII2BIN
LEA SI, ASCII5
LEA DI, BINARIO5
CALL ASCII2BIN
LEA SI, ASCII6
LEA DI, BINARIO6
CALL ASCII2BIN
LEA SI, ASCII7
LEA DI, BINARIO7
CALL ASCII2BIN
LEA SI, ASCII8
LEA DI, BINARIO8
CALL ASCII2BIN
;-------------------------------------------------------------------
;-------------------------------------------------------------------
 LEA DX, MENSAJE2
 CALL ESCRIBE

 ;-------------------------------------------------------------------
 LEA DX, ESPACIO
 CALL ESCRIBE

 ;-------------------------------------------------------------------
 LEA DX, ASCII
 CALL ESCRIBE ; Imprimimos el ASCII original
 LEA DX, ASCII2
 CALL ESCRIBE
  LEA DX, ASCII3
 CALL ESCRIBE
  LEA DX, ASCII4
 CALL ESCRIBE
  LEA DX, ASCII5
 CALL ESCRIBE
  LEA DX, ASCII6
 CALL ESCRIBE
  LEA DX, ASCII7
 CALL ESCRIBE
  LEA DX, ASCII8
 CALL ESCRIBE
 ;-------------------------------------------------------------------
 LEA DX, ESPACIO
 CALL ESCRIBE
 ;-------------------------------------------------------------------
  LEA DX, ESPACIO

  LEA DX, BINARIO1 ; Imprimimos el n?mero binario ya convertido

 CALL ESCRIBE

 LEA DX, BINARIO2
 CALL ESCRIBE

 LEA DX, BINARIO3
 CALL ESCRIBE

 LEA DX, BINARIO4
 CALL ESCRIBE

 LEA DX, BINARIO5
 CALL ESCRIBE

 LEA DX, BINARIO6
 CALL ESCRIBE

 LEA DX, BINARIO7
 CALL ESCRIBE

 LEA DX, BINARIO8
 CALL ESCRIBE
 ;-------------------------------------------------------------------
 LEA DX, ESPACIO
 CALL ESCRIBE
;-------------------------------------------------------------------
 CALL SALIR ; Salimos del programa
;-------------------------------------------------------------------
 pe17_cbi ENDP ; Fin del procedimiento pe15_cbi
 ;-----------------------------------------------------------------------
 ;----------------------------------------------------------------------
 ; Definicion del procedimiento. toma un buffer de 8 bits y lo transforma
 ; en uno de 64, recibe en el SI el de 8 y en DI el de 64
;----------------------------------------------------------------------
 ASCII2BIN PROC NEAR
   XOR AX, AX ; Limpiamos el AX para eliminar basura
   ; Movemos al CX la cantidad de caracteres ASCII para hacer un loop
   MOV CX, 0
   LEA DX, ESPACIO
   CALL ESCRIBE
   MOV CX, 1

   ;-------------------------------------
   ASCII1: ; Este loop ir? de ASCII en ASCII transform?ndolo a binario

   MOV AL, [SI] ; Movemos el siguiente car?cter ASCII al AL

   PUSH CX ; Metemos el CX a la pila para guardar temporalmente el valor
   MOV CX, 8 ; Metemos un nuevo valor al CX para un nuevo loop anidado

  ;---------------------------------
   LOOP_SHIFT: ; Este loop producir? el n?mero binario para el ASCII actual

   SHL AL, 1 ; Hacemos un SHIFT LEFT para mover el sig n?m binario al CF (1= UN BIT)

   JC BIN_UNO ; Si el CF est? en uno es por que el siguiente n?m binario debe ser uno


   MOV [DI], BYTE PTR '0' ; Sino el siguiente n?mero binario debe ser 0. Cuando se hace una escritura


   JMP CICLO_SHIFT ; directa a memoria, es necesario indicar qu? tama?o posee el dato.
   BIN_UNO: ; Para ello, se ha indicar un puntero a memoria, de tama?o BYTE o WORD:

   MOV [DI], BYTE PTR '1' ; Cuando se hace una escritura directa a memoria, es necesario indicar qu?

   CICLO_SHIFT: ; tama?o posee el dato. Para ello,
   INC DI ; se ha indicar un puntero a memoria, de tama?o BYTE o WORD.

   LOOP LOOP_SHIFT ; Seguimos con el ciclo anidado para sacar el siguiente n?m binario

 ;---------------------------------

   POP CX ; Devolvemos al CX su valor original
   INC SI


   LOOP ASCII1 ; Seguimos con el siguiente ciclo para el siguiente valor ASCII


 ;-------------------------------------
    RET ; Terminamos y regresamos
ASCII2BIN ENDP
 ;-----------------------------------------------------------------------
 ESCRIBE PROC ; Inicio procedimiento ESCRIBE
    MOV AH,IMPRIMIR ; Funci?n DOS para escribir texto en pantalla
    INT DOS ; Llamar a la interrupci?n del DOS
    RET ; Volver o retornar
 
 ESCRIBE ENDP ; Fin del procedimiento ESCRIBE
 ;----------------------------------------------------------------------
 SALIR PROC NEAR
 MOV AX, FIN ; Mueve la instruccion para terminar el programa.
 INT DOS ; Ejecuta la interrupci?n.
 SALIR ENDP
 ;----------------------------------------------------------------------
 CODIGO ENDS
 ;===========================================================================
 END pe17_cbi
 ;===========================================================================
 ;===========================================================================

programa Vector


;==========================================================
; PROGRAMA : pe26_arr
; FUNCION : Vector ingresa datos .
; REALIZADO POR : Yesenia Lizbeth Guerrero Garcia
; FECHA : jueves 27 abril 2017
;=========================================================
.model small ;Modelo de memoria m?s utilizado
.stack 256h ;se define el espacio necesario para la pila
.data
CR equ 13 ; Constante CR (Retorno de carro) En decimal o
LF equ 10 ; Constante LF (Salto de l?nea) en hex es igual
mens db 'Escribe algo y te lo convierto al reves', CR,LF,'$'
salto db CR,LF,'$'
cadena label byte ;cadena de texto
cant db 20
max db 00
campo db 20 dup(' ')
.code
inicio:
mov ax,@data ; Inicializar correctamente el
mov ds,ax ; registro de datos
push ds ; Guardar ds en vector
pop es ;restaruamos es con sus valores anteriores
mov ah,09h ; Esperar tecla
lea dx,mens ; CARGA ETIQUETA MENSAJE
int 21h ; Llamar a la interrupci?n del DOS
mov ah,0ah ; Esperar tecla
lea dx,cadena ; CARGA ETIQUETA CADENA
int 21h ; Llamar a la interrupci?n del DOS
mov ah,09h ; Esperar tecla
lea dx,salto
int 21h ; Llamar a la interrupci?n del DOS
mov cl,cant
mov bx, offset campo
add bl, cant
loopo:
mov dl,[bx] ; Movemos el siguiente caracter ASCII al dl
mov ah,02h ;Leer car?cter desde el teclado
int 21h ; Llamar a la interrupci?n del DOS
dec bl
dec cl
cmp cl,0
je salir
jmp loopo
salir:
mov dl,[bx] ; Movemos el siguiente caracter ASCII al dl
mov ah,02h ;Leer car?cter desde el teclado
int 21h ; Llamar a la interrupci?n del DOS
mov ax,4c00h ;regresamos el control al sistema operativo
int 21h ; Llamar a la interrupci?n del DOS
end inicio

miércoles, 4 de octubre de 2017

Proframas de Ensamblador pendientes:



valores binarios
suma
calificacion
multiplicación
llenar vector

Instrucciones para operaciones aritméticas

ADD - Añade el contenido deloperando fuente al operando destino.
SUB - Resta el contenido del operando fuente del operando destino.
INC - Incrementa en 1 el valor del operando.
DEC - Decrementa en 1 el valor del operando.
NEG - Calcula el complemento a dos del operando y almacena el resultado en el mismo operando.
MUL - Multiplica enteros sin signo.
Caso 1- Si el operando es un byte, multiplica el contenido de AL por el contenido del
operando y almacena el resultado en AX.
AX=AL*operando
Caso 2-Si el operando es una palabra multiplica el contenido de AX por el operando,
y el resultado será almacenado en los registros DX:AX.
DX:AX=AX*operando
IMUL - Multiplica enteros con signo.
Caso 1- Si el operando es un byte, multiplica el contenido de AL por el contenido del
operando y almacena el resultado en AX.
AX=AL*operando 
Caso 2-Si el operando es una palabra multiplica el contenido de AX por el operando, y el resultado será almacenado en los registros DX:AX.
DX:AX=AX*operando

DIV - Divide números enteros sin signo.
Caso 1- Si el operando es un byte, divide el contenido de AX entre el contenido del
operando, almacena el resultado en AL y el residuo en AH.
AL=AX/operando
AH=AX MOD operando
Caso 2-Si el operando es una palabra divide el contenido de DX:AX entre el
operando, el resultado será almacenado en AX y el residuo será almacenado en DX.
AX=DX:AX/operando
IDIV - Divide números enteros con signo.
Caso 1- Si el operando es un byte, divide el contenido de AX entre el contenido del
operando, almacena el resultado en AL y el residuo en AH.
AL=AX/operando
AH=AX MOD operando 
Caso 2-Si el operando es una palabra divide el contenido de DX:AX entre el
operando, el resultado será almacenado en AX y el residuo será almacenado en DX.
AX=DX:AX/operando