martes, 24 de agosto de 2010

Leer CARACTER

Para Leer UN caracter de los dispositivos de entrada utilizamos la función  02H, seguida de la INT 21H el codigo es el siguiente.
              mov dl,al
              mov ah,02h            -----Indicamos que funcion va a realizar, en este caso leer un caracter 02h
               int 21h                   -----interrup`cion del bios
              -------------Bueno el caracter leido se almacena en la parte baja de AX, AL. Para comprobar podemos utilizar la funcion 01H, que nos imprime solamente un caracter en pantalla.
             
              mov ah,01H
              int 21H                        el caracter que debemos imprimir debe de ir en la parte baja de AX,... AL
 RECORDEMOS QUE SE MANEJAN SOLAMENTE LOS CODIGOS ASCII....
Por ejemplo  al leer el numero 1. AL, donde es guardado, tiene el valor de 31h, codigo ASCII en hexadecimal...
 = )

Tabla codigo ASCII Hexadecimal

OPERACIONES LÓGICAS:


OPERACIONES LÓGICAS:

Se usan para realizar operaciones a nivel de bits.

• NOT operando: cambia los bits 1 por 0 y viceversa y devuelve el resultado en el mismo
operando.
  AL = F2h             AL 1111 0010 
  NOT AL;    NOT AL 0000 1101 = Odh

• OR destino, fuente: operación o lógico inclusivo. El resultado se almacena en destino.
  AX = FEDCh  =  1111 1110 1101 1100 
  BX =  1234 h  =   0001 0010 0011 0100 
  OR AX,  BX        1111 1110 1111 1100 = FEFC h

• AND destino, fuente: la operación Y lógica entre 2 operandos, el resultado se deja en destino.
  AX =  FEDC h     1111 1110 1101 1100 
  BX =   1234 h       0001 0010 0011 0100 
  ADD  AX, BX      0001 0010 0001 0100 = 1214 h

• XOR destino, fuente: la operación o lógico exclusiva; el resultado se deja en destino.
  AX =  FEDC h     1111 1110 1101 1100 
  BX =  1234 h       0001 0010 0011 0100 
  XOR  AX, BX     1110 1100 1110 1000 = ECE8 h 

Limpiar Pantalla

¿Cómo hago para borrar todo el texto de la pantalla?

MOV AX,0600H ; Peticion para limpiar pantalla
MOV BH,89H ; Color de letra ==9 "Azul Claro"
; Fondo ==8 "Gris"
MOV CX,0000H ; Se posiciona el cursor en Ren=0 Col=0
MOV DX,184FH ; Cursor al final de la pantalla Ren=24(18)
; Col=79(4F)
INT 10H ; INTERRUPCION AL BIOS
;------------------------------------------------------------------------------
MOV AH,02H ; Peticion para colocar el cursor
MOV BH,00 ; Nunmero de pagina a imprimir
MOV DH,05 ; Cursor en el renglon 05
MOV DL,05 ; Cursor en la columna 05
INT 10H ; Interrupcion al bios
;-------------------------------------------------------------
 
INSTRUCCION MOV (MOVe)

Sintaxis:       MOV op_destino,op_fuente        ; Sintaxis básica
FORMATOS                        EJEMPLOS
MOV reg8,reg8                   MOV AH,BL
MOV reg16,reg16                 MOV AX,BX
MOV segreg,reg16                MOV ES,AX
MOV reg16,segreg                MOV CX,DS
MOV reg,mem                     MOV CH,[AA55H]
MOV mem,segreg                  MOV [DI],DS
MOV segreg,mem                  MOV SS,[4584H]
MOV reg,inmediato               MOV CX,2450H
MOV mem,inmediato               MOV BYTE PTR [SI],20
Mueve o transfiere un byte o una palabra desde el operando fuente al operando destino. El dato transferido se copia, por lo que no desaparece del operando fuente. Tanto el operando fuente como el operando destino pueden ser un registro o un elemento de memoria. El operando fuente puede ser un valor inmediato.

Ejemplos: 
MOV     AX,BX                   ; AX=BX
MOV     DL,CH                   ; DL=CH
MOV     BX,1500                 ; BX=1500
MOV     AX,[2458H]              ; AX=contenido en DS:2458H
MOV     [2458H],AL              ; contenido en DS:2458H=AL
MOV     [BX],AL                 ; contenido en DS:BX=AL
MOV     AL,[BX]                 ; AL=contenido en DS:BX
MOV     DS,AX                   ; DS=AX
MOV     CL,[SI+4]               ; CL=contenido en DS:SI+4
MOV     AX,[BP+7]               ; AX=contenido en SS:BP+7
MOV     [BX+DI-4],DX            ; contenido en DS:BX+DI-4=DX
MOV     DS,[BP+SI]              ; DS=contenido en SS:BP+SI
MOV     AX,[BP+SI+4]            ; AX=contenido en SS:BP+SI+4
MOV     BYTE PTR [1547H],25     ; contenido en DS:1547H=25
MOV     WORD PTR [1457H],AA55H  ; contenido en DS:1457H=AA55H


El tamaño de los dos operandos han de ser el mismo (8 bits o 16 bits). En la siguiente expresión:
MOV     AX,1
El operando fuente se traduciría a un operando de 16 bits (0001H), por lo que AH valdría 0, y AL valdría 1. En los siguientes ejemplos:
MOV     AX,[4520H]
MOV     AL,[4520H]
El ensamblador reconoce enseguida el tamaño de los operandos. En el primer caso se realiza un acceso a memoria, leyendo una palabra. En el segundo caso se realiza un acceso a memoria, leyendo 8 bits.

Cuando el operando se encierra entre corchetes, indica "el contenido de memoria en", es decir, que no se referencia a un valor sino a una posición de memoria. Normalmente, las referencias a memoria se basan en el segmento DS, y se direcciona a través de una posición predeterminada, o usando los registros BX, SI ó DI como punteros base que indican la posición dentro del segmento.

Si se utiliza el registro BP, éste direcciona al segmento de pila (SS).

Cuando se hace una escritura directa a memoria, es necesario indicar qué tamaño posee el dato. Para ello, se ha indicar un puntero a memoria, de tamaño BYTE o WORD:

MOV     BYTE PTR [4520H],25     ; Escritura en memoria de 8 bits
MOV     WORD PTR [4520H],25     ; Escritura en memoria de 16 bits
                                  (4520H=25 y 4521H=0)

Para referenciar a una posición de memoria localizada en otro segmento, se escribe el nombre del registro de segmento antes de los corchetes:

MOV     ES:[45],AL              ; Escribir en ES:45 el valor de AL

Los registros de segmento no se pueden inicializar con un valor inmediato, por lo que es necesario un registro intermedio de 16 bits o un valor WORD en una posición de memoria.
 

INSTRUCCIONES DE ARITMETICA
 

INTRUCCION INC (INCrement)

Sintaxis: 
INC     reg
INC     mem


Incrementa (suma 1 a) el contenido de un registro o de una posición de memoria.

Ejemplos:       
INC     AX                 ; AX=AX+1
INC     DL                 ; DL=DL+1
INC     WORD PTR ES:[DI+4] ; Increm. palabra contenida 
                           ; en ES:DI+4


INSTRUCCION DEC (DECrement)

Sintaxis:
DEC     reg
DEC     mem


Decrementa (resta 1 a) el contenido de un registro o de una posición de memoria.

Ejemplos:
DEC     AX                 ; AX=AX-1
DEC     DL                 ; DL=DL-1
DEC     BYTE PTR ES:[DI+4] ; Decrem. byte contenido en
                           ; ES:DI+4


INSTRUCCION ADD (ADDition)

Sintaxis:       ADD op_destino, op_fuente    ; Sintaxis básica
FORMATOS                        EJEMPLOS
ADD     reg,inmediato           ADD AX,3500
ADD     mem,inmediato           ADD BYTE PTR [SI],35
ADD     reg,reg                 ADD BX,DX
ADD     mem,reg                 ADD [BX],AX
ADD     reg,mem                 ADD AH,[BX]


Suma al operando de destino el valor o contenido del operando fuente, almacenándose el resultado en el operando de destino. Ambos operandos han de ser del mismo tamaño (byte o palabra).
 

INSTRUCCION SUB (SUBstract)

Sintaxis:       SUB op_destino, op_fuente    ; Sintaxis básica
 
FORMATOS                        EJEMPLOS
SUB     reg,inmediato           SUB AX,3500
SUB     mem,inmediato           SUB BYTE PTR [SI],35
SUB     reg,reg                 SUB BX,DX
SUB     mem,reg                 SUB [BX],AX
SUB     reg,mem                 SUB AH,[BX]


Resta al operando de destino el valor o contenido del operando fuente, almacenándose el resultado en el operando de destino. Ambos operandos han de ser del mismo tamaño (byte o palabra).
 

INSTRUCCIONES MUL (MULTiply) E IMUL

Sintaxis:
MUL     reg
MUL     mem
IMUL    reg
IMUL    mem
Realiza una multiplicación con el acumulador. Si se realiza con AL, el operando de la instrucción debe ser de 8 bits, y ambos generan un resultado de 16 bits que se almacena en el registro AX. Sin embargo, si se realiza con AX, el operando de la instrucción debe ser de 16 bits, con lo que el resultado será de 32 bits y se almacenará en el par de registros DX (palabra de mayor peso) y AX (palabra de menor peso).

La diferencia entre MUL e IMUL, es que la instrucción MUL realiza una multiplicación sin signo (sin complemento a dos), mientras que la instrucción IMUL realiza una multiplicación con signo (con complemento a dos).

Ejemplos:
MUL     BL              ; AX=AL*BL
MUL     CX              ; DXAX=AX*CX
MUL     BYTE PTR [BX]   ; AX=AL*byte contenido en DS:BX
MUL     WORD PTR [SI]   ; DXAX=AX*palabra contenida en DS:SI
IMUL    CL              ; AX=AL*CL
IMUL    DX              ; DXAX=AX*DX
IMUL    BYTE PTR [SI+2] ; AX=AL*byte contenido en DS:SI+2
IMUL    WORD PTR [BX+DI]; DXAX=AX*palabra contenida en DS:BX+DI


INSTRUCCIONES DIV (DIVide) E IDIV

Sintaxis:
DIV     reg
DIV     mem
IDIV    reg
IDIV    mem


Realiza una división entre un número de 16 bits y otro de 8 bits, o entre un número de 32 bits y otro de 16 bits.

En el primer caso, el dividendo ha de estar en el registro AX, y el divisor será el operando, con un tamaño de 8 bits. Como resultado, el cociente de 8 bits se almacena en AL, y el resto de 8 bits se almacena en AH.

En el segundo caso, el dividendo ha de estar en la pareja de registros DX (palabra de mayor peso) y AX (palabra de menor peso), y el divisor ser  el operando, con un tamaño de 16 bits. Como resultado, el cociente de 16 bits se almacena en AX, y el resto de 16 bits se almacena en DX.

La diferencia entre DIV e IDIV es que la instrucción DIV realiza una división sin signo (sin complemento a dos), mientras que la instrucción IDIV realiza una división con signo (con complemento a dos).

Ejemplos:       
DIV     CL              ; AX / CL
DIV     BX              ; DXAX / BX 
DIV     BYTE PTR [SI+2] ; AX / contenido en DS:SI+2
DIV     WORD PTR [DI+BX]; DXAX / contenido en DS:DI+BX
IDIV    DH              ; AX / DH
IDIV    CX              ; DXAX / CX 
IDIV    BYTE PTR [DI+BX]; AX / contenido en DS:DI+BX
IDIV    WORD PTR [SI+8] ; DXAX / contenido en DS:si+8