2010-07-30 25 views
8

estoy aprendiendo asm en Linux (noobuntu 10.04) tengo el siguiente código fuera de: http://asm.sourceforge.net/intro/hello.htmlAsamblea, hola pregunta mundo

section .text 
global _start ;must be declared for linker (ld) 

_start: ;tell linker entry point 

mov edx,len ;message length 
mov ecx,msg ;message to write 
mov ebx,1 ;file descriptor (stdout) 
mov eax,4 ;system call number (sys_write) 
int 0x80 ;call kernel 

mov eax,1 ;system call number (sys_exit) 
int 0x80 ;call kernel 

section .data 

msg db 'Hello, world!',0xa ;our dear string 
len equ $ - msg ;length of our dear string 

Es un mundo simple hola. Se ejecuta en Linux + llama al núcleo directamente (aparentemente). ¿Puede alguien explicar por favor qué está pasando realmente aquí? Creo que lee los enteros en eax & El procesador ebx registra & ecx, edx data y eso define la llamada al sistema cuando se llama al kernel. Si es así, ¿las diferentes combinaciones de números enteros definen llamadas de sistema diferentes cuando se llama a int 0x80?

No soy bueno con las páginas de manual, pero he leído todas las relacionadas que puedo encontrar, ¿alguna página man me dice qué combinaciones definen qué llamadas de sistema?

CUALQUIER ayuda es apreciada. Una línea por línea explicación sería increíble ... -Gracias por adelantado Jeremy

Respuesta

7

Cuando se llama a int 0x80, el núcleo se ve en el valor del registro eax para determinar la función que desea llamar (este es el " número de syscall "). Dependiendo de ese número, el resto de los registros se interpretan en el sentido de cosas específicas. La llamada sys_write espera que los registros que se creará la siguiente manera:

  • eax contiene 4
  • ebx contiene el descriptor de archivo
  • ecx contiene la dirección de los datos a escribir
  • edx contiene el número de bytes

Para obtener más información, ver Linux System Calls.

+0

Muchas gracias, esta fue mi sospecha y útil, sin embargo ... ¿Me puede decir dónde puedo obtener más información? ¿Estos números enteros de syscall están en las páginas man? – Jeremy

+0

Tienes que profundizar un poco en los archivos de encabezado fuente de Linux para encontrar los números de llamada del sistema. No tengo una máquina Linux a la mano en este momento, así que no puedo decir la ubicación exacta, pero es algo así como 'include/asm/syscall.h' en el árbol fuente del kernel. –

+0

muchas gracias, has sido útil. – Jeremy

0

Hay demasiadas llamadas al sistema para que haya una instrucción de lenguaje ensamblador diferente para cada una.

En su lugar, llama a la instrucción TRAP. El valor de eax determina qué llamada al sistema se invocará. Los otros registros son los argumentos para la llamada al sistema.

Las llamadas al sistema se enumeran dentro del kernel.

+0

Gracias. ¿Dónde, exactamente, miro las llamadas al sistema en el kernel? – Jeremy

2
section .text 
global _start ;must be declared for linker (ld) 

Esto es sólo Material del conector, la sección de "texto" de un programa de montaje es sólo las instrucciones de la máquina (en comparación con los datos, los datos de las secciones del SRS de sólo lectura, y). La línea global es similar a decir que la función _start es "pública".

_start: ;tell linker entry point 

mov edx,len ;message length 
mov ecx,msg ;message to write 
mov ebx,1 ;file descriptor (stdout) 
mov eax,4 ;system call number (sys_write) 
int 0x80 ;call kernel 

De los comentarios que conocemos que estamos buscando en la función sys_write, por lo que podemos man 2 write para obtener los detalles. El prototipo C proporciona los siguientes parámetros: fd, *buf y count. Comenzando con% ebx vemos que esas coincidencias (% ebx = fd,% ecx = cadena para escribir, y% edx = longitud de la cadena). Entonces, dado que somos un proceso de usuario, debemos pedirle al kernel que realice la salida. Esto se hace a través de la interfaz SYSCALL, y la función write() es (aparentemente) dado el número 4. INT 0x80 es una interrupción de software que llama a la rutina SYSCALL del kernel de Linux.

Puede encontrar los números reales de todos los syscalls en los archivos de encabezado de Linux (suponiendo que los tenga instalados). En mi sistema, marqué /usr/include/sys/syscall.h y llegué al /usr/include/asm/unistd.h y luego al /usr/include/asm-i386/unistd.h. Donde (veo), #define __NR_write 4.

mov eax,1 ;system call number (sys_exit) 
int 0x80 ;call kernel 

Al igual que con las dos últimas líneas del segmento anterior, esto sólo carga el ID de llamada al sistema y hace la interrupción de software para salir del programa (que es eliminar la asignación de memoria y limpieza).

section .data 

msg db 'Hello, world!',0xa ;our dear string 
len equ $ - msg ;length of our dear string 

Esta es la sección de datos, solo describe las variables que usamos en nuestro programa.

+0

la respuesta más útil hasta el momento. muchas gracias por su tiempo. – Jeremy

Cuestiones relacionadas