lunes, 28 de octubre de 2013

Instrucciones de Desplazamiento, Rotación y Adeudos

Instrucciones de Desplazamiento, Rotación y Adeudos


SAL/SHL
Realiza desplazamiento a la izquierda del primer operando tantos bits como indique el segundo operando, introduciendo un 0 y guardando el bit que sale en el bit CF del registro de estado.



Admite los siguientes formatos:
SAL/SHL reg, 1; desplaza 1 vez el contenido de reg
SAL/SHL mem, 1
SAL/SHL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
SAL/SHL mem, CL
Afecta a los bit OF, CF del registro de estado.
SHR
Realiza el desplazamiento a la derecha del operando, introduciendo un 0 y guardando el resultado en el bit CF del registro de estado.
Admite los siguientes formatos:
SHR reg, 1; desplaza 1 vez el contenido de reg
SHR mem, 1
SHR reg, CL; desplaza tantas veces el contenido de reg como indique CL.



SHR mem, CL

Afecta a los bit OF, CF del registro de estado.
 
SAR
Realiza el desplazamiento a la derecha del operando, repitiendo el bit de signo y guardando el resultado en el bit CF del registro de estado.


Admite los siguientes formatos:

SAR reg, 1; desplaza 1 vez el contenido de reg
SAR mem, 1
SAR reg, CL; desplaza tantas veces el contenido de reg como indique CL.
SAR mem, CL
Afecta a todos los bit del registro de estado.




ROL
Realiza la rotación a la izquierda de los bits del operando, ignorando el bit CF del registro de estado, aunque en CF se almacena el bit que se rota.
Admite los siguientes formatos:
ROL reg, 1; desplaza 1 vez el contenido de reg
ROL mem, 1
ROL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
ROL mem, CL
Afecta a los bit OF, CF del registro de estado.
ROR
Realiza la rotación a la derecha de los bits del operando, ignorando el bit CF del registro de estado, aunque en CF se almacena el bit que se rota.

Admite los siguientes formatos:
ROL reg, 1; desplaza 1 vez el contenido de reg
ROL mem, 1
ROL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
ROL mem, CL
Afecta a los bit OF, CF del registro de estado.
RCL
Realiza la rotación a la izquierda de los bits del operando a través del bit CF (acarreo) del registro de estado.
Admite los siguientes formatos:
RCL reg, 1; desplaza 1 vez el contenido de reg
RCL mem, 1
RCL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
RCL mem, CL
Afecta a los bit OF, CF del registro de estado.
 
RCR
Realiza la rotación a la derecha de los bits de operando a través del bit CF del registro de estado.
Admite los siguientes formatos:
RCR reg, 1; desplaza 1 vez el contenido de reg
RCR mem, 1
RCR reg, CL; desplaza tantas veces el contenido de reg como indique CL.
RCR mem, CL
Afecta a los bit OF, CF del registro de estado.



STC (pone a uno el indicador de acarreo)
Sintaxis: STC
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - 1
Pone a 1 el indicador de acarreo CF sin afectar a ningún otro indicador.


CLC (baja el indicador de acarreo)
Sintaxis: CLC
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - 0
Borra el indicador de acarreo (CF) sin afectar a ninguno otro.

jueves, 24 de octubre de 2013

Hacer manualmente la ejecución y comprobar con el debug

Codigo de nuestro programa:
.MODEL SMALL
.DATA
Var1 DW 10 ;Declaracián de una variable de tipo entero ;dw reserva una palabra en memoria o dos bytes.
 ;inicializada con 10.
.CODE ; begin
inicio: ;Punto de entrada al programa
Mov AX,5 ;AX=5
Mov BX,10 ;BX1O
Add AX,BX ;AX=AX+BX
Mov CX,8 ;CX=8
Add CX,Var1 ;CX=CX+Varl
Inc AX ;AX=AX+1
Dec BX ;BX=BX-1
Inc Var1 ;VarlVarl+l
Dec Var1 ;VanlVarl-1
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ; llamada al sistema operativo
END Inicio
END





Proceso de ensamblado y enlace



Despues ejecutamos el debug y abrimos los segmentos cs,ss y ds
Usamos -t para rastrear el programa
Hasta llegar a la interrupcion hasta que nos saque del debug

martes, 22 de octubre de 2013

Programa Reverse

Codigo de nuestro programa reverse

