|
| Autor |
Mensaje |
ANDRES
Registrado: 28 Oct 2009 Mensajes: 3
|
Publicado: Sab 07 Nov, 2009 00:00 am
Título del mensaje: ASM |
|
|
Buenas a todos....
Estoy con un problema en asm, el cual me pide encontrar cuantas veces esta contenido el dato 3a en una tabla que comienza en C000 y que contiene 33 bytes.
Por otro lado esto es lo que hice yo, igual no da el resultado esperado:
| Código: | MOV AX,[COOO]
MOV SI,C000
MOV AH,0
CMP AX,[SI]
JE ; ACA SALTARIA AL LUGAR DONDE SE INCREMENTA SI
INC AH
INC SI
DEC AH
JNZ ;ACA VUELVE A LA DIRECCION DONDE SE COMPARA
MOV [A000],AH |
Cualquier ayuda desde ya muchas gracias...
Saludos
Andres |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 989 Ubicación: y*width+x
|
Publicado: Mar 10 Nov, 2009 01:25 am
Título del mensaje: Re: ASM |
|
|
Mira, Andrés, te veo muy verde en ensamblador, deberías empaparte más, antes de realizar cualquier programilla... En el código que has expuesto te faltan las etiquetas.. pero mejor te epxlico que hace tu programa línea por línea:
MOV AX,[C000] Copia el contenido de la direccion C000 en el registro AX
MOV SI,C000 Asigna C000 al registro de 16 bits, SI
MOV AH,0 Asigna 0 al byte alto del registro AX
CMP AX,[SI] Compara el registro AX con el contenido del registro de SI
JE Si es igual (TE FALTA ESPECIFICAR LA ETIQUETA DONDE SALTAR)
INC AH Incrementa el byte alto del registro AX
INC SI
DEC AH Decrementa el byte alto de AX (?¿?)
JNZ Salta si no es cero, ésto de acá no tiene mucho sentido si no hay un CMP de por medio o similar
MOV [A000],AH Asigna el byte alto de AX al contenido de la direccion A000
Bueno, en resumen, no creo que llegues muy lejos con ese código... yo nunca he programado en ensamblador puro, porque si te soy sincero es un verdadero coñazo, lo que si puedo mostrarte es código ensamblador con C, en éste caso, usando el estándar de AT&T, que suele ser un poco diferente al de Intel, que es el más común, en el que usaste tú. En éste código cuento las veces que se repite un carater en un array, que es más o menos lo que quieres hacer, observa que todo se resume en saltos de una etiqueta a otra, y también podrás observar, cómo algo tan sencillo que en C se hace en un par de líneas, en ensamblador se hace en muchas más...
Echo en DEV-C++ 4.9
| Código: | #include <stdio.h>
// Da la casualidad que un byte es igual que un char
// también da la casualidad que 0x3A es igual ':'
char array[34]="J00000:000000000000000000000:000F";
unsigned int direccion=&array;
unsigned int contador,acumulador=0;
main()
{
// CODIGO EN C
//for (contador=0;contador<=33;contador++)
//if (Puntero[contador]==0x3A) acumulador++;
// CODIGO EN ENSAMBLADOR DE AT&T (OJO NO EL DE INTEL)
// Guardamos el conetnido de los registros, no vayamos a cargarnos algo que se estaba usando
asm ("push %esi");
asm ("push %eax");
asm ("push %ebx");
asm ("push %ecx");
// ponemos el contador a cero y el acumulador tambien
asm ("sub %ecx,%ecx");
asm ("sub %eax,%eax");
asm ("mov _direccion,%esi"); // Asignamos el puntero
asm ("repite:"); // Comienza el bucle
asm ("mov (%esi,%ecx),%ebx");
asm ("cmp $0x3a,%bl"); // Comparamos el byte
asm ("je entonces");
asm ("continua:");
asm ("inc %ecx"); // incremento el contador
asm ("cmp $33,%ecx"); // compruebo si se repite 33 veces
asm ("jne repite");
asm ("jmp fin");
asm ("entonces:"); // incrementa el acumulador
asm ("inc %eax");
asm ("jmp continua"); // volvemos al bucle
asm ("fin:");
asm ("mov %eax,_acumulador");
// Reponemos el contenido de los registros
asm ("pop %ecx");
asm ("pop %ebx");
asm ("pop %eax");
asm ("pop %esi");
printf("El valor 0x3A se repite en el puntero, %d veces",acumulador);
getch();
}
|
suerte y lee bien algún manual de ASM.. |
http://www.youtube.com/watch?v=DzLKIW86hmM
Ultima edición por WhiteSkull el Mar 10 Nov, 2009 16:14 pm; editado 2 veces
|
|
| Volver arriba |
|
|
Gux
Registrado: 07 Nov 2009 Mensajes: 7
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 989 Ubicación: y*width+x
|
Publicado: Mar 10 Nov, 2009 13:42 pm
Título del mensaje: Re: ASM |
|
|
Para que quieres usar ensamblador? |
|
|
|
| Volver arriba |
|
|
Gux
Registrado: 07 Nov 2009 Mensajes: 7
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 989 Ubicación: y*width+x
|
Publicado: Mar 10 Nov, 2009 14:43 pm
Título del mensaje: Re: ASM |
|
|
Bueno, ya veo... Entonces descargate éste simulador, que además incluye varios ejemplos, el Microprocessor Emulator and Assembler 8086 te permite programar y ver internamente el funcionamiento. Creo que es la manera más fácil de aprender ASM. Para programar además se requiere que estudies bien el hardware del 8086, sobre todo las funciones de la bios, conocer los puertos de algunos periféricos básicos y demás. De por si, el ensamblador es un lenguaje muy primitivo y bastante fácil de aprender. De hecho fue el creador del C, Dennis, quien lo inventó para programar. Y es el C una evolución de éste. Cada línea de ensamblador, equivale a varias líneas del un determinada instrucción, denominándose todas ellas, set de instrucciones, que normalmente usa cualquier CPU, desde los PICs más básicos hasta los Pentium de última generación... Éste set o ISA, se cuenta con los dedos, normalmente sus funciones habituales son mover el contenido de una zona de la memoria a otro, guardar el estado de la memoria o cargarla. Para usar éste emulador te puede servir cualquier manual de ASM para el 8086, que puedes encontrar googleando en internet. Que por cierto hay cientos, en diverosos idiomas, siendo el inglés el más dominante... Y ahora sólo te deseo suerte y que practiques mucho, ya que por la información que has ofrecido, supongo que sabes bastante de C y eso te facilitara mucho la comprensión de éste lenguaje, y más si ya usaste los punteros.
http://www.altacracks.com/programas-gratis/microprocessor-emulator-and-assembler-8086 |
http://www.youtube.com/watch?v=DzLKIW86hmM
Ultima edición por WhiteSkull el Mar 10 Nov, 2009 15:52 pm; editado 1 vez
|
|
| Volver arriba |
|
|
Gux
Registrado: 07 Nov 2009 Mensajes: 7
|
Publicado: Mar 10 Nov, 2009 15:36 pm
Título del mensaje: Re: ASM |
|
|
| Cita: | | por la información que has ofrecido, supongo que sabes bastante de C y eso te facilitara mucho la comprensión de éste lenguaje, y más si ya usaste los punteros. |
La verdad que no. Solamente tengo un suficiente dominio de Java, que tengo entendido tiene una gran base (ademas de la sintaxis) del lenguaje C. Al paralelo del concepto de punteros, conozco el manejo de referencias por los objetos que se crean en Java, por ejemplo, pero entiendo que es algo semejante.
En la materia que me hacen estudiar Assembler, tendríamos otro proyecto, en C, pero como este semestre se vio interrumpido (por la propagación de la gripe A en la temporada invernal en Argentina) creo que queda fuera de la materia. La cuestión es que lo que sería C, lo veríamos despues del lenguaje ensablador.
Bueno, muchas gracias por la información WhiteSkull. Te cuento de paso que para nuestra materia, propusieron el simulador emu8086; quizás sea el mismo que me recomendaste, creo que es bastante conocido. De todas formas lo tendré en cuenta para ver los ejemplos.
 |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 989 Ubicación: y*width+x
|
Publicado: Mar 10 Nov, 2009 16:09 pm
Título del mensaje: Re: ASM |
|
|
Así es, es el emu8086. Java desciende de C++. Creo que no hay mucha relación entre una referencia y un puntero. Una referencia es casi cómo un vinculo con un objeto existente, mientras que un puntero, casi cómo indica su nombre es algo que apunta a algo, concretamente a una dirección de memoria. La gestión de datos usando punteros es muy similar a trabajar cómo se haría en ensamblador. Por ello en C, se recurre más a los punteros para optimizar, que usar ensamblador directamente, ya que apenas hay diferencia,en relación a la velocidad obtenida. No se, hay gente que puede discutirme éste tema, pero no quisiera entrar en debate.
Gracias a ti por tú atención...  |
http://www.youtube.com/watch?v=DzLKIW86hmM
|
|
| Volver arriba |
|
|