2012-06-05 29 views
5

estoy trabajando actualmente en una asignación en AT & Asamblea T y ahora tengo que añadir dos cadenas:Al añadir dos cuerdas en ensamblador x86

message: .asciz "String 1" 
before: .asciz "String 2" 

tengo realmente ni idea de cómo hacer esto o cómo empezar. Ya he buscado en Internet pero no pude encontrar ninguna información útil. Creo que tengo que copiar manualmente los caracteres de la segunda cadena al final de la primera cadena, pero no estoy seguro de eso.

¿Alguien podría explicarme cómo hacer esto? :)

+0

El ensamblaje de AT & T no existe, es solo una sintaxis diferente ... Supongo que querías ensamblar x86 tal vez? :) – BlackBear

+0

Eso es lo que quise decir;) – Devos50

+0

Ok, me tomé la libertad de editar tu queston :) – BlackBear

Respuesta

2

Esto no es una cuestión trivial. Las cadenas son de longitud variable y ocupan espacios diferentes en la memoria, y tiene que haber alguna manera de saber cuánto tiempo están o dónde terminan. Con C o C++, un nulo de bytes (bytes de valor cero) indica el final de la cadena. Con algunos otros lenguajes de programa , tiene un puntero al comienzo de la cadena y la longitud de la cadena almacenada por separado, que tiene la ventaja de permitirle almacenar código binario (incluidos los bytes de valor cero) en la cadena. Incluso con C y el resto, debe tener un puntero hacia donde comienza la cadena.

Lo que generalmente tiene que suceder es que debe usar asm para contactar con el sistema operativo y solicitar un bloque de memoria que actualmente es libre lo suficientemente grande como para contener el contenido de las dos cadenas una vez que están conectadas.Esta sería la memoria separada de cualquiera de las dos cadenas para empezar, y viene de lo que se conoce como el Heap de memoria. Una vez que se le da el punto de inicio de ese bloque de memoria, se copian los contenidos de la primera cadena . en él, luego continúe mientras copia el contenido de la segunda cadena en justo detrás de la primera. A continuación, libera la memoria que se ha asignado a la primera cadena y reasigna el bloque a esa cadena cambiando su puntero, y posiblemente su longitud. La memoria liberada se devuelve al Memory Heap por el sistema operativo para su reutilización en otro lugar.

En realidad, el sistema operativo no es la única fuente de memoria liberada. Algunos compiladores, incluso ensambladores, manejan la administración de la memoria por su cuenta, o proporcionan las herramientas adecuadas al programador para hacerlo cuando sea necesario.

En otras palabras, esta puede ser una empresa muy ambiciosa, y usted debe saber bastante sobre acerca de lo que está haciendo bien. Si lo haces mal, puedes esperar que las consecuencias afecten tu sistema y necesiten reiniciarse.

+0

No estoy seguro de cómo puedes colgar tu sistema ejecutando un programa que concatena cadenas. – Simon

5

Esta pregunta no menciona la memoria de destino, lo que hace que sea algo difícil de responder. Tampoco sé si estás en 16 bits, 32 bits o 64 bits. Por cuestiones de conveniencia, también asumiré que son cadenas terminadas en estilo C.

De todos modos, esto parece ser el procedimiento general:

  • obtener la longitud de la primera cadena (las instrucciones sobre cómo escribir un strlen ASM se puede encontrar aquí: http://www.int80h.org/strlen/)
  • Establecer el PTR hasta el objetivo memory
  • Copie la primera cadena a la memoria de destino, usando rep(e/ne) movsb con el tamaño en ecx.

Ésta puede ser la CPU optimizado mediante el uso de 'movsd' por primera vez haciendo un shr ecx, 2 en su longitud para conseguirlo en lotes de 4 bytes, y luego hacer el resto con movsb. He visto este hecho así:

mov  edi, dest 
mov  esi, string_address 
mov  ecx, string_length 
mov  eax, ecx 
shr  ecx, 2 
repne movsd 
mov  cl, al 
and  cl, 3 
repne movsb ; esi and edi move along the addresses as they copy, meaning they are already set correctly here 
  • Obtener la longitud de la segunda cadena (asegúrese de copia de seguridad del EDI en la pila o en otro registro, si es necesario, ya que contiene la dirección que necesita para copiar el siguiente cadena a)
  • Copie la segunda cadena a la memoria de destino (como dije, la dirección correcta debería estar en edi después de la primera operación de cadena)
  • Por seguridad, agregue un nuevo 0 detrás de ella.

Si va a copiar la segunda cadena al final de la primera cadena, se necesita una menor operación de copia, pero que tienen para asegurarse de que en realidad hay espacio suficiente allí para copiar la segunda cadena sin sobrescribir otras cosas vitales.

Cuestiones relacionadas