2011-01-31 64 views
5

Acabo de empezar a aprender el lenguaje ensamblador. En java, si tenemos una matriz, siempre podemos usar array.length para obtener su longitud. ¿Hay algo así en el ensamblaje? Si es así, ¿alguien puede guiarme aquí?Cómo verificar una "longitud de matriz" en lenguaje ensamblador (ASM),

Editar:

Mis disculpas, sé que el montaje no tiene matrices, que estaba tratando de simplificar las cosas.

Lo que quería decir, si por ejemplo tengo una

data DB 1,2,3,5,7,8,9,10 

Dado que la base de datos puede contener cualquier cantidad de elementos, ¿cómo puedo comprobar la variable total de una variable que contiene?

Algo como Java, donde el uso int matriz para almacenar este

int data = {1,2,3,4,57,8,9,10}; 

sólo podemos data.length para encontrar el amountt total de elementos.

+0

hay tantos lenguajes ensambladores, que uno que está señalando? –

+3

No existe una longitud inherente de matrices. Las matrices son solo un trozo de memoria en el que se introducen las cosas. No se puede saber de qué tamaño; necesitarás hacer un seguimiento de esto tú mismo. –

+0

Nadie nunca indicó qué arquitectura está preguntando el OP. –

Respuesta

2

No existe una matriz en el conjunto (hasta donde yo sé). Eres libre de inventar cómo funciona una matriz si lo deseas.

Si está leyendo el ensamblado generado por un compilador, entonces tendrá que preguntar específicamente sobre ese compilador.

Una forma de hacer esto sería permitir que el primer byte de la matriz almacene la longitud de cada elemento. Otra forma sería anular la terminación de la matriz (por lo general, esta es la forma en que se mantienen las cadenas).

6

El montaje es mucho más lowlevel que Java. Esto, entre otras cosas, significa que no existe una "matriz". Al menos en la forma segura de Java en la que lo conoces.

Lo que sería equivalente a una matriz es asignar una porción de memoria y tratarla como una matriz. Sin embargo, la duración y la cantidad que tendrá que administrar, ya que todo lo que tiene es un pedazo de memoria que contiene sus datos. Si desea almacenar metadatos, como la longitud, tendrá que hacerlo usted mismo.

Las matrices como las conoces en Java contienen metadatos como la longitud y la verificación de límites. Éstos hacen lo mismo que debes hacer, solo que lo ocultan para que no tengas que preocuparte por esas cosas.

sugiero que eche un vistazo a la siguiente para una introducción sobre cómo se podría comúnmente crear y utilizar lo que es equivalente a una matriz en el montaje:

+0

mmm Sebastian, porque estoy esperando que un usuario dé una cantidad aleatoria de enteros, por lo tanto, intento codificar mi código de una manera más dinámica. intenté – Mike

+0

Si necesita una cantidad variable de elementos, podría hacer algunas cosas. Podría usar una [lista vinculada] (http://en.wikipedia.org/wiki/Linked_list), o podría hacer una matriz en fragmentos, cada uno con un tamaño como primer elemento y un puntero al siguiente fragmento como su segundo. (Mezcla de lista vinculada y matriz) –

+0

+1 ese libro es el mejor – BlackBear

10

La mejor manera de responder a esto es usar ejemplos de C. En C, hay dos maneras de realizar un seguimiento de la longitud de una matriz:

  1. Almacena una variable que le indica cuánto tiempo hace la matriz.
  2. Hace lo que las cadenas hacen y tienen el último elemento como 0.Luego, puede implementar una función de longitud de "cadena" que recorre la matriz hasta que encuentre cero.

Para el primer ejemplo, dependiendo del ensamblador que esté utilizando, es posible que pueda utilizar algunos trucos. Por ejemplo, en nasm usted puede hacer esto:

SECTION .data  

msg: db "Hello World",10,0 ; the 0-terminated string. 
len: equ $-msg    ; "$" means current address. 

Como se puede ver, se utiliza el operador de equ para obtener nasm para calcular la diferencia entre la dirección actual y el inicio de msg que debe ser igual a su longitud. Alternativamente, puede escribir la longitud allí como un dígito.

Para el segundo caso, podría escribir fácilmente una pequeña función para hacerlo. En general, si usted:

SECTION .text 

global _mystrlen 

_mystrlen: 

    push ebp  ; conform to C calling conventions. 
    mov  ebp, esp 

    xor  eax, eax 
    lea  ecx, [esp+8] ; load the start of the array into ecx 
    jecxz end   ; jump if [ecx] is zero. 

loop: 
    add  eax, 1  ; could use inc eax as well. 
    add  ecx, 4  ; always increment by (sizeof(int)). Change as appropriate 
    mov  edx, [ecx] ; load ecx 
    cmp  edx, 0  ; compare with zerp 
    je  end  ; if ecx is zero, we're done. 
    jmp  loop  ; if ecx isn't zero, loop until it is. 

end: 
    leave    ; restore stack frame 
    ret    ; return. eax is retval 

Tenga en cuenta que no he probado eso. Es solo para darte una idea.

Editar He probado la versión x86_64 en Linux, usando como rdi param1, pasando int arr[10] = {1,2,3,4,5,6,7,8,9,0};. Devuelve 9 como se esperaba. Tenga en cuenta que en Linux, el subrayado anterior a mystrlen es innecesario.

+3

+1 el concepto 'equ $ -msg' es muy útil –

+0

¡Muchas gracias por equ $ -msg! – Conex

+0

Aunque la característica '$' se aplica de hecho, vale la pena señalar que las cadenas terminadas en cero de longitud (en contraste con las cadenas Pascal) no se calculan de esa manera. La cadena en sí misma se itera buscando un byte cero y se devuelve el número de ciclos. Sin embargo, este método no se puede usar con arreglos ya que también deberían permitir valores cero. Para ellos, realmente no hay otra manera de hacer un seguimiento de su longitud en una variable. – Powerslave

0

MOV EAX, los datos longitudde

Devuelve el número de elementos de variable de matriz.

+0

El compilador EMU8086 no parece reconocer la palabra clave 'lengthof'. ¿Qué compilador usas? –

+0

MASM - https://msdn.microsoft.com/en-us/library/2kz8tk66.aspx – vengy

0

Creo que esto le ayudará a ....

.data

num db 2,4,6,8,10 

.code

main proc 
mov eax,0 ; initialize with zero 
mov ax,lengthof num 

salida = 5

+0

El compilador EMU8086 no parece reconocer la palabra clave 'lengthof'. ¿Qué compilador usas? –

Cuestiones relacionadas