Título: Como imprimir los valores de un vector de enteros? Publicado por: xoker en 3 Enero 2014, 20:35 pm Buenas a todos, resulta que como se podran pensar soy muy novato con esto de ensamblador x86 y aqui viene mi duda:
Estoy tratando de imprimir los valores que contiene un vector, les pongo aqui el codigo que tengo por el momento: Código: .Const Bueno pues como pongo en el codigo, lo que me ocurre es que en vez de aparecerme la primera posicion del vector lo que me aparece es un numero que no tiene nada que ver y que tampoco es la direccion de memoria del vector. Creo que la teoria me la conozco y es lo que trato de aplicar, le paso a un registro la direccion donde se encuentra la direccion base del vector, y a partir de ahi voy recorriendo este aumentando la direccion en funcion de lo que ocupen los enteros, en este caso son dw por lo que se incrementara de 2 en 2 bytes, pero en la primera posicion el incremento es cero por lo que con mi codigo tendria que verse... He probado sumandole 2 o mas... quitandole los corchetes a Ecx y mil perradas, pero no lo cosigo :rolleyes:. Se que con este codigo no se puede recorrer todo el vector, he puesto aqui solo parte para que se vea la primea posicion para simplificarlo, mi problema solo es ese, con el bucle no tengo problemas (aun... xD) A ver si me pueden decir donde esta mal el codigo!! Un saludo!! Título: Re: Como imprimir los valores de un vector de enteros? Publicado por: _Enko en 4 Enero 2014, 15:22 pm Hola, ten cuidado al usar ECX que la funcion printf por ahi no preserva ecx. Recuerda que los contadores seguros son esi, edi y ebx.
Te doy una pista si quieres imprimir numeros menores a 10. 8 no es lo mismo que "8" El primero es un entero. El segundo es un caracter ascii. El valor del caracter ascii "8" es 56. De "0" 48, "1" es 49... http://www.asciitable.com/ Luego otro problema. Vect1 DW.... mov ecx, addr vect1 printf..... [ecx] printf como parametro te pide un Double Word. DW creo que significa Data Word. Necesitas un DD, Data Double Word. De lo contrario en vez te tomar 8.... te va tomar 98 (primer y segundo elemento del vector invirtiendolos) Saludos Título: Re: Como imprimir los valores de un vector de enteros? Publicado por: xoker en 4 Enero 2014, 15:33 pm Hola, ten cuidado al usar ECX que la funcion printf por ahi no preserva ecx. Recuerda que los contadores seguros son esi, edi y ebx. Te doy una pista si quieres imprimir numeros menores a 10. 8 no es lo mismo que "8" El primero es un entero. El segundo es un caracter ascii. El valor del caracter ascii "8" es 56. De "0" 48, "1" es 49... http://www.asciitable.com/ Luego otro problema. Vect1 DW.... mov ecx, addr vect1 printf..... [ecx] printf como parametro te pide un Double Word. DW creo que significa Data Word. Necesitas un DD, Data Double Word. De lo contrario en vez te tomar 8.... te va tomar 98 (primer y segundo elemento del vector invirtiendolos) Saludos Gracias por contestar, el tema de los caracteres ASCII no tengo problemas, al menos en C. Ya he conseguido acceder a la primera posicion, el error era usar el registro Ecx tal como comentaste! He usado Esi y puesto DD en vez de DW (este fue el tipico cambio desesperado...) y a la primera me ha salido el 8. ¿Podrias explicarme un poco mas eso del registro Esi y Ecx? Comprendo que Ecx es un registro que tiene un proposito especifico, pero ¿sabes cual es el problema con printf que se modifica? Elegi el registro Ecx por ya tenia usados Eax y Ebx, vamos por orden, vaya ojo el mio que me fui a fijar en el que se modifica con printf... Ya no se me olvida en la vida!!! :( Título: Re: Como imprimir los valores de un vector de enteros? Publicado por: MCKSys Argentina en 4 Enero 2014, 15:47 pm ¿Podrias explicarme un poco mas eso del registro Esi y Ecx? Comprendo que Ecx es un registro que tiene un proposito especifico, pero ¿sabes cual es el problema con printf que se modifica? Fijate esto: http://en.wikipedia.org/wiki/X86_calling_conventions (http://en.wikipedia.org/wiki/X86_calling_conventions) Saludos! Título: Re: Como imprimir los valores de un vector de enteros? Publicado por: _Enko en 4 Enero 2014, 16:15 pm Mh... fijate el link que te paso McksYS para el tema de convenciones que es importante ^^
Luego, ecx es un registro de proposito general. El llamado "Count Register" CX tenía un proposito específico en DOS 16 bit. En 32bit es un registro mas del monton. Título: Re: Como imprimir los valores de un vector de enteros? Publicado por: xoker en 7 Enero 2014, 10:36 am Buenas, termine el programa que trataba de hacer, lo voy a poner aqui por si alguna persona le quiere echar un vistazo o a modo docente por si alguien quiere aprender, tengo mas o menos comentado para que sirve cada linea.
El programa es muy basico y lo que hace es ordenar un vector en orden creciente mediante el algoritmo de la burbuja. Lo ideal seria utilizar funciones en el codigo, pero no se hacerlas aun correctamente, ya que siempre me petan en el ret, se ve que no se guardar bien la direccion a la que debe volver... Código: ;Ordenar un vector dado mediante el algoritmo de la burbuja |