programas maquina lenguaje instrucciones historia explicados ensamblador ejemplos assembly nasm

assembly - maquina - ¿Qué es el inicio global en lenguaje ensamblador?



lenguaje maquina y ensamblador (4)

Este es mi código de nivel de montaje ...

section .text global _start _start: mov eax, 4 mov ebx, 1 mov ecx, mesg mov edx, size int 0x80 exit: mov eax, 1 int 0x80 section .data mesg db ''KingKong'',0xa size equ $-mesg

Salida:

root@bt:~/Arena# nasm -f elf a.asm -o a.o root@bt:~/Arena# ld -o out a.o root@bt:~/Arena# ./out KingKong

Mi pregunta es: ¿Para qué se utiliza el _start global ? Probé suerte con Mr.Google y descubrí que se usa para indicar el punto de inicio de mi programa. ¿Por qué no podemos tener el _start para decir dónde comienza el programa como el que se muestra a continuación, que produce un poco de advertencia en la pantalla?

section .text _start: mov eax, 4 mov ebx, 1 mov ecx, mesg mov edx, size int 0x80 exit: mov eax, 1 int 0x80 section .data mesg db ''KingKong'',0xa size equ $-mesg root@bt:~/Arena# nasm -f elf a.asm root@bt:~/Arena# ld -e _start -o out a.o ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080 root@bt:~/Arena# ld -o out a.o ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080


Una etiqueta no es explícitamente global hasta que la declara global, por lo que debe usar la directiva global.

La etiqueta global "_start" es necesaria para el vinculador, si no hay una dirección global de inicio, el vinculador se quejará porque no puede encontrar una. No declaró _start como un global, por lo que no es visible fuera de ese módulo / objeto de código, por lo que no está visible para el vinculador.

Esto es lo opuesto a C, donde se implica que las cosas son globales a menos que las declare locales.

unsigned int hello; int fun ( int a ) { return(a+1); }

Hola y diversión son globales, visibles fuera del objeto, pero esto

static unsigned int hello; static int fun ( int a ) { return(a+1); }

Los hace locales no visibles.

todo local

_start: hello: fun: more_fun:

Estos ahora están disponibles globalmente para el enlazador y otros objetos.

global _start _start: global hello hello: ...


global _start es solo una etiqueta que apunta a una dirección de memoria. En el caso de _start cuando se trata de binarios ELF, es la etiqueta predeterminada utilizada que actúa como la dirección donde se inicia el programa.

También hay main o _main o main_ se conoce en el lenguaje C, y se llama mediante el "código de inicio", que está "generalmente" vinculado a, si está usando C.

Espero que esto ayude.


global directiva global es específica de NASM. Es para exportar símbolos en su código a donde apunta en el código objeto generado. Aquí marca el símbolo de _start global para que su nombre se agregue en el código del objeto ( ao ). El vinculador ( ld ) puede leer ese símbolo en el código del objeto y su valor para que sepa dónde marcar como un punto de entrada en el ejecutable de salida. Cuando ejecutas el ejecutable, comienza en donde está marcado como _start en el código.

Si falta una directiva global para un símbolo, ese símbolo no se colocará en la tabla de exportación del código del objeto, por lo que el vinculador no tiene forma de conocer el símbolo.

Si desea utilizar un nombre de punto de entrada diferente al de _start (que es el predeterminado), puede especificar -e parámetro a ld como:

ld -e my_entry_point -o out a.o


_start se establece mediante el script de enlazador ld predeterminado

ld -verbose a.o | grep ENTRY

salidas:

ENTRY(_start)

El formato de archivo ELF (y otro formato de objeto que supongo), dice explícitamente en qué dirección comenzará a ejecutarse el programa a través del campo de encabezado e_entry .

ENTRY(_start) le dice al vinculador que establezca en esa entrada la dirección del símbolo _start al generar el archivo ELF a partir de archivos de objeto.

Luego, cuando el sistema operativo comienza a ejecutar el programa ( exec system call en Linux), analiza el archivo ELF, carga el código ejecutable en la memoria y establece el puntero de instrucción en la dirección especificada.

La bandera -e mencionada por Sedat reemplaza el símbolo de _start predeterminado.

También puede reemplazar todo el script del enlazador predeterminado con la opción -T <script> , aquí hay un ejemplo concreto que configura algunos elementos de ensamblaje de metal desnudo .