2013-12-04 4 views
0

Я работаю над этой проблемой сборки, где я просматриваю каждый элемент в array1 и сохраняю индекс этого массива, где запись «F».Переместить значение регистра в массив

Я использую MASM для процессоров Intel x86. Assembly Language

INCLUDE Irvine32.inc 
.data 
array1 BYTE "FMMFMFMMFFMMFFFMFMFM",0 
indexa1 BYTE SIZEOF array1 DUP(?) 
ArraySize = ($ - array1) 

.code 
main PROC 

mov esi,0   ; index 
mov ecx,ArraySize 

L1: cmp esi,ecx   ; check to continue loop 
    jl L2     ; continue 
    jmp L5     ; exit 

L2: cmp array1[esi], "F" ; Check if "F" 
    je L3    ; jump if "F" 
    jmp L4    ; jump to L4 if not "F" 

L3: 
    mov indexa1[ah], esi ; store index number,---- ERROR ---- 
    inc ah 
    jmp L4 

L4: inc esi ; increment loop counter 
    jmp L1 ; jump to beginning 

L5: movzx eax, ah 
    call DumpRegs 

exit  
main ENDP 
END main 

Зачем возникает ошибка при попытке сохранить индекс в indexa1? Ошибка говорит, должен быть индексный или базовый регистр

+0

Можете ли вы указать, какой ассемблер вы используете (MASM, TASM, NASM ...) и что именно точно говорит об ошибке? – m0skit0

+0

Несомненно! MASM для процессоров Intel x86. – coderkid

ответ

2

indexa1[ah] не соответствует действительному режиму адресации на x86. Вместо этого используйте 32-разрядный регистр (например, eax).

См. Рисунок 3-11 в Intel's Software Developer's Manual.

+0

Черт! Я был уверен, что это проблема, но у меня не было времени проверить ее, и я не хотел публиковать ее без подтверждения. :) – Devolus

+0

Спасибо! Мог ли я вместо этого установить указатель на индексный массив, mov edx, OFFSET indexa1; указатель на indexarray, а затем в L3 mov [edx], esi; для хранения индекса inc edx; – coderkid

+0

Несомненно. Фактически, это, вероятно, было бы лучше (так как вы заканчиваете небольшую инструкцию внутри цикла). – Michael

Смежные вопросы