Attention dans ton exemple les operandes ont des tailles differentes ce qui est une erreur.
Aussi, ne devrais-tu pas utiliser 'byte ptr' (ou word ptr ici) plutot que 'ptr byte' ? et de toute facon tu pourrais omettre l'indicateur de taille puisqu'il peut etre induit par le premier operande.
Extra car je m'ennuie en ce moment :
L'instruction ADD AX,[BP-2] s'encode en 3 octets: 03 46 FE
Le premier octet est l'opcode. Le second est le mod/rm decrivant les arguments et le troisieme est le deplacement encode sur un octet signe.
L'opcode est au format 000000dw binaire. Donc ici 00000011 binaire, d=1 (le registre est la destination) et w=1 (l'instruction opere sur un mot).
Le mod/rm est 46 hexa ou 106 octal : 1 = l'operande memoire a un deplacement encode sur 8 bits signes. 0 = registre AX (et non AL puisque w=1). 6 = memoire [BP+deplacement].
# .
Posté par popcorn . En réponse au message question théorique sur l'assembleur. Évalué à 3. Dernière modification le 21 août 2019 à 17:27.
Salut,
Attention dans ton exemple les operandes ont des tailles differentes ce qui est une erreur.
Aussi, ne devrais-tu pas utiliser 'byte ptr' (ou word ptr ici) plutot que 'ptr byte' ? et de toute facon tu pourrais omettre l'indicateur de taille puisqu'il peut etre induit par le premier operande.
Extra car je m'ennuie en ce moment :
L'instruction ADD AX,[BP-2] s'encode en 3 octets: 03 46 FE
Le premier octet est l'opcode. Le second est le mod/rm decrivant les arguments et le troisieme est le deplacement encode sur un octet signe.
L'opcode est au format 000000dw binaire. Donc ici 00000011 binaire, d=1 (le registre est la destination) et w=1 (l'instruction opere sur un mot).
Le mod/rm est 46 hexa ou 106 octal : 1 = l'operande memoire a un deplacement encode sur 8 bits signes. 0 = registre AX (et non AL puisque w=1). 6 = memoire [BP+deplacement].
Je te laisse decouvrir les details.
Question subsidiaire : comment encoderais-tu MOV [BP-2],AL : ?? 46 FE