2016-03-10 2 views
-1

Я пытаюсь изменить массив в сборке, но я не могу успешно это сделать. Программа отлично работала для двойных слов, но теперь не работает для слов. Я проверил его, используя отладчик visual studio. Конечный результат - 98,78,10,00,36, что неверно. Мой код:Обращение к массиву в сборке (masm)

.386 
.model flat,stdcall 
ExitProcess PROTO,dwExitCode:DWORD 
.data 

intarray WORD 10h,20h,36h,78h,98h 

.code 
main PROC 


mov esi,OFFSET intarray 
mov edi,OFFSET intarray 
add edi,SIZEOF intarray 
sub edi,TYPE intarray 
mov ecx,LENGTHOF intarray/2 




L1: 
mov eax,[ESI] 
mov ebx,[EDI] 
mov [EDI],eax 
mov[ESI],ebx 
add esi,TYPE intarray 
sub edi,TYPE intarray 
loop L1 

invoke ExitProcess,0 
main ENDP 
END main 
+0

Попробуйте найти на этом [очень распространенной проблемой] (http://stackoverflow.com/search?q=reverse+array+%5Bassembly%5D). Одна ошибка в вашем коде заключается в том, что вы загружаете/сохраняете слова, но ваш массив - это слова. –

+0

Я ничего не нашел. –

+0

Вот почему я спросил. Я не просто «люблю» задавать вопросы. –

ответ

2

Вы перемещаете DWORDS (4 байта). Слово - 2 байта.

Вы должны получить правильные результаты, изменяя код на что-то вроде:

mov ax,[ESI] 
mov bx,[EDI] 
mov [EDI],ax 
mov [ESI],bx 

Или с одной командой и один регистр меньше:

mov ax,[ESI] 
xchg ax,[EDI] 
mov [ESI],ax 
+0

Почему вы предлагаете 'xchg' с памятью? Он имеет неявный префикс 'lock'. Для этого вам не требуется медленная атомарная read-modify-write, поэтому гораздо быстрее использовать существующий код с отдельными нагрузками/магазинами (нужного размера). –

+2

Он меньше на 6 байт и использует один меньше регистра. Различные последовательности кода имеют разные приложения. – Michael

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