Question

Je suis en train d'apprendre l'assemblage à partir de zéro. Je lis un peu, mais même le programme simple suivant j'ai trouvé dans un livre de référence me stumped:

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

Maintenant, apparemment ce qui est censé imprimer « Bonjour ». Mais je ne sais même pas ce qui se passe à l'une des étapes. Les deux premières étapes ont mis la longueur du message et messgae dans deux registres, qui ne sont jamais utilisés à nouveau. Je ne comprends pas pourquoi.

Je ne sais pas pourquoi quatre registres différents sont nécessaires.

Était-ce utile?

La solution

int 80 est un mécanisme dans certains * a systèmes d'exploitation UNIX comme pour faire des appels système.

Pour ces appels, les registres sont utilisés pour des valeurs spécifiques. A partir du fichier 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); }

vous pouvez voir que le numéro 4 est l'appel write et a besoin de trois autres paramètres. Le numéro 1 est exit et ne nécessite que le code de retour.

Lors de l'appel, eax est le syscall que vous faites tout ebx, ecx et edx sont les trois paramètres (en supposant qu'ils sont tous nécessaires - exit par exemple ne nécessite qu'une seule).

Alors, vous pouvez commenter le code comme suit:

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: Les versions ultérieures de Linux ont introduit la nouvelle interface qui peut utiliser différentes méthodes basées sur ce qui fournit la meilleure vitesse. Par exemple, certaines puces Intel sont beaucoup plus rapides si vous utilisez sysenter plutôt que int 80.

Autres conseils

IIRC l'instruction de int 0x80 est utilisé pour invoquer un appel système en utilisant le vecteur d'interruption. Dans votre exemple, les valeurs ebx et eax sont utilisés pour spécifier les syscall vous allez appeler (probablement l'opération d'impression sur la sortie standard).

Le syscall sait par Convenction que edx et ecx doivent contenir ce qui va être imprimé.

Sur de nombreux systèmes, int 80h est le appel système de porte . Le numéro de syscall est eax. ebx, ecx et edx contiennent des paramètres supplémentaires:

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)

Lorsque vous appelez un appel système, le « int » mnémotechnique, une interruption du système est généré. Il un peu « saute » à une fonction du système, qui, dans ce cas, la sortie imprime (dépend EAX).

Cette interruption utilise tous les registres pour savoir quoi faire. L'interruption se lit eax, vérifier que la fonction que vous voulez et utilise les autres registres pour le faire.

eax est le nombre de fonctions, 4 SYS_write moyens, qui écrit une chaîne de caractères à un descripteur courant / fichier.

Maintenant, il sait que vous voulez écrire quelque chose à un endroit, il utilise les autres registres à ces informations.

pour eax = 4 et int 0x80 c'est le sens pour les autres registres:

= EBX sortie (1 = sortie standard)
ECX = adresse de la chaîne
EDX = longueur de la chaîne

Vous pouvez lire ceci:

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

Section 6.4 Il a des trucs sur Interruptins et exceptions.

Et vous pouvez commencer à écrire du code assembleur Intel 80x86, ce qui est plus simple et plus facile à comprendre, voici quelques liens:

tables mnémoniques / code antisèche: http://www.jegerlehner.ch/intel/

Quelques sites d'introduction: http://mysite.du.edu/~etuttle/math/8086.htm http://www.malware.org/teaching/assembly.htm

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top