Pregunta

Estoy terminando un curso de arquitectura de computadoras este semestre donde, entre otras cosas, hemos estado incursionando en el ensamblaje MIPS y ejecutándolo en el simulador MARS. Hoy, por curiosidad, comencé a jugar con NASM en mi caja de Ubuntu, y básicamente he estado armando cosas de los tutoriales y teniendo una idea de cómo NASM es diferente de MIPS. Aquí está el fragmento de código que estoy viendo actualmente:

global _start

_start:

    mov eax, 4
    mov ebx, 1
    pop ecx
    pop ecx
    pop ecx
    mov edx, 200
    int 0x80
    mov eax, 1
    mov ebx, 0
    int 0x80

Esto se guarda como test.asm, y se ensambla con nasm -f elf test.asm y se vincula con ld -o test test.o . Cuando lo invoco con ./test anArgument , imprime 'anArgument', como se esperaba, seguido de la cantidad de caracteres necesarios para rellenar esa cadena a 200 caracteres en total (debido a ese mov edx , 200 declaración). Sin embargo, lo interesante es que estos caracteres de relleno, que hubiera esperado ser un galimatías, son en realidad desde el principio de mis variables de entorno, como se muestra en el comando env . ¿Por qué está imprimiendo mis variables de entorno?

¿Fue útil?

Solución

Sin saber la respuesta real o tener tiempo para buscarla, supongo que las variables de entorno se almacenan en la memoria después de los argumentos de la línea de comandos. Su código es simplemente un búfer que se desborda en las cadenas variables de entorno y también las imprime.

Esto realmente tiene sentido, ya que los argumentos de la línea de comandos son manejados por el sistema / cargador, al igual que las variables de entorno, por lo que tiene sentido que se almacenen cerca unos de otros. Para solucionar esto, necesitaría encontrar la longitud de los argumentos de la línea de comando y solo imprimir esa cantidad de caracteres. O, dado que supongo que son cadenas terminadas en nulo, imprima hasta llegar a un byte cero.

EDITAR: Supongo que tanto los argumentos de la línea de comandos como las variables de entorno se almacenan en la sección de datos inicializados (.data en NASM, creo)

Otros consejos

Para comprender por qué obtiene variables de entorno, debe comprender cómo el núcleo organiza la memoria en el inicio del proceso. Aquí es una buena explicación con una imagen (desplácese hacia abajo para " Diseño de pila ") .

Mientras tenga curiosidad, es posible que desee averiguar cómo imprimir la dirección de su cadena (creo que se pasó y la sacó de la pila). Además, escriba una rutina de volcado hexadecimal para que pueda ver esa memoria y otras direcciones que le interesan. Esto puede ayudarlo a descubrir cosas sobre el espacio del programa.

La curiosidad puede ser lo más importante en la caja de herramientas de su programador.

No he investigado los detalles de los procesos de inicio, pero creo que cada vez que se inicia un nuevo shell, se hace una copia del entorno. Es posible que esté viendo los restos de un shell que se inició con un comando que ejecutó, o un script que escribió, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top