[ASM] Enoncer assembleur
Dernière réponse : dans Programmation
Bonjour voila j'ai un petit programme a faire sur les code multiplexe est ce que quelqun pourrai m'aider s'il vous plait ?
voice l'enoncé :
****************************************
* 5.4. Trouver le format par programme *
****************************************
But : Ecrire un programme capable de décoder une instruction du type "mov s/w/mm/rrr/ttt"
5.4.1. Le code machine est en "DATA"
************************************
Ex. : cm db 8Bh,89h,12h,34h
Amenez les bytes successivement dans un registre de travail.
Conservez la taille des opérandes dans une variable.
Ex. : taille db 8 ; 8 pour 8 bits, 16 pour 16 bits et 32 pour 32 bits
Test du premier byte amené des DATA :
Si ce byte vaut 66, on a affaire à une instruction 32 bits :
cmp al,66h
- les registres seront préfixés par "e"
- il faudra prendre le byte suivant
Test du bit donnant le sens du transfert en regard du registre principal :
Ce bit est le bit b1 dans le 1er byte : and al,2 ; « 2 » pour « 0000 0010b »
attention ! « al » est détruit par le résultat.
cmp al,2
Test du bit donnant la taille des opérandes 8/16 bits :
Ce bit est le bit b0 dans le 1er byte : and al,1 ; « 1 » pour « 0000 0001b »
attention ! « al » est détruit par le résultat.
cmp al,1
Ensuite, prenez le byte suivant
Test des bits pour obtenir le mode :
Il s'agit des bits b7b6 dans le 2ème byte : and al,192 ; « 192 » pour « 1100 0000b »
cmp al,0 -> pour 00 : adressage BI ou direct !
cmp al,64 -> pour 01 : adressage BI8
cmp al,128 -> pour 10 : adressage BI16
cmp al,192 -> pour 11 : échange entre registres
Test des bits pour obtenir le registre principal :
Il s'agit des bits b5b4b3 dans le 2ème byte :
and al,56 ; « 56 » pour « 0011 1000b »
; décaler 3 fois à gauche pour avoir la valeur exacte
shr al,3 ; la valeur est divisée par 8
; ceci donne le numéro du registre dont le nom est à prélever dans une ou des tables
; si 8 bits : TReg8 db "al$ cl$ dl$ bl$ ah$ ch$ dh$ bh$ "
; si 16 bits : TReg16 db "ax$ cx$ dx$ bx$ sp$ bp$ si$ di$ "
; si 32 bits : TReg32 db "eax$ecx$edx$ebx$esp$ebp$esi$edi$"
shl al,2 ; pour obtenir le décalage dans le tableau
mov bx, offset TReg16
add bx, al
mov ah, 09h
mov dx, bx
int 21h
Test des bits pour obtenir le type d'adressage :
Il s'agit des bits b2b1b0 dans le 2ème byte :
and al,7 ; « 7 » pour « 0000 0111b »
Construisez un tableau avec des textes décrivant explicitement chaque type
et inspirez-vous de la technique utilisée ci-dessus pour l'identité des registres.
5.4.2. L'instruction est dans le segment de "CODE"
**************************************************
1. L’instruction pouvant produire des effets non souhaités, la compiler mais
l’empêcher de s’exécuter en la sautant à l’aide d’un « jmp ».
2. Référencer l’instruction, du moins son 1er byte par une étiquette
« ici : ». Charger cette adresse dans « bx » :
mov bx, offset ici
3. Transférer les bytes successivement dans « al » :
mov al, CS:[bx]
....
inc bx ; pour le 2ème byte
mov al, CS:[bx] ; ou en une seule instruction : mov al, CS:[bx+1]
J'espere que quelqu'un pourrai m'aider s'il vous plait
voice l'enoncé :
Citation :
****************************************
* 5.4. Trouver le format par programme *
****************************************
But : Ecrire un programme capable de décoder une instruction du type "mov s/w/mm/rrr/ttt"
5.4.1. Le code machine est en "DATA"
************************************
Ex. : cm db 8Bh,89h,12h,34h
Amenez les bytes successivement dans un registre de travail.
Conservez la taille des opérandes dans une variable.
Ex. : taille db 8 ; 8 pour 8 bits, 16 pour 16 bits et 32 pour 32 bits
Test du premier byte amené des DATA :
Si ce byte vaut 66, on a affaire à une instruction 32 bits :
cmp al,66h
- les registres seront préfixés par "e"
- il faudra prendre le byte suivant
Test du bit donnant le sens du transfert en regard du registre principal :
Ce bit est le bit b1 dans le 1er byte : and al,2 ; « 2 » pour « 0000 0010b »
attention ! « al » est détruit par le résultat.
cmp al,2
Test du bit donnant la taille des opérandes 8/16 bits :
Ce bit est le bit b0 dans le 1er byte : and al,1 ; « 1 » pour « 0000 0001b »
attention ! « al » est détruit par le résultat.
cmp al,1
Ensuite, prenez le byte suivant
Test des bits pour obtenir le mode :
Il s'agit des bits b7b6 dans le 2ème byte : and al,192 ; « 192 » pour « 1100 0000b »
cmp al,0 -> pour 00 : adressage BI ou direct !
cmp al,64 -> pour 01 : adressage BI8
cmp al,128 -> pour 10 : adressage BI16
cmp al,192 -> pour 11 : échange entre registres
Test des bits pour obtenir le registre principal :
Il s'agit des bits b5b4b3 dans le 2ème byte :
and al,56 ; « 56 » pour « 0011 1000b »
; décaler 3 fois à gauche pour avoir la valeur exacte
shr al,3 ; la valeur est divisée par 8
; ceci donne le numéro du registre dont le nom est à prélever dans une ou des tables
; si 8 bits : TReg8 db "al$ cl$ dl$ bl$ ah$ ch$ dh$ bh$ "
; si 16 bits : TReg16 db "ax$ cx$ dx$ bx$ sp$ bp$ si$ di$ "
; si 32 bits : TReg32 db "eax$ecx$edx$ebx$esp$ebp$esi$edi$"
shl al,2 ; pour obtenir le décalage dans le tableau
mov bx, offset TReg16
add bx, al
mov ah, 09h
mov dx, bx
int 21h
Test des bits pour obtenir le type d'adressage :
Il s'agit des bits b2b1b0 dans le 2ème byte :
and al,7 ; « 7 » pour « 0000 0111b »
Construisez un tableau avec des textes décrivant explicitement chaque type
et inspirez-vous de la technique utilisée ci-dessus pour l'identité des registres.
5.4.2. L'instruction est dans le segment de "CODE"
**************************************************
1. L’instruction pouvant produire des effets non souhaités, la compiler mais
l’empêcher de s’exécuter en la sautant à l’aide d’un « jmp ».
2. Référencer l’instruction, du moins son 1er byte par une étiquette
« ici : ». Charger cette adresse dans « bx » :
mov bx, offset ici
3. Transférer les bytes successivement dans « al » :
mov al, CS:[bx]
....
inc bx ; pour le 2ème byte
mov al, CS:[bx] ; ou en une seule instruction : mov al, CS:[bx+1]
J'espere que quelqu'un pourrai m'aider s'il vous plait
Autres pages sur : asm enoncer assembleur
Lassé par la pub ? Créez un compte
Lassé par la pub ? Créez un compte