.MODEL Small
.STACK 100h
.DATA
10 EQU 1000
"abc" 08 10 DUP (?)
"cba" DB  10 DUP
.CODE
Inicio: mov ax,@data
mov ds,ax ; DS apunta al segmento de datos.
mov ah,3Fh ; Funaón de ctura
mov bx,0 ; Entrada estádar
mov cx,10 ; Máximo # de caracteres a ser leidos.
mov dx,OFFSET "abc" ; Apuntador a Ia cadena a iwerlir.
int 21h
and ax,ax ; ¿Fue leido gún carácter?.
jz Salir ;no,salir
mov cx,ax ;almacenar longitud en CK
push cx ;SvarbngitudenIapda
mov bx,OFFSET "abc"
mov si,OFFSET "cba"
add si, cx ;Apuntador al fmal del buffer
dec  si ; de Ia cadena invertida.
Lazo: mov al,[bx] ; Obtener carácter sigtiente.
mov [si],al ; !Jmacenar en orden ænfrario.
inc bx ; Aptstar al sigtiente carácter.
dec si  ; Apuntar a localidad antenor.
loop Lazo ; Repelir
pop  cx; Recuperar longitud.
mov ah,40h ; Función de escritura.
mov bx,1 ; Salida estádar.
mov dx,OFFSET "cba" ; Apuntador a Ia cadena mveriida
INT 21h
Salir: mov ah,4Ch ; Retomar control al DOS.
int 21h
END Inicio


Proceso de ensamblado, enlace y la ejecucion del programa
En la imagen de arriba se ve que se introduce la cadena romo y devuelve la cadena omor

 abrimos el debug y vemos los segmentos cs,ss y ds tambien rastreamos el programa con -t hasta que llegue la interrupcion y nos saque del debug.


en la imagen de arriba se ve como llegamos a la interrupcion

lunes, 21 de octubre de 2013

Actividad Lunes 21 de octubre

Codigo del programa modificado.

page 60,132
TITLE PO8JUMP (COM) uso de JMP para iterar
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;INICIACION DE AX
MOV BX,01
MOV DX,01
MOV CX,10
A20:
ADD AX,01 ;SUMAR 01 A AX
ADD BX,AX ;SUMAR AX A BX
SHL CX,1 ;MULTIPLICAR POR CADA DOS CX
JMP A20 ; SALTAR A LA ETIQUETA 20
MAIN ENDP
END MAIN


Proceso de ensamblado de nuestro programa modificado
como vemos en la imagen de arriba nos vuelve a salir el warning del stack segment pero no es necesario de ponerlo

 ejecutamos el debug y vemos los segmentos cs,ss y ds
tecleamos -t el cx va de decremento

Instrucción LOOP y JMP programas Analisis

 Codigo del programa:

page 60,132
TITLE POBLOOP (COM) Ilustracion de Loop
.MODEL SMALL
.CODE
ORG l00
BEGIN PROC NEAR
MOV AX,Ol
MOV BX,01
MOV DX,01
MOV cx,lO
A20:
INC AX
ADD BX,AX
SHL DX,1
LOOP A20
MOV AX,4C00h
INT 21h
BEGIN ENDP
END BEGIN

Análisis del código:
1. Se define con la instruccion PAGE el numero maximo de lineas para una página.
2. Con TITLE definimos el titulo que le daremos
3. Definimos el modelo de memoria en este caso sera SMALL
4.Indicamos inicia el codigo
5.Nuestro codigo que vamos a generar iniciara con un desplazamiento de direccion 100
6.Entramos a iniciar nuestro proceso  PROC NEAR
7.Inicializamos AX,  Mueve el valor 01 a AX
8.Transfiere a BX el valor 01
9.Transfiere a DX  el valor 01
10. Transfiere a CX el valor 01
11.Una etiqueta la cual representa el numero de iteraciones.
12. Sumar 01 a AX
13.Sumas AX a BX
14.SHL Multiplicar por dos a DX
15.Decrementar CX (Iterar si este es diferente de cero)
16.Transferir 4c00h a AX
17.Interrupción 21h, salida a dos
18. Fin del begin
19. Fin del programa
  
Proceso de emsamblado de nuestro programa 

podemos ver que nuestro programa esta perfectamente ensamblado solo nos aparece un warning pero no afecta el funcionamiento de nuestro programa es solo un recordatorio por si se nos olvido porne el stack segment.

Dentro del debug comenzamos a rastrear nuestro programa con la instruccion con la instruccion -T
podemos ver que la instrucion IP
y asi seguimos hasta que el programa termine esto pasara cuando nos saque del Debug

Que pasa en el siguiente programa y porque?
Codigo de nuestro programa JMP

page 60,132
TITLE PO8JUMP (COM) uso de JMP para iterar
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;INICIACION DE AX
MOV BX,01 ;BX Y
MOV CX,01 ;CX A 01
A20:
ADD AX,01 ;SUMAR 01 A AX
ADD BX,AX ;SUMAR AX A BX
SHL CX,1 ;MULTIPLICAR POR CADA DOS CX
JMP A20 ; SALTAR A LA ETIQUETA 20
MAIN ENDP
END MAIN





