; This program checks for even or odd parities inside of an array. Displays 1 if even or 0 if odd.
Include Irvine32.inc
TRUE = 1
FALSE = 0
.data
str1 BYTE "Even Parity", 0
str2 BYTE "Odd Parity", 0
str3 BYTE "The block of data under checking is: ", 0
array1 BYTE 1,0,1,0,0,0,1,0,0,1
array2 BYTE 1,0,0,0,0,0,1,0,0,1
; declares two 10-bit arrays
.code
main proc
call Clrscr ; Clears the screen
mov esi, OFFSET array1 ; Pass address
mov ecx, LENGTHOF array1 ; Pass length
call Display ; Display on Console
call Parity_Check
cmp eax,0
je L1 ; if EAX = 0 then odd
mov edx, OFFSET str1
call WriteString ; Write str1
call Crlf
L1:
mov edx, OFFSET str2
Call WriteString ; Write str2
call Crlf
call Crlf ; Check if array2 is even or odd
mov esi, OFFSET array2 ; Pass Address
mov ecx, LENGTHOF array2 ; Pass length
call Display ; Display on console
call Parity_Check
cmp eax, 0
je L2 ; if eax = 0 then odd
mov edx, OFFSET str1
call WriteString ;Write str1
call Crlf
L2:
mov edx, OFFSET str2
call WriteString ; Write str2
call Crlf
call Crlf
invoke ExitProcess,0
main endp
Parity_Check PROC USES eax ecx esi edi ;Returns 1 if even 0 if odd
mov edi, 0 ; array pointer 0
L1:
xor [esi], 0 ; Xor data bits
inc esi ; points to next bit
loop L1 ; continue loop
jpe L2 ; jumps to L2 if even
jpo L3 ; jumps to L3 if odd
L2:
mov eax, TRUE ; copies 1(true) to eax
jmp L4
L3:
mov eax, FALSE ; copies 0(false) to eax
L4:
ret
Parity_Check ENDP
Display PROC USES esi ecx edx ; Displays array elements
mov edx, OFFSET str3
call WriteString ; Writes str3
L1:
mov eax, [esi] ; Store array in eax
call WriteDec ; Write EAX
inc esi ; Point to next item in array
loop L1 ; Continue Traversing
call Crlf
ret
Display endp
end main
我无法弄清楚为什么我的XOR和masm.target(文件)错误导致错误。 XOR说“无效指令操作数”,而masm.targets错误将我带到该文件。
masm.targets是文件名,错误代码是第50行第5列的MSB3721(再次将它带到另一页,所以我假设我的MASM设置有问题?)。对这些中的任何一个有任何帮助吗?
答案 0 :(得分:4)
array1 BYTE 1,0,1,0,0,0,1,0,0,1
array2 BYTE 1,0,0,0,0,0,1,0,0,1
;声明两个10位数组
您实际上已经声明了2个10 字节的数组。
xor [esi], 0 ; Xor data bits
MASM会抱怨不知道此xor
操作的大小。只需将其写为xor byte ptr [esi], 0
jpe L2 ; jumps to L2 if even
jpo L3 ; jumps to L3 if odd
这两个与奇偶校验相关的跳转都将基于增加ESI中地址的奇偶校验。它们不反映您在测试数组中的字节时获得的任何奇偶校验值! 这是一个例行程序:
Parity_Check PROC USES eax ecx esi ;Returns 1 if even, 0 if odd
mov al, 0
L1:
add al, [esi]
inc esi ; points to next byte
loop L1 ; continue loop
test al, 1
jnz L3 ; jumps to L3 if odd
L2:
mov eax, TRUE ; copies 1(true) to eax
jmp L4
L3:
mov eax, FALSE ; copies 0(false) to eax
L4:
ret
Parity_Check ENDP
在显示过程中,您忘记了数组元素的真实大小 改变这个
mov eax, [esi] ; Store array in eax
到
movzx eax, byte ptr [esi]
答案 1 :(得分:3)
您正在使用将[esi]视为参考的符号,您可能打算做的是xor esi, 0
- 但即便如此,这样的操作并不具有实际意义(esi)将保持不变。)
如果您打算修改由' esi'中的值标识的内存位置。您可能需要考虑在“xor”之前将其移至寄存器中。操作,因为我不相信xor操作内存操作数(我可能会弄错,对我来说已经有一段时间了。)