Jump to content

Des gens qui connaissent l'assembleur 8086 ?


Recommended Posts

Salut

Bon suis nul en assembleur, je comprends strictement rien !

Qqu'un aurait dans ses vieux documents un prog en assembleur qui permet de calculer le carré d'un nombre (sans utiliser le copro) ? Je sais, c'est spécial comme demande mais bon...

Merci,

vince

Link to comment
Share on other sites

le carré d'un entier ?

Ca fait longtemps que j'en n'ai plus fait, mais c'est quelque chose du genre:


mov ax, nombre

mul ax          ; calcule ax*ax

et le résultat est dans dx:ax je crois (partie haute dans dx, partie basse dans ax)

Link to comment
Share on other sites

arf... en fait j'arrive pas à mettre en oeuvre tout ça... la saisie merdouille à fond... quelqu'un pourrait me dire précisément comment faire saisir le nombre puis le mettre au carré ?

par avance merci pour les âmes généreuses :fumer:

Link to comment
Share on other sites

lol!

si ça n'en tenait qu'à moi, je ferai saisie et calcul en c, si je veux faire ça en asm c'est parce que suis etudiant et que c'est un élément d'un TP !

maintenant c'est un cosinus que j'essaie de calculer avec le copro ! lol

Link to comment
Share on other sites

Moi j'ai la soluce quelque part la haut dans mon crane...

C'est sous linux, avec gcc...

Tu le fais minimal en C, tu compile avec GCC avec l'option qui va bien (trou), et tu ré édites l'ASM tu nettoies, tu compile tn asm et c'est bon...

Link to comment
Share on other sites

lol ! oui c'est un moyen comme un autre !

bon en fait là j'ai bien avancé : j'ai mon resultat dans une variable de type DT, le truc c'est que j'arrive pas à afficher caractere par caractere le contenu de cette variable !

Link to comment
Share on other sites

  • 2 weeks later...

Oula je m'y essaie, rien de garanti :-)


mov ah, 8      ;int dos, lire char

int 21h           ;appel dos

imul al           ;al * al

mov dl, al  ;dl contient le char a afficher

mov ah, 2        ;int dos affiche char

int 21h             ;appel dos

attention ne marche que pour des nombres de 16bits.

Link to comment
Share on other sites

Oula je m'y essaie, rien de garanti :-)


mov ah, 8      ;int dos, lire char

int 21h           ;appel dos

imul al           ;al * al

mov dl, al  ;dl contient le char a afficher

mov ah, 2        ;int dos affiche char

int 21h             ;appel dos

attention ne marche que pour des nombres de 16bits.

lol ! si ça marche pas c'est pas grave, c'est déjà super sympa de m'aider ! je vais essayer dés que possible ! en tous cas merci beaucoup !

Vince

Link to comment
Share on other sites

En fait, après tests, faut faire gaffe que l'assembleur prends en compte le code ASCII, donc ca donne plutot ca :


bcl:	

 mov ah, 8      ;int dos, lire char 

 int 21h           ;appel dos

 sub al, 48  ;conversion code ascii-> valeur

 imul al  	;al * al  

 add al, 48  ;valeur->code ascii

 mov dl, al    

 mov ah, 2

 int 21h

jmp bcl

Et encore une autre précision, ca ne marchera que pour un nombre de 0 à 9, car on utilise la fonction 'lire caractère' du DOS, et non pas 'lire une chaine de caractères', qui est gérée autrement.

Link to comment
Share on other sites

oui bon déjà c'est vrai que j'avais oublié de déduire les fameux 48 !

maintenant il me reste un problème : mon format de variable est dt et son contenu est en dcb80... bref, faut donc que j'arrive à avoir octet par octet le contenu de ma variable et à extraire chaque demi-octet pour l'afficher... et ça j'y arrive po :non:

bref pour évoluer ma variable j'ai fait ça :


mov si, offset resultat+9

mov cx,10

boucle :

 mov cl,[si]

 ...

 inc si

loop boucle

mais même ça je suis pas certain de mon coup ! est-ce que dans ce cas cl contient bien le SIème octet de resultat ?

Link to comment
Share on other sites

c'est tout à fait ça... sauf qu'en fait, en principe, j'ai que les 5 derniers octets qui sont utilisés et chaque octet comprend 2 chiffres (un dans la partie haute, l'autre dans la partie basse de l'octet)... bref, le truc que j'arrive pas à faire, c'est à me positionner au debut du premier des 5 derniers octets pour afficher les 10 chiffres qui sont stockés dans ma variable

Link to comment
Share on other sites

J'ai quelques exemples avec les pointeurs, mais je ne les ai jamais utilisés :


var1 dw 1234h

var2 db 1

var3 db 2



mov bh, byte ptr var1   ; bh <- 34h

mov al, byte ptr var1 + 1   ; al <- 12h

mov ax, word ptr var2   ; ax <- var2 + var3

mov byte ptr [bx], 0   ; 1 byte mémoire (ea = bx) mis à 0

Link to comment
Share on other sites

  • 13 years later...

Bonjour, besoin d'aide pour résoudre ce problème. J'ai bien des difficultés.

Ecrire un programme  en assembleur 6809 compte le nombre de bits à 1 dans un octet se trouvant à l’adresse $1000 lorsque le microprocesseur reçoit une demande d’interruption FIRQ. L’interruption IRQ étant masquée.

a) Donner l’organigramme

b) Donner le programme

Link to comment
Share on other sites

Vous devez comparer (AND) votre octet avec une valeur initialisée à 1 sur laquelle vous appliquerez un Shift Left huit fois de suite. Si le résultat du AND et différent de 0, alors vous incrémentez un compteur de bits.

Exemple : un octet 11101001

 

BCL1

  11101001

+00000001

 ========

=00000001 -> Inc un registre DX par exemple

 

BCL2

  11101001

+00000010

 ========

=00000000 -> Zéro, on ne fait rien

 

BCL3

  11101001

+00000100

 ========

=00000000 -> Zéro, on ne fait rien

 

BCL4

  11101001

+00001000

 ========

=00001000 -> Inc DX

 

etc

 

Je ne détaille pas, c'est votre boulot.

Link to comment
Share on other sites

Merci bien Aloyse57, j'avoue que je comprends mieux l'exercice maintenant. le décalage bit à bit et de compter à chaque fois

si le résultat du NAND est 1.Vraiment merci pour le principe.

Seulement je n'assimile pas vraiment ce qu'on enttend par interruption FIRQ ou FIRQ.

Merci encore.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...