1: Define el numero máximo de lineas para listar en una pagina.
2: Define el titulo del programa.
3: Define el modelo de memoria.
4: Inicia el codigo.
5: Inicia la generacion de codigo a partir del desplazamiento de dirección 100h.
6: Comienza el proceso.
7: Mueve 01 al registro AX.
8: Mueve 01 al registro BX.
9: Mueve 01 al registro CX.
10: Nombre de la etiqueta indicando el número de iteraciones.
11: Suma 1 al registro AX.
13: Suma el valor de AX al registro BX.
14: Multiplica por dos a DX.
15: Salta a la etiqueta A20, realizando una especie de ciclo.
16: Termina el proceso.
17: Termina el programa.

Proceso de emsamblado de nuestro programa 
en la imagen de arriba se ve que nos vuelve a salir el warning de que nos falta el stack segment pero no afecta el funcionamiento de nuestro programa
en la imagen de arriba se ve los segmentos cs, ds, ss y parte del rastreo del programa se encuentran vacios.



 se ve en el codigo que se comienzan a repetir las instrucciones

martes, 15 de octubre de 2013

Entrada desde el teclado

Codigo del programa:

.MODEL Small
.STACK 100h
.DATA
Tiempo DB "ES de mañana o de tarde(M/T)?$"
BuenosDias DB "Buenos dias, Mundo",13,10,"$"
BuenasTardes DB "Buenas tardes, Mundo",13,10,"$"
.Code
inicio:
mov ax,@data
mov ds,ax
mov dx,OFFSET Tiempo
mov AH,9
int 21h
mov AH,1
int 21h
cmp AL,"m"
jz AM
cmp AL,"M"
JZ AM
mov dx,OFFSET BuenasTardes;no,Es de tarde
jmp MostrarMensaje
AM: mov dx,OFFSET BuenosDias
MostrarMensaje: MOV AH,9
INT 21H
MoV AH,4CH
INT 21H
END inicio

Hacer el proceso para crear el archivo .exe
Podemos observar que al correr el programa nos hacer la pregunta ¿Es de mañana o de tarde (M/T)? al introducir la letra T nos dice Buenas tardes, Mundo y al presionar la letra T nos dice Buenos dias, Mundo.





jueves, 10 de octubre de 2013

Actividad ejemplo saltos

El codigo es el siguiente:

PAGE 60,132
TITLE PO6MOVE (ExE) OPERACIONES DE MOVIMIENTO EXTENDIDOS
;----------------------------------------------------------
.MODEL SMALL
.STACK 64
;----------------------------------------------------------
.DATA
NAME1 DB 'ABCDEFGHI'
NAME2 DB 'JKLMNOPQR'
;----------------------------------------------------------
.CODE
BEGIN PROC FAR
MOV AX,@data
MOV DS,AX
MOV ES,AX
MOV CX,09
LEA SI,NAME1
LEA DI,NAME2
B20:
MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ B20
MOV AX,4C00H
INT 21
BEGIN ENDP
END


Despues de tener el archivo .asm lo copiamos a la carpeta masm y realizamos el proceso de ensamblado y enlace.
Despues entramos al debug para poder ejecutarlo y ver lo que pasa en la memoria y los registros.


El registro CX va decrementando y difernetes operaciones como podemos ver  MOV(mover), JNZ (salto condicional) que estos estan en la estructura de nuestro código. EL IP va cambiando por que va apuntando a la siguiente instrucción. 


Los registros de banderas : Se van apagando o prendiendo como podemos ver
Los bits de paridad en PO y PE : Paridad non y Paridad Par
El de Zero : NZ y ZR: Si es cero o no lo es
El de Carry: NC y CY : si hay acarreo o No hay





martes, 8 de octubre de 2013

Primer programa en ensamblador

Escribimos nuestro código en notepad o editor de texto (bloc de notas)
 
Codigo de Hola Mundo

.model small
.stack
.data
saludo db "Hola mundo!!!", "$"
.code
main proc ;Inicia proceso
mov ax,seg saludo ;hmm ¿seg?
mov ds,ax ;ds = ax = saludo
mov ah,09 ;Function(print string)
lea dx,saludo ;DX = String terminated by "$"
int 21h ;Interruptions DOS Functions
;mensaje en pantalla
mov ax,4c00h ;Function (Quit with exit code (EXIT))
int 21h ;Interruption DOS Functions
main endp ;Termina proceso
end main
Despues de teclear el codigo o haberlo copiado lo guardamos con la extension .asm y lo copiamos a la carpeta masm(macroassembler).