Assembly 如何将内存中的值放入masm32中的eax寄存器

Assembly 如何将内存中的值放入masm32中的eax寄存器,assembly,masm32,Assembly,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

所以我尝试使用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 
现在我试着做了很多事情来解决这个问题,但当我成功地解决了一个问题,我得到了一个新的

因此,这个程序应该使用字符串“i like assembly$”通过0101010101010101的xor运算符加密这个字符串,然后打印加密的字符串 然后使用my_xor db 0101010101的xor再次解密字符串 然后打印解密的字符串

有人知道如何解决这个问题吗

谢谢你们
mike

修复这些特定的错误消息不会得到您想要的结果

当您指示计算机对AX中存储的值进行异或运算时,它将仅适用于AX中当前存储的16位。汇编程序无法理解您正在[msg]地址存储字符串

您需要对[msg]引用的数据进行迭代,对每个字节进行异或运算,只要其值不为0(以null结尾的字符串)

:第一个答案显示循环如何工作,但不涉及保存结果

伪代码:

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.
看一看

-----------------编辑---------------

要从代码中获得单字符功能,请尝试删除方括号,因为它们取消引用存储在寄存器或标识符位置的值。此外,每次执行一个字节,因为字符串以一个空字节终止

如果希望INT 21h函数生成输出,则需要生成MS-DOS.EXE或.COM文件

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

xor-ax,[my\u-xor]
my\u-xor
声明为单个字节
ax
是一个16位寄存器(即2个字节)
mov-ax,[word-msg]
:我不确定您在这里想做什么(?)。word应该做什么?另外,您似乎正在创建一个Win32应用程序。所以那些
int21h
函数不起作用(那些是用于DOS的)。为什么标题提到了
eax
,而你的代码从来没有直接使用过
eax
?所以我需要清除我的xoras dw?eax是我的错误,抱歉,但是,我把[word msg]放在这里,因为我认为问题是msg是单字节,ax是16位的,所以word msg意味着ax应该把这个1字节作为16位(2字节)我第一次尝试打印Resolt,所以我从互联网上复制了代码,如果我有错误,我会非常满意,如果你能把所有有效的代码放在这里,并解释我做了什么,为什么我必须使用循环?我只想创建第一个单词jibrish,并想通过xor实现它为什么它不起作用?@h_meir您的问题描述了您想要加密字符串。如果您修改了代码,将“my_xor”定义为一个单词,则只会修改字符串的前两个字符。如果我使用ax-rax而不是ax-rax呢?我也可以只改变前两个字符,这样我就可以对所有的字符串进行循环,我的问题是,我甚至不能做这两个字符,因为我不能把这个变量放在ax中而不出错。。。