Меню сайта

Урок 128. Синус угла

Последний пример использованиясопроцессора 8087 — вычисление
— — — синуса угла. — У сопроцессора 8087 нет команды вычисления функции
— — — SIN- самое большее, что он может — этовыполнить команду FPTAN,
— — — нахождение частичного тангенса. — Чтобы выполнить операцию SIN,
— — — воспользуемся этой командой, а такжекомандой FPREM (частичный
— — — остаток).

— — — — — Программа, вычисляющая SIN, показана наФиг. 7.27. — Эта
— — — программа вычисляет и печатает синусыуглов от 1/2 до 6 с шагом 1/2
— — — радиана. -Выдача программы аналогична выдаче следующей программы на
— — — языке Бейсик:

— — — — — 10 -FOR X = .5 TO 6.0 STEP .5
— — — — — 20 -PRINT SIN(X)
— — — — — 30 -NEXT X

— — — — — Для печати результатов используетсяподпрограмма на Фиг. 7.25.

— — — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — 1/1/80 04:05:01
— — — — — — — — — — -Фиг. 7.27 Вычисление синуса угла — — — — — — — — — — — — — — — -Page — — — -1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — PAGE — — -,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — TITLE — -Фиг. 7.27 Вычисление синуса угла

— — — — — — — — — — — 0000 — — — — — — — — — — — — — — — — — — — STACK — -SEGMENT STACK
— — — — — — — — — — — 0000 — 0040[ — — — — — — — — — — — — — — — — — — DW — — — — -64 DUP (?)
— — — — — — — — — — — — — — — — — — ????
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — ]

— — — — — — — — — — — 0080 — — — — — — — — — — — — — — — — — — — STACK — -ENDS
— — — — — — — — — — — 0000 — — — — — — — — — — — — — — — — — — — CODE — — -SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ASSUME -CS:CODE,DS:CODE,ES:CODE
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — EXTRN — -FLOAT_ASCII:NEAR
— — — — — — — — — — — 0000 — 0001 — — — — — — — — — — — — — NUM_ANGLE — — — — — — DW — — — — — 1
— — — — — — — — — — — 0002 — 0002 — — — — — — — — — — — — — DEN_ANGLE — — — — — — DW — — — — — 2
— — — — — — — — — — — 0004 — ???? — — — — — — — — — — — — — STATUS -DW — — — — — ?
— — — — — — — — — — — 0006 — 0004 — — — — — — — — — — — — — FOUR — — -DW — — — — — 4
— — — — — — — — — — — = 0040 — — — — — — — — — — — — — — — — — — — — — — -C3 — — — — — EQU — — — — 40H
— — — — — — — — — — — = 0004 — — — — — — — — — — — — — — — — — — — — — — -C2 — — — — — EQU — — — — 04H
— — — — — — — — — — — = 0002 — — — — — — — — — — — — — — — — — — — — — — -C1 — — — — — EQU — — — — 02H
— — — — — — — — — — — = 0001 — — — — — — — — — — — — — — — — — — — — — — -C0 — — — — -EQU — — — — 01H
— — — — — — — — — — — 0008 — 93 A3 AE AB 20 E1 AB — — — -ERROR_MSG — — — — — — DB — — — — — ‘Угол слишком большой’, 10, 13, ‘$’
— — — — — — — — — — — — — — — — A8 E8 AA AE AC 20 A1
— — — — — — — — — — — — — — — — AE AB EC E8 AE A9 0A
— — — — — — — — — — — — — — — — 0D 24
— — — — — — — — — — — 001F — — — — — — — — — — — — — — — — — — — SIN — — — -PROC — — — FAR
— — — — — — — — — — — 001F — 1E — — — — — — — — — — — — — — — — — — — — — PUSH — — -DS
— — — — — — — — — — — 0020 — 2B C0 — — — — — — — — — — — — — — — — — — SUB — — — -AX, AX
— — — — — — — — — — — 0022 — 50 — — — — — — — — — — — — — — — — — — — — — PUSH — — -AX
— — — — — — — — — — — 0023 — 8C C8 — — — — — — — — — -&nbs
p- — — — — — — — MOV — — — -AX, CS
— — — — — — — — — — — 0025 — 8E D8 — — — — — — — — — — — — — — — — — — MOV — — — -DS, AX
— — — — — — — — — — — 0027 — 8E C0 — — — — — — — — — — — — — — — — — — MOV — — — -ES, AX
— — — — — — — — — — — 0029 — — — — — — — — — — — — — — — — — — — DO_AGAIN:
— — — — — — — — — — — 0029 — 9B DB E3 — — — — — — — — — — — — — — — — — — — — — FINIT — — — — — — — — — — — — — — — — — ——ST(0)————ST(1)——
— — — — — — — — — — — 002C — 9B DF 06 0000 R — — — — — — — — — — — — — — FILD — — -NUM_ANGLE — — — — — — — — — — — — — — — —
— — — — — — — — — — — 0031 — 9B DE 36 0002 R — — — — — — — — — — — — — — FIDIV — -DEN_ANGLE — — — — — — — X = Угол — — — — — —

