Autor
|
Tema: Como imprimir los valores de un vector de enteros? (Leído 10,930 veces)
|
xoker
|
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: .Const
.Data
Vec1 DW 8, 9, 2, 4, 5, 6, 1, 2, 3, 4, 7, 8, 9, 5, 6, 2, 3, 1, 4, 7 ;Aqui esta el vector
.Code
start: Mov Ecx, Addr Vec1 ;Se le pasa la direccion base para movernos por todo el vector Mov Eax, 0 ;Contador del vector, se pone el contador a 0
Invoke printf, "El valor de la posicion %d es: %d", Eax,[Ecx] ;[b]Aqui es donde viene la gracia, quiero ver el valor de la posicion 0 del vector y me sale un numero diferente!![/b] Invoke puts, "", "\N" ;Salto de Linea Exit: Invoke system, "pause" Xor Eax, Eax Invoke ExitProcess, Eax ;Fin del programa principal 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 . 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!!
|
|
|
En línea
|
|
|
|
_Enko
|
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
|
|
« Última modificación: 4 Enero 2014, 15:24 pm por _Enko »
|
En línea
|
|
|
|
xoker
|
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!!!
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
¿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_conventionsSaludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
_Enko
|
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.
|
|
|
En línea
|
|
|
|
xoker
|
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... ;Ordenar un vector dado mediante el algoritmo de la burbuja
.Const
.Data
Vec1 DD 8, 10, 2, 4, 5, 6, 1, 2, 3, 4, 7, 8, 9, 5, 6, 2, 3, 1, 4, 7 ;Aqui esta el vector Num DD 20 ;Numero de elementos
.Code
start: Invoke printf, "Vamos a Ordenar el vector Vec1 ya iniciado mediante el algoritmo de la burbuja: " Invoke puts, "", "\N" ;Salto de Linea Invoke printf, "Vector a Ordenar: " Invoke puts, "", "\N" ;Salto de Linea
;Imprimir por pantalla el vector:
imprimir: Mov Ebx, 0 ;Ponemos el contador del bucle a cero. Mov Esi, Addr Vec1 ;Se le pasa la direccion base para movernos por todo el vector bucle: Cmp Ebx, [Num] ;Comparacion de Eax y N Je > fin ;Salta si Eax y N son iguales, por lo que seria igual a if(Eax < N) Invoke printf, "%d, ", [Esi] ;Imprime el valor que hay en la direccion de memoria Inc Ebx ;Eax++ Add Esi, 4 ;Se le suma 4 para movernos sobre el vector elemento a elemento Jmp < bucle ;Salto incondicional, se usa < porque el salto es hacia atras. fin: Invoke puts, "", "\N" ;Salto de Linea
;Fin parte imprimir Vector por pantalla
;Ordenar los elementos del vector con algoritmo burbuja burbuja: Mov Esi, 0 ;Contador i del bucle fuera Mov Edi, 0 ;Contador j del bucle dentro Mov Ebx, Addr Vec1 ;Metemos en Ebx la direccion base de vec1 para el bucle de fuera while_fuera: Cmp Esi, [Num] Je > fin_whilefuera ;while(i < Num) Mov Edi, Esi ;Hacemos j = i al iniciar el bucle Mov Ebp, Ebx ;Metemos en Ebp la direccion base por donde vamos a empezar que sera en vec1[i]
while_dentro: Cmp Edi, [Num] Je > fin_whiledentro ;while(j < Num) Mov Eax, [Ebx] ;No se pueden comparar [Ebx] y [Ebp] por lo que los hemos pasado a Eax y Ecx Mov Ecx, [Ebp] if: Cmp Eax, Ecx Jbe > fin_if ;if (Vec1[i] > Vec1[j]) ;Invoke printf, "Valor de Vec1[%d]= %d <-- Vec1[%d]= %d, ", Esi, [Ebx], Edi, [Ebp] ;Invoke puts, "", "\N" ;Salto de Linea Mov Eax, [Ebx] ;aux1 = vec1[i] Mov Edx, [Ebp] ;aux2 = vec1[j] Mov [Ebx], Edx ;vec1[i] = aux2 Mov [Ebp], Eax ;vec1[j] = aux1 fin_if: Inc Edi ;j++ Add Ebp, 4 Jmp while_dentro ;volvemos al bucle while dentro fin_whiledentro: Inc Esi ;i++ al terminar el while_dentro Add Ebx, 4 Jmp while_fuera ;volveos al bucle while fuera fin_whilefuera:
;Imprimimos de nuevo los resultados Invoke printf, "Vector Ordenado: " Invoke puts, "", "\N" ;Salto de Linea
imprimir2: Mov Ebx, 0 ;Ponemos el contador del bucle a cero. Mov Esi, Addr Vec1 ;Se le pasa la direccion base para movernos por todo el vector bucle2: Cmp Ebx, [Num] ;Comparacion de Eax y N Je > fin2 ;Salta si Eax y N son iguales, por lo que seria igual a if(Eax < N) Invoke printf, "%d, ", [Esi] ;Imprime el valor que hay en la direccion de memoria Inc Ebx ;Eax++ Add Esi, 4 ;Se le suma 4 para movernos sobre el vector elemento a elemento Jmp < bucle2 ;Salto incondicional, se usa < porque el salto es hacia atras. fin2: Invoke puts, "", "\N" ;Salto de Linea
;Fin parte Ordenar los elementos Exit: Invoke system, "pause" Xor EAX, EAX Invoke ExitProcess, EAX
;Fin del programa principal
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[C] Entremezclar valores de un vector
Programación C/C++
|
Rockmore
|
2
|
2,874
|
4 Diciembre 2010, 19:19 pm
por Rockmore
|
|
|
[C] Mostrando datos de un vector de enteros
Programación C/C++
|
Rockmore
|
0
|
3,082
|
5 Diciembre 2010, 20:44 pm
por Rockmore
|
|
|
Imprimir matriz de enteros en un jTextArea
Java
|
falko0n
|
5
|
17,093
|
26 Marzo 2012, 20:08 pm
por Proteus1989
|
|
|
como imprimir valores que tengan zeros al principio
Programación C/C++
|
Erres
|
5
|
3,969
|
8 Octubre 2012, 19:27 pm
por Eternal Idol
|
|
|
problema para imprimir un vector en el main (java)
Dudas Generales
|
dam_daniel
|
0
|
2,099
|
15 Marzo 2019, 17:31 pm
por dam_daniel
|
|