2015-11-13 9 views
0

Эта программа должна сравнивать массив из пяти элементов с минимальными и максимальными значениями для каждого элемента массива. Я не знаю, почему, что, когда я сравниваю массив максимального массива и массив мин я получаю эту ошибкуОшибка MASM: ошибка A2032 Specificed size

1>......\Users\ross\Desktop\chapter6HW.asm(97): error A2032: invalid......\Users\ross\Desktop\chapter6HW.asm(99)r specified size

Вот мой код. Я отметил, где ошибка с ** **.

INCLUDE Irvine32.inc 

.data 
str1 BYTE "Invalid",0 
str2 BYTE "Valid", 0 
str3 BYTE "The PIN under Validation is:",0 
minArr BYTE 5,2,4,1,3 
maxArr BYTE 9,5,8,4,6 

arr1 BYTE 6,4,5,3,5 
arr2 BYTE 1,4,5,3,5 
arr3 BYTE 8,4,5,2,5 
arr4 BYTE 5,4,9,2,6 

.code 
main PROC 
call Clrscr 

mov esi,OFFSET arr1 
call Display 
call Validate_PIN 

cmp eax,0 

je L1 

mov edx,OFFSET str1 
call WriteString 
call Crlf 

L1: 
mov edx,OFFSET str2 
call WriteString 
call Crlf 
call Crlf 

mov esi,OFFSET arr2 

call Display 
call Validate_PIN 

cmp eax,0 
je L2 
mov edx,OFFSET str1 
call WriteString 
call Crlf 

L2: 
mov edx,OFFSET str2 

call WriteString 
call Crlf 
call Crlf 
mov esi,OFFSET arr3 

call Display 

call Validate_PIN 

cmp eax,0 

je l3 

mov edx,OFFSET str1 
call WriteString 
call Crlf 

L3: 
mov edx,OFFSET str2 
call WriteString 
call Crlf 
call Crlf 

mov esi,OFFSET arr4 
call Display 
call Validate_PIN 

cmp eax,0 
je L4 
mov edx,OFFSET str1 
call WriteString 
call Crlf 
L4: 
mov edx,OFFSET str2 
call WriteString 
call Crlf 
call Crlf 
exit 
main ENDP 

Validate_PIN PROC 
mov edi,0 
mov ecx,5 

L1: 
**cmp [esi],minArr[edi]** 
jb L2 
**cmp [esi],maxArr[edi]** 
ja L2 
inc esi 
inc edi 
cmp edi,5 
je L3 
loop L1 
L2: 
mov eax,edi 
inc eax 
jmp L4 
L3: 
mov eax,0 
L4: 
ret 
Validate_PIN ENDP 

Display PROC 
mov edx,OFFSET str3 
call WriteString 
mov ecx,5 
L1: 
mov eax,[esi] 
call WriteDec 
inc esi 
loop L1 
call Crlf 
ret 
Display ENDP 

End main 

ответ

2

Вы не можете сравнить операнд памяти с другим операндом памяти, подобным этому. Вы должны будете использовать регистр в качестве посредника:

mov al,[esi] 
cmp al,minArr[edi] 
jb L2 
cmp al,maxArr[edi] 

Другой потенциальной проблемой является то, что ваша Display процедура не кажется, чтобы сохранить исходное значение esi, которое Validate_PIN опирается на.

+0

Почему? Это потому, что они не одного размера? – riskitall69

+0

Нет. Это потому, что в общем случае вы не можете выполнять операции, где оба источника и адресаты являются операндами памяти. Если у вас есть операнд памяти, тогда другой операнд обычно должен быть регистром или немедленно. – Michael