— — — — — — — — — — — -Фиг. 7.27 (a) Процедура SIN (начало)
— — — — — — — — — — — 0036 — 9B D9 EB — — — — — — — — — — — — — — — — — — — — — FLDPI — — — — — — — — — — — — — — — — — — PI — — — — — — — X
— — — — — — — — — — — 0039 — 9B DE 36 0006 R — — — — — — — — — — — — — — FIDIV — -FOUR — — — — — — — — — — — PI/4 — — — — — — — — — — — X
— — — — — — — — — — — 003E — 9B D9 C9 — — — — — — — — — — — — — — — — — — — — — FXCH — — — — — — — — — — — — — X — — — — — — — — PI/4
— — — — — — — — — — — 0041 — 9B D9 F8 — — — — — — — — — — — — — — — — — — — — — FPREM — — — — — — — — — — — — — — — — — — R — — — — — — — — PI/4
— — — — — — — — — — — 0044 — 9B DD 3E 0004 R — — — — — — — — — — — — — — FSTSW — -STATUS
— — — — — — — — — — — 0049 — 9B — — — — — — — — — — — — — — — — — — — — — FWAIT
— — — — — — — — — — — 004A — 8A 26 0005 R — — — — — — — — — — — — — — — — — MOV — — — -AH, BYTE PTR STATUS+1
— — — — — — — — — — — 004E — F6 C4 04 — — — — — — — — — — — — — — — — — — — — — TEST — — -AH, C2
— — — — — — — — — — — 0051 — 75 55 — — — — — — — — — — — — — — — — — — JNZ — — — -BIG_ANGLE
— — — — — — — — — — — 0053 — F6 C4 02 — — — — — — — — — — — — — — — — — — — — — TEST — — -AH, C1 — — — — — — — — — Определяется, необходимо ли вычитание PI/4
— — — — — — — — — — — 0056 — 74 05 — — — — — — — — — — — — — — — — — — JZ — — — — -DO_R — — — — — — — — — — — Если 0, то не необходимо вычитание PI/4
— — — — — — — — — — — 0058 — 9B DE E1 — — — — — — — — — — — — — — — — — — — — — FSUBRP -ST(1), ST(0) — — — — A = PI/4-R — — — — ?
— — — — — — — — — — — 005B — EB 06 — — — — — — — — — — — — — — — — — — JMP — — — -SHORT DO_FPTAN
— — — — — — — — — — — 005D — — — — — — — — — — — — — — — — — — — DO_R:
— — — — — — — — — — — 005D — 9B D9 C9 — — — — — — — — — — — — — — — — — — — — — FXCH — — — — — — — — — — — — — PI/4 — — — — — — — — — — — R
— — — — — — — — — — — 0060 — 9B D8 D9 — — — — — — — — — — — — — — — — — — — — — FCOMP — — — — — — — — — — — — — — — — — — R — — — — — — — — ?
— — — — — — — — — — — 0063 — — — — — — — — — — — — — — — — — — — DO_FPTAN:
— — — — — — — — — — — 0063 — 9B D9 F2 — — — — — — — — — — — — — — — — — — — — — FPTAN — — — — — — — — — — — — — — — — — — OPP — — — — — — — — — — — — ADJ — -Где OPP/ADJ=Tan(A)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —— -Опеределение того, что нужно — синус или косинус

