Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

convertir de hexadecimal a decimal en Assembler

lunes, 4 de agosto de 2008
Como todos ustedes saben los caracteres ingresados por teclado una vez presionada la tecla en el dispositivo, esta emite una señal y esta pasa por uan especie de decodificador ( reconocedor de señales) para así reconocer entre si se presionó una letra 'a' o el numero '1', pero esta señal es un conjunto de bits, que a su vez estos agrupados, van en bloques haciendo una suma de pesos, por ejemplo ( supongamos 8 bits):

PESOS -> 128 64 32 16 8 4 2 1
A7 A6 A5 A4 A3 A2 A1 A0
0 0 1 0 1 0 0 1 Sumando sus pesos =1+8+32 =41

41 es el código hexadecimal de la letra 'a', entonces de reconocer este carácter se habrá presionado la letra a del teclado.

Ahora la idea es convertir ese código ASCII (hexadecimal) al sistema que manejamos nosotros el decimal, no es con un fin específico sino para practicar instrucciones y un poco de programación en assembler.

Bien veamos a continuación el código, no lo comentaré todo porque pretendo mostrarles como es que funcionan algunas instrucciones que están dentro de este código

.MODEL SMALL
.CODE
;leer un carácter e imprimir su código en exa.
INICIO: MOV AH,01 ; instrucción para leer algo de teclado
INT 21H ; realiza el servicio cagado de 01
MOV BL,AL
MOV AH,02H
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
MOV AL,BL
MOV CL,04
SHR AL,CL ; instrucción de rotación de bits
ADD AL,30H
MOV DL,AL
INT 21H
AND BL,0FH
CMP BL,09
JA sig ; es un salto condicional hacia la etiqueta sig
ADD BL,30H
MOV DL,BL
INT 21H
JMP FIN
sig: ADD BL,37H ; etiqueta sig, especie de procedimiento
MOV DL,BL
INT 21H
FIN: MOV AH,4CH
INT 21H
END

Tutoriales de programación

viernes, 18 de julio de 2008
Aquí les dejo las direcciones de algunos tutoriales que sirven de mucho al momento de empezar a aprender algun tipo de lenguaje de programación, la verdad que no los he probado todos puesto que no soy un experto programador y por los pocos conocimientos que manejo al respecto, siempre con el ánimo de aprender un poco mas.

  1. Para HTML : http://www.htmlya.com.ar/
  2. Para Java Script : http://www.javascriptya.com.ar/
  3. Para MySql: http://www.mysqlya.com.ar/
  4. Para PHP : http://www.phpya.com.ar/
  5. Para SQL Server : http://www.sqlserverya.com.ar/
Espero les sea de mucha utilidad.

Programacion en Assembler

Cuando hablamos del Assembler como un lenguaje ensamblador, podemos antes mencionar que la computadora maneja ciertos lenguajes para poder interactuar con los usuarios, ya que como bien sabemos ella conoce a la perfección el lenguaje binario de 1's y 0's que para nosotros es muy tedioso utilizarlo, por eso se crearon lenguajes de alto nivel y de bajo nivel.

Dentro de los lenguajes de alto nivel podemos decir que se encuentran java, visual c++ ( que he usado desde segundo ciclo)la particularidad de estos lenguajes de programación es que los códigos en binario fueron agrupados para poder utilizar palabras mas entendibles como un "if" o un "cout" que no son mas que una agrupación de tediosos y largos códigos en binario.

Ahora los lenguajes de bajo nivel, son los que mas comprende la pc, ya que la agrupacion de código binario es menor, en esta clasificación se encuentra el lenguaje ensamblador, el lenguaje binario.

En el lenguaje ensamblador se trabaja con los registros del procesador como son: AX,BX,CX y DX registros de propósito general ( son de 16 bits).

El registro AX que a su vez se divide en bits de alto nivel AH( de 8 bits) y de bajo nivel AL(de 8 bits);AX sirve fundamentalmente como acumulador y como registro para transferir informacion en las operaciones de E/S. BX, que de la misma manera que AX se divide en BH y BL;BX se usa como acumulador y como un registro base para calcular direcciones de memoria. CX, que maneja CH y CL, se usa como acumulador y se utiliza como contador para iteraciones y finalmente el registro DX (DH-DL) se usa como puntero de datos en ciertas instrucciones de E/S.

Registros de puntero de segmento (CS,SS,DS,ES)

Estos punteros definen los segmentos de 64k.El registro CS segmento de código(code segment) se usa para calcular direcciones de las instrucciones del programa; el registro SS segmento pila (stack segment) se emplea junto con el SP puntero de pila(Stack pointer), para calcular la dirección de las instrucciones que manejan la pila en su desarrollo como las instrucciones PUSH, POP CALL y RETURN; DS segmento de datos(data segment) se usa en instrucciones que manejan datos de memoria y el registro ES segmento extra(extra segment) se utiliza en las instrucciones donde se maneja cadena de caracteres.

Registros de desplazamiento dentro de los segmentos (SP,BP,SI,DI)

El SP es el puntero de pila
El SI índice de segmento (index segment)
El DI índice de destino contienen desplazamientos de los punteros de segmento DS y ES en el manejo de cadena de caracteres.
El BP es el puntero base.

Tambien existe un registro llamado contador de programa, el cual ya veremos la gran utilidad
del mismo.

Registros de estado

Un registro de estado, S, de 16 bits con la siguiente asignación: Bit bo(C) es el acarreo, Bit b2(P) es el de paridad, Bit b4(A) es el de acarreo auxiliar, Bit b6(Z) el de cero, Bit b7(S) el de signo, Bit b8 (T) el de Trap, Bit b9(I) que sirve para controlar el bloqueo de las intrusiones, Bit b10(D) que determinan si se han de autoincrementar o autodecrementar los punteros SI y DI en las intrusiones que manejan cadenas de caracteres, Bit b11(O) que especifica el desbordamiento (Overflow).

Ejemplo de programación en Assembler

Los comentarios van despues del ";"

.MODEL SMALL
.CODE
;leer un caracter e imprimir su codigo hexa en decimal.
INICIO: MOV AH,01 ;mov para asignar valor a un reg o pos de memoria aca se carga un serv.
INT 21H ;realizar el servicio cargado en ah
MOV BL,AL ;guardo lo que teclee del al al bl
MOV AH,02H
MOV DL,0AH ;salto de linea o retorno de carro no recuerdo jeje
INT 21H
MOV DL,0DH
INT 21H
MOV AL,BL
MOV CL,04
SHR AL,CL
ADD AL,30H ; suma de al +30 en hexa
MOV DL,AL
INT 21H
AND BL,0FH
CMP BL,09 ;instucción que hace comparaciones
JA sig ; sentencia afirmativa luego de la comparación
ADD BL,30H
MOV DL,BL
INT 21H
JMP FIN ;salto a posicion donde se encuentra la etiqueta FIN, sin condiciones
sig: ADD BL,37H
MOV DL,BL
INT 21H
FIN: INT 21H
END ; fin del programa

Espero hayan podido entender un poco lo que es assembler, dejo la promesa de hacer un post de intrucciones en assembler para explicar cada una de ellas.