Матрица a не работает в другой прог - Assembler
Формулировка задачи:
Здравствуйте. В ячейку матрицы a загружаются кординаты точки, первое слово (16 байт) y и смещается в лево, второе слово x. Матрица a при переводе из одной прог. в другую не работает. Если загрузить одни 0, то отработает или вместо загрузки mov dx,x , загружать в два слова т.е. mov edx,x то тоже отработает в другой прог. Если матрицу a, с загрузкой в одно слово т.е. оставить в старой прог. то она будет работать. Заранее благодарю.
mov dx,y
shl edx,16
mov dx,x
push ecx
xor ecx,ecx
mov ecx,countA
push eax
xor eax,eax
lea eax,a
mov [eax+4*ecx],edx
pop eaxРешение задачи: «Матрица a не работает в другой прог»
textual
Листинг программы
f:=TFileStream.Create('C:\Filename LL.dat',fmOpenRead);
f.Read(LL, sizeOf(LL));
f.Free;
asm
push edx
xor edx,edx
mov edx,LL
mov x,dx
shr edx,16
mov y,dx
pop edx
push edx
xor edx,edx
mov dx,x
mov XX,edx
pop edx
push edx
xor edx,edx
mov dx,y
mov edx,YY
pop edx
end;
Объяснение кода листинга программы
В данном коде происходит следующее:
- Создается объект
fклассаTFileStream, который открывает файлC:\Filename LL.datв режиме чтения. - Читается содержимое файла в переменную
LLс помощью методаReadобъектаf. - Освобождается память, занимаемая объектом
f, вызывая методFree. - Начинается блок кода на языке Assembler (ASM).
- Значение регистра
edxочищается (обнуляется) с помощью операцииxor edx,edx. - Значение переменной
LLзагружается в регистрedxс помощью операцииmov edx, LL. - Значение регистра
dxкопируется в переменнуюxс помощью операцииmov x, dx. - Значение регистра
edxсдвигается вправо на 16 бит с помощью операцииshr edx, 16. - Значение регистра
dxкопируется в переменнуюyс помощью операцииmov y, dx. - Значение регистра
edxвосстанавливается из стека с помощью операцииpop edx. - Значение регистра
edxочищается (обнуляется) с помощью операцииxor edx, edx. - Значение переменной
xзагружается в регистрdxс помощью операцииmov dx, x. - Значение регистра
dxкопируется в переменнуюXXс помощью операцииmov XX, edx. - Значение регистра
edxвосстанавливается из стека с помощью операцииpop edx. - Значение регистра
edxочищается (обнуляется) с помощью операцииxor edx, edx. - Значение переменной
yзагружается в регистрdxс помощью операцииmov dx, y. - Значение регистра
edxкопируется в переменнуюYYс помощью операцииmov edx, YY. - Значение регистра
edxвосстанавливается из стека с помощью операцииpop edx. - Блок кода на языке Assembler завершается.
Обратите внимание, что значения переменных
LL,x,y,XXиYYне предоставлены в тексте кода, поэтому их значения неизвестны.