— — — — — — — — — — — 0066 — F6 C4 42 — — — — — — — — — — — — — — — — — — — — — TEST — — -AH, C3 or C1
— — — — — — — — — — — 0069 — 7A 03 — — — — — — — — — — — — — — — — — — JPE — — — -DO_SINE
— — — — — — — — — — — 006B — 9B D9 C9 -&nbs
p- — — — — — — — — — — — — — — — — — — — FXCH — — — — — — — — — — — — — ADJ — — — — — — — — — — — — OPP
— — — — — — — — — — — 006E — — — — — — — — — — — — — — — — — — — DO_SINE: — — — — — — — — — — — — — — D — — — — — — — N

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —— -Вычисление N/SQR(N**2 + D**2)
— — — — — — — — — — — 006E — 9B D8 8E 0000 U — — — — — — — — — — — — — — FMUL — — -ST(0) — — — — — — — — — — D**2 — — — — — — — — — — — N
— — — — — — — — — — — 0073 — 9B D9 C9 — — — — — — — — — — — — — — — — — — — — — FXCH — — -ST(1) — — — — — — — — — — N — — — — — — — — D**2
— — — — — — — — — — — 0076 — 9B D9 C0 — — — — — — — — — — — — — — — — — — — — — FLD — — — -ST(0) — — — — — — — — — — N — — — — — — — — N — — — — — — — — D**2
— — — — — — — — — — — 0079 — 9B D8 8E 0000 U — — — — — — — — — — — — — — FMUL — — -ST(0) — — — — — — — — — — N**2 — — — — — — — — — — — N — — — — — — — — — — — — D**2
— — — — — — — — — — — 007E — 9B DC 06 0000 U — — — — — — — — — — — — — — FADD — — -ST(2) — — — — — — — — — — N**2 + D**2 — — — N — — — — — — — — — — — D**2
— — — — — — — — — — — 0083 — 9B D9 FA — — — — — — — — — — — — — — — — — — — — — FSQRT — — — — — — — — — — — — — — — — — — SQR(N2 + D2) — — N — — — — — — — — — — — — D**2
— — — — — — — — — — — 0086 — 9B DE F1 — — — — — — — — — — — — — — — — — — — — — FDIVRP -ST(1) — — — — — — — — — — SIN(X) — — — — — — — -D**2
— — — — — — — — — — — 0089 — 9B D9 C9 — — — — — — — — — — — — — — — — — — — — — FXCH — — -ST(1) — — — — — — — — — — D**2 — — — — — — — — — — — SIN(X)
— — — — — — — — — — — 008C — 9B D8 D9 — — — — — — — — — — — — — — — — — — — — — FCOMP — — — — — — — — — — — — — — — — — — SIN(X) — — — — — — — — ?
— — — — — — — — — — — 008F — F6 C4 01 — — — — — — — — — — — — — — — — — — — — — TEST — — -AH, C0
— — — — — — — — — — — 0092 — 74 03 — — — — — — — — — — — — — — — — — — JZ — — — — -SIGN_OK
— — — — — — — — — — — 0094 — 9B D9 E0 — — — — — — — — — — — — — — — — — — — — — FCHS
— — — — — — — — — — — 0097 — — — — — — — — — — — — — — — — — — — SIGN_OK:
— — — — — — — — — — — 0097 — E8 0000 E — — — — — — — — — — — — — -CALL — — -FLOAT_ASCII
— — — — — — — — — — — 009A — FF 06 0000 R — — — — — — — — — — — — — — — — — INC — — — -NUM_ANGLE
— — — — — — — — — — — 009E — 83 3E 0000 R 0D — — — — — — — — — — — — — — CMP — — — -NUM_ANGLE, 13
— — — — — — — — — — — 00A3 — 77 02 — — — — — — — — — — — — — — — — — — JA — — — — -RETURN_INST
— — — — — — — — — — — 00A5 — EB 82 — — — — — — — — — — — — — — — — — — JMP — — — -DO_AGAIN
— — — — — — — — — — — 00A7 — — — — — — — — — — — — — — — — — — — RETURN_INST:
— — — — — — — — — — — 00A7 — CB — — — — — — — — — — — — — — — — — — — — — RET
— — — — — — — — — — — 00A8 — — — — — — — — — — — — — — — — — — — BIG_ANGLE:
— — — — — — — — — — — 00A8 — 8D 16 0008 R — — — — — — — — — — — — — — — — — LEA — — — -DX, ERROR_MSG
— — — — — — — — — — — 00AC — B4 09 — — — — — — — — — — — — — — — — — — MOV — — — -AH, 9H
— — — — — — — — — — — 00AE — CD 21 — — — — — — — — — — — — — — — — — — INT — — — -21H
— — — — — — — — — — — 00B0 — CB — — — — — — — — — — — — — — — — — — — — — RET
— — — — — — — — — — — 00B1 — — — — — — — — — — — — — — — — — — — SIN — — — -ENDP
— — — — — — — — — — — 00B1 — — — — -&n
bsp- — — — — — — — — — — — — — CODE — — -ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — END — — — -SIN
— — — — — — — — — — — -Фиг. 7.27 (a) Процедура SIN (продолжение)
— — — — — — — — — — — A&gt-SIN
— — — — — — — — — — — -4.79425539E-001
— — — — — — — — — — — -8.41470985E-001
— — — — — — — — — — — -9.97494987E-001
— — — — — — — — — — — -5.98472144E-001
— — — — — — — — — — — -1.41120008E-001
— — — — — — — — — — — -3.50783228E-001
— — — — — — — — — — — -7.56802495E-001
— — — — — — — — — — — -9.77530118E-001
— — — — — — — — — — — -9.58924275E-001
— — — — — — — — — — — -7.05540326E-001
— — — — — — — — — — — -2.79415498E-001
— — — — — — — — — — — -2.15119988E-001

