Матрица 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;

Объяснение кода листинга программы

В данном коде происходит следующее:

  1. Создается объект f класса TFileStream, который открывает файл C:\Filename LL.dat в режиме чтения.
  2. Читается содержимое файла в переменную LL с помощью метода Read объекта f.
  3. Освобождается память, занимаемая объектом f, вызывая метод Free.
  4. Начинается блок кода на языке Assembler (ASM).
  5. Значение регистра edx очищается (обнуляется) с помощью операции xor edx,edx.
  6. Значение переменной LL загружается в регистр edx с помощью операции mov edx, LL.
  7. Значение регистра dx копируется в переменную x с помощью операции mov x, dx.
  8. Значение регистра edx сдвигается вправо на 16 бит с помощью операции shr edx, 16.
  9. Значение регистра dx копируется в переменную y с помощью операции mov y, dx.
  10. Значение регистра edx восстанавливается из стека с помощью операции pop edx.
  11. Значение регистра edx очищается (обнуляется) с помощью операции xor edx, edx.
  12. Значение переменной x загружается в регистр dx с помощью операции mov dx, x.
  13. Значение регистра dx копируется в переменную XX с помощью операции mov XX, edx.
  14. Значение регистра edx восстанавливается из стека с помощью операции pop edx.
  15. Значение регистра edx очищается (обнуляется) с помощью операции xor edx, edx.
  16. Значение переменной y загружается в регистр dx с помощью операции mov dx, y.
  17. Значение регистра edx копируется в переменную YY с помощью операции mov edx, YY.
  18. Значение регистра edx восстанавливается из стека с помощью операции pop edx.
  19. Блок кода на языке Assembler завершается. Обратите внимание, что значения переменных LL, x, y, XX и YY не предоставлены в тексте кода, поэтому их значения неизвестны.

Оцени полезность:

9   голосов , оценка 3.778 из 5