ASR1 2016 Florent de Dinechin, Nicolas Louvet, Antoine Plet TP 4 Programmation en assembleur Vous devez avant tout lire le document qui décrit l’ISA de notre processeur. 1 Lisons un peu d’assembleur Que font les programmes suivants ? prog1: letl letl add lsl add r0 42 r10 17 r0 r0 r10 r3 r0 2 r3 r3 r0 prog2: letl rmem letl rmem add letl wmem r0 r0 r1 r1 r1 r0 r1 32 [r0] 33 [r1] r1 r0 34 [r0] ; video memory ranges from 0x6000 to 0xffff prog3: letl r1 0 letl r0 6 lsl r0 r0 12 loop: wmem r1 [r0] add r0 r0 1 snif r0 eq 0 jump loop return 2 Assemblons et désassemblons 2.1 Assemblage Pour chacun de nos programmes d’échauffement, écrivez à droite de chaque instruction son code hexadécimal. N’hésitez pas à commencer par l’écrire en binaire. (Ce travail stupide et dégradant s’appelle l’assemblage (assembly), et vous avez déjà envie d’écrire un programme qui le fait pour vous. Un tel programme s’appelle un assembleur.) 2.2 Désassemblage Quel est le programme qui a pour codes hexadécimaux BAAD C0DE, B0B0 8BAD F00D, DEAD BEEF, B0B0 DEAD ? (merci wikipedia HexSpeak). (Ce travail rébarbatif et vexatoire s’appelle le désassemblage (disassembly), et le programme correspondant s’appelle un désassembleur – c’est le -d de objdump -d.) 3 Écrivons un peu d’assembleur 3.1) Ecrivez une routine (qui sera appelée par call et terminera par return) qui multiplie les contenus de r0 et r1 et renvoie le résultat dans r2. 3.2) Ecrivez le produit scalaire de deux vecteurs d’entiers de taille r0, pointés respectivement par r1 et r2, en appelant votre multiplication. 3.3) Ecrivez une routine qui convertit une chaine de caractères composés des chiffres 0 à 9 en l’entier correspondant. On supposera la chaîne pointée par r0 et terminée par un espace. 3.4) Ecrivez une routine qui divise rO par r1, renvoie le quotient dans r2 et le reste dans r3. On commencera par poser en binaire la division de 25 par 5 pour se convaincre que c’est plus facile qu’en décimal. 3.5) Ecrivez Pokemon Go 2, vite avant que Nintendo le fasse. 4 Et dans les 10mn qui restent Identifiez-vous des instructions qui manquent à ce processeur, et des manières raisonnables de les encoder ?