2016-02-25 2 views
1

Ce sont les problèmes:Assemblée Shift/Rotation

Je possède ce hw, mais je ne sais connaissances de base. Ce sera une aide précieuse si quelqu'un peut me donner un indice sur la façon de résoudre ces problèmes. Je sais que ce peut être un mouvement désespéré, mais au moins j'apprendrai comment répondre à ce genre de problèmes.

+0

Utilisez-vous uniquement des quarts de travail? ** 2 ** ressemble à un travail pour ET/OU. ** 3 ** ne semble pas possible en utilisant * seulement * Maj ou tourner. Cela ressemble à un travail pour LEA (qui change et ajoute dans le même insn): 'lea ecx, [rcx * 2]'/'lea eax, [rcx + 8 * rax]'. Ou plus simplement, faites x10 avec x2, x5: 'shl eax' /' lea eax, [rax + 4 * rax] '. –

Répondre

0
  1. Pour effacer le grignotage plus significand et régler le grignotage moins de significand de AX vous pouvez écrire:

    and ax, 0FFFh ;Clears the top nibble 
    or ax, 000Fh ;Sets the bottom nibble 
    

    Sans and/or, en utilisant des changements:

    shl ax, 4  ;Moves the middle part into AH 
    mov al, 0F0h ;Prepares for a set low nibble 
    shr ax, 4  ;Puts everything in place 
    
  2. Pour calculer 10 * AX en équipes:

    shl ax, 1  ;Calculate 2*AX 
    mov dx, ax  ;Store in DX 
    shl ax, 2  ;Continue calculating 8*AX 
    add ax, dx  ;Makes AX = 8*AX + 2*AX 
    
0

Vous pouvez définir et effacer des parties d'une valeur intégrale en utilisant la logique de bits - logique AND et OU dans ce cas.

Exemples superficiels: J'ai la valeur de bit 0101; Je veux définir les deux bits les plus bas. Donc je OU avec 0011. Maintenant, je veux effacer les deux bits les plus bas. Alors moi et avec 1100.

1

"et" renvoie 1 uniquement, si les deux bits d'entrée sont 1.
0 et 0 est 0
1 et 0 0 0
et 1 est 0
1 et 1 est 1

donc "compensation" un peu peut être fait par "anding" avec le bit 0. quel que soit (b) est, b et 0 0

"ou" retourne 1, si l'une des bits d'entrée est 1.
0 ou 0 est 0
1 ou 0 est une
0 ou 1 est une
1 ou 1 est 1

"réglage" un bit peut être fait par "ORing" avec le bit 1. quelle que soit (b) est, ou b 1 est 1

AX est 16 bits si vous et AX avec 0000.1111.1111.1111b (= 0x0FFF) le grignotage supérieure (4 bits) seront effacées
(ET avec 1 ne changera pas un peu, il reste 1 si il est défini et reste non défini s'il est 0, donc tous les grignotages qui ne doivent pas être modifiés sont associés à 1)

si vous OU AXE Avec 0000.0000.0000.1111b (= 0x000F), le quartet inférieur sera défini.
(OR avec 0 ne changera pas un peu, il reste 1 si elle est définie, et reste hors service si elle est 0, donc tous les autres amuse-gueules sont OU avec 0)

+0

"effacé" est le terme usuel, pas "supprimé".Supprimé implique qu'ils ne font plus partie du registre, pas qu'ils soient toujours présents et mis à zéro. –

0

La meilleure façon de comprendre ces opérations est de marcher à travers eux étape par étape. Je vais essayer d'expliquer le processus du mieux que je peux. À chaque étape, j'inclurai le statut des deux registres pour que vous puissiez suivre. Afin de maintenir les valeurs supérieures de EAX, nous devons d'abord déplacer son contenu dans un autre registre pour la manipulation.

Début:
EAX: 1100 1001 1111 0011 1011 1100 1001 1111

mov ebx, eax; copies contenu de eax dans EBX

EAX: 0011 1100 1001 1111 1011 1100 1001 1111
EBX: 1100 1001 1111 0011 1011 1100 1001 1111

SHL EBX, 24; cela efface les bits de ebx que nous ne sommes pas concernés
shr ebx, 24; déplace en arrière à la position initiale

EAX: 0011 1100 1001 1111 1011 1100 1001 1111
EBX: 0000 0000 0000 0000 0000 0000 1100 1001

SHL EBX, 4; Déplacez-vous vers la gauche de 4 bits. Bx est où nous le voulons pour la prochaine étape.

EAX: 0011 1100 1001 1111 1011 1100 1001 1111
EBX: 0000 0000 0000 0000 0000 1100 1001 0000

add bl, 0Fh; ajoute 0xF à bl. Ou, en binaire, 1111. jeu de quartet le moins significatif.

EAX: 0011 1100 1001 1111 1011 1100 1001 1111
EBX: 0000 0000 0000 0000 0000 1100 1001 1111

ax xor, ax; efface le contenu de la hache, faire de la place pour ce qui est Bx

EAX: 0011 1100 1001 1111 0000 0000 0000 0000
EBX: 0000 0000 0000 0000 0000 1100 1001 1111

hache ajouter, bx; combiner les résultats de bx retour dans eax pour le résultat final

EAX: 1100 1001 1111 0011 0000 1100 1001 1111

Et là, vous l'avez! Maintenant que vous connaissez les opérations de quart, je vous laisse la dernière partie.

À la votre!