我正在开发一个程序,它接受一个人的名字,遍历名称中的每个字符,并使用XOR命令组合每个字符。程序仅清除AL寄存器,而不清除EAX寄存器的其余部分。最后的XOR结果存储在AL寄存器中。
代码:
INCLUDE Irvine32.inc
.data
myName BYTE "Joe Smith",0
tempName BYTE SIZEOF myName DUP(0)
.code
main PROC
mov al,0
mov esi,0
mov ecx,SIZEOF myName
top:
xor al, myName[esi]
inc esi
loop top
call DumpRegs
exit
main ENDP
END main
当我使用名称" Joe Smith"运行程序时,这是我得到的输出:
EAX=768D332B EBX=7EFDE000 ECX=00000000 EDX=00401005
ESI=0000000A EDI=00000000 EBP=0018FF94 ESP=0018FF8C
EIP-004033FA EFL=00000206 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=1
我应该得到这个:
EAX=0000002B EBX=7EFDE000 ECX=00000000 EDX=00405000
ESI=00405009 EDI=00000000 EBP=0018FF94 ESP=0018FF8C
EIP=00401045 EFL=00000206 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=1
我也有其他一些问题。首先,我不确定" Joe Smith"转换为十六进制的0000002B。另外,我不确定我是否正确地将XOR结果存储在AL寄存器中,以便它能够提供正确的输出。非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
OP问我不确定“Joe Smith”如何用十六进制转换为0000002B
。
char ASCII binary hex
----- ----- --------- ---
J 74 0100 1010 4A
o 111 0110 1111 6F
e 101 0110 0101 65
(space) 32 0010 0000 20
S 83 0101 0011 53
m 109 0110 1101 6D
i 105 0110 1001 69
t 116 0111 0100 74
h 104 0110 1000 68
(zero) 0 0000 0000 00 (this was included but has no effect on XOR)
----- --------- ---
XOR = 43 0010 1011 2B
在二进制位值的每一列中,奇数个1
位将产生1
,偶数个1
位将产生0
}。