Pregunta

Estoy tratando de aprender ensamblador desde cero. He estado leyendo un poco, pero incluso el siguiente programa sencillo que encontré en un libro de referencia me tiene perplejo:

section .data
msg db "Hello!", 0xa
len equ $ - msg
section .text

     global _start

_start:


move edx, len
move ecx, msg
move ebx, 1
move eax, 4
int  0x80
move ebx, 0
move eax, 1
int 0x80

Ahora al parecer, esto se supone que imprimir "Hola". Pero yo ni siquiera sé qué está sucediendo en cualquiera de las etapas. Las dos primeras etapas ponen la longitud del mensaje y messgae en dos registros, que nunca se utilizan de nuevo. No entiendo por qué.

No sé por qué se necesitan cuatro registros diferentes.

¿Fue útil?

Solución

int 80 es un mecanismo de alguna * a UNIX-como sistemas operativos para realizar llamadas de sistema.

Para estas llamadas, los registros se utilizan para valores específicos. Desde el archivo syscalls:

0 STD NOHIDE { int nosys(void); } syscall nosys_args int
1 STD NOHIDE { void exit(int rval); } exit rexit_args void
2 STD POSIX  { int fork(void); }
3 STD POSIX  { ssize_t read(int fd, void *buf, size_t nbyte); }
4 STD POSIX  { ssize_t write(int fd, const void *buf, size_t nbyte); }

se puede ver que el número 4 es la llamada write y necesita otros tres parámetros. El número 1 es exit y sólo necesita el código de retorno.

Al realizar la llamada, eax es la llamada al sistema que está haciendo mientras ebx, ecx y edx son los tres parámetros (asumiendo que todos son necesarios - exit por ejemplo, sólo necesita uno).

Por lo tanto, se puede comentar el código de la siguiente manera:

move edx, len   ; length of message (nbyte).
move ecx, msg   ; message to print (buf).
move ebx, 1     ; file handle 1, stdout (fd).
move eax, 4     ; write syscall.
int  0x80       ; do it.

move ebx, 0     ; exit code (rval).
move eax, 1     ; exit syscall.
int 0x80        ; do it.

* a: Las versiones posteriores de Linux introdujeron la una nueva interfaz que puede utilizar diferentes métodos basados ??en que proporciona la mejor velocidad. Por ejemplo, algunos chips de Intel son mucho más rápidos si se utiliza en lugar de sysenter int 80.

Otros consejos

IIRC la instrucción int 0x80 se utiliza para invocar una syscall utilizando el vector de interrupción. En su ejemplo los valores en ebx y eax se utilizan para especificar qué SYSCALL estás va a llamar (probablemente la operación de impresión en stdout).

La llamada al sistema sabe por convenction que edx y ecx deben contener lo que se va a imprimir.

En muchos sistemas, int 80h es la llamada al sistema puerta. El número de llamada al sistema se encuentra en eax. ebx, ecx y edx contienen parámetros adicionales:

move edx, len
move ecx, msg
move ebx, 1    ; fd 1 is stdout
move eax, 4    ; syscall 4 is write
int  0x80      ; write(1, msg, len)
move ebx, 0
move eax, 1    ; syscall 1 is exit
int 0x80       ; exit(0)

Cuando se llama a una llamada al sistema, el 'int' mnemotécnica, se genera una interrupción del sistema. Es un poco "salta" a una función del sistema, que, en este caso, la salida de copias (depende de EAX).

Esta interrupción utiliza todos esos registros para saber qué hacer. La interrupción lee eax, cheque cuál es la función que desea y utiliza los otros registros para hacerlo.

eax es el número de función, 4 significa sys_write, que escribe una cadena en un descriptor de flujo / archivo.

Ahora se sabe que quiere escribir algo a algún lugar, a continuación, utiliza los otros registros de esas informaciones.

para eax = 4 y int 0x80 este es el significado de los otros registros:

ebx = salida (1 = stdout)
ecx = dirección de la cadena
EDX = longitud de la cadena

Usted puede leer esto:

http://www.intel.com/Assets/ja_JP/ PDF / manual / 253665.pdf

Sección 6.4 Tiene algunas cosas sobre Interruptins y excepciones.

Y se puede empezar a escribir Intel 80x86 código de montaje, lo que es más simple y más fácil de entender, aquí hay algunos enlaces:

mesas Mnemónicos / Código CheatSheet: http://www.jegerlehner.ch/intel/

Algunos sitios de introducción: http://mysite.du.edu/~etuttle/math/8086.htm http://www.malware.org/teaching/assembly.htm

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