es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ensamblador: almacenar una cadena en el registro.

Digamos que trabajamos en la arquitectura x86_64 y tenemos la siguiente cadena, “123456”. En caracteres ASCII, se convierte en 31 32 33 34 35 36 00.

Ahora bien, ¿qué instrucciones ensamblador debo utilizar para mover el contenido completo de esta cadena (incluso si está fragmentada), de tal manera que %rdi guarde la dirección de esa cadena (apunte a ésta)?

Dado que no puedo simplemente mover la representación hexadecimal de la cadena a un registro, como se puede hacer con valores sin signo, ¿cómo puedo hacerlo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mover todo el contenido de la cadena “123456” a la dirección apuntada por %rdi, necesitamos usar una combinación de instrucciones de ensamblador. Aquí están los pasos:

    1. Asignar memoria para la cadena en la pila. Podemos usar la instrucción “sub” para decrementar %rsp y reservar algún espacio en la pila. Por ejemplo, podemos reservar 7 bytes (6 bytes para la cadena más el terminador nulo) ejecutando la siguiente instrucción:

    sub $8, %rsp

    1. Copiar la cadena en la memoria asignada en la pila. Podemos usar la instrucción “mov” para copiar cada byte de la cadena uno por uno. Podemos usar la dirección de memoria de la memoria asignada en la pila como el operando fuente y una serie de valores inmediatos (31, 32, 33, 34, 35, 36 y 0) como los operandos de destino. Así es como se verían las instrucciones:

    movb $0x31, (%rsp) ; copiar "1" en la ubicación de memoria asignada
    movb $0x32, 1(%rsp) ; copiar "2" en la siguiente ubicación de memoria
    movb $0x33, 2(%rsp) ; copiar "3" en la siguiente ubicación de memoria
    movb $0x34, 3(%rsp) ; copiar "4" en la siguiente ubicación de memoria
    movb $0x35, 4(%rsp) ; copiar "5" en la siguiente ubicación de memoria
    movb $0x36, 5(%rsp) ; copiar "6" en la siguiente ubicación de memoria
    movb $0x00, 6(%rsp) ; copiar el terminador nulo en la última ubicación de memoria

    1. Almacenar la dirección de la memoria asignada en la pila en %rdi. Podemos usar la instrucción “lea” para calcular la dirección del primer byte de la cadena en la memoria asignada y almacenarla en %rdi. Así es como se vería la instrucción:

    lea (%rsp), %rdi ; calcular la dirección del primer byte de la cadena y almacenarla en %rdi

    Después de que se ejecuten estas instrucciones, %rdi debería contener la dirección de la cadena “123456” en memoria.

Comments are closed.