Сопроцессор - Assembler

Узнай цену своей работы

Формулировка задачи:

Имеется следующее задание:
xor bl,bl  ;обнуляем bx
finit         ;инициализация сопроцессора
fld1         ;ложим на стек 1
fld1         ;ложим на стек 1
fadd        ;складываем 1+1 и на вершине стека будет 2
fsqrt        ;на вершине стека теперь будет 2^1/2
fldpi         ;ложим на стек число пи
fcompp    ;вещественное сравнение с двойным выталкиванием??? это как??? выталкивание==снять со стека?????
fsstw ax  ;эту команду не нашёл в интернете(проверял не описка)
sahf         ;STORE AH REGISTER INTO FLAGS до конца не понимаю как это работает
ja al         ;jump above - до конца не понимаю как это работает
inc bl        ;инкрементация регистра bl
a1:
inc bl        ;инкрементация регистра bl
В конечно итоге значение регистра bl будет равняться 1. Подскажите почуму именно 1? Не могу до конца разобраться с некоторыми командами данного кода
Всетаки в строке 9 должно быть
 fstsw ax

Решение задачи: «Сопроцессор»

textual
Листинг программы
xor bl,bl  ;обнуляем BL
finit         ;инициализация сопроцессора
fld1         ;st(0)=1
fld1         ;st(0)=1 st(1)=1
fadd        ;st(0)=st(0)+st(1)=2 st(1)=1
fsqrt        ;st(0)=1,4142135623730950488016887242097 st(1)=1
fldpi        ;st(0)=3,1415926535897932384626433832795 st(1)=1,4142135623730950488016887242097 st(2)=1
fcompp    ;st(0)>st(1) ? содержимое st(0) и st(1) выталкивается теперь st(0)=1
fstsw ax  ;содержимое регистра состояния в регистр АХ
sahf         ;содержимое из регистра AH в 8 младших битов регистра ЕFLAGS 
ja al         ;если st(0)>st(1) переход на а1 (3,14 > 1,4142)
inc bl        ; <-- этого не происходит
a1:
inc bl

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

Код выполняет следующие действия:

  1. Обнуляет BL.
  2. Инициализирует сопроцессор.
  3. Загружает 1 в ST(0).
  4. Загружает 1 в ST(1).
  5. Выполняет сложение ST(0) и ST(1), результат сохраняется в ST(0).
  6. Вычисляет квадратный корень из ST(0), результат сохраняется в ST(0).
  7. Загружает значение π в ST(0).
  8. Загружает 1,4142135623730950488016887242097 в ST(1).
  9. Выполняет сравнение ST(0) и ST(1), результат сохраняется в ST(0).
  10. Сохраняет содержимое регистра состояния в регистр AX.
  11. Сохраняет содержимое регистра AH в 8 младших битов регистра EFLAGS.
  12. Если ST(0) больше ST(1), то происходит переход на метку a1.
  13. Увеличивает BL на 1. Список действий:
  14. xor bl,bl
  15. finit
  16. fld1
  17. fld1
  18. fadd
  19. fsqrt
  20. fldpi
  21. fcompp
  22. fstsw ax
  23. sahf
  24. ja al
  25. inc bl
  26. a1: inc bl

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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