Domanda

sto cercando di imparare il montaggio da zero. Ho letto un bel po ', ma anche il seguente programma semplice che ho trovato in un libro di riferimento mi ha perplesso:

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

Ora a quanto pare questo è supposto per la stampa "Ciao". Ma io non so nemmeno che cosa sta accadendo in una qualsiasi delle fasi. I primi due stadi mettono la lunghezza del messaggio e messgae in due registri, che sono non riutilizzabili. Non capisco perché.

Non so il motivo per cui sono necessari quattro registri differenti.

È stato utile?

Soluzione

int 80 è un meccanismo in qualche * a UNIX-like sistemi operativi per effettuare chiamate di sistema.

Per queste chiamate, i registri vengono utilizzati per valori specifici. Dal file 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); }

si può vedere che il numero 4 è la chiamata write e ha bisogno di altri tre parametri. Il numero 1 è exit e necessita solo il codice di ritorno.

Quando si effettua la chiamata, eax è la chiamata di sistema che si sta facendo, mentre ebx, ecx e edx sono i tre parametri (ammesso che sono tutti necessari - exit per esempio ha bisogno di una sola).

Quindi, si può commentare il codice come segue:

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: Le versioni successive di Linux ha introdotto il una nuova interfaccia che può utilizzare diversi metodi in base al quale fornisce la migliore velocità. Ad esempio, alcuni chip Intel sono molto più veloci se si utilizzano sysenter piuttosto che int 80.

Altri suggerimenti

IIRC l'istruzione int 0x80 viene utilizzato per richiamare una chiamata di sistema utilizzando il vettore di interruzione. Nel tuo esempio vengono utilizzati i valori in ebx e eax per specificare quali syscall si sono gonna chiamata (probabilmente l'operazione di stampa su stdout).

La syscall sa da convenction che edx e ecx dovrebbero contenere ciò che sta andando essere stampato.

Su molti sistemi, int 80h è il sistema di chiamata porta . Il numero syscall è in eax. ebx, ecx e edx contengono parametri aggiuntivi:

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)

Quando si chiama una chiamata di sistema, il 'int' mnemonica, un'interruzione del sistema viene generato. E 'un pò "salta" per una funzione di sistema, che, in questo caso, l'uscita stampe (dipende EAX).

Questa interruzione utilizza tutti questi registri per sapere cosa fare. L'interrupt legge EAX, controllare ciò che funzione che si desidera e usa gli altri registri per farlo.

EAX è il numero della funzione, 4 mezzi sys_write, che scrive una stringa in un descrittore di flusso / file.

Ora si sa che si vuole scrivere qualcosa in qualche posto, quindi utilizza le altri registri per quelle informazioni.

per eax = 4 e int 0x80 questo è il significato per gli altri registri:

EBX = uscita (1 = stdout)
ecx = indirizzo della stringa
edx = lunghezza della stringa

Si può leggere questo:

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

Sezione 6.4 Ha alcune cose su Interruptins ed eccezioni.

E si può iniziare a scrivere Intel 80x86 codice assembly, che è più semplice e più facile da capire, ecco alcuni link:

tavoli Mnemonics / Codice bigino: http://www.jegerlehner.ch/intel/

Alcuni siti Introduzione: http://mysite.du.edu/~etuttle/math/8086.htm http://www.malware.org/teaching/assembly.htm

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top