EMU8086 est basé sur 8086 des instructions afin que vous avez uniquement les versions d'opérandes uniques de MUL et DIV. Juste pour vous faire connaître, IMUL est la version signée de MUL, et IDIV est la version signée de DIV. En supposant que vous aviez l'intention de faire de l'arithmétique non signé votre code pourrait ressembler à ceci:
mov al,5
mov bl,4
mul bl
mov cx, ax ; Save AX to CX
mov ax,35
mov bl,7
div bl
xor ah, ah ; Result(quotient) of DIV in AL, ensure AH is zero
add ax, cx ; AX=AX+CX
Il n'y a aucun moyen d'empêcher AX d'être détruit avec les instructions spécifiques de 8086 MUL et DIV. Vous devrez déplacer la valeur vers une zone de travail. Nous allons utiliser le registre CX pour cela dans le code ci-dessus. Puisque nous sauvons le résultat de l'instruction MUL -CX nous avons juste besoin d'ajouter au résultat de l'instruction DIV (où le quotient est AL).Nous remettons à zéro le reste stocké dans AH, laissant le quotient dans AL. AX contiendrait maintenant le quotient (en tant que valeur de 16 bits) que nous ajoutons à CX, et le résultat final de l'équation est stocké dans AX. Une simplification pour multiplier par 4 consiste à décaler une valeur à gauche de 2 bits. Ce code:
mov al,5
mov bl,4
mul bl
mov cx, ax ; Save AX to CX
peut être réduite à:
mov cx, 5
shl cx, 2 ; Multiply CX by 4
Le processeur 8086 ne supporte pas SHL déplacement de plus de 1 bit, sauf par l'intermédiaire du registre CL. L'assembleur EMU8086 traduit automatiquement l'instruction SHL reg, imm
en une ou plusieurs instructions SHL, reg, 1
. Dans ce cas SHL CX, 2
a été traduit à:
shl cx, 1 ; Multiply CX by 2
shl cx, 1 ; Multiply CX by 2 again
La plupart des 8086 assembleurs ne le feront pas la traduction pour vous. En variante, le nombre de bits à décaler peut être spécifié dans le registre CL. Ce (ou l'équivalent) travaillerait avec la plupart des assembleurs 8086:
mov cl, 2 ; Number of bits to shift left by in CL
mov dx, 5
shl dx, cl ; Shift DX to the left by CL(2) is equivalent to multiply by 4
mov ax,35
mov bl,7
div bl
xor ah, ah ; Result(quotient) of DIV in AL, ensure AH is zero
add ax, dx ; AX=AX+DX
Êtes-vous écrit 8086 code 16 bits ciblant DOS ou EMU8086? –
J'écris ceci pour emu8086 ..yes 16bit –