— — — — — — — — — — — -Фиг. 7.27 (b) Вывод процедуры SIN

— — — — — — — — — — — Фиг. 7.27 Вычисление синуса угла

— — — — — В первой части программы происходит ееинициализация для работы
— — — в качестве файла типа .EXE. — Затем сопроцессор 8087 загружает два
— — — целых числа и делит их, формируя исходныйугол. — Это — пример
— — — использования двух целых чисел дляпорождения числа с плавающей
— — — точкой (в данном случае 1/2), что нельзясделать непосредственно с
— — — помощью ассемблера.

— — — — — Как вы помните из тригонометрии, синус -периодическая функция.
— — — То есть функция дает один и тот жерезультат в случае исходных
— — — чисел, различающихся ровно на 2*PI. — Поэтому первой задачей
— — — подпрограммы SIN является замена исходногоугла соответствующим
— — — значением, лежащим в диапазоне

— — — — — 0 &lt-= X &lt- 2*PI

— — — — — В команде FPTAN требуется, чтобы уголнаходился в диапазоне

— — — — — 0 &lt-= X &lt- PI/4

— — — — — Это означает, что даже если угол и меньше2*PI, мы должны
— — — уменьшить его еще, чтобы он удовлетворялограничениям команды
— — — FPTAN. -К счастью, если исходный угол уменьшен до значения,
— — — меньшего PI/4, все еще можно определитьверное значение
— — — тригонометрических функций. — Чтобы это сделать, надо знать, в каком
— — — месте исходного диапазона от 0 до 2*PIнаходился исходный угол.

— — — — — Нужное уменьшение угла выполняет командаFPREM. — Она не только
— — — вычисляет остаток, но и три младших битачастного, определяемого в
— — — течение процесса поиска остатка. — Эти три бита команда записывает в
— — — слово состояния. — Следовательно, хотя мы и уменьшили угол до
— — — значения одной восьмой исходногодиапазона, все же можно определить
— — — октант, в который попадет угол. — Зная его, можно найти формулу
— — — вычисления синуса с помощьютригонометрических преобразований.
— — — Таблица на Фиг. 7.28 показывает связьмежду исходным октантом и
— — — методом вычисления синуса угла. — В таблице предполагается, что
— — — число R — это остаток от уменьшенияисходного угла до значения
— — — меньше PI/4. — Номер октанта появляется в разрядах C3 = C1 = C0
— — — после выполнения команды FPREM.

— — — — — С помощью этой таблицы мы можем определитьформулу вычислений,
— — — применяемую в каждом случае выполненияпрограммы. — После загрузки
— — — значения угла в радианах программазагружает число и делит его на
— — — 4, чтобы использовать в командеFPREM. — В этот момент
— — — «захватывается» словосостояния. — Если процесс поиска остаткане
— — — завершился на этом единственном шаге, этоозначает, что исходный
— — — угол был больше 2**64. — Следовательно, его значение настолько больше
— — — максимально возможного при вычисленияхтригонометрических функций,
— — — что мы отбрасываем это число, как слишкомбольшое. — — — — — Этого не
— — — происходит со значениями, выбранными впримере, но здесь для
— — — иллюстрации введена такая проверка.

— — — — — — — — — — — Октанты
— — — — — -C0 — C3 — — — C1 — — — Диапазон — — — — — -SIN(X) = :
— — — — — ——————————————————
— — — — — — -0 — 0 — — — 0 — — — 0 — — — — PI/4 — SIN(R)
— — — — — — -0 — 0 — — — 1 — -&nb
sp- PI/4 — PI/2 — COS(PI/4-R)
— — — — — — -0 — 1 — — — 0 — — — PI/2 — 3*PI/4 — — — — — COS(R)
— — — — — — -0 — 1 — — — 1 — — — 3*PI/4 — — — — — PI — — — SIN(PI/4-R)
— — — — — — -1 — 0 — — — 0 — — — PI — — — 5*PI/4 — — — — — -SIN(R)
— — — — — — -1 — 0 — — — 1 — — — 5*PI/4 — — — — — 3*PI/2 — — — — — -COS(PI4-R)
— — — — — — -1 — 1 — — — 0 — — — 3*PI/2 — — — — — 7*PI/4 — — — — — -COS(R)
— — — — — — -1 — 1 — — — 1 — — — 7*PI/4 — — — — — 2*PI — -SIN(PI/4-R)

— — — — — — — — — — — — — — — — — (R — остаток, 0&lt-R&lt-PI/4)
— — — — — ——————————————————
— Продолжение в комментариях…

Категория: Программирование на Ассемблере | Дата: 13.03.13

Меню раздела
Блок