2015-04-27 2 views
2
; 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 - это имя файла, код ошибки MSB3721 в строке 50 столбца 5 (опять же он приводит меня на другую страницу, поэтому я предполагаю, что что-то не так с моей настройкой MASM?). Любая помощь с любым из них?

ответ

3

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

Если вы хотите изменить местоположение памяти, идентифицированное значением в «esi», вы можете захотеть переместить его в регистр перед операцией «xor», так как я не верю, что xor работает с операндами памяти (я мог ошибаться , это было время для меня.)

+1

Для чего это стоит «операнд» имеет в виду входных команд, в вашем случае, то есть «[еси]» и «0», и ассемблер говорит вам, что один из них недействителен для инструкции XOR. –

3

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 

В вашем Display процедуры Вы забыли, что это истинный размер элементов массива.
Изменить этот

mov eax, [esi]     ; Store array in eax 

в

movzx eax, byte ptr [esi] 
Смежные вопросы