Memory 异或指令未按预期工作(英特尔8086)

Memory 异或指令未按预期工作(英特尔8086),memory,assembly,reverse-engineering,intel,xor,Memory,Assembly,Reverse Engineering,Intel,Xor,我正在研究我感兴趣的一个课题,逆向工程。但是我遇到了一个小小的减速带。我知道按位运算符xor以及它对位的作用,但当我在反汇编程序中观察它的过程时,它似乎工作不正常。我正在处理的一小段代码是: MOV EAX, 0040305D XOR DWORD PTR [EAX], 1234567 在异或发生之前,驻留在位置0040305D的数字是1234或31323334十六进制(它表示为ASCII,因为它是从用户输入中获取的,并且在内存中固定为31323334)。当我在互联网上查找一个异或计算器,以确保

我正在研究我感兴趣的一个课题,逆向工程。但是我遇到了一个小小的减速带。我知道按位运算符xor以及它对位的作用,但当我在反汇编程序中观察它的过程时,它似乎工作不正常。我正在处理的一小段代码是:

MOV EAX, 0040305D
XOR DWORD PTR [EAX], 1234567
在异或发生之前,驻留在位置0040305D的数字是1234或31323334十六进制(它表示为ASCII,因为它是从用户输入中获取的,并且在内存中固定为31323334)。当我在互联网上查找一个异或计算器,以确保我在纸上做的一切正常时,我得到的异或计算结果是3017653十六进制。但当我在反汇编程序中运行该操作时,它将EAX中保存的内存位置替换为56771035

刚才发生了什么事?我是不是遗漏了什么?我在许多计算器上检查了xor计算,但我无法得到56771035的答案。有人能帮我一下,告诉我我做错了什么吗


-Dan

显示的数字都是十六进制,您忘记了使用正确的尾数。如果用户输入为ascii
1234
,则表示内存包含字节
31323334
。因为x86是小尾数,所以操作数
1234567
是字节序列
67 45 23 01
。执行异或操作,我们得到了字节序列,这就是你看到的。

我看到的唯一解释是地址上的值不是31323334。肯定还有其他原因。假设1234567的值是十六进制的,而原来的dword值是31323334h,那么你的3017653似乎是正确的。请告诉我,正是+1ah!非常感谢。这个小小的endian很难习惯,但经过挫折,我会开始这样想。再次感谢你@Jester等了一个很快的问题,为什么他们要在xor指令中计算小端点?67452301与十六进制的1234567单独比较时有所不同。我以为英特尔只是将信息存储在little endian中,而不是按该顺序计算位运算符。数字不一样。你能帮我照一下吗?反汇编程序为你显示了
1234567
,但实际上它是作为字节序列存储和使用的
67 45 23 01
。或者,您可以转换所有其他数字
1234
然后是
34333231
,结果是
35107756
,它将以字节序列
56 77 10 35
@Jester的形式存储在内存中,所以实际上十六进制数是1234567,但计算机使用它作为67452301,对吗?它都是一样的,只是它的显示方式不同。