Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice en Assembleur 8086

8 mai 2015 à 15:57:10

Salut,

J'aurai besoin de votre aide pour résoudre 2 exercices pratique en assembleur 8086 sur lesquelles je bloque, voici leur énoncés : 

Le premier : 

Ecrivez un programme en assembleur 8086 qui permet de sauvegarder dans un fichier le contenu de l’écran de l’émulateur DOSBOX, l’écran en question est en mode texte et affiche par Default 80 colonnes, 28 lignes de caractères.

la mémoire VIDEO associée a l’écran est située à l'adresse b800 : 0000 . chaqu'un ds caractères de l’écran occupe deux octets : le premier constitue le code ASCII, le second code l'attribut d’affichage.

Donnez également un programme qui fait la fonction inverse : affichage du contenu d'un fichier texte à l’écran.

Note : l'utilitaire DEBUG suffit largement pour faire les entrées/sortie fichier.

Le deuxième : 

On vous donne un fichier image au format bitmap, charger ce fichier dans l'utilitaire DEBUG, colorier autrement une partie de l'image par le biais d'un programme en assembleur 8086 puis sauvegarder le résultat dans le fichier d'origine. 

Merci

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
8 mai 2015 à 19:11:25

Salut,

Sais tu quel est l'instruction permettant de déplacer une valeur d'une variable à un registre, registre à variable, registre à registre ?

Quel est l'instruction qui permet de faire des comparaisons entre variable à valeur, register à valeur.

Laquelle permet de faire un saut conditionnel ou inconditionnel.

Et laquelle permet d'écrire en format raw en mémoire.

Puis sais tu nager dans la RAM en mode 16 bit ? http://openclassrooms.com/forum/sujet/memo-sur-l-assembleur?page=2#message-88391250

Si tu arrives à répondre a toutes ces questions, tu pourras faire cet exo, qui me semble être un devoir d'école.

-
Edité par Anonyme 8 mai 2015 à 19:14:33

  • Partager sur Facebook
  • Partager sur Twitter
8 mai 2015 à 19:20:48

Merci pour ta réponse, ces exercices font partie de me mon TD, je bloque dessus.

L'instruction pour faire les déplacements est l'instruction MOV

Celle qui permet de faire des comparaisons est l'instruction CMP 

Pour les sauts on utilise les différente instructions de type jump ( JMP, JZ, JNZ ... etc ) 

Pour la dernière question, je ne sais pas :/

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
8 mai 2015 à 20:11:49

Pour écrire en raw dans la RAM (déclaration de donnée), c'est à coup de dq/dd/dw/db http://www.nasm.us/doc/nasmdoc3.html#section-3.2.1

Tu travailles avec quel outil pour construire ton programme ?

Et bien sinon tu as tous les outils nécessaires pour faire ton programme.

Dans le premier exo, il te demande de copier tout le contenu de ton écran (dosbox), donc tu fais une boucle parcourans l'écran ([ds:bx] avec ds = 0xB800 et bx = 0) et dans cette boucle tu sauvegardes (mov) [ds:bx] dans un tableau (screen: times ((28 * 2) * 80) db 0) tant quantdtu n'a pas atteint la fin de l'écran (0xB800:((28 * 2) * 80))

l'attribut d'affichage = couleur du text/fond d'écran du caractère

Ensuite, le deuxième exo est juste l'inverse de premier.

Et enfin pour modifier un fichier bmp, il suffit juste de connaitre comment marche ce format d'image: http://en.wikipedia.org/wiki/BMP_file_format

Après si tu veux plus d'info: http://www.developpez.net/forums/d1513061/autres-langages/assembleur/x86-16-bits/aide-exercice/

-
Edité par Anonyme 9 mai 2015 à 3:24:19

  • Partager sur Facebook
  • Partager sur Twitter
8 mai 2015 à 23:18:51

Je n'ai pas tres bien compris comment faire pour ecrire dans un fichier, pourrai tu me donner un exemple stp ? 

Pour le moment je ne fais que des brouillons avec bloc note

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
9 mai 2015 à 0:04:06

