2015-02-26 1 views
-3

donc j'essayer de faire le code « de cryptage » en utilisant la commande XORcomment puis-je mettre la valeur de la mémoire à eax inscrire à masm32

c'est mon code

.486 
.model flat,stdcall 
option casemap :none ;case sensitive 

;;_____MASM MACROS___ 
include \masm32\include\masm32.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\masm32.lib 
includelib \masm32\lib\kernel32.lib 

;;_____DATA____ 
.data 
msg DB "I LIKE ASSEMLY$",0H 
my_xor db 0101010101010101b 

;;_____CODE____ 
.code 
_start: 

encript_lbl: 

mov ax,[word msg] 
xor ax,[my_xor] 
mov [msg],ax 
jmp print_lbl 

decript_lbl: 
mov ax,[msg] 
xor ax,[my_xor] 
mov [msg],ax 


print_lbl: 
mov dx,offset msg 
mov ah,9h 
int 21h 
mov ah,2 ;new line 
mov dl,10 
int 21h 
mov dl,13 
int 21h 
jmp decript_lbl 





end _start 

lorsque je tente de le compiler en masm32 je reçois tas d'erreurs

lines 23,24,28,29,30 invalid instruction operand (a2070) 
line 22 missing operator in expration (a2206) 
line 34 (a2022) instruction operand must be in the same size 
line 14 (a2071) initializer magnitude to large for spesofied 

maintenant j'ai essayé de faire beaucoup de choses à résoudre ce problème, mais quand je réussis à résoudre 1 problème que je reçois un nouveau ...

alors ce programme devrait prendre la chaîne "j'aime assembly $" crypter cette chaîne par l'opérateur xor de 0101010101010101 puis imprimer la chaîne cryptée puis décrypter la chaîne à nouveau en utilisant le xor de my_xor db 0101010101010101 et imprimer la chaîne décryptée

quelqu'un sait comment résoudre ce problème?

vous remercier Mike

+0

'ax xor, [my_xor]': 'my_xor' est déclarée comme un seul octet. 'ax' est un registre de 16 bits (c'est-à-dire 2 octets). 'mov hache, [mot msg]': Je ne suis pas sûr de ce que vous essayez de faire ici (?). Qu'est-ce que 'word' est censé faire? – Michael

+0

En outre, vous semblez créer une application Win32. Donc, ces fonctions 'int 21h' ne vont pas fonctionner (ce sont pour DOS). Et pourquoi le titre mentionne-t-il 'eax' quand votre code n'utilise jamais directement' eax'? – Michael

+0

Donc, je dois décliner my_xoras dw? –

Répondre

0

Fixation ces messages d'erreur spécifiques ne vous donnera pas le résultat que vous voulez. Lorsque vous demandez à l'ordinateur de XOR une valeur stockée dans AX, elle s'appliquera uniquement aux 16 bits actuellement stockés dans AX. L'assembleur ne comprend pas que vous stockez une chaîne à l'adresse de [msg].

Vous devez parcourir les données référencées par [msg], XOR-ing chaque octet tant qu'il n'a pas la valeur 0 (chaîne terminée par un caractère nul).

From StackOverflow: La première réponse montre comment la boucle peut fonctionner, mais ne concerne pas l'enregistrement du résultat.

Pseudo-code:

Get a pointer to the start of the message. 
Start loop. 
    - Exit loop if referenced byte is 0. 
    - XOR the byte referenced by the pointer. 
    - Increment the pointer. 
End loop. 

Jetez un oeil à Using Square Brackets To Reference Memory in ASM.

----------------- --------------- EDIT

Pour obtenir toutes les fonctionnalités de caractère de votre code , essayez de supprimer les crochets car ils décrivent les valeurs stockées dans le registre ou à l'emplacement de l'identificateur. En outre, effectuez un octet à la fois que votre chaîne est terminée avec un seul octet nul.

Vous devrez générer un fichier MS-DOS .EXE ou .COM si vous souhaitez que les fonctions INT 21h génèrent une sortie.

encript_lbl: 
mov al,msg 
xor al,my_xor 
mov msg,al 
jmp print_lbl 

Details on the XOR instruction

+0

Pourquoi dois-je utiliser une boucle? je veux faire seulement le premier mot jibrish et veux le faire par xor pourquoi son travail ne fonctionnera pas? –

+0

@h_meir Votre question a décrit que vous vouliez chiffrer la chaîne. Si vous avez corrigé votre code afin que "my_xor" soit défini comme un mot, seuls les deux premiers caractères de la chaîne seront modifiés. – bpdohall

+0

Et si je vais utiliser à la place de ax rax? et aussi son amende par moi de changer seulement le premier 2 bec becoas que je peux faire une boucle et la même chose pour toute la corde, mon problème est que je ne peux pas faire même 2 becoas je ne peux pas mettre ce varible à l'intérieur sans avoir une erreur ... –