как я могу поместить значение из памяти в регистр eax в masm32

поэтому я пытаюсь сделать код «шифрования» с помощью команды xor

это мой код

.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

когда я пытаюсь скомпилировать его в masm32, я получаю кучу ошибок

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 

теперь я пытался сделать много вещей, чтобы исправить это, но когда мне удается решить 1 проблему, я получаю новую...

поэтому эта программа должна взять строку «мне нравится сборка $», зашифровать эту строку операндом xor 0101010101010101, а затем распечатать зашифрованную строку, а затем снова расшифровать строку, используя xor my_xor db 0101010101010101, и распечатать расшифрованную строку

кто-нибудь знает, как решить эту проблему?

спасибо, ребята, майк


person H_meir    schedule 26.02.2015    source источник
comment
xor ax,[my_xor]: my_xor объявляется как один байт. ax — это 16-битный регистр (т.е. 2 байта). mov ax,[word msg]: Я не понимаю, что ты здесь пытаешься сделать(?). Что word должен делать?   -  person Michael    schedule 26.02.2015
comment
Кроме того, вы, кажется, создаете приложение Win32. Так что эти int 21h функции не будут работать (они для DOS). И почему в заголовке упоминается eax, если ваш код никогда напрямую не использует eax?   -  person Michael    schedule 26.02.2015
comment
Итак, мне нужно объявить my_xoras dw?   -  person H_meir    schedule 26.02.2015
comment
и eax - это моя ошибка, извините за это, я поставил [word msg], потому что я думал, что проблема в том, что msg - это один байт, а ax - 16 бит, поэтому слово msg означает, что ax должен принимать этот 1 байт как 16 бит (2 байта )   -  person H_meir    schedule 26.02.2015
comment
и я пытаюсь распечатать разрешение в первый раз, поэтому я скопировал код из Интернета, если я обнаружу какую-то ошибку, я буду очень благодарен, если вы можете разместить здесь весь код, который работает, и объясните мне, что я сделал.   -  person H_meir    schedule 26.02.2015
comment
Для использования прерываний DOS для записи строки в стандартный вывод DOS нам нужен 16-битный компоновщик, чтобы получить 16-битный исполняемый файл. [ссылка]download.microsoft.com/download /vc15/Update/1/WIN98/EN-US/   -  person Dirk Wolfgang Glomp    schedule 26.02.2015


Ответы (1)


Исправление этих конкретных сообщений об ошибках не даст вам желаемого результата.

Когда вы даете компьютеру команду XOR для значения, хранящегося в AX, оно будет применяться только к 16 битам, хранящимся в настоящее время в AX. Ассемблер не понимает, что вы храните строку по адресу [msg].

Вам нужно перебирать данные, на которые ссылается [msg], выполняя операцию XOR для каждого байта, если он не имеет значения 0 (строка с нулевым завершением).

Из StackOverflow: первый ответ показывает, как может работать цикл, но не разобраться с сохранением результата.

Псевдокод:

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.

Взгляните на Использование квадратных скобок для ссылки на память в ASM.

----------------- РЕДАКТИРОВАТЬ ---------------

Чтобы получить функциональность одного символа из вашего кода, попробуйте удалить квадратные скобки, поскольку они разыгрывают значения, хранящиеся в регистре или в местоположении идентификатора. Кроме того, делайте по одному байту за раз, поскольку ваша строка заканчивается одним нулевым байтом.

Вам потребуется сгенерировать файл MS-DOS .EXE или .COM, если вы хотите, чтобы функции INT 21h генерировали выходные данные.

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

Подробнее об инструкции XOR

person bpdohall    schedule 26.02.2015
comment
Почему я должен использовать цикл? я хочу сделать только первое слово jibrish и хочу сделать это с помощью xor, почему это не сработает? - person H_meir; 26.02.2015
comment
@h_meir В вашем вопросе говорилось, что вы хотели зашифровать строку. Если вы исправите свой код так, что my_xor будет определен как слово, будут изменены только первые два символа строки. - person bpdohall; 26.02.2015
comment
Что, если я буду использовать вместо топора ракс? а также я могу изменить только первые 2 символа, потому что я могу сделать цикл и то же самое для всей строки, моя проблема в том, что я не могу сделать даже эти 2, потому что я не могу поместить эту переменную внутри ax без получения ошибки ... - person H_meir; 26.02.2015