Conseil: prend notepad++ si tu veut coder en asm et test avec ma propre syntaxe: http://codes-sources.commentcamarche.net/source/100763-hackengine-x64 (readme.txt -> Notepad++ configuration (Optional): )

Appuie toi sur l'exemple ici: http://pastebin.com/R2rLdwCr

(Aufaite tu en pense quoi de mon début de tuto sur l'assembleur: http://hackasm.5gb.co/Projects/Computer_Science/courses/tutorials/assembly/fr/index.html), qui est certes toujours en construction.

-
Edité par Anonyme 14 juin 2015 à 20:03:55

  • Partager sur Facebook
  • Partager sur Twitter
9 mai 2015 à 1:36:10

Tu commences bien dans tuto je trouve ^^ parcontre dans le workspace je pense que tu devrai ajouter un fichier texte ou tu explique les étapes d'installation et la configurations des différents programmes ou le faire directement sur le site ^^ 

Parcontre pourrai tu me dire ce que cela signifie quand on fais [ds:bx] par exemple stp ? enfaite je ne comprend pas trop le ds:bx , qu'est ce que le :bx represente ? j'ai l'habitude de faire des opérations simple comme mov ax, bx xor ax ax ... etc 

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
9 mai 2015 à 1:50:16

ok merci, ecrire bx signifie utiliser la valeur dans bx à modifier/lire, [bx] signifie utiliser la valeur contenu dans bx comme une adresse où ecrire/récuperer, example:

mov     bx  , 0xFF00        ; ecrit 0xFF00 dans le registre bx
mov     [ds:bx], word 16    ; ecrit 16 à l'adresse (ds * 16 + 0xFF00)

-
Edité par Anonyme 9 mai 2015 à 1:54:31

  • Partager sur Facebook
  • Partager sur Twitter
9 mai 2015 à 3:13:28

Ok merci mais enfaite c'est le ds:bx que je n'ai pas compris, je n'ai pas l'habitude de me servir de cette écriture mais en gros si j'ai compris cela sert juste a preciser le segement qu'on va utiliser ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
9 mai 2015 à 3:31:55

Oui et l'offset, en mode reel (16-bit), la taille d'un segment est codé sur 16 bit, et on accede via [segment:offset], le segment peut etre renseigné par ds/es/ss et l'offset par bx, bp, si, di.

Et l'adresse absolue est calculée par (segment * 16) + offset

-
Edité par Anonyme 9 mai 2015 à 3:33:14

  • Partager sur Facebook
  • Partager sur Twitter
9 mai 2015 à 12:36:28

Ok merci, je vais essayer de gribouiller quelques chose pour le programme que j'enverrai plus tard ^^
  • Partager sur Facebook
  • Partager sur Twitter
10 mai 2015 à 0:33:34

J'ai essayer un peu mais je n'ai pu faire que sa :

xor ax, ax

mov cx, 2240

mov bx, si

boucle: mov ax, b800

mov si , ax

inc ax

inc si

loop boucle

SI me sert de tableau ... mais je n'ai toujours pas compris comment enregistrer dans un fichier :(

-
Edité par rik18Rik 10 mai 2015 à 0:53:18

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 mai 2015 à 3:13:44

le 0xB800 va dans le segment et non l'offset, car l'adresse video est située en 0xB8000 (0xB800 * 0x10).

Et bien tu écris d'abord dans un tableau de (80 * 28 * 2) bytes grâce à l'instruction times et db, ensuite écrire ce tableau dans un fichier, il y aurait bien l'interruptions du DOS (int 0x21).

http://www.gladir.com/LEXIQUE/INTR/int21f3c.htm (crée un fichier)

- http://www.gladir.com/LEXIQUE/INTR/int21f40.htm (écris dans un fichier)

- http://www.gladir.com/LEXIQUE/INTR/int21f3d.htm (ouvrir un fichier)

- http://www.gladir.com/LEXIQUE/INTR/int21f3f.htm (lit un fichier)

- http://www.gladir.com/LEXIQUE/INTR/int21f3e.htm (close file)

(http://www.gladir.com/LEXIQUE/INTR/INT21.HTM)

Par contre, ces interruptions ne sont pas disponibles en 64 bit, qu'en 32 bit, car apparemment elles sont codés en 16 bit :D

-
Edité par Anonyme 10 mai 2015 à 3:15:34

  • Partager sur Facebook
  • Partager sur Twitter
10 mai 2015 à 22:52:04

Merci ^^ mais pourrai tu me dire comment utiliser un tableau dans la partie code afin de copier ce dont j'ai besoin ? car je sais seulement le faire dans la section data ...
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 mai 2015 à 23:49:00

Et bien tu reference le label entre crochet: [screen]

-
Edité par Anonyme 11 mai 2015 à 0:04:04

  • Partager sur Facebook
  • Partager sur Twitter
11 mai 2015 à 13:49:36

Mais par exemple quand je declare le tableau j'ai l'habitude de faire tab db puis j'ecris mes données par exemple tab db 5, 8, 18, 20 ... mais comment faire pour declarer une taille a la place ?

Sinon quand je travaille avec mes registres et que je fais par exemple mov tab, ax on va donc mettre ax dans tab mais la prochaine fois que je voudrai ajouter une autre donnée au tableau et que je ferai un autre mov tab, ax avec ax qui contient une donnée différente cette fois, est ce que la premiere ne sera pas ecrasé ?

Merci

  • Partager sur Facebook
  • Partager sur Twitter
11 mai 2015 à 18:35:21

slt; j'ai besoin de la solution aujourd'hui parceque ce tp et à remettre demain
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
11 mai 2015 à 18:59:45

Tu le fais grâce à l'instruction times du compile: tab times (12) db 0

C'est plutôt un mov [tab], ax.

Oui, en effet, c'est écrasé si tu n'ajoutes pas d'offset à tab.

-
Edité par Anonyme 11 mai 2015 à 19:02:02

  • Partager sur Facebook
  • Partager sur Twitter
11 mai 2015 à 22:20:05

Ok donc pour éviter l'écrasement j'incrémente le tableau avec : inc [tab]

Sinon que represente le 12 dans tab time(12) ? pour le db 0 je suppose que c'est la taille que je dois mettre en hexadecimal ?

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
11 mai 2015 à 22:36:09

times 12 = répète 12 fois l'instruction qui suit, donc db 0

Le db est juste un define byte, ce qui veut dire que ça ecrit en raw dans le fichier une donnée avec une largeur d'un octet, ensuite à l'exécution du programme, cette donnée sera transférée en raw dans la RAM tout comme tout ton programme.

-
Edité par Anonyme 11 mai 2015 à 22:41:34

  • Partager sur Facebook
  • Partager sur Twitter
11 mai 2015 à 23:05:23

Je vois donc je garde db 0 et je dois jouer sur le time si j'ai bien compris le fonctionnement dans ton exemple le tableau fais 12 octet ?

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
11 mai 2015 à 23:18:17

oui, byte = octet

Dans ton exo, il est dit que tu dois créer un tableau de 80 colonnes et 28 lignes de caractères.

Comme on peut représenter la colonne par l'axe y et la ligne par l'axe x, ça fait un tableaux a 2D, et pour créer un tableaux a plusieurs dimensions, tu dois faire le produit des axes.

Donc dans ton exo, tu dois faire times (80 * 28) de deux octets, car un caractère est codé en 2 bytes dans ce mode graphique.

1 pour le code ascii et l'autre pour sa couleur (color foreground/background)

-
Edité par Anonyme 11 mai 2015 à 23:28:35

  • Partager sur Facebook
  • Partager sur Twitter
13 mai 2015 à 2:01:54

Ok merci, je vais essayer de faire quelque chose :)

-
Edité par rik18Rik 13 mai 2015 à 2:03:15

  • Partager sur Facebook
  • Partager sur Twitter
7 juillet 2019 à 23:20:47

J ai besoir d'un programme qui fait la conversion des chiffres arabes en chiffres romains
  • Partager sur Facebook
  • Partager sur Twitter
7 juillet 2019 à 23:30:03

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter