usar programas mundo lenguaje hola explicados ensamblador desde como cero linux assembly elf cpu-registers

programas - ¿Cuál es el estado de registro predeterminado cuando se inicia el programa(asm, linux)?



lenguaje ensamblador desde cero pdf (3)

Para los sistemas AMD64 o x86-64 (64 bits) en Linux, el ABI x86-64 define el contenido inicial de los registros.

Existen especificaciones similares para i386 ABI , ARM ABI, etc.

Vea las páginas de wikipedia en ELF y ABI

Cuando se inicia el programa (linux, elf), ¿hay ceros en eax , ebx , etc. o puede haber algo (no estoy haciendo ninguna llamada ni estoy usando bibliotecas externas)? En mi máquina es realmente así, ¿puedo transmitir tal comportamiento al escribir programas asm?


Esto depende completamente del ABI para cada plataforma. Como mencionas eax y ebx , veamos cuál es el caso de x86. En fs/binfmt_elf.c línea # 972, dentro de load_elf_binary() , el kernel verifica si el ABI especifica cualquier requisito para los valores de registro en la carga del programa:

/* * The ABI may specify that certain registers be set up in special * ways (on i386 %edx is the address of a DT_FINI function, for * example. In addition, it may also specify (eg, PowerPC64 ELF) * that the e_entry field is the address of the function descriptor * for the startup routine, rather than the address of the startup * routine itself. This macro performs whatever initialization to * the regs structure is required as well as any relocations to the * function descriptor entries when executing dynamically links apps. */

Luego llama a ELF_PLAT_INIT , que es una macro definida para cada arquitectura en arch/xxx/include/elf.h Para x86, hace lo siguiente :

#define ELF_PLAT_INIT(_r, load_addr) / do { / _r->bx = 0; _r->cx = 0; _r->dx = 0; / _r->si = 0; _r->di = 0; _r->bp = 0; / _r->ax = 0; / } while (0)

Entonces, cuando su binario ELF se carga en Linux x86, puede contar con que todos los valores de registro sean iguales a cero. No significa que deberías, sin embargo. :-)


x86-64 Sistema V ABI sección 3.4.1 "Estado inicial de pila y registro" ( Basile vinculado a PDF ):

  1. %rsp apunta a la pila

    El puntero de pila contiene la dirección del byte con la dirección más baja que es parte de la pila. Se garantiza que esté alineado a 16 bytes en la entrada del proceso

  2. %rdx un puntero a la función que la aplicación debería registrar con atexit si no es cero.

    un puntero de función con el que la aplicación debe registrarse

  3. %rbp no está especificado, pero el usuario debe establecerlo en el marco base.

    El contenido de este registro no se especifica en el momento de la inicialización del proceso, pero el código de usuario debe marcar el marco de pila más profundo al establecer el puntero del marco en cero.

  4. Todo lo demás indefinido

Linux luego lo sigue "porque" el LSB lo dice.