_______________________________________________________________________________________________ /_______________________________________________________________________________________________\ \_______/\_______/ \_______/\_______/ \____/ \____/ Programmer: Initiation assembleur. \____/ \____/ \_/ \_/ \_/ \_/ \_________________________________________________________________________________________/ Voila, bienvenu dans notre premier cours de programmation ont va parler dans ce premier numero de L'assembleur indispensable pour le cracking: EXPLICATION : L'asm est le language au plus bas niveau qu'y existe (aprŠs ce sont des chiffres...binaire) et c'est celui qu'on utilise pour optimiser les programmes dans les fonctions qui utilisent beaucoup de temps machine (3D, les effets dans les démos, etc) et pour les rendrent plus rapides. Evidemment le language asm n'est pas des plus simples et si vous voulez commencez … programmer commencez par le C (une suite de cours de C apparetra dans les prochain numers) mais surtout pas par l'asm!!! Dans cette première leçon ont va aborder la structure de base de l'asm que sont les registres, les interruptions et la pile. (NEWBIE s'abstenir a part les NEWBIE mais fort) Bon pour faire de l'asm c'est pas compliqué (hihi) il faut 2 logiciels: -Un éditeur de texte -Un assembleur pour transformer les instructions en chiffre :) -Un PC a la limite (hahahaha) Pour l'éditeur de texte moi j'utilise UltraEdit32, un logiciel qui a une interface Tres Tres Tres facile un peu comme word. Mais sinon vous pouvez utiliser edit du dos qui fait ça assez bien... Pour l'assembleur j'utilise Turbo Assembleur de Borland qui fait ça trés bien (et donc tout les programmes qui seront dans ce tutorial seront compiles avec Tasm), il en existe d'autres comme Masm et ils necessiteront un peu de changement dans votre code...mais bon ça ira quand même :). Pour apprendre la meilleure solution consiste … regarder le travail des autres , et bien je vais commencer par vous mettre un petit exemples sous les yeux: ;***************************************************************************** .MODEL SMALL ;Petit model m‚moire .386 ;Utilise les fonctions jusqu'au 386 .STACK 100H ;La pile....explication plus loin .DATA ;SEGMENT de donn‚e MESSAGE DB "Coucou de l'asm$" ;Une variable qui contient une chaine ;de caract‚res .CODE ;Le code du programme debut: ;Reference du debut du programme MOV AX,@DATA ;Initialise le segment de donn‚ MOV DS,AX MOV AH,09 ;Met 9 dans le registre ah MOV DX,OFFSET MESSAGE ;Met l'addresse de message dans dx INT 21H ;Lance la fonction 9 de l'interruption 21H ;qui affiche un message MOV AX,4C00H ;Met la valeur hexadecimale 4C00 dans ax INT 21H ;Lance la fonctions 4C de l'interruption 21H ;qui arrete le programme... END debut ;informe l'asm que le programme commence … debut... ;***************************************************************************** Ca va vous avez reussi … lire tout ça? Bon plus qu'a le compiler :). Vous sauvez ce texte sous euh par exemple sous Test.asm et vous lancez les commandes suivantes(si vous utilisez Tasm sinon je sais pas): Tasm Test.asm Tlink Test.obj Et vous voila avec un beau executable(Test.exe) qui affiche un joli message tout plein :). Bon maintenant expliquons plus en d‚tail ce programme: .MODEL SMALL ;Définit un petit segment m‚moire, ne vous cassez pas la tete avec ça :)) .386 ;Le programme ne contient pas de fonctions qui font appele … plus puissant ;que 386 .STACK 100H ;Definit une pile qui n'est d'ailleur pas utilis‚ dans le programme :) .DATA ;Definit un segment qui contiendra toute les données mais pas ;de code executable MESSAGE DB "Coucou de l'asm$" ;Definit une chaine de caractere avec l'instruction DB qui en fait d‚finit ;soit un nombre d'1 byte(comme un char sous C) soit une chaine de nombre, une ;chaine de caractere quoi... ;Cette chaine finit par un $ car l'interruption qu'on va lancer plus loin ;arrete l'affichage au premier '$' trouv‚... .CODE ;definit un segment qui ne contient que du code debut: ;Il faut bien que le programme commence quelque part non? MOV AX,@DATA MOV DS,AX ;Initialise le segment DS avec l'adresse du segment DATA pour que l'ordinateur ;sache ou sont les données, on passe par le registre AX car l'asm refuse ;que l'on mette directement une valeur mais il accepte que l'on mette ;la valeur d'un registre(c chiant mais c comme ça) MOV AH,09H ;Met la valeur 09 dans le registre ah qui est en fait la partie haute de ;AX, l'on aurait put tout aussi bien écrire 'mov AX,0900H', cela aurait ;aussi mit AH … 09 mais cela aurait aussi mit AL(la partie basse de AX) … 0 ;, ce qu'on ne desire pas... MOV DX,OFFSET MESSAGE ;Met l'adresse de la donn‚ MESSAGE declar‚ plus haut dans DX INT 21H ;Lance l'interruption 21H qui est l'interrution du dos, cette interruption ;regarde le contenue de ah et lance la fonction correspondante, ici elle lance ;la fonction 09 qui affiche le message dont l'adresse est stock‚ dans DX MOV AX,4C00H INT 21H ;Memme chose que plus haut mais cette fois ci c'est la fonction 4C qui arrete ;le programme, l'on est obligé de mettre ces 2 lignes sinon l'ordinateur ;plante ou windoz arrete le programme... END debut ;Informe tasm que le programme commence … debut, un label qui est d‚finit plus ;haut dans le programme Bon voila, apres avoir detaillé soigneusement ce programme onta parler des registres. Il existe 4 principaux registres: AX,BX,CX et DX. Chaqu'un de ces registres est 16-bits(comparable a un int en C) mais les 8 bits superieurs et inferieurs peuvent eetre accedes grace … AH(partie haute de ax) AL(parite basse de ax), de meme avec BX avec les registres BH(partie haute) et BL(partie basse), et toujours la meme chose avec CX et DX avec les registres CH, CL, DH et DL. Ces registres sont comparables … des variables en C … l'exception prŠs qu'ils sont plus rapide en temps-machine et qu'ils existent dŠs le lan‡ement de la machine. Ces registres existent aussi en version 32-bits … partir du 386, ils sont alors appelés EAX,EBX,ECX et EDX mais la partie haute des 32 bits ne peut etre accedé directement. Il existe aussi les registres de segment, il en existe 3 importants: CS, DS et ES. CS contient l'adresse du code executable et quand vous lancez le programme CS pointe automatiquement sur le code executable, donc n'y touchez pas... DS lui au demarrage pointe aussi sur le code executable alors qu'il doit referencer les donnees, il est alors necessaire de faire pointer ce segment sur le segment DATA par les 2 lignes suivantes au debut du code executable: ;*********** MOV AX,@DATA MOV DS,AX ;*********** ES est lui un registre suplementaire qu'y peut servir … contenir un segment supplementaire, un autre segment de DATA par exemple car un segment ne peut depasser les 64000 octets d'ou son utilis‚. Il faut que vous sachiez aussi qu'il existent aussi 2 autres registres que sont SI et DI, il peuvent servir comme AX, BX, CX et DX … contenir des nombres mais il servent surtout … copier des zone memoires et … faire des comparaisons. Les interruptions sont en fait des fonctions qui peuvent etre lancées par une simple commande qui est INT suivit du numero de l'interruption. Les interruptions sont ce qu'il existe de plus simple … utiliser en asm. Il existe differentes interruptions: -10H pour les graphismes -14H pour le joystick -17H pour l'imprimante -21H pour les fonctions DOS Il en existe evidemment plus que cela.... Chaqu'une des ces interruptions contient plusieures fonctions, le num‚ro de la fonctions doit etre mit dans AH avant le lancement de l'interruption. Normalement avec ce texte doit etre fournit un logiciel: HELP-PC qui contient une liste d'interruption avec en plus une liste de toutes les fonctions de l'asm :). Maintenant une petite explication de ce qu'est la pile. La pile, n'est pas comme vous pouvez vous l'imaginez une pile qui fournit de l'energie mais bien une pile de chiffre, eh oui :). Si vous lisez ce texte vous devez surement deja avoir fait du C, alors vous devez savoir que le nombre de variable est souvent important et si vous avez bien lu les lignes plus haut qui concernaient les registres vous devez vous ˆtre rendu compte qu'il n'y en a pas beaucoup...Nous arrivons donc ici … l'utilit‚ de la pile qui permet de preserver le contenue d'un ou de plusieurs registres. Mais comme avec une pile d'assiettes vous ne pourrez pas retirez une valeur qui se trouve en bas de la pile s'en en avoir enlevé le dessus. Bon je ne suis peut-etre pas tres clair mais ce programme va peut-etre eclaircir vos idees (enfin peut-etre): ;*********** MOV AX,34315 MOV DX,123 ;met dans les registres AX et DX des chiffres PUSH AX PUSH DX ;met ces 2 registres sur la pile MOV AX,946 MOV DX,555 ;Change le contenue de ces 2 registres POP DX POP AX ;AX et DX contiennent de nouveau 34315 et 123 ;*********** Si a la fin du programme nous avions mis POP AX puis POP DX alors AX contiendrait 123 et DX, 34315. FIN.