Assemblée problème simple programme
-
29-09-2019 - |
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.
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