Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Микропроцессор 486 / INTEL486 / CH20
.TXT `¬`¤ѓ« ў 20. ЏаЁ¬Ґал ўлзЁб«ЁвҐ«м®Ј® Їа®Ја ¬¬Ёа®ў Ёп`*
--------------------------------------------------------------------------
‚ б«Ґ¤го饬 а §¤Ґ«Ґ ЇаЁўҐ¤Ґл ЇаЁ¬Ґал Їа®Ја ¬¬ ўлзЁб«ЁвҐ«м®Ј® е а ЄвҐа
¤«п Їа®жҐбб®а i486, ЇЁб лҐ бᥬЎ«ҐаҐ ASM386/486. ќвЁ ЇаЁ¬Ґал
Ё««обваЁагов ҐЄ®в®алҐ Ї®«Ґ§лҐ ЇаЁҐ¬л ¤«п а §а Ў®вЄЁ ўлзЁб«ЁвҐ«мле
Їа®Ја ¬¬ле Їа®¤гЄв®ў Ё бЁб⥬ ®б®ўҐ Їа®жҐбб®а i486.
`¤`Є20.1 ЏаЁ¬Ґа гб«®ў®Ј® ўҐвў«ҐЁп`*
Љ Є 㦥 ®Ўб㦤 «®бм ў ѓ« ўҐ 15, а §«ЁзлҐ зЁб«®ўлҐ Є®¬ ¤л ў®§¤Ґ©бвўгов
ЎЁвл Є®¤ гб«®ўЁп б«®ў б®бв®пЁп ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩
в®зЄ®©, е®вп бгйҐбвўгҐв ¬®¦Ґбвў® бЇ®б®Ў®ў ¤«п в®Ј®, зв®Ўл ॠ«Ё§®ў вм
гб«®ў®Ґ ўҐвў«ҐЁҐ, б«Ґ¤го饥 § ба ўҐЁҐ¬. „ «ҐҐ ЇаЁўҐ¤Ґ ®б®ў®©
Ї®¤е®¤:
- ‚лЇ®«Ёвм ба ўҐЁҐ.
- ‘®еа Ёвм б«®ў® б®бв®пЁп. (‘«®ў® б®бв®пЁп ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б
Ї« ў о饩 в®зЄ®© ¬®¦® б®еа Ёвм Їаאַ ў ॣЁбвॠAX.)
- Џа®ўҐаЁвм ЎЁвл Є®¤ гб«®ўЁп.
- ЏҐаҐ©вЁ Ї® १г«мв вг.
Ќ ђЁбгЄҐ 20-1 ЇаҐ¤бв ў«Ґ да Ј¬Ґв Їа®Ја ¬¬л, Є®в®ал© Ё««обваЁагҐв, Є Є
¬®¦® ба ўЁвм ¤ў 室пйЁҐбп ў Ї ¬пвЁ ўҐйҐбвўҐлҐ зЁб« ¤ў®©®Ј®
д®а¬ в (Ї®¤®Ў п Їа®Ја ¬¬ ¬®¦Ґв Ўлвм ЁбЇ®«м§®ў б Є®¬ ¤®© FTST).
—Ёб« , Є®в®алҐ ба ўЁў овбп ў н⮬ да Ј¬ҐвҐ, §ў л A Ё B. ЋЇҐа жЁп
ба ўҐЁп вॡгҐв § Јаг§ЄЁ зЁб« A ў ўҐаиЁг ॣЁбва®ў®Ј® б⥪ ¬®¤г«п
®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®©, § ⥬ ба ўҐЁп ҐЈ® б зЁб«®¬ B,
ўлЇ®«пп ЇаЁ н⮬ ®ЇҐа жЁо ў®ббв ®ў«ҐЁп Ё§ б⥪ . Џ®б«Ґ 祣® б«®ў®
б®бв®пЁп § ЇЁблў Ґвбп ў ॣЁбва AX. A Ё B Ё¬Ґов зҐвлॠў®§¬®¦ле
Ї®ап¤Є , ЎЁвл C3, C2 Ё C0 Є®¤ гб«®ўЁп гЄ §лў ов, Є Є®© Ё§ нвЁе Ї®ап¤Є®ў
гбв ®ў«Ґ. ’аЁ ЎЁв а бЇ®« Ј овбп ў ўҐа奬 Ў ©вҐ б«®ў б®бв®пЁп ¬®¤г«п
®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®© в Є, зв®Ўл ᮮ⢥вбвў®ў вм д« Ј ¬
г«п, зҐв®бвЁ Ё ЇҐаҐ®б (ZF, PF Ё CF), Є®Ј¤ Ў ©в § ЇЁблў Ґвбп ў® д« ЈЁ.
‚® да Ј¬ҐвҐ Їа®Ја ¬¬л д« ЈЁ ZF, PF Ё CF ॣЁбва EFLAGS гбв ў«Ёў овбп ў
§ зҐЁп ЎЁв®ў C3, C2 Ё C0 б«®ў б®бв®пЁп, § ⥬ ЁбЇ®«м§гҐвбп ®ЇҐа жЁп
гб«®ў®Ј® ЇҐаҐе®¤ ¤«п в®Ј®, зв®Ўл Їа®ўҐаЁвм д« ЈЁ. ђҐ§г«мвЁагой п
Їа®Ја ¬¬ ®зҐм Є®¬Ї Єв Ё § ЇЁблў Ґвбп ўбҐЈ® «Ёим ў бҐ¬м Є®¬ ¤.
Љ®¬ ¤ FXAM ®Ў®ў«пҐв ўбҐ зҐвлॠЎЁв Є®¤ гб«®ўЁп. Ќ ђЁбгЄҐ 20-2
Ї®Є § ®, Є Є в Ў«Ёж ЇҐаҐе®¤®ў ¬®¦Ґв Ўлвм ЁбЇ®«м§®ў ¤«п в®Ј®, зв®Ўл
®ЇаҐ¤Ґ«Ёвм е а ЄвҐа Їа®б¬®ваҐле ўҐ«ЁзЁ. ’ Ў«Ёж ЇҐаҐе®¤®ў (FXAM_TBL)
ᮤҐа¦Ёв 16 ¬Ґв®Є, Ї® ®¤®© ¤«п Є ¦¤®Ј® ў®§¬®¦®Ј® Є®¤ гб«®ўЁп. ЋЎа вЁвҐ
ўЁ¬ ЁҐ, зв® зҐвлॠ§ 票п ᮤҐа¦ в ®¤® Ё ⮦Ґ - "EMPTY" (Їгбв®).
ЏҐаўлҐ ¤ў § зҐЁп Є®¤ гб«®ўЁп ᮮ⢥вбвўгов Ї®§ЁжЁЁ "EMPTY". „ў ¤агЈЁҐ
§ зҐЁп ў в Ў«ЁжҐ, Є®в®алҐ б®¤Ґа¦ в "EMPTY", ЁЄ®Ј¤ Ґ Ўг¤гв
ЁбЇ®«м§®ў л Їа®жҐбб®а®¬ i486 Ё«Ё ¬ ⥬ вЁзҐбЄЁ¬ б®Їа®жҐбб®а®¬ 387(TM), ®
¬®Јгв Ўлвм ЁбЇ®«м§®ў л ЇаЁ ўлЇ®«ҐЁЁ Їа®Ја ¬¬л б®Їа®жҐбб®аҐ 80287.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і . і
і A DQ ? і
і B DQ ? і
і . і
і . і
і FLD A ; ‡ Јаг¦ Ґв A ў ўҐаиЁг б⥪ FPU і
і FCOMP B ; ‘а ўҐЁҐ A:B, ўлв «ЄЁў ЁҐ A і
і FSTSW AX ; ‘®еа пҐв १г«мв в ў ॣЁбвॠAX і
і ; і
і ; Љ®¤л гб«®ўЁп ᮤҐа¦ вбп ў ॣЁбвॠ–Џ“ AX і
і ; (ђҐ§г«мв вл ба ўҐЁп) і
і ; ‡ Јаг§Є Є®¤®ў гб«®ўЁп ў® д« ЈЁ і
і ; і
і SAHF і
і ; і
і ; €бЇ®«м§гҐв гб«®ўлҐ ЇҐаҐе®¤л ¤«п в®Ј®, зв®Ўл і
і ; ®ЇаҐ¤Ґ«Ёвм Є Є гЇ®а冷зҐл A Ё B і
і ; і
і JP A_B_UNORDERED ; ’ҐбвЁа®ў ЁҐ ЎЁв C2 (PF) і
і JB A_LESS ; ’ҐбвЁа®ў ЁҐ ЎЁв C0 (CF) і
і JE A_EQUAL ; ’ҐбвЁа®ў ЁҐ ЎЁв C3 (ZF) і
і A_GREATHER: ; C0 (CF) = 0, C3 (ZF) = 0 і
і . і
і . і
і A_EQUAL: ; C0 (CF) = 0, C3 (ZF) = 1 і
і . і
і . і
і A_LESS: ; C0 (CF) = 1, C3 (ZF) = 0 і
і . і
і . і
і A_UNORDERED: ; C2 (PF) = 1 і
і . і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-1. “б«®ў®Ґ ‚Ґвў«ҐЁҐ ЇаЁ ‘а ўҐЁЁ
”а Ј¬Ґв Їа®Ја ¬¬л ўлЇ®«пҐв Є®¬ ¤г FXAM Ё б®еа пҐв б«®ў® б®бв®пЁп.
‡ ⥬ Ё¤Ґв ¬ ЁЇг«пжЁп ЎЁв ¬Ё Є®¤ гб«®ўЁп ¤«п ®Є®з ⥫쮣® ўлў®¤ зЁб«
ў ॣЁбва AX, Є®в®а®Ґ а ў® Є®¤г гб«®ўЁп, 㬮¦Ґ®¬г 2. ЏаЁ н⮬
ўЄ«оз Ґвбп ®Ўг«ҐЁҐ ҐЁбЇ®«м§гҐ¬ле ЎЁв®ў ў Ў ©вҐ, Є®в®ал© б®¤Ґа¦Ёв Є®¤,
Їа®Ёб室Ёв б¤ўЁЈ ЎЁв C3 ўЇа ў® в Є, зв®Ўл ® Ўл« б®бҐ¤Ё¬ б ЎЁв®¬ C2, Ё
§ ⥬ Їа®Ёб室Ёв б¤ўЁЈ Є®¤ ¤«п в®Ј®, зв®Ўл 㬮¦Ёвм ҐЈ® 2. Џ®«г祮Ґ
§ 票Ґ ЁбЇ®«м§гҐвбп Є Є Ё¤ҐЄб, Ї® Є®в®а®¬г ўлЎЁа Ґвбп ®¤ Ё§ ¬Ґв®Є Ё§
в Ў«Ёжл ЇҐаҐе®¤®ў FXAM TBL (㬮¦ҐЁҐ Є®¤ гб«®ўЁп вॡгҐвбп Ё§-§ 2-е
Ў ©в®© ¤«Ёл Є ¦¤®Ј® § зҐЁп ў в Ў«ЁжҐ). Љ®¬ ¤ ЎҐ§гб«®ў®Ј® ЇҐаҐе®¤
JMP Їа ў«пҐв Їа®жҐбб®а зҐаҐ§ в Ў«Ёжг ЇҐаҐе®¤®ў Є Їа®жҐ¤гаҐ, Є®в®а п
ᮤҐа¦Ёв Їа®Ја ¬¬г (Ґ Ї®Є § го ў ЇаЁ¬ҐаҐ) ¤«п ®Ўа Ў®вЄЁ Є ¦¤®Ј®
ў®§¬®¦®Ј® १г«мв в Є ¬ ¤л FXAM.
`¤`Є20.2 ЏаЁ¬Ґал ®Ўа Ў®вЄЁ ЁбЄ«о票©`*
‘гйҐбвўгҐв ¬®¦Ґбвў® Ї®¤е®¤®ў ¤«п ЇЁб Ёп ®Ўа Ў®взЁЄ®ў ЁбЄ«озЁвҐ«мле
бЁвг жЁ©. Ћ¤Ё Ї®«Ґ§л© ЇаЁҐ¬ - н⮠ᤥ« вм Їа®жҐ¤гаг ®Ўа Ў®вЄЁ
ЁбЄ«оз票© Ё§ ваҐе з б⥩: "Їа®«®Ј ", "⥫ " Ё "нЇЁ«®Ј ". ќв Їа®жҐ¤га
ўл§лў Ґвбп зҐаҐ§ ЇаҐалў ЁҐ ®¬Ґа 16.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і ; ’ Ў«Ёж ЇҐаҐе®¤®ў ¤«п Їа®жҐ¤гал Їа®ўҐаЄЁ і
і ; і
і FXAM_TBL DD POS_UNNORM, POS_NAN, NEG_UNNORM, NEG_NAN, і
і & POS_NORM, POS_INFINITY, NEG_NORM, і
і & NEG_INFINITY, POS_ZERO, EMPTY, NEG_ZERO, і
і & EMPTY, POS_DENORM, EMPTY, NEG_DENORM, EMPTY і
і . і
і . і
і ; Џа®ўҐаЁвм ST Ё б®еа Ёвм १г«мв в (Є®¤л гб«®ўЁп) і
і ; і
і FXAM і
і XOR EAX, EAX ; ЋзЁбвЁвм ॣЁбва EAX і
і FSTSW AX і
і ; і
і ; ‚лзЁб«ҐЁҐ б¬ҐйҐЁп ў в Ў«ЁжҐ ЇҐаҐе®¤®ў і
і ; і
і AND AX, 0100011100000000B ; ЋзЁбвЁвм ўбҐ ЎЁвл і
і ; Єа®¬Ґ C3, C2-C0 і
і SHR EAX, 6 ; ‘¤ўЁгвм C2-C0 Є Є (000XXX00) і
і SAL AH, 5 ; “бв ®ўЁвм C3 Є Є (00X00000) і
і OR AL, AH ; ‘«Ёвм C3 Ё C2-C0 (00XXXX00) і
і XOR AH, AH ; “¤ «Ёвм бв аго Є®ЇЁо C3 і
і ; і
і ; ЏҐаҐ©вЁ Є Їа®жҐ¤гॠЇ® Є®¤г гб«®ўЁп і
і ; і
і JMP FXAM_TBL[EAX] і
і ; і
і ; ЊҐвЄЁ в Ў«Ёжл ЇҐаҐе®¤ , Ї® ®¤®© ¤«п ®Ўа Ў®вЄЁ і
і ; Є ¦¤®Ј® ў®§¬®¦®Ј® १г«мв в FXAM і
і ; і
і POS_UNNORM: і
і . і
і POS_NAN: і
і . і
і NEG_UNNORM: і
і . і
і NEG_NAN: і
і . і
і POS_NORM: і
і . і
і POS_INFINITY: і
і . і
і NEG_NORM: і
і . і
і NEG_INFINITY: і
і . і
і POS_ZERO: і
і . і
і EMPTY: і
і . і
і NEG_ZERO: і
і . і
і POS_DENORM: і
і . і
і NEG_DENORM: і
і . і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-2. “б«®ў®Ґ ‚Ґвў«ҐЁҐ ЇаЁ ЋЇҐа жЁЁ FXAM
ЏаЁ ЇҐаҐ¤ зҐ гЇа ў«ҐЁп Їа®жҐ¤гаг ®Ўа Ў®вЄЁ ЁбЄ«о票п, ўбҐ ЇаҐалў Ёп
§ ЇаҐй овбп ЇЇ а вл¬ бЇ®б®Ў®¬. Џа®«®Ј ўлЇ®«пҐв ўбҐ дгЄжЁЁ, Є®в®алҐ
¤®«¦л Ўлвм § йЁйҐл ®в ў®§¬®¦®Ј® ЇаҐалў Ёп Ў®«ҐҐ ўлб®ЄЁ¬ ЇаЁ®аЁвҐв®¬.
ЋЎлз® нв® б®еа ҐЁҐ ॣЁбва®ў Ё ЇҐаҐ¤ з ¤Ё Ј®бвЁзҐбЄ®© Ёд®а¬ жЁЁ Ё§
¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў ой© в®зЄ®© ў Ї ¬пвм. Љ®Ј¤ ЄаЁвЁзҐбЄЁ©
Їа®жҐбб Ўг¤Ґв § ўҐаиҐ, Їа®«®Ј ¬®¦Ґв а §аҐиЁвм ЇаҐалў Ёп ¤«п в®Ј®, зв®Ўл
Ї®§ў®«Ёвм ®Ўа Ў®взЁЄ ¬ ЇаҐалў Ё© б Ў®«ҐҐ ўлб®ЄЁ¬ ЇаЁ®аЁвҐв®¬ ўлЇ®«Ёвмбп
а миҐ ®Ўа Ў®взЁЄ ЁбЄ«о票п.
’Ґ«® ®Ўа Ў®взЁЄ ЁбЄ«озҐЁп Їа®б¬ ваЁў Ґв ¤Ё Ј®бвЁзҐбЄго Ёд®а¬ жЁо Ё
ॠЈЁагҐв в®, зв® Ґ®Ўе®¤Ё¬® б в®зЄЁ §аҐЁп Їа®Ја ¬¬®Ј® Їа®¤гЄв . ќв
ॠЄжЁп ¬®¦Ґв Ё¬Ґвм ¤Ё Ї §® ®в ЇаҐалў Ёп ўлЇ®«ҐЁп ¤«п в®Ј®, зв®Ўл
ўл¤ вм б®®ЎйҐЁҐ, ¤® Ї®ЇлвЄЁ г« ¤Ёвм ҐЇ®« ¤Єг Ё Їа®¤®«¦Ёвм ®а¬ «м®Ґ
ўлЇ®«ҐЁҐ.
ќЇЁ«®Ј, б®Ўб⢥®, ўлЇ®«пҐв ¤Ґ©бвўЁп ®Ўа влҐ Їа®«®Јг, ў®§ўа й п
Їа®жҐбб®а ў б®бв®пЁҐ, ЇаЁ Є®в®а®¬ ¬®¦® Ўл«® Ўл ў®§®Ў®ўЁвм ®а¬ «м®Ґ
ўлЇ®«ҐЁҐ. ќЇЁ«®Ј Ґ ¤®«¦Ґ § Јаг¦ вм Ґ¬ бЄЁа®ў л© д« Ј ЁбЄ«озҐЁп ў
¬®¤г«м ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®© Ё«Ё Ї®вॡ®ў вм Ґ¬Ґ¤«Ґ®
¤агЈ®© ЁбЄ«озЁвҐ«м®© бЁвг жЁЁ.
Ќ аЁбгЄ е ®в ђЁбгЄ 20-3 ¤® ђЁбгЄ 20-5 Ї®Є § л бЄҐ«ҐвлҐ б奬л
Ёб室ле Є®¤®ў бᥬЎ«ҐаҐ ASM386/486 ваҐе ®Ўа Ў®взЁЄ®ў ЁбЄ«озЁвҐ«мле
бЁвг жЁ©. ЏаЁ н⮬ ¤Ґ¬®бваЁагҐвбп Є Є ¬®Јгв Ўлвм ЇЁб л Їа®«®Ј Ё нЇЁ«®Ј
ў а §«Ёзле бЁвг жЁпе, ¬ҐбвҐ, Ј¤Ґ ¤®«¦® Ўлвм Ї®¬ҐйҐ® § ўЁбп饥 ®в
ЇаЁ¬ҐҐЁп ⥫® ®Ўа Ў®взЁЄ ЁбЄ«о票п, бв®пв Є®¬¬Ґв аЁЁ.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і SAVE_ALL PROC і
і ; і
і ; ‘®еа Ёвм ॣЁбвал, § ҐбвЁ і
і ; ®в®Ўа ¦ҐЁҐ б®бв®пЁп FPU ў б⥪ і
і ; і
і PUSH EBP і
і MOV EBP, ESP і
і SUB ESP, 108 і
і ; і
і ; ‘®еа Ёвм Ї®«®Ґ б®бв®пЁҐ FPU, а §аҐиЁвм ЇаҐалў Ёп і
і ; і
і FNSAVE [EBP-108] і
і STI і
і ; і
і ; „ «ҐҐ б«Ґ¤гҐв Їа®Ја ¬¬ ®Ўа Ў®взЁЄ ЁбЄ«о票© і
і ; ў § ўЁбЁ¬®бвЁ ®в 楫Ё ®Ўа Ў®вЄЁ і
і ; і
і ; ЋзЁбвЁвм д« ЈЁ ЁбЄ«о票© ў б«®ўҐ б®бв®пЁп і
і ; (Є®в®а®Ґ 室Ёвбп ў Ї ¬пвЁ) і
і ; ‚®ббв ®ўЁвм ¬®¤ЁдЁжЁа®ў ®Ґ ®в®Ўа ¦ҐЁҐ б®бв®пЁп і
і ; і
і MOV BYTE PTR [EBP-104], 0H і
і FRSTOR [EBP-108] і
і ; і
і ; Ћбў®Ў®¤Ёвм б⥪, ў®ббв ®ўЁвм ॣЁбвал і
і ; і
і MOVE ESP, EBP і
і . і
і . і
і POP EBP і
і ; і
і ; ‚Ґагвмбп Є ЇаҐаў л¬ ўлзЁб«ҐЁп¬ і
і ; і
і IRET і
і SAVE_ALL ENDP і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-3. ЋЎа Ў®взЁЄ €бЄ«озҐЁп Џ®«®Ј® ‘®бв®пЁп
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і SAVE_ENVIRONMENT PROC і
і ; і
і ; ‘®еа Ёвм ॣЁбвал, § ҐбвЁ і
і ; ®Єа㦥ЁҐ FPU ў б⥪ і
і ; і
і PUSH EBP і
і і
і MOV EBP, ESP і
і SUB ESP, 28 і
і ; і
і ; ‘®еа Ёвм ®Єа㦥ЁҐ FPU, а §аҐиЁвм ЇаҐалў Ёп і
і ; і
і FNSTENV [EBP-28] і
і STI і
і ; і
і ; „ «ҐҐ б«Ґ¤гҐв Їа®Ја ¬¬ ®Ўа Ў®взЁЄ ЁбЄ«о票© і
і ; ў § ўЁбЁ¬®бвЁ ®в 楫Ё ®Ўа Ў®вЄЁ і
і ; і
і ; ЋзЁбвЁвм д« ЈЁ ЁбЄ«о票© ў б«®ўҐ б®бв®пЁп і
і ; (Є®в®а®Ґ 室Ёвбп ў Ї ¬пвЁ) і
і ; ‚®ббв ®ўЁвм ¬®¤ЁдЁжЁа®ў ®Ґ ®в®Ўа ¦ҐЁҐ ®Єа㦥Ёп і
і ; і
і MOV BYTE PTR [EBP-24], 0H і
і FLDENV [EBP-28] і
і ; і
і ; Ћбў®Ў®¤Ёвм б⥪, ў®ббв ®ўЁвм ॣЁбвал і
і ; і
і MOVE ESP, EBP і
і POP EBP і
і ; і
і ; ‚Ґагвмбп Є ЇаҐаў л¬ ўлзЁб«ҐЁп¬ і
і ; і
і IRET і
і SAVE_ENVIRONMENT ENDP і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-4. ЋЎа Ў®взЁЄ €бЄ«озҐЁп ‘®Єа 饮Ј® ‚६ҐЁ Ћ¦Ё¤ Ёп
’ҐЄбвл ђЁбгЄ е 20-3 Ё 20-4 ®зҐм Ї®е®¦Ё; Ёе ®в«ЁзЁҐ § Є«оз Ґвбп в®«мЄ®
ў ўлЎ®аҐ Є®¬ ¤ ¤«п б®еа ҐЁп Ё ў®ббв ®ў«ҐЁп б®бв®пЁп ¬®¤г«п ®Ўа Ў®вЄЁ
®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®©. ‚лЎ®а §¤Ґбм § Є«оз Ґвбп ў Ї®ўл襮©
¤Ё Ј®бвЁзҐбЄ®© Ёд®а¬ жЁЁ, ЇаҐ¤®бв ў«пҐ¬®© Є®¬ ¤®© FNSAVE, Ё Ў®«ҐҐ
Ўлбвал¬ ўлЇ®«ҐЁҐ¬ Є®¬ ¤л FNSTENV. „«п вҐе ЇаЁ«®¦ҐЁ©, Є®в®алҐ
згўб⢨⥫мл Є ўаҐ¬ҐЁ ®¦Ё¤ Ёп ЇаҐалў Ёп Ё«Ё Є®в®ал¬ Ґ ¤®
Їа®б¬ ваЁў вм ᮤҐа¦Ё¬®Ґ ॣЁбва®ў, Є®¬ ¤ FNSTENV б®Єа й Ґв
Їа®¤®«¦ЁвҐ«м®бвм "ЄаЁвЁзҐбЄ®© §®л", ў вҐзҐЁҐ Є®в®а®© Їа®жҐбб®а Ґ ўЁ¤Ёв
вॡ®ў Ёп ¤агЈЁе ЇаҐалў Ё©.
Џ®б«Ґ ўлЇ®«ҐЁп ⥫ ®Ўа Ў®взЁЄ ЁбЄ«о票п, нЇЁ«®Ј ЇаЁЈ®в ў«Ёў Ґв
Їа®жҐбб®а ¤«п в®Ј®, зв®Ўл Їа®¤®«¦Ёвм ўлЇ®«ҐЁҐ ®в в®зЄЁ ЇаҐалў Ёп (в®
Ґбвм, Є®¬ ¤л, б«Ґ¤го饩 § в®©, Є®в®а п ᮧ¤ « Ґ¬ бЄЁа®ў ®Ґ
ЁбЄ«о票Ґ). ЋЎа вЁвҐ ўЁ¬ ЁҐ, зв® д« ЈЁ ЁбЄ«озҐЁп ў Ї ¬пвЁ, Є®в®алҐ
§ Јаг¦ Ґвбп ў ¬®¤г«м ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®©, ®Ўа й овбп ў
г«м ¤«п ЇҐаҐ§ Јаг§ЄЁ (д ЄвЁзҐбЄЁ, ў нвЁе ЇаЁ¬Ґа е ®Ўг«пҐвбп ўбҐ
®в®Ўа ¦ҐЁҐ б«®ў б®бв®пЁп).
ЏаЁ¬Ґал ђЁбгЄ е 20-3 Ё 20-4 ЇаҐ¤Ї®« Ј ов, зв® б ¬ ®Ўа Ў®взЁЄ
ЁбЄ«озҐЁп Ґ Ўг¤Ґв ЇаЁзЁ®© ¤агЈ®© Ґ¬ бЄЁа㥬®Ј® ЁбЄ«о票п. ’ ¬, Ј¤Ґ
нв® ў®§¬®¦®, ¬®¦® ЇаЁ¬Ґпвм ®ЎйЁ© Ї®¤е®¤, Ї®Є § л© ђЁбгЄҐ 20-5.
Ћб®ў®© ЇаЁҐ¬ - б®еа Ёвм Ї®«®Ґ б®бв®пЁҐ ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б
Ї« ў о饩 в®зЄ®© Ё § ⥬ § Јаг§Ёвм ®ў®Ґ гЇа ў«по饥 б«®ў® ў Їа®«®ЈҐ.
ЋЎа й Ґ¬ ў иҐ ўЁ¬ ЁҐ в®, зв® ¤® Ўлвм ®зҐм ®бв®а®¦л¬ ЇаЁ
а §а Ў®вЄҐ ®Ўа Ў®взЁЄ®ў ЁбЄ«о票© нв®Ј® вЁЇ ¤«п в®Ј®, зв®Ўл гЎҐаҐзм
®Ўа Ў®взЁЄ ®в ЎҐбЄ®Ґзле ®Ўа 饨©.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і . і
і . і
і . і
і LOCAL_CONTROL DW ? ; €ЁжЁ «Ё§Ёа®ў ® і
і . і
і . і
і . і
і REENTRANT PROC і
і ; і
і ; ‘®еа Ёвм ॣЁбвал, § ҐбвЁ і
і ; ®в®Ўа ¦ҐЁҐ б®бв®пЁп FPU ў б⥪ і
і ; і
і PUSH EBP і
і . і
і . і
і . і
і MOV EBP, ESP і
і SUB ESP, 108 і
і ; і
і ; ‘®еа Ёвм Ї®«®Ґ б®бв®пЁҐ FPU, § Јаг§Ёвм ®ў®Ґ і
і ; гЇа ў«по饥 б«®ў®, а §аҐиЁвм ЇаҐалў Ёп і
і ; і
і FNSAVE [EBP-108] і
і FLDCW LOCAL_CONTROL і
і STI і
і . і
і . і
і . і
і ; і
і ; „ «ҐҐ б«Ґ¤гҐв Їа®Ја ¬¬ ®Ўа Ў®взЁЄ ЁбЄ«о票© і
і ; ў § ўЁбЁ¬®бвЁ ®в 楫Ё ®Ўа Ў®вЄЁ і
і ; ѓҐҐаЁа㥬®Ґ §¤Ґбм Ґ¬ бЄЁа®ў ®Ґ ЁбЄ«о票Ґ і
і ; Ўг¤Ґв ЇаЁзЁ®© ўл§®ў ®Ўа Ў®взЁЄ ЁбЄ«о票©. і
і ; …б«Ё Ґ®Ўе®¤Ё¬ «®Є «м п Ї ¬пвм, в® ¬®¦® і
і ; а бЇ®«®¦Ёвм ¤ лҐ ў б⥪Ґ. і
і . і
і . і
і . і
і ; ЋзЁбвЁвм д« ЈЁ ЁбЄ«о票© ў б«®ўҐ б®бв®пЁп і
і ; (Є®в®а®Ґ 室Ёвбп ў Ї ¬пвЁ) і
і ; ‚®ббв ®ўЁвм ¬®¤ЁдЁжЁа®ў ®Ґ ®в®Ўа ¦ҐЁҐ б®бв®пЁп і
і ; і
і MOV BYTE PTR [EBP-104], 0H і
і FRSTOR [EBP-108] і
і ; і
і ; Ћбў®Ў®¤Ёвм б⥪, ў®ббв ®ўЁвм ॣЁбвал і
і ; і
і MOVE ESP, EBP і
і . і
і . і
і POP EBP і
і ; і
і ; ‚Ґагвмбп ў в®зЄг, Ј¤Ґ Їа®Ё§®и«® ЇаҐалў ЁҐ і
і ; і
і IRET і
і REENTRANT ENDP і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-5. ђҐҐвҐа ЎҐ«мл© ЋЎа Ў®взЁЄ €бЄ«о票©
`¤`Є20.3 ЏаЁ¬Ґа ЇҐаҐў®¤ зЁб« б Ї« ў о饩 в®зЄ®© ў бЁ¬ў®«мл© ўЁ¤ `*
‚лзЁб«ЁвҐ«млҐ Їа®Ја ¬¬л ¤®«¦л д®а¬Ёа®ў вм бў®Ё १г«мв вл ¤«п в®Ј®,
зв®Ўл ®Ё Ўл«Ё ў®бЇаЁЁ¬ Ґ¬л Ё зЁв Ґ¬л Ї®«м§®ў ⥫Ґ¬ Їа®Ја ¬¬л. ‚
Ў®«миЁб⢥ б«гз Ґў, зЁб«®ўлҐ १г«мв вл ўлў®¤пвбп Є Є бва®ЄЁ бЁ¬ў®«®ў
ASCII ¤«п в®Ј®, зв®Ўл Ёе ¬®¦® Ўл«® ®вЇҐз в вм Ё«Ё Їа®б¬®ваҐвм ¤ЁбЇ«ҐҐ.
ќв®в ЇаЁ¬Ґа Ї®Є §лў Ґв, Є Є ўҐ«ЁзЁ б Ї« ў о饩 в®зЄ®© ¬®¦Ґв Ўлвм
ЇҐаҐўҐ¤Ґ ў ¤ҐбпвЁзго бва®Єг ASCII бЁ¬ў®«®ў. ”гЄжЁп, Ї®Є § п
ђЁбгЄҐ 20-6, ¬®¦Ґв Ўлвм ўл§ў Ё§ Їа®Ја ¬¬ п§лЄ е PL/M-386/486,
Pascal386/486, FORTRAN-386/486 Ё«Ё ASM386/486.
ЏаЁ ЇЁб ЁЁ Їа®Ја ¬¬л ®Ўа й «®бм ўЁ¬ ЁҐ ᪮॥ Єа вЄ®бвм, бЄ®а®бвм
Ё в®з®бвм ўлЇ®«ҐЁп, 祬 ¬ ЄбЁ¬Ё§ жЁо зЁб« § з йЁе жЁда. ‘¤Ґ«
Ї®ЇлвЄ ®бв ўЁвм жҐ«лҐ ў Ёе б®Ўб⢥ле ®Ў« бвпе ¤«п в®Ј®, зв®Ўл
ЇаҐ¤®вўа вЁвм б«гз ©лҐ ®иЁЎЄЁ ЇаЁ ЇҐаҐў®¤Ґ зЁбҐ«.
€бЇ®«м§гп зЁб« ў ўҐйҐб⢥®¬ д®а¬ ⥠а биЁаҐ®© в®з®бвЁ, нв
Ї®¤Їа®Ја ¬¬ ¤®бвЁЈ Ґв ў Ёег¤иҐ¬ б«гз Ґ в®з®бвЁ ваЁ Ґ¤ЁЁжл ў 16-⮬
¤ҐбпвЁз®¬ а §а拉 ¤«п ҐжҐ«Ґ«®зЁб«Ґле ўҐ«ЁзЁ Ё«Ё 楫ле зЁбҐ«, Ў®«миЁе
祬 10**(18). ќв® ¤ў®© п в®з®бвм. …б«Ё зЁб«® Ё¬ҐҐв ¤ҐбпвЁзл© Ї®а冷Є,
¬ҐмиЁ© 祬 100, в®з®бвм б®бв ў«пҐв ®¤ Ґ¤ЁЁж ў 17-⮬ ¤ҐбпвЁз®¬
а §а拉.
Ѓ®«ҐҐ ўлб®Є п в®з®бвм ¬®¦Ґв Ўлвм ¤®бвЁЈгв ЇаЁ Ў®«миЁе § ва в е
Їа®Ја ¬¬Ёа®ў ЁҐ, 㢥«ЁзҐЁЁ а §¬Ґа Їа®Ја ¬¬л Ў®«ҐҐ Ё§Є®© нд䥪⨢®бвЁ.
`¤`Є20.3.1 ‘®бв ў«пойЁҐ з бвЁ дгЄжЁЁ `*
ЏҐаҐў®¤ зЁбҐ« ॠ«Ё§гҐвбп ваҐ¬п ®в¤Ґ«мл¬Ё ¬®¤г«п¬Ё. ѓ« ўго а Ў®вг
ўлЇ®«пҐ¬ ¬®¤г«м FLOATING TO ASCII (—Ёб«® б Ї« ў о饩 в®зЄ®© ў
ASCII-бва®Єг). „агЈЁҐ ¬®¤г«Ё ЇаҐ¤бв ў«Ґл ®в¤Ґ«м®, Ї®в®¬г зв® ®Ё Ё¬Ґов
Ў®«ҐҐ ®ЎйҐҐ § 票Ґ. Ћ¤Ё Ё§ Ёе, GET POWER 10 (‚§пвм б⥯Ґм 10-вЁ),
ЁбЇ®«м§гҐвбп в Є¦Ґ Ё Ї®¤Їа®Ја ¬¬®© ЇҐаҐў®¤ зЁбҐ« Ё§ ASCII ўЁ¤ ў д®а¬ в б
Ї« ў о饩 в®зЄ®©. „агЈ®© ¬ «ҐмЄЁ© ¬®¤г«м, TOP STATUS (‘®бв®пЁҐ ўҐаиЁл
б⥪ ), Ё¤ҐвЁдЁжЁагҐв в®, з⮠室Ёвбп ў ўҐаиЁҐ зЁб«®ў®Ј® ॣЁбва®ў®Ј®
б⥪ .
`¤`Є20.3.2 ‘®Ј« иҐЁп Ї® ЁбЄ«озҐЁп¬ `*
ЌҐ®Ўе®¤Ё¬® ЇаҐ¤®вўа вЁвм дгЄжЁо ®в ЈҐҐаЁа®ў Ёп ўгваЁ ҐҐ
ЁбЄ«озЁвҐ«мле бЁвг жЁ©. ЏаЁЁ¬ овбп «оЎлҐ зЁб«®ўлҐ § 票п, ЇаЁ н⮬
в®«мЄ® ў®§¬®¦лҐ ЁбЄ«озҐЁп § Ё¬ ов б⥪ зЁб«®ўле ॣЁбва®ў.
‹оЎ®Ґ § 票Ґ, Ї®б« ®Ґ ў зЁб«®ў®© б⥪, Їа®ўҐапҐвбп бгйҐбвў®ў ЁҐ,
вЁЇ (NaN Ё«Ё ЎҐбЄ®Ґз®бвм) Ё б®бв®пЁҐ (¤Ґ®а¬ «м®Ґ, ®«м, § Є). ђ §¬Ґа
бва®ЄЁ вҐбвЁагҐвбп ЇаЁ ¬ЁЁ¬ «м®¬ Ё ¬ ЄбЁ¬ «м®¬ § 票Ё. …б«Ё ўҐаиЁ
ॣЁбва®ў®Ј® б⥪ Їгбв Ё«Ё а §¬Ґа бва®ЄЁ б«ЁиЄ®¬ ¬ «, дгЄжЁп ў®§ўа й Ґв
Є®¤ ®иЁЎЄЁ.
ЏҐаҐЇ®«ҐЁҐ Ё ®ваЁж ⥫쮥 ЇҐаҐЇ®«ҐЁҐ ЇаЁ ®зҐм Ў®«миЁе Ё«Ё ®зҐм
¬ «ҐмЄЁе зЁб« е ЇаҐ¤®вўа и овбп ўгваЁ дгЄжЁЁ.
ђЁбг®Є 20-6. Џ®¤Їа®Ја ¬¬ ЏҐаҐў®¤ —ЁбҐ« б Џ« ў о饩 ’®зЄ®© ў ASCII ‚Ё¤
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і і
і SOURCE і
і і
і +1 $title('ЏҐаҐў®¤ зЁб« б Ї« ў о饩 в®зЄ®© ў ASCII ўЁ¤') і
і і
і і
і name floating_to_ascii і
і і
і public floating_to_ascii і
і extrn get_power_10:near, tos_status:near і
і ; і
і ; ќв Ї®¤Їа®Ја ¬¬ ЇҐаҐў®¤Ёв зЁб«® б Ї« ў о饩 в®зЄ®© і
і ; Ё§ ўҐаиЁл б⥪ FPU ў бва®Єг вЁЇ ASCII Ё ®в¤Ґ«пҐв і
і ; б⥯Ґм 10, ¬ бив ЎЁагп § 票Ґ (ў ¤ў®Ёз®¬ ўЁ¤Ґ). і
і ; Њ ЄбЁ¬ «м п ¤«Ё бва®ЄЁ бЁ¬ў®«®ў ॣ㫨агҐвбп і
і ; Ї а ¬Ґв஬, Є®в®ал© ¤®«¦Ґ Ўлвм Ў®«миҐ 1. і
і ; ЌҐ-®а¬ «млҐ § 票п, ¤Ґ®а¬ «млҐ § зҐЁп Ё ЇбҐў¤® і
і ; -г«Ё ЇҐаҐў®¤пвбп Є®а४в®. Ћ¤ Є®, Ґ-®а¬ «млҐ і
і ; ўҐ«ЁзЁл Ё ЇбҐў¤®-г«Ё Ў®«ҐҐ Ґ Ї®¤¤Ґа¦Ёў овбп і
і ; Їа®жҐбб®а®¬ i486 (ў ᮮ⢥вбвўЁЁ б® бв ¤ а⮬ IEEE) Ё і
і ; ўгв॥ Ґ ЈҐҐаЁаговбп. ‚®§ўа й Ґ¬®Ґ § 票Ґ і
і ; гЄ §лў Ґв бЄ®«мЄ® ¤ў®Ёзле а §а冷ў в®з®бвЁ Ўл«® і
і ; Ї®вҐап® ў Ґ-®а¬ «мле Ё«Ё ¤Ґ®а¬ «мле § 票пе. і
і ; ’ Є¦Ґ гЄ §лў Ґвбп Ё ўҐ«ЁзЁ ¬ вЁббл ЇбҐў¤®-г«п і
і ; (¤ў®Ёзл¬ Ї®ап¤Є®¬). –Ґ«лҐ зЁб« ¬ҐмиЁҐ 10**18 і
і ; ЇҐаҐў®¤пвбп в®з®, Ґб«Ё ЇаЁЁ¬ ой п бва®Є ASCII і
і ; бЁ¬ў®«®ў ᮤҐа¦Ёв ¤®бв в®з®Ґ Є®«ЁзҐбвў® Ї®§ЁжЁ© ¤«п і
і ; жЁда нвЁе зЁбҐ«. ‚ Їа®вЁў®¬ б«гз Ґ § 票Ґ і
і ; ЇҐаҐў®¤Ёвмбп ў гзго ®в жЁо. і
і ; і
і ; ‚ § ўЁбЁ¬®бвЁ ®в १г«мв в Ї®¤Їа®Ја ¬¬ ўл¤ Ґв і
і ; б«Ґ¤гойЁҐ § 票п: і
і ; і
і ; 0 ЇҐаҐў®¤ ўлЇ®«Ґ, а §¬Ґа бва®ЄЁ ®ЇаҐ¤Ґ«Ґ і
і ; 1 Ґ¤®ЇгбвЁ¬лҐ аЈг¬Ґвл і
і ; 2 в®зл© жҐ«®зЁб«Ґл© ЇҐаҐў®¤, а §¬Ґа бва®ЄЁ і
і ; ®ЇаҐ¤Ґ«Ґ і
і ; 3 Ґ®ЇаҐ¤Ґ«Ґ®бвм і
і ; 4 + NaN (Ґ-зЁб«®) і
і ; 5 - NaN і
і ; 6 + ЃҐбЄ®Ґз®бвм і
і ; 7 - ЃҐбЄ®Ґз®бвм і
і ; 8 ўбваҐзҐ ЇбҐў¤®-®«м, а §¬Ґа бва®ЄЁ ®ЇаҐ¤Ґ«Ґ і
і ; і
і ; €вҐадҐ©б ¤«п ўл§®ў Ё§ PLM-386/486 і
і ; і
і ; floating_to_ascii: і
і ; procedure (number, denormal_ptr, string_ptr, size_ptr, і
і ; field_size, power_ptr) word external; і
і ; declare (denormal_ptr, string_ptr, power_ptr, size_ptr) і
і ; pointer; і
і ; declare field_size word; і
і ; string_size based size_ptr word; і
і ; declare number real; і
і ; declare denormal integer based denormal_ptr; і
і ; і
і і
і ; declare power integer based power_ptr; і
і ; end floating_to_ascii; і
і ; і
і ; ‚Ґ«ЁзЁ б Ї« ў о饩 в®зЄ®© ¤®«¦ Ўлвм ўҐаиЁҐ і
і ; б⥪ FPU. ќв Ї®¤Їа®Ја ¬¬ вॡгҐв ваЁ бў®Ў®¤лҐ і
і ; ॣЁбва ў б⥪Ґ Ё Ї®б«Ґ ®ва Ў®вЄЁ ўлв «ЄЁў Ґв і
і ; ЇҐаҐ¤ ў Ґ¬лҐ § зҐЁп Ё§ б⥪ . Џ®«гзҐ п бва®Є і
і ; Ўг¤Ґв Ё¬Ґвм з «мл© бЁ¬ў®« «ЁЎ® "+", «ЁЎ® "-", і
і ; гЄ §лў п § Є ўҐ«ЁзЁл. ‡ ⥬ б«Ґ¤гов ¤ҐбпвЁзлҐ і
і ; жЁдал ў ASCII ўЁ¤Ґ. —Ёб«®ў®Ґ § 票Ґ бва®ЄЁ вЁЇ і
і ; ASCII Ўг¤Ґв а ў® (ASCII ‘’ђЋЉЂ)*10**ЏЋђџ„ЋЉ. …б«Ё і
і ; ¤ ®Ґ зЁб«® Ўл«® г«Ґ¬, в® бва®Є Ўг¤Ґв ᮤҐа¦ вм і
і ; в®«мЄ® § Є Ё ®¤Ё бЁ¬ў®« 0. ‚Ґ«ЁзЁ а §¬Ґа бва®ЄЁ і
і ; (string_size) гЄ §лў Ґв Ї®«го ¤«Ёг бва®ЄЁ бЁ¬ў®«®ў, і
і ; ўЄ«оз п бЁ¬ў®« § Є . ‘ва®Є (0) ўбҐЈ¤ Ўг¤Ґв і
і ; ᮤҐа¦ вм § Є. ‚®§¬®¦®, зв® а §¬Ґа бва®ЄЁ Ўг¤Ґв і
і ; ¬ҐмиҐ а §¬Ґа Ї®«п. ќв® Ўлў Ґв ЇаЁ г«пе Ё 楫ле і
і ; зЁб« е. ЏбҐў¤®-®«м ўл¤ Ґв ®б®Ўл© Є®¤ ў®§ўа в . ЏаЁ і
і ; ¤Ґ®а¬ «мле зЁб« е гЄ §лў Ґвбп б⥯Ґм ¤ўге і
і ; ЇаҐ¤бв ў«Ґ®Ј® § 票п. ‘⥯Ґм ¤ҐбпвЁ Ё бва®Є Ўг¤гв і
і ; в ЄЁ¬Ё ¦Ґ, Є Є Ґб«Ё Ўл ўҐ«ЁзЁ Ўл« Ўл Їа®бвл¬ г«Ґ¬. і
і ; і
і ; ќв Ї®¤Їа®Ја ¬¬ в®з® ўл¤ Ґв ¤ҐбпвЁзлҐ жҐ«лҐ ¤® 18 і
і ; жЁда. –Ґ«лҐ ўҐ«ЁзЁл Ё¬Ґов ¤ҐбпвЁзл© Ї®Є § вҐ«м і
і ; б⥯ҐЁ ў бва®ЄҐ Ё§ г«Ґ©. ЏаЁ ҐжҐ«ле ўҐ«ЁзЁ е і
і ; в®з®бвм १г«мв в § Є«озҐ ў ¤ўге Ї®б«Ґ¤Ёе і
і ; ¤ҐбпвЁзле жЁда е (¤ў®© п в®з®бвм). „«п і
і ; ¬ бив ЎЁа®ў Ёп ўҐ«ЁзЁл ў ¤Ё Ї §®Ґ, ЇаЁҐ¬«Ґ¬®¬ ¤«п і
і ; ¤ ле вЁЇ BCD, ЁбЇ®«м§говбп Є®¬ ¤л ў®§ўҐ¤ҐЁп ў і
і ; б⥯Ґм. „«п ЇҐаҐў®¤ ЁбЇ®«м§гҐвбп ०Ё¬ ®ЄагЈ«ҐЁп, і
і ; ¤Ґ©бвўгойЁ© ЇаЁ ўе®¤Ґ ў Ї®¤Їа®Ја ¬¬г. і
і ; і
і ; ‘«Ґ¤гойЁҐ ॣЁбвал Ґ ўЁ¤л: і
і ; і
і ; eax ebx ecx edx esi edi eflags і
і ; і
і ; ЋЇаҐ¤Ґ«ҐЁҐ б⥪ . і
і ; і
і ebp_save equ dword ptr [ebp] і
і es_save equ ebp_save + size ebp_save і
і return_ptr equ es_save + size es_save і
і power_ptr equ return_ptr + size return_ptr і
і field_size equ power_ptr + size power_ptr і
і size_ptr equ field_size + size size_ptr і
і string_ptr equ size_ptr + size size_ptr і
і denormal_ptr equ string_ptr + size string_ptr і
і і
і parms_size equ size power_ptr + size field_size + і
і & size size_ptr + size string_ptr + і
і & size denormal_ptr і
і ; і
і ; ЋЇаҐ¤Ґ«ҐЁҐ ЁбЇ®«м§гҐ¬ле Є®бв в. і
і ; і
і BCD_DIGITS equ 18 ; Љ®«ЁзҐбвў® жЁда ў ўҐ«ЁзЁҐ вЁЇ BCD і
і WORD_SIZE equ 4 і
і BCD_SIZE equ 10 і
і MINUS equ 1 ; ЋЇаҐ¤Ґ«ҐЁҐ ўл¤ ў Ґ¬ле § 票© і
і NAN equ 4 ; ‚лЎа лҐ §¤Ґбм в®злҐ ўҐ«ЁзЁл - і
і INFINITY equ 6 ; ў ¦л. ЋЁ ¤®«¦л ᮮ⢥вбвў®ў вм і
і INDEFINITE equ 3 ; ў®§¬®¦л¬ ўл¤ ў Ґ¬л¬ § зҐЁп¬ Ё і
і PSEUDO_ZERO equ 8 ; вҐбвЁа®ў вмбп ў ⮬ ¦Ґ Ї®ап¤ЄҐ, Є Є і
і INVALID equ -2 ; Ї®Є § ® ў нв®© Їа®Ја ¬¬Ґ. і
і ZERO equ -4 і
і DENORMAL equ -6 і
і UNNORMAL equ -8 і
і NORMAL equ 0 і
і EXACT equ 2 і
і ; і
і ; ЋЇаҐ¤Ґ«ҐЁҐ Ї®«®¦ҐЁп ўаҐ¬Ґ®© ®Ў« бвЁ еа ҐЁп. і
і ; і
і power_two equ word ptr [ebp - WORD_SIZE] і
і bcd_value equ tbyte ptr power_two - BCD_SIZE і
і bcd-byte equ byte ptr bcd_value і
і fraction equ bcd_value і
і і
і lokal_size equ size power_two + size bcd_value і
і ; і
і ; ‚뤥«Ёвм ¤®бв в®зл© ®ЎкҐ¬ б⥪ ¤«п і
і ; ўаҐ¬Ґле १г«мв в®ў. і
і ; і
і stack stackseg (lokal_size+6) ; ‚뤥«Ёвм Їа®бва бвў® б⥪ і
і ; ¤«п «®Є «мле ¤ ле. і
і +1 $eject і
і і
і code segment public er і
і extrn power_table:qword і
і ; і
і ; Љ®бв вл, ЁбЇ®«м§гҐ¬лҐ нв®© дгЄжЁҐ©. і
і ; і
і even ; ЋЇвЁ¬Ё§Ёа®ў вм ¤® 16 жЁда. і
і const10 dw 10 ; Џ®¤аҐЈг«Ёа®ў вм § 票Ґ ¤«п і
і ; ; б«ЁиЄ®¬ Ў®«миЁе BCD. і
і ; і
і ; ЏҐаҐўҐбвЁ ЎЁвл C3, C2, C1 Ё C0 ў і
і ; § з йЁҐ д« ЈЁ Ё ўҐ«ЁзЁл, ЁбЇ®«м§гп і
і ; Їа®жҐ¤гаг tos_status. і
і ; і
і status_table db UNNORMAL, NAN, UNNORMAL+MINUS, і
і & NAN+MINUS, NORMAL, INFINITY, і
і & NORMAL+MINUS, INFINITY+MINUS, і
і & ZERO, INVALID, ZERO+MINUS, INVALID, і
і & DENORMAL, INVALID, DENORMAL+MINUS, INVALID і
і floting_to_ascii proc і
і і
і call tos_status ; Џ®б¬®ваҐвм б®бв®пЁҐ ST(0) і
і ; і
і ; ‚§пвм ¤ҐбЄаЁЇв®а Ё§ в Ў«Ёжл і
і ; і
і movzx eax, status_table[eax] і
і cmp al,INVALID ; ST(0) Їгбв? і
і jne not_empty і
і ; і
і ; ST(0) - Їгбв! ‚®§ўа й Ґв § 票Ґ б®бв®пЁп. і
і ; і
і ret parms_size і
і ; і
і ; “¤ «Ёвм ЎҐбЄ®Ґз®бвм Ё§ б⥪ Ё ўл©вЁ. і
і ; і
і found_infinity: і
і fstp st(0) ; Ћбв ўЁвм fstp і
і jmp short exit_proc і
і ; і
і ; „«Ё бва®ЄЁ б«ЁиЄ®¬ ¬ « ! і
і ; ‚л¤ Ґв Є®¤ Ґ¤®ЇгбвЁ¬®бвЁ. і
і ; і
і small_string: і
і mov al,INVALID і
і exit_proc: і
і leave ; ‚®ббв ®ўЁвм б⥪ і
і і
і pop es і
і ret parms_size і
і ; і
і ; ‚ ST(0) 室Ёвбп NaN Ё«Ё і
і ; Ґ®ЇаҐ¤Ґ«Ґ®бвм. ‘®еа Ёвм § 票Ґ і
і ; ў Ї ¬пвЁ Ё Їа®б¬®ваҐвм ¤а®Ў®Ґ Ї®«Ґ і
і ; ¤«п в®Ј®, зв®Ўл ®в«ЁзЁвм і
і ; Ґ®ЇаҐ¤Ґ«Ґ®бвм ®в ®Ўлз®Ј® NaN. і
і ; і
і NAN_or_indefinite: і
і fstp fraction ; „«п Їа®ўҐаЄЁ - г¤ «Ёвм § 票Ґ і
і ; Ё§ б⥪ . і
і test al,MINUS ; Џ®б¬®ваҐвм ЎЁв § Є . і
і fwait ; “ЎҐ¤Ёвмбп ў ўлЇ®«ҐЁЁ б®еа ҐЁп. і
і jz exit_proc ; …б«Ё Ї®«®¦ЁвҐ«мл© § Є, в® Ґ і
і ; ¬®¦Ґв Ўлвм Ґ®ЇаҐ¤Ґ«Ґ®бвмо. і
і і
і mov ebx,0C0000000H ; Џ®¤ ўЁвм ўҐаеЁҐ 32 а §ап¤ ¤а®Ў®© і
і ; з бвЁ. і
і і
і ; ‘а ўЁвм а §ап¤л 63-32 і
і sub ebx,dword ptr fraction + 4 і
і і
і ; ђ §ап¤л 31-0 ¤®«¦л Ўлвм г«п¬Ё і
і or ebx,dword ptr fraction і
і jnz exit_proc і
і і
і ; “бв ®ўЁвм ўл¤ ў Ґ¬®Ґ § 票Ґ і
і ; Ґ®ЇаҐ¤Ґ«Ґ®бвм і
і mov al,INDEFINITE і
і jmp exit_proc і
і ; і
і ; ‚뤥«Ёвм ¬Ґбв® ў б⥪Ґ ¤«п «®Є «мле ЇҐаҐ¬Ґле і
і ; Ё гбв ®ўЁвм Ї а ¬Ґва ¤аҐб жЁЁ. і
і ; і
і not_empty: і
і push es ; ‘®еа Ёвм а Ў®зЁ© ॣЁбва і
і enter local_size,0 ; “бв ®ўЁвм ¤аҐб жЁо б⥪ і
і і
і ; Џа®ўҐаЁвм, ¤®бв в®з® «Ё ¬Ґбв ў бва®ЄҐ і
і mov ecx,field_size і
і cmp ecx,2 і
і jl small_string і
і і
і dec ecx ; “бв ®ўЁвм бЁ¬ў®« § Є і
і і
і ; Џ®б¬®ваҐвм, ¬®¦Ґв Ўлвм бва®Є б«ЁиЄ®¬ Ў®«ми п ¤«п вЁЇ BCD і
і cmp ecx,BCD_DIGITS і
і jbe size_ok і
і і
і ; € зҐ гбв ®ўЁвм ¬ ЄбЁ¬ «мл© а §¬Ґа бва®ЄЁ і
і mov ecx,BCD_DIGITS і
і size_ok: і
і cmp al,INFINITY ; Њ®¦Ґв Ўлвм ЎҐбЄ®Ґз®бвм? і
і і
і ; ‚®§ўа вЁвм § 票Ґ б®бв®пЁп ¤«п + Ё«Ё - ЎҐбЄ®Ґз®бвЁ і
і jge found_infinity і
і і
і cmp al,NAN ; Њ®¦Ґвм Ўлвм NaN Ё«Ё і
і jge NAN_or_indefinite ; Ґ®ЇаҐ¤Ґ«Ґ®бвм і
і і
і ; і
і ; “бв ®ўЁвм ўл¤ ў Ґ¬®Ґ § 票Ґ Ї® 㬮«з Ёо і
і ; Ё Їа®ўҐаЁвм, ®а¬ «Ё§®ў ® «Ё зЁб«®. і
і ; і
і fabs ; €бЇ®«м§®ў вм в®«мЄ® Ї®«®¦ЁвҐ«млҐ § зҐЁп і
і ; і
і ; ЃЁв § Є ў ॣЁбвॠAL ᮤҐа¦Ёв ЁбвЁл© § Є ўҐ«ЁзЁл. і
і ; і
і xor edx,edx ; Џ®¤Ј®в®ўЁвм Є®бв вг 0 і
і mov edi,denormal_ptr ; ЋЎг«Ёвм бзҐвзЁЄ ¤Ґ®а¬ «мле зЁбҐ« і
і mov [edi],dx і
і mov ebx,power_ptr ; ЋЎг«Ёвм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ і
і mov [ebx],dx і
і mov dl,al і
і and dl,1 і
і add dl,EXACT і
і cmp al,ZERO ; Џа®ўҐаЁвм ®«м і
і jae convert_integer ; ЏҐаҐ©вЁ Їа®Ја ¬¬г ў®§ўҐ¤ҐЁп ў і
і ; б⥯Ґм, Ґб«Ё § 票Ґ а ў® г«о. і
і і
і fstp fraction і
і fwait і
і mov al,bcd_byte + 7 і
і or byte ptr bcd_byte +7,80h і
і fld fraction і
і fxtract і
і test al,80h і
і jnz normal_value і
і і
і fld1 і
і fsub і
і ftst і
і fstsw ax і
і sahf і
і jnz set_unnormal_count і
і ; і
і ; Ќ ©¤Ґ ЇбҐў¤®-®«м і
і ; і
і fldlg2 ; ЋжҐЁвм б⥯Ґм ¤ҐбпвЁ і
і add dl,PSEUDO_ZERO - EXACT і
і fmulp st(2),st і
і fxch ; ‚§пвм б⥯Ґвм ¤ҐбпвЁ і
і fistp word ptr [ebx] ; “бв ®ўЁвм б⥯Ґм ¤ҐбпвЁ і
і jmp convert_integer і
і і
і set_unnormal_count: і
і fxtract ; ‚§пвм Ёб室го ¤а®Ўм, і
і ; Ё ®а¬ «Ё§®ў вм. і
і fxch ; ‚§пвм бзҐвзЁЄ Ґ-®а¬ «мле зЁбҐ« і
і fchs і
і fistp word ptr [edi] ; “бв ®ўЁвм бзҐвзЁЄ і
і ; Ґ-®а¬ «мле зЁбҐ« і
і і
і ; і
і ; ‚лзЁб«Ёвм ¤ҐбпвЁзго ўҐ«ЁзЁг ў¬Ґб⥠б нвЁ¬ зЁб«®¬ і
і ; ўгваЁ ®¤®Ј® Ї®ап¤Є . і
і ; і
і ; ‚ᥣ¤ ЇаЁ ®ЄагЈ«ҐЁЁ Ўг¤Ґв ЇаЁбгвбвў®ў вм ®иЁЎЄ і
і ; Ё§-§ Ї®вҐаЁ в®з®бвЁ. ‚ १г«мв вҐ, ¬л і
і ; ЇаҐ¤ ¬ҐаҐ® ЇаЁ ўлзЁб«ҐЁЁ Ї®ап¤Є Ґ бв «Ё і
і ; а бб¬ ваЁў вм LOG10 ®в § зҐЁп ¤а®ЎЁ. ’ Є Є Є і
і ; ¤а®Ўм ўбҐЈ¤ Ў®«миҐ Ё«Ё а ў 1 Ё ¬ҐмиҐ ¤ўге, в® і
і ; LOG10 ®в нв®© ¤а®ЎЁ Ґ Ё§¬ҐпҐв ®б®ў®© в®з®бвЁ і
і ; дгЄжЁЁ. „«п в®Ј®, зв®Ўл Ї®«гзЁвм ¤ҐбпвЁзл© і
і ; Ї®а冷Є ўҐ«ЁзЁл, ¤® Їа®б⮠㬮¦Ёвм б⥯Ґм і
і ; ¤ўге LOG10(2) Ё ®ЄагЈ«Ёвм १г«мв в б і
і ; ®вбҐзҐЁҐ¬ ¤® 楫®Ј®. і
і ; і
і normal_value: і
і fstp fraction ; „«п ¤ «мҐ©иҐЈ® ЁбЇ®«м§®ў Ёп і
і ; б®еа Ёвм Ї®«Ґ ¤а®ЎЁ. і
і fist power_twq ; ‘®еа Ёвм б⥯Ґм ¤ўге і
і fldlg2 ; ‚§пвм LOG10(2) і
і ; ’ҐЇҐам ¬®¦® ЎҐ§®Ї б® ЁбЇ®«м§®ў вм і
і ; power_two і
і fmul ; Џ®¤Ј®в®ўЁвм LOG10 ®в Ї®ап¤Є зЁб« і
і fistp word ptr [ebx] ; ‡¤Ґбм ¬®¦Ґв Ўлвм ЇаЁ¬ҐҐ «оЎ®© і
і ; ०Ё¬ ®ЄагЈ«ҐЁп і
і ; і
і ; Џа®ўҐаЁвм, зв®Ўл ўҐ«ЁзЁ зЁб« і
і ; ЁвҐаЇаҐвЁа®ў « бм Є Є 楫®Ґ. і
і ; і
і ; CX Ё¬ҐҐв ¬ ЄбЁ¬ «м® Ї®§ў®«Ґ®Ґ Є®«ЁзҐбвў® ¤ҐбпвЁзле жЁда. і
і ; і
і fwait ; Ћ¦Ё¤ вм ¤®ЇгбвЁ¬®© б⥯ҐЁ ¤ҐбпвЁ і
і ; і
і ; ‚®§ўҐбвЁ ¤Ґбпвм ў б⥯Ґм ўҐ«ЁзЁл § зҐЁп і
і ; і
і movsx si,word ptr [ebx] і
і sub esi,ecx ; Џ®¤Ј®в®ўЁвм ў AX Ґ®Ўе®¤Ё¬л© і
і ; Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп. і
і ja adjust_result ; ЏҐаҐ©вЁ, Ґб«Ё зЁб«® Ґ Ї®¤е®¤Ёв і
і ; і
і ; —Ёб«® ¬Ґ¦¤г 1 Ё 10**(field_size - а §¬Ґа Ї®«п) і
і ; Џа®ўҐаЁвм 楫®зЁб«Ґ®бвм і
і ; і
і fild power_two ; ‚®ббв ®ўЁвм з «м®Ґ § 票Ґ і
і sub dl,NORMAL-EXACT ; ЏҐаҐўҐбвЁ ў в®з®Ґ ўл¤ ў Ґ¬®Ґ і
і ; § 票Ґ і
і fld farction і
і fscale ; Џ®¤Ј®в®ўЁвм Ї®«го ўҐ«ЁзЁг, ў нв®© і
і ; Є®¬ ¤Ґ ® Ґ Ї®авЁвбп і
і fst st(1) ; ‘Є®ЇЁа®ў вм § 票Ґ ¤«п ба ўҐЁп і
і frndint ; Џа®ўҐаЁвм 楫®зЁб«Ґ®бвм і
і fcomp ; ‘а ўЁвм § зҐЁп і
і fstsw ax ; ‘®еа Ёвм б®бв®пЁҐ і
і sahf ; C3 = 1, § зЁв нв® Ўл« 楫®Ґ зЁб«® і
і і
і jnz convert_integer і
і і
і fstp st(0) ; “¤ «Ёвм ҐжҐ«®зЁб«Ґ®Ґ § 票Ґ і
і add dl,NORMAL-EXACT ; ‚®ббв ®ўЁвм з «м®Ґ ўл¤ ў Ґ¬®Ґ і
і ; § 票Ґ і
і ; і
і ; Њ бив ЎЁа®ў вм зЁб«® ўгваЁ ¤Ё Ї §® , і
і ; Ї®§ў®«Ґ®Ј® д®а¬ ⮬ BCD. ЋЇҐа жЁп і
і ; ¬ бив ЎЁа®ў Ёп ўл¤ Ґв зЁб«® ўгваЁ ®¤®Ј® і
і ; ¤ҐбпвЁз®Ј® Ї®ап¤Є ўҐ«ЁзЁл ЁЎ®«м襣® і
і ; ¤ҐбпвЁз®Ј® зЁб« , ЇаҐ¤бв ўЁ¬®Ј® ¤«п ¤ ®© ¤«Ёл і
і ; бва®ЄЁ. і
і ; і
і ; ‚Ґ«ЁзЁ б⥯ҐЁ ¤ҐбпвЁ ¤«п ¬ бив ЎЁа®ў Ёп і
і ; 室Ёвбп ў ॣЁбвॠSI. і
і ; і
і adjust_result: і
і mov eax,esi ; Џ®¤Ј®в®ўЁвм ¤«п ў®§ўҐ¤ҐЁп ў і
і ; б⥯Ґм і
і mov word ptr [ebx],ax ; “бв ®ўЁвм з «мго ўҐ«ЁзЁг і
і ; б⥯ҐЁ ¤ҐбпвЁ і
і neg eax ; ‚лзҐбвм Ґ¤ЁЁжг ¤«п Є ¦¤®Ј® Ї®ап¤Є і
і ; ўҐ«ЁзЁл, Є®в®ал© ¬ бив ЎЁагҐвбп і
і ; § 票Ґ. і
і call get_power_10 ; Љ®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп і
і ; ЇаҐ¤бв ў«пҐвбп Є Є Ї®а冷Є Ё ¤а®Ўм. і
і fld fraction ; ‚§пвм ¤а®Ўм і
і fmul ; Љ®¬ЎЁЁа®ў вм ¤а®ЎЁ і
і mov esi,ecx ; ‚®§ўҐбвЁ ¤Ґбпвм ў ¬ ЄбЁ¬ «мго і
і ; б⥯Ґм і
і shl esi,3 ; „«п в®Ј®, зв®Ўл § 票Ґ BCD і
і ; ўе®¤Ё«® ў бва®Єг і
і fild power_two ; Љ®¬ЎЁЁа®ў вм б⥯Ґм ¤ўге і
і faddp st(2),st і
і fscale ; Џ®¤Ј®в®ўЁвм Ї®«®Ґ § 票Ґ, і
і ; Ї®а冷Є ®бв «бп Ґ ва®гвл¬ і
і fstp st(1) ; “¤ «Ёвм Ї®а冷Є і
і ; і
і ; Џа®ўҐам⥠гбв ®ў«Ґ®Ґ § 票Ґ Ї® в Ў«ЁжҐ і
і ; в®зле б⥯ҐҐ© ¤ҐбпвЁ. ‘㬬 алҐ ®иЁЎЄЁ ®жҐЄЁ і
і ; ўҐ«ЁзЁл Ё б⥯Ґ®© дгЄжЁЁ ¬®Јгв ЇаЁўҐбвЁ Є і
і ; ⮬г, зв® § 票Ґ ®¤®Ј® Ї®ап¤Є ўҐ«ЁзЁл Ўг¤Ґв і
і ; «ЁЎ® б«ЁиЄ®¬ ¬ «ҐмЄ®Ґ, «ЁЎ® б«ЁиЄ®¬ Ў®«м讥 ¤«п і
і ; Ї®«п вЁЇ BCD. „«п гбва ҐЁп нв®© Їа®Ў«Ґ¬л і
і ; Їа®вҐбвЁаг©вҐ Ї®«г祮Ґ § 票Ґ - пў«пҐвбп «Ё і
і ; ®® б«ЁиЄ®¬ Ў®«миЁ¬ Ё«Ё б«ЁиЄ®¬ ¬ «ҐмЄЁ¬. ‡ ⥬ і
і ; ®вॣ㫨аг©вҐ ҐЈ® Ё § 票Ґ б⥯ҐЁ ¤ҐбпвЁ. і
і ; і
і test_power: і
і ; і
і ; ‘а ўЁвҐ б в®з®© б⥯Ґмо. €бЇ®«м§г©вҐ б«Ґ¤гойго і
і ; б⥯Ґм ЇаЁ 㬥м襨Ё CX Ґ¤ЁЁжг. і
і ; і
і fcom power_table[esi]+type power_table і
і fstsw ax ; ЌҐ ¤® ¦¤ вм і
і sahf ; …б«Ё C3=C0=0, в® б«ЁиЄ®¬ Ў®«м讥 і
і jb test_for-small і
і fidiv const10 ; € зҐ гбв ®ўЁвм § 票Ґ і
і and dl,not EXACT ; “¤ «Ёвм д« Ј в®Ј®, зв® зЁб«® в®з®Ґ і
і inc word ptr [ebx] ; “бв ®ўЁвм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ і
і jmp short in_range ; ЏҐаҐўҐбвЁ § 票Ґ ў 楫®Ґ вЁЇ BCD і
і і
і test_for_small: і
і fcom power_table[esi] ; Џа®ўҐаЁвм ®в®бЁвҐ«мл© а §¬Ґа і
і і
і fstsw ax ; ЌҐ ¦¤ вм і
і sahf ; …б«Ё C0 = 0, в® ST(0) Ў®«миҐ Ё«Ё і
і ; а ўҐ Ё¦иҐ© Ја ЁжҐ і
і jc in_range ; ЏҐаҐўҐбвЁ § 票Ґ ў 楫®Ґ вЁЇ BCD і
і fimul const10 ; Џ®¤®Ј вм § 票Ґ Ї®¤ ¤Ё Ї §® і
і dec word ptr [ebx] ; Џ®¤®Ўа вм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ і
і in_range: і
і frndint ; Џ®¤Ј®в®ўЁвм 楫®Ґ § 票Ґ і
і ; і
і ; “⢥তҐЁҐ: 0 <= TOS <= 999,999,999,999,999,999 і
і ; —Ёб«® TOS Ўг¤Ґв в®з® ЇаҐ¤бв ў«Ґ® і
і ; 18-о жЁда ¬Ё ў д®а¬ ⥠BCD. і
і ; і
і convert_integer: і
і fbstp bcd_value ; ‘®еа Ёвм зЁб«® ў д®а¬ ⥠BCD і
і ; і
і ; ЏаЁ б®еа ҐЁЁ д®а¬ в BCD гбв ®ўЁвм ॣЁбвал і
і ; ¤«п ЇҐаҐў®¤ ў ASCII ўЁ¤. і
і ; і
і mov esi,BCD_SIZE-2 ; €ЁжЁ «Ё§Ёа®ў вм § 票Ґ і
і ; Ё¤ҐЄб BCD і
і mov cx,0f04h ; “бв ®ўЁвм бзҐвзЁЄ б¤ўЁЈ Ё ¬ бЄг і
і mov ebx,1 ; “бв ®ўЁвм з «мл© а §¬Ґа ASCII і
і ; Ї®«п ¤«п § Є і
і mov edi,string_ptr ; ‚§пвм ¤аҐб з « ASCII бва®ЄЁ і
і mov ax,ds ; ‘Є®ЇЁа®ў вм DS ў ES і
і mov es,ax і
і cld ; “бв ®ўЁвм ०Ё¬ ўв®¬ вЁзҐбЄ®Ј® і
і ; ¤®Ў ў«ҐЁп Ґ¤ЁЁжл і
і mov al,'+' ; ЋзЁбвЁвм Ї®«Ґ § Є і
і test dl,MINUS ; Џа®ўҐаЁвм ®ваЁж ⥫쮥 § 票Ґ і
і jz positive_result і
і і
і mov al,'-' і
і positive_result: і
і stosb ; “бв ®ўЁвм гЄ § ⥫м бва®ЄЁ і
і ; Ї®б«Ґ¤Ё© § Є і
і and dl,not MINUS ; ‚лЄ«озЁвм ЎЁв § Є і
і fwait ; Ћ¦Ё¤ вм ®Є®з Ёп Є®¬ ¤л fbstp і
і ; і
і ; €бЇ®«м§гҐ¬лҐ ॣЁбвал: і
і ; і
і ; AH: Ў ©в б® § 票Ґ¬ вЁЇ BCD і
і ; AL: § 票Ґ бва®ЄЁ ASCII і
і ; DX: ў®§ўа й Ґ¬®Ґ § 票Ґ і
і ; CH: ¬ бЄ BCD = 0fh і
і ; CL: бзҐвзЁЄ б¤ўЁЈ BCD = 4 і
і ; BX: иЁаЁ Ї®«п бва®ЄЁ ASCII і
і ; ESI: Ё¤ҐЄб Ї®«п BCD і
і ; DI: гЄ § вҐ«м Ї®«п бва®ЄЁ BCD і
і ; DS, ES: ¤аҐб ᥣ¬Ґв бва®ЄЁ ASCII і
і ; і
і ; “¤ «Ёвм з «млҐ г«Ё Ё§ зЁб« . і
і ; і
і ; і
і skip_leading_zeroes: і
і mov ah,bcd_byte[esi] ; ‚§пвм Ў ©в BCD і
і mov al,ah ; ‘Є®ЇЁа®ў вм § 票Ґ і
і shr al,cl ; ‚§пвм ўҐаеоо Ї® Ї®ап¤Єг жЁдаг і
і and al,0fh ; “бв ®ўЁвм д« Ј г«п і
і jnz enter_odd ; ‚л©вЁ Ё§ жЁЄ« , Ґб«Ё ў з «Ґ і
і ; ®Ў аг¦Ґл Ґ г«Ё і
і і
і mov al,ah ; ‚§пвм б®ў Ў ©в BCD і
і and al,0fh ; ‚§пвм Ё¦оо Ї® Ї®ап¤Єг жЁдаг і
і jnz enter-even ; ‚л©вЁ Ё§ жЁЄ« , Ґб«Ё ®Ў аг¦Ґл і
і ; Ґг«ҐўлҐ жЁдал і
і і
і dec esi ; “¬ҐмиЁвм Ё¤ҐЄб BCD і
і jns skip_leading_zeroes і
і ; і
і ; ‚бп ¬ вЁбб б®бв®Ёв Ё§ г«Ґ© і
і ; і
і mov al,'0' ; “бв ®ўЁвм з «мл© ®«м і
і stosb і
і inc ebx ; “ўҐ«ЁзЁвм ¤«Ёг бва®ЄЁ і
і jmp short exit_with_value і
і ; і
і ; ’ҐЇҐам а биЁа塞 бва®Єг жЁда ¬Ё ®в і
і ; 0 ¤® 9 Ї® ®¤®© жЁдॠЎ ©в і
і ; і
і digit_loop: і
і mov ah,bcd_byte[esi] ; ‚§пвм Ў ©в BCD і
і mov al,ah і
і shr al,cl ; ‚§пвм ўҐаеоо Ї® Ї®ап¤Єг жЁдаг і
і enter_odd: і
і add al,'0' ; ЏҐаҐўҐбвЁ ў ASCII і
і stosb ; ‡ ҐбвЁ жЁдаг ў бва®Єг ASCII і
і mov al,ah ; ‚§пвм Ё¦оо Ї® Ї®ап¤Єг жЁдаг і
і and al,0fh і
і inc ebx ; “ўҐ«ЁзЁвм бзҐвзЁЄ а §¬Ґа Ї®«п і
і enter-even: і
і add al,'0' ; ЏҐаҐўҐбвЁ ў ASCII і
і stosb ; ‡ ҐбвЁ жЁдаг ў бва®Єг ASCII і
і inc ebx ; “ўҐ«ЁзЁвм бзҐвзЁЄ а §¬Ґа Ї®«п і
і dec esi ; ЏҐаҐ©вЁ Є б«Ґ¤го饬㠡 ©вг BCD і
і jns digit_loop і
і ; і
і ; ЏҐаҐў®¤ § Є®зҐ. “бв ®ўЁвм а §¬Ґа і
і ; бва®ЄЁ Ё ®бв в®Є і
і ; і
і exit_with_value: і
і mov edi,size_ptr і
і mov word ptr [edi],bx і
і mov eax,edx ; “бв ®ўЁвм ўл¤ ў Ґ¬®Ґ § 票Ґ і
і jmp exit_proc і
і і
і floating_to_ascii endp і
і code ends і
і end і
і і
і і
і +1 $title(‚лзЁб«Ёвм § 票Ґ 10**AX) і
і і
і ; ќв Ї®¤Їа®Ја ¬¬ ўлзЁб«пҐв § 票Ґ б⥯ҐЁ і
і ; 10**EAX. ’®зл© аҐ§г«мв в ўл¤ Ґвбп ¤«п § 票© ў і
і ; ¤Ё Ї §®Ґ 0 <= EAX < 19. ‚ᥠॣЁбвал Їа®§а зл і
і ; Ё § 票Ґ ўл¤ Ґвбп ў TOS Є Є ¤ў зЁб« : Ї®а冷Є і
і ; ў ST(1) Ё ¤а®Ўм ў ST(0). ‚Ґ«ЁзЁ Ї®ап¤Є ¬®¦Ґв і
і ; ЇаҐўли вм ЁЎ®«миЁ© Ї®а冷Є зЁб« ў а биЁаҐ®¬ і
і ; ўҐйҐб⢥®¬ д®а¬ вҐ. ‚ Їа®Ја ¬¬Ґ ЁбЇ®«м§говбп і
і ; ваЁ б⥪®ўле ॣЁбва . і
і ; і
і name get_power_10 і
і public get_power_10, power_table і
і і
і stack stackseg 8 і
і і
і code segment public er і
і ; і
і ; €бЇ®«м§®ў вм в®злҐ § зҐЁп ®в 1.0 ¤® 1E18. і
і ; і
і even ; ЋЇвЁ¬Ё§Ёа®ў вм 16-вЁ ЎЁв®ўл© ¤®бвгЇ і
і power_table dq 1.0,1e1,1e2,1e3 і
і і
і dq 1e4,1e5,1e6,1e7 і
і і
і dq 1e8,1e9,1e10,1e11 і
і і
і dq 1e12,1e13,1e14,1e15 і
і і
і dq 1e16,1e17,1e18 і
і і
і get_power_10 proc і
і cmp eax,18 ; Џа®ўҐаЁвм ¤Ё Ї §® 0 <= AX < 19 і
і ja out_of_range і
і і
і fld power_table[eax*8] ; ‚§пвм в®з®Ґ § 票Ґ і
і fxtract ; Ћв¤Ґ«Ёвм б⥯Ґм Ё і
і ; ¤а®Ўго з бвм і
і ret ; Ћбв ўЁвм fxtract і
і ; і
і ; ‚лзЁб«Ёвм § 票Ґ, ЁбЇ®«м§гп Є®¬ ¤г ў®§ўҐ¤ҐЁп і
і ; ў б⥯Ґм. €бЇ®«м§говбп б«Ґ¤гойЁҐ б®®в®иҐЁп: і
і ; і
і ; 10**X = 2**(log2(10)*X) і
і ; 2**(I+F) = 2**I * 2**F і
і ; і
і ; …б«Ё ST(1) = I Ё ST(0) = 2**F, в® Є®¬ ¤ fscale і
і ; ўл¤ Ґв 2**(I+F). і
і ; і
і out_of_range: і
і і
і fldl2t ; TOS = LOG2(10) і
і enter 4,0 і
і і
і ; ‘®еа Ёвм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ, P і
і ; і
і mov [ebp-4],eax і
і і
і ; TOS, X = LOG2(10)*P = LOG2(10**P) і
і ; і
і fimul dword ptr [ebp-4] і
і fld1 ; “бв ®ўЁвм TOS = -1.0 і
і fchs і
і fld st(1) ; ‘Є®ЇЁа®ў вм § 票Ґ б⥯ҐЁ Ї® і
і ; ®б®ў Ёо ¤ў і
і frndint ; TOS = I; -ЎҐбЄ®Ґз®бвм < I <= X, і
і ; Ј¤Ґ I - 楫®Ґ і
і ; ђҐ¦Ё¬ ®ЄагЈ«ҐЁп Ґ Ё¬ҐҐв § зҐЁп і
і fxch st(2) ; TOS = X, ST(1) = -1.0 і
і ; ST(2) = I і
і fsub st,st(2) ; TOS, F = X-I: і
і ; -1.0 < TOS <= 1.0 і
і і
і ; ‚®ббв ®ўЁвм з «мл© аҐ¦Ё¬ гЇа ў«ҐЁп в®з®бвмо і
і pop eax і
і f2xm1 ; TOS = 2**(F) - 1.0 і
і leave ; ‚®ббв ®ўЁвм б⥪ і
і fsubr ; Џ®¤Ј®в®ўЁвм 2**(F) і
і ret ; Ћбв ўЁвм fsubr і
і і
і get_power_10 endp і
і і
і code ends і
і end і
і і
і +1 $title(ЋЇаҐ¤Ґ«ҐЁҐ ᮤҐа¦Ё¬®Ј® ॣЁбва TOS) і
і ; і
і ; ќв Ї®¤Їа®Ја ¬¬ ўл¤ Ґв § 票Ґ ®в 0 ¤® 15 ў і
і ; ॣЁбва EAX ў ᮮ⢥вбвўЁЁ б ᮤҐа¦ ЁҐ¬ ўҐаиЁл і
і ; б⥪ FPU. ‚ᥠॣЁбвал Їа®§а зл, Ї®н⮬㠮訡ЄЁ і
і ; ЁбЄ«озҐл. ‚л¤ ў Ґ¬®Ґ § 票Ґ ᮮ⢥вбвўгҐв і
і ; ЎЁв ¬ C3, C2, C1 Ё C0 Є®¬ ¤л FXAM. і
і ; і
і name tos_status і
і public tos_status і
і і
і stack stackseg 6 і
і і
і code segment public er і
і і
і tos_status proc і
і fxam ; ‚§пвм б®бв®пЁҐ ॣЁбва TOS і
і fstsw ax ; ‚§пвм ⥪г饥 б®бв®пЁҐ і
і mov al,ah ; Џ®«®¦Ёвм ЎЁвл 10-8 ў ЎЁвл 2-0 і
і and eax,4007h ; Њ бЄЁа®ў вм ЎЁвл C3, C2, C1 Ё C0 і
і shr ah,3 ; Џ®«®¦Ёвм ЎЁв C3 ў ЎЁв 11 і
і or al,ah ; Џ®«®¦Ёвм ЎЁв C3 ў ЎЁв 3 і
і mov ah,0 ; ЋзЁбвЁвм ў®§ўа й Ґ¬®Ґ § 票Ґ і
і ret і
і і
і tos_status endp і
і і
і code ends і
і end і
і і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
`¤`Є20.3.3 ‘ЇҐжЁ «млҐ Є®¬ ¤л `*
”гЄжЁЁ ®ЇҐаЁагов а §«Ёзл¬Ё зЁб«®ўл¬Ё Є®¬ ¤ ¬Ё, вЁЇ ¬Ё ¤ ле Ё
гЇа ў«пов в®з®бвмо. Џ®Є § лҐ Є®¬ ¤л пў«повбп Є®¬ ¤ ¬Ё ¤«п
ўв®¬ вЁзҐбЄ®Ј® ЇҐаҐў®¤ зЁбҐ« ў BCD ўЁ¤ (¤ў®Ёз®- ¤ҐбпвЁзл© Є®¤). ЏаЁ
н⮬ ўлзЁб«пҐвбп 10-вЁ Єа ⮥ § 票Ґ 楫®зЁб«Ґ®© ўҐ«ЁзЁл, ®ЇҐа жЁЁ
ўлЇ®«повбп ®¤®ўаҐ¬Ґ®, гбв ў«Ёў Ґвбп бЁеа®Ё§ жЁп ¤ ле Ё
ЁбЇ®«м§гҐвбп ®аЁҐвЁа®ў ®Ґ ®ЄагЈ«ҐЁҐ ў ¬®¤г«Ґ ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б
Ї« ў о饩 в®зЄ®©.
ЃҐ§ вЁЇ ¤ ле а биЁаҐ®© в®з®бвЁ Ё ўбв஥®© нЄбЇ®ҐжЁ «м®©
дгЄжЁЁ, Ґ ¬®¦Ґв Ўлвм ¤®бвЁЈгв ¤ў®© п в®з®бвм нв®© дгЄжЁЁ ЇаЁ
бЄ®а®бвЁ Ё а §¬ҐаҐ ЇаЁўҐ¤Ґ®Ј® ЇаЁ¬Ґа .
”гЄжЁп Ў §ЁагҐвбп зЁб«®ў®¬ вЁЇҐ ¤ ле BCD ¤«п ЇҐаҐў®¤ Ё§ ¤ў®Ёз®Ј® б
Ї« ў о饩 в®зЄ®© ў ¤ҐбпвЁз®Ґ. Ћб®ў п а Ў®в § Є«оз Ґвбп ў
¬ бив ЎЁа®ў ЁЁ § 票п б Ї« ў о饩 в®зЄ®© ¤® ЇаЁҐ¬«Ґ¬®Ј® ®Ја ЁзҐ®Ј®
¤Ё Ї §® § 票© вЁЇ BCD. „«п в®, зв®Ўл ЇҐз в вм १г«мв в Ё§ 9-вЁ
жЁда, Ґ®Ўе®¤Ё¬® в®з® Їа®ўҐбвЁ ¬ бив ЎЁа®ў ЁҐ ¤ ®© ўҐ«ЁзЁл ў 楫®Ґ
¬Ґ¦¤г 10**(8) Ё 10**(9). Ќ ЇаЁ¬Ґа, зЁб«® +0.123456789 вॡгҐв Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп Ї®ап¤Є 10**(9) ¤«п в®Ј®, зв®Ўл Ї®«гзЁвм зЁб«®
+123456789.0, Є®в®а®Ґ ¬®¦Ґв еа Ёвмбп ў 9-вЁ жЁда е вЁЇ BCD. Љ®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп ¤®«¦Ґ Ўлвм в®з®© б⥯Ґмо 10-вЁ ¤«п в®Ј®, зв®Ўл
ЇаҐ¤®вўа вЁвм Ё§¬ҐҐЁп жЁда ЇаЁ ЇҐз вЁ.
ќвЁ Ї®¤Їа®Ја ¬¬л ¤®«¦л Їа ўЁ«м® ЇҐаҐў®¤Ёвм ўбҐ § 票п, в®з®
ЇаҐ¤бв ўЁ¬лҐ ў ¤ҐбпвЁз®¬ ўЁ¤Ґ, ў Ї®«Ґ, § ¤ ®Ј® а §¬Ґа . –Ґ«®зЁб«ҐлҐ
§ 票п, Є®в®алҐ Ї®¤е®¤пв Ї®¤ ¤ л© а §¬Ґа бва®ЄЁ, Ґв Ґ®Ўе®¤Ё¬®бвЁ
¬ бив ЎЁа®ў вм, ¬®¦® ба §г б®еа пвм ў д®а¬Ґ BCD. ЌҐжҐ«®зЁб«ҐлҐ
§ 票п, в®з® ЇаҐ¤бв ўЁ¬лҐ ў ¤ҐбпвЁз®¬ ўЁ¤Ґ ў ЇаҐ¤Ґ« е а §¬Ґа бва®ЄЁ,
в Є¦Ґ ЇҐаҐў®¤пвбп в®з®. Ќ ЇаЁ¬Ґа, зЁб«® 0.125 в®з® ЇаҐ¤бв ўЁ¬® Є Є ў
¤ў®Ёз®¬ ўЁ¤Ґ, в Є Ё ў ¤ҐбпвЁз®¬. „«п в®Ј®, зв®Ўл ЇҐаҐўҐбвЁ нв® § 票Ґ
б Ї« ў о饩 в®зЄ®© ў ¤ҐбпвЁзл© ўЁ¤, ¤® ўлЎа вм Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп 1000. ‚ १г«мв ⥠Ї®«гзЁ¬ зЁб«® 125. ЏаЁ ¬ бив ЎЁа®ў ЁЁ
ўҐ«ЁзЁ, дгЄжЁп ¤®«¦ ®бв ў«пвм б«Ґ¤ в ¬, Ј¤Ґ Ўг¤Ґв а бЇ®« Ј вмбп
¤ҐбпвЁз п в®зЄ ў Є®Ґз®¬ ¤ҐбпвЁз®¬ § 票Ё.
`¤`Є20.3.4 ЋЇЁб ЁҐ ®ЇҐа жЁЁ`*
ЏҐаҐў®¤ зЁб« б Ї« ў о饩 в®зЄ®© ў ¤ҐбпвЁзл© ASCII ўЁ¤ Їа®ў®¤Ёвбп ў ваЁ
®б®ўле и Ј : ®ЇаҐ¤Ґ«ҐЁҐ ўҐ«ЁзЁл зЁб« , ¬ бив ЎЁа®ў ЁҐ ҐЈ® ¤«п
ЇаҐ¤бв ў«ҐЁп ў ўЁ¤Ґ BCD Ё ЇҐаҐў®¤ ¤ ле вЁЇ BCD ў ¤ҐбпвЁзго бЁ¬ў®«мго
ASCII § ЇЁбм.
ЋЇаҐ¤Ґ«ҐЁҐ ўҐ«ЁзЁл १г«мв в вॡгҐв 宦¤ҐЁп в Є®Ј® § 票п зЁб«
X, ЇаЁ Є®в®а®¬ иҐ зЁб«® Ўл«® Ўл ЇаҐ¤бв ўЁ¬® ў ўЁ¤Ґ I x 10**(X), Ј¤Ґ 1.0
у I < 10.0. Њ бив ЎЁа®ў ЁҐ зЁб« вॡгҐв ҐЈ® 㬮¦ҐЁп Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп 10**(S) в Є, зв®Ўл १г«мв в Ўл« жҐ«л¬, Ґ ᮤҐа¦ йЁ¬
¤ҐбпвЁзле жЁда Ў®«миҐ, 祬 ®вўҐ¤Ґ® ¤«п нв®Ј® ¬Ґбв ў бва®ЄҐ бЁ¬ў®«®ў
ASCII.
Џ®б«Ґ ¬ бив ЎЁа®ў Ёп, ®ЄагЈ«ҐЁп Ё ЇҐаҐў®¤ ў вЁЇ BCD зЁб«®
ЇаҐ¤бв ў«пҐвбп ў д®а¬Ґ, 㤮Ў®© ¤«п ЇҐаҐў®¤ ў ¤ҐбпвЁзл© ASCII ўЁ¤ «оЎл¬
Їа®Ја ¬¬л¬ ®ЎҐбЇҐзҐЁҐ¬.
ђҐ «Ё§ жЁп ўбҐе нвЁе ваҐе и Ј®ў вॡгҐв ЇаҐ¤Ґ«м®Ј® ўЁ¬ Ёп Є ¤Ґв «п¬.
„«п з « ®Ўа вЁвҐ ўЁ¬ ЁҐ, зв® Ґ Є ¦¤ п ўҐ«ЁзЁ б Ї« ў о饩 в®зЄ®©
Ё¬ҐҐв зЁб«®ў®Ґ § 票Ґ. Џ®¤Їа®Ја ¬¬®© ЇҐаҐў®¤ ¬®Јгв Ўлвм ўбваҐзҐл Ё
в ЄЁҐ ўҐ«ЁзЁл Є Є ЎҐбЄ®Ґз®бвм, Ґ®ЇаҐ¤Ґ«Ґ®бвм Ё«Ё NaN. Џ®н⮬г нв
Ї®¤Їа®Ја ¬¬ ¤®«¦ 㬥вм ®Ї®§ ў вм нвЁ ўҐ«ЁзЁл Ё ®¤®§ з® ®ЇаҐ¤Ґ«пвм
Ёе.
’ Є¦Ґ ЇаЁбгвбвўгов ®б®ЎлҐ б«гз Ё зЁб«®ўле § 票©. ЌҐ®а¬ «млҐ ўҐ«ЁзЁл
Ё¬Ґов зЁб«®ў®Ґ § 票Ґ Ё ¤®«¦л Ўлвм ®в«ЁзЁ¬л дгЄжЁҐ©, в Є Є Є ®Ё
гЄ §лў ов в®, зв® Ўл« Ї®вҐап в®з®бвм ў Їа®жҐбᥠЇа®ўҐ¤ҐЁп
ЇаҐ¤иҐбвўгойЁе ўлзЁб«ҐЁ©.
ЋЇаҐ¤Ґ«Ёў, зв® зЁб«® Ё¬ҐҐв зЁб«®ў®Ґ § 票Ґ Ё ®а¬ «Ё§®ў ® (ЇаЁ
Ґ®Ўе®¤Ё¬®бвЁ гбв ®ўЄ ᮮ⢥вбвўгойЁе д« Ј®ў бЁЈ «Ё§ЁагҐв ўл§ў ®©
Їа®Ја ¬¬Ґ, зв® нв® Ґ®а¬ «м®Ґ зЁб«®), ¬®¦® ¬ бив ЎЁа®ў вм ўҐ«ЁзЁг ў
¤Ё Ї §®Ґ вЁЇ BCD.
`¤`Є20.3.5 Њ бив ЎЁа®ў ЁҐ ўҐ«ЁзЁ `*
„«п в®Ј®, зв®Ўл ¬ бив ЎЁа®ў вм зЁб«®, Ґ®Ўе®¤Ё¬® ®ЇаҐ¤Ґ«Ёвм ҐЈ® ўҐ«ЁзЁг.
„®бв в®з® ўлзЁб«Ёвм ўҐ«ЁзЁг б в®з®бвмо ¤® 1 Ґ¤ЁЁжл Ё«Ё ЇаЁ Єа ⮬ 10
Є®нддЁжЁҐвҐ, 㬮¦Ґл¬ вॡ㥬го ўҐ«ЁзЁг. Џ®б«Ґ ¬ бив ЎЁа®ў Ёп
зЁб« Їа®ў®¤Ёвбп Їа®ўҐаЄ ¤«п в®Ј®, зв®Ўл Ї®б¬®ваҐвм Ї®Ї « «Ё १г«мв в ў
®¦Ё¤ Ґ¬л© ¤Ё Ї §®. …б«Ё Ґв, ⮠१г«мв в ¬®¦Ґв Ўлвм ЁбЇа ў«Ґ ®¤Ё
¤ҐбпвЁзл© Ї®а冷Є ўўҐае Ё«Ё ўЁ§ ®в вॡ㥬®© ўҐ«ЁзЁл. Џ®¤бв஥зл© вҐбв
Ї®б«Ґ ¬ бив ЎЁа®ў Ёп Ґ®Ўе®¤Ё¬ ¤«п гбва ҐЁп ҐЁ§ЎҐ¦®© Ґв®з®бвЁ ў
¬ бив ЎЁа®ў ®¬ § 票Ё.
’ Є Є Є ®жҐЄ § зҐЁп ¤«п Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп ¤®«¦ Ўлвм
¤®бв в®з® Ў«Ё§Є®©, в® ЁбЇ®«м§гҐвбп Ўлбвал© ЇаЁҐ¬ ¬ бив ЎЁа®ў Ёп.
‚Ґ«ЁзЁ ®жҐЁў Ґвбп 㬮¦ҐЁҐ¬ б⥯ҐЁ 2, Є®в®а п ЇаҐ¤бв ў«пҐв Ё§ ᥡп
Ґб¬ҐйҐл© Ї®а冷Є зЁб« б Ї« ў о饩 в®зЄ®©, ᮮ⢥вб⢥® б зЁб«®¬
log(10) ®в 2. ЋЄагЈ«ҐЁҐ १г«мв в ¤® 楫®Ј® ¤ Ґв ®жҐЄг ¤®бв в®з®©
в®з®бвЁ. €Ј®аЁагп ¤а®ЎЁ, § 票Ґ ў १г«мв ⥠¬®¦Ґв Ё¬Ґвм ¬ ЄбЁ¬ «мго
®иЁЎЄг 0.32.
€бЇ®«м§гп § 票Ґ ўҐ«ЁзЁл Ё а §¬Ґа зЁб«®ў®© бва®ЄЁ, ¬®¦® ўлзЁб«Ёвм
Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп. ‚ Їа®жҐ¤гॠЇҐаҐў®¤ зЁб« ўлзЁб«ҐЁҐ
Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп пў«пҐвбп б ¬®© Ґв®з®© ®ЇҐа жЁҐ©. „«п нв®Ј®
ЁбЇ®«м§гҐвбп б®®в®иҐЁҐ 10**(X) = 2**(X * log(10) 2) Ё Є®¬ ¤ F2XM1.
‚ ᮮ⢥вбвўЁЁ б ®Ја ЁзҐЁп¬Ё ¤Ё Ї §® § 票©, а §аҐиҐле Є®¬ ¤®©
F2XM1, § 票Ґ б⥯ҐЁ 2 а §ЎЁў Ґвбп 楫го Ё ¤а®Ўго Є®¬Ї®Ґвл.
‘®®в®иҐЁҐ 2**(I + F) = 2**(I) x 2**(F) Ї®§ў®«пҐв ЁбЇ®«м§®ў вм ЁбвагЄжЁо
FSCALE ¤«п в®Ј®, зв®Ўл ЇҐаҐЄ®¬ЎЁЁа®ў вм § 票Ґ 2**(F), ўлзЁб«Ґ®Ґ
Є®¬ ¤®© F2XM1, Ё з бвм 2**(I).
`¤`Є20.3.5.1 ЌҐв®з®бвм ЇаЁ ¬ бив ЎЁа®ў ЁЁ`*
ЏаЁ ўлзЁб«ҐЁЁ Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп ў®§ЁЄ Ґв Ґв®з®бвм Ё§-§
®бв в®зле г«Ґ©, Ї®¬ҐйҐле ў ¤а®Ў®© ўҐ«ЁзЁҐ б⥯ҐЁ 2 ЇаЁ ®в¤Ґ«ҐЁЁ
§ зЁ¬ле ЎЁв®ў 楫®© з бвЁ. „«п Є ¦¤®Ј® 楫®Ј® § зЁ¬®Ј® ЎЁв ў § 票Ё
б⥯ҐЁ 2, ®в¤Ґ«Ґле ®в ¤а®Ўле ЎЁв®ў, ў ¤а®Ў®© з бвЁ вҐапҐвбп ®¤Ё ЎЁв
в®з®бвЁ ЇаЁ § Ї®«ҐЁЁ г«п¬Ё ¬ҐҐҐ § з йЁе ЎЁв®ў.
„® 14 ЎЁв®ў ¬®¦Ґв Ўлвм Ї®вҐап® ў ¤а®Ў®© з бвЁ, в Є Є Є ЁЎ®«ми п
¤®ЇгбвЁ¬ п ўҐ«ЁзЁ Ї®ап¤Є зЁб« б Ї« ў о饩 в®зЄ®© б®бв ў«пҐв 2**(14) -
1. ќвЁ ЎЁвл ҐЇ®б।б⢥® Ё 㬥ми ов в®з®бвм ўлзЁб«ҐЁп Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп, 祬 Ё ўл§лў ов 㬥м襨Ґ в®з®бвЁ б ¬®Ј® § 票п зЁб« .
„«п зЁбҐ« ў ¤Ё Ї §®Ґ 10**(с30) ¬ ЄбЁ¬ «м®Ґ зЁб«® ЎЁв®ў в®з®бвЁ,
Ї®вҐапле ЇаЁ ўлЇ®«ҐЁЁ ¬ бив ЎЁа®ў Ёп, ¤®бвЁЈ Ґв 8-¬Ё.
`¤`Є20.3.5.2 ЏаҐ¤гЇаҐ¦¤ҐЁҐ ЇҐаҐЇ®«ҐЁ© Ё ®ваЁж ⥫мле ЇҐаҐЇ®«ҐЁ© `*
„а®Ў п з бвм зЁб« Ё Ї®Є § вҐ«м ®в¤Ґ«Ґл ¤агЈ ®в ¤агЈ ¤«п в®Ј®, зв®Ўл
Ё§ЎҐ¦ вм ЇҐаҐЇ®«ҐЁ© Ё ®ваЁж ⥫мле ЇҐаҐЇ®«ҐЁ© ЇаЁ ўлзЁб«ҐЁЁ
¬ би ЎЁа®ў ®© ўҐ«ЁзЁл. Ќ ЇаЁ¬Ґа, ¤«п в®Ј®, зв®Ўл Їа®Ё§ўҐбвЁ
¬ бив ЎЁа®ў ЁҐ зЁб« 10**(-4932) ¤® 10**(8), вॡгҐвбп Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп 10**(4950), Є®в®ал© Ґ ¬®¦Ґв Ўлвм ЇаҐ¤бв ў«Ґ Їа®жҐбб®а®¬
i486.
Ћв¤Ґ«Ёў Ї®Є § вҐ«м Ё ¤а®Ўм, ®ЇҐа жЁп ¬ бив ЎЁа®ў Ёп Ўг¤Ґв Їа®бв®
бЄ« ¤лў вм Ї®Є § ⥫Ё ®в¤Ґ«м® ®в 㬮¦ҐЁп ¤а®ЎҐ©. ќв аЁд¬ҐвЁзҐбЄ п
®ЇҐа жЁп ўЄ«оз Ґв ¬ «лҐ жҐ«лҐ зЁб« , «ҐЈЄ® ЇаҐ¤бв ўЁ¬лҐ Їа®жҐбб®а®¬ i486.
`¤`Є20.3.5.3 ЋЄ®з ⥫м п ॣ㫨஢Є `*
‚®§¬®¦®, зв® б⥯Ґ п дгЄжЁп Get Power 10 ¬®¦Ґв ўл¤ вм १г«мв в
¬ бив ЎЁа®ў Ёп ўҐ«ЁзЁл в Є, зв® Ї®«гзЁвбп зЁб«®, Ё¬Ґо饥 Ў®«миҐ
а §а冷ў, 祬 ¬®¦Ґв Ўлвм ЇаҐ¤бв ў«Ґ® ў бва®ЄҐ ASCII бЁ¬ў®«®ў. Ќ ЇаЁ¬Ґа,
¬ бив ЎЁа®ў ЁҐ зЁб« 9.9999999999999999 x 10**(4900) б Є®нддЁжЁҐв®¬
1.00000000000000010 x 10**(-4883) ¤ «® Ўл ў १г«мв ⥠зЁб«®
1.00000000000000009 x 10**(18). € Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп
ᮮ⢥вбвўгҐв в®з®бвЁ ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®© Ё
१г«мв в ᮮ⢥вбвўгҐв в®з®бвЁ ЇҐаҐў®¤ , ® зЁб«® Ґ ¬®¦Ґв Ўлвм
ЇаҐ¤бв ў«Ґ® ў д®а¬ ⥠BCD. ‚®в Ї®зҐ¬г Ґ®Ўе®¤® Ї®б«Ґ ¬ бив ЎЁа®ў Ёп
Їа®ўҐбвЁ вҐбвЁа®ў ЁҐ ўҐ«ЁзЁл १г«мв в . ђҐ§г«мв в ¬®¦® 㬮¦Ёвм Ё«Ё
а §¤Ґ«Ёвм 10, ў § ўЁбЁ¬®бвЁ ®в в®Ј®, пў«пҐвбп «Ё १г«мв в
ᮮ⢥вб⢥® б«ЁиЄ®¬ ¬ «л¬ Ё«Ё б«ЁиЄ®¬ Ў®«миЁ¬.
`¤`Є20.3.6 ‚л室®© д®а¬ в `*
„«п ¬ ЄбЁ¬ «м®© ЈЁЎЄ®бвЁ ўл室®Ј® д®а¬ в , Ї®§ЁжЁп ¤ҐбпвЁз®© в®зЄЁ
гЄ §лў Ґвбп ¤ў®Ёзл¬ жҐ«л¬ зЁб«®¬, §лў Ґ¬л¬ § 票Ґ¬ Ї®Є § ⥫п
б⥯ҐЁ. …б«Ё Ї®Є § ⥫м б⥯ҐЁ а ўҐ г«о, в® ¤ҐбпвЁз п в®зЄ
ЇаҐ¤Ї®« Ј Ґвбп бЇа ў ®в б ¬®© Їа ў®© жЁдал. Џ®Є § ⥫м б⥯ҐЁ Ў®«миЁ©
г«п Ї®Є §лў Ґв, Є Є ¬®Ј® ®бв в®зле г«Ґ© Ґ Ї®Є §лў Ґвбп. „«п Є ¦¤®©
Ґ¤ЁЁжҐ Ё¦Ґ г«п ¤ҐбпвЁз п в®зЄ ў бва®ЄҐ б¤ўЁЈ Ґвбп «Ґў®.
Џ®б«Ґ¤Ё© и Ј ЇҐаҐў®¤ зЁб« - нв® б®еа Ёвм १г«мв в ў ўЁ¤Ґ BCD Ё
гЄ § вм, Ј¤Ґ 室Ёвбп ¤ҐбпвЁз п в®зЄ . ‘ва®Є вЁЇ BCD § ⥬
а бЇ Є®ўлў Ґвбп ў ¤ҐбпвЁзго бва®Єг Ё§ ASCII бЁ¬ў®«®ў. ‡ Є
гбв ў«Ёў Ґвбп ў ᮮ⢥вбвўЁЁ б® § Є®¬ ®аЁЈЁ «м®Ј® § 票п.
`¤`Є20.4 ЏаЁ¬Ґал ваЁЈ®®¬ҐваЁзҐбЄЁе ўлзЁб«ҐЁ© `*
‚ н⮬ ЇаЁ¬ҐаҐ ¬®¤Ґ«ЁагҐвбп ЄЁҐ¬ вЁЄ агЄЁ а®Ў®в Ї® Ј®¬®ЈҐл¬ ¬ ваЁж ¬
ЇаҐ®Ўа §®ў Ё© а §¬Ґа®¬ 4 x 4, ЇаҐ¤«®¦Ґл¬ „Ґ ўЁв®¬ Ё • а⥡ҐаЈ®¬
(1,2). ЏҐаҐ¤ в®злҐ Ё Ї®ў®а®влҐ ®в®иҐЁп ¬Ґ¦¤г ᬥ¦л¬Ё §ўҐмп¬Ё агЄЁ
®ЇЁб л б Ї®¬®ймо нвЁе ¬ ваЁж, ЁбЇ®«м§гп ¬ ваЁзл© ¬Ґв®¤ D-H. „«п Є ¦¤®Ј®
§ўҐ Ї®бв஥ Ј®¬®ЈҐ п ¬ ваЁж ЇаҐ®Ўа §®ў Ё© а §¬Ґа®¬ 4 x 4, Є®в®а п
ЇаҐ¤бв ў«пҐв Є®®а¤Ё вго бЁб⥬㠧ўҐ (L(i)) ў ᮥ¤ЁҐЁЁ (J(i)) ў
ᮮ⢥вбвўЁЁ б ЇаҐ¤л¤г饩 Є®®а¤Ё в®© бЁб⥬®© (J(i-1),L(i-1)).
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД 1. J.Denavit and R.S.Hartenberg,
"A Kinematic Notation for Lower-Pair Mechanisms Based on Matrices." J.
Applied Mechanics, June 1955, pp. 215-221
2. C.S.George Lee, "Robert Arm Kinematics, Dinamics, and Control." IEEE
Computer, Dec. 1982.
‘«Ґ¤гойЁҐ зҐвлॠЈҐ®¬ҐваЁзҐбЄЁҐ ўҐ«ЁзЁл Ї®«®бвмо ®ЇЁблў ов ¤ўЁ¦ҐЁҐ
«оЎ®© Ї ал ᮥ¤ЁҐЁҐ/§ўҐ® (J(i),L(i)), Є Є Ї®Є § ® ђЁбгЄҐ 20-7.
вҐв (i) = “Ј®« ¬Ґ¦¤г ®бмо x(i) Ё ®бмо x(i-1) ЇаЁ Ї®ў®а®вҐ ў®ЄагЈ ®бЁ
z(i-1) Їа®вЁў з б®ў®© бв५ЄЁ. d(i) = ђ ббв®пЁҐ ®в (i-1)-®© Є®®а¤Ё в®©
бЁбвҐ¬л ў¤®«м ®бЁ z(i-1) ¤® ®бЁ x(i). a(i) = ђ ббв®пЁҐ ¤® i-®©
Є®®а¤Ё в®© бЁбвҐ¬л ®в ®бЁ z(i-1) ў¤®«м ®бЁ -x(i). «мд (i) = “Ј®« ¬Ґ¦¤г
®бмо z(i) Ё ®бмо z(i-1) ЇаЁ Ї®ў®а®вҐ ў®ЄагЈ ®бЁ x(i) Їа®вЁў з б®ў®©
бв५ЄЁ.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і і
і zi-1 xi-1 і
і yi-1 і 90 / і
і \ ГДДДДДД\ / і
і \ і /\ вҐв і
і \ і / \ і
і \ і / * і
і \ і / і
і ‘Ћ…„€Ќ…Ќ€… i-1 Г Д Д Д Д Д Д Д Д Д Д ДДВДД і
і і і і
і і і і
і і і і
і «мд i і і і
і \ і і і
і \ і і
і \ * <ДДДіДДД\ di і
і \ і \ 90 і
і zi \ і і і і
і \ yi \ і і і і
і \ / \ і і і і
і \ / \ і і і і
і \ / \ і і і і
і ДДДДДДДДДДДДДДДДДБДДДДДДБДДДДДДДДДДДДД xi ДДБДД і
і ‘Ћ…„€Ќ…Ќ€…i+1 і
і і
і ГДДДДДД ai ДДДДДДґ і
і 240486/103 і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-7. Ћв®иҐЁп ЊҐ¦¤г ‘¬Ґ¦л¬Ё ‡ўҐмп¬Ё
Њ ваЁж ЇаҐ®Ўа §®ў Ё© A(i)(i-1) вЁЇ D-H ¤«п ᬥ¦ле Є®®а¤Ё вле
гз бвЄ®ў ®в ᮥ¤ЁҐЁп (i-1) ¤® ᮥ¤ЁҐЁп (i) ўлзЁб«пҐвбп Є Є:
A(i)(i-1) = T(z,d) x T(z,вҐв ) x T(x,a) x T(x, «мд )
Ј¤Ґ:
T(z,d) ЇаҐ¤бв ў«пҐв ЇҐаҐ¤ зг ў¤®«м ®бЁ z(i-1)
T(z,вҐв ) ЇаҐ¤бв ў«пҐв Ї®ў®а®в гЈ« вҐв ў®ЄагЈ ®бЁ z(i-1)
T(x,a) ЇаҐ¤бв ў«пҐв ЇҐаҐ¤ зг ў¤®«м ®бЁ x(i)
T(x, «мд ) ЇаҐ¤бв ў«пҐв Ї®ў®а®в гЈ« «мд ў®ЄагЈ ®бЁ x(i)
A(i)(i-1) =
і COSвҐв(i) -COS «д(i)SINвҐв(i) SIN «д(i)SINвҐв(i) COSвҐв(i) і
і і
і SINвҐв(i) COS «д(i)COSвҐв(i) -SIN «д(i)COSвҐв(i) SINвҐв(i) і
і і
і 0 SIN «д(i) COS «д(i) d(i) і
і і
і 0 0 0 1 і
Љ®¬Ї®§Ёв п Ј®¬®ЈҐ п ¬ ваЁж T, Є®в®а п ЇаҐ¤бв ў«пҐв б®Ў®© Ї®§ЁжЁо Ё
®аЁҐв жЁо Ї ал ᮥ¤ЁҐЁҐ/§ўҐ® Ї® ®в®иҐЁо Є ®б®ў®© бЁб⥬Ґ,
Ї®«гз Ґвбп Ї®б«Ґ¤®ў ⥫мл¬ г¬®¦ҐЁҐ¬ ¬ ваЁж ЇаҐ®Ўа §®ў Ё© вЁЇ D-H ¤«п
ᬥ¦ле Є®®а¤Ё вле гз бвЄ®ў.
T(i)(0) = A(1)(0) x A(2)(1) x ... x A(i)(i-1)
ЏаЁ¬Ґа Їа®Ја ¬¬л ђЁбгЄҐ 20-8 Ё««обваЁагҐв, Є Є ¬®¦® ўлЇ®«Ёвм
ЇҐаҐ¤ в®зл© Їа®жҐбб, ЁбЇ®«м§гп ў®§¬®¦®бвЁ ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩
в®зЄ®© Їа®жҐбб®а i486. Џа®Ја ¬¬ б®бв®Ёв Ё§ ¤ўге Ј« ўле Їа®жҐ¤га. ЏҐаў п
Їа®жҐ¤га TRANS PROC ЁбЇ®«м§гҐвбп ¤«п ўлзЁб«ҐЁп н«Ґ¬Ґв®ў ў Є ¦¤®©
¬ ваЁжҐ A(i)(i-1) вЁЇ D-H. ‚в®а п Їа®жҐ¤га MATRIXMUL PROC 室Ёв
Їа®Ё§ўҐ¤ҐЁҐ ¤ўге Ї®б«Ґ¤®ў ⥫мле ¬ ваЁж вЁЇ D-H.
ђЁбг®Є 20-8. ЏаЁ¬Ґа ЉЁҐ¬ вЁЄЁ ђгЄЁ ђ®Ў®в
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і і
і Name ROT_MATRIX_CAL і
і ; і
і ; ќв®в ЇаЁ¬Ґа Ё««обваЁагҐв ЁбЇ®«м§®ў ЁҐ Є®¬ ¤ б і
і ; Ї« ў о饩 в®зЄ®© Їа®жҐбб®а i486 Ё з бвЁз® і
і ; дгЄжЁо FSINCOS, Є®в®а п ¤ Ґв § 票п бЁгб Ё і
і ; Є®бЁгб ®¤®ўаҐ¬Ґ®. Џа®Ја ¬¬ ўлзЁб«пҐв і
і ; Є®¬Ї®§ЁвлҐ ¬ ваЁжл, Ї® Є®в®ал¬ а Ў®в Ґв ¬Ґе Ё§¬ і
і ; ЇҐаҐ¤ зЁ. і
і ; і
і ; ‚ н⮬ ЇаЁ¬ҐаҐ а бᬮвॠ⮫쪮 ЄЁҐ¬ вЁЄ і
і ; а®Ў®в . і
і ; і
і ; …б«Ё Є®¬Ї®§Ёв п ¬ ваЁж , гЇ®¬пгв п ўлиҐ, і
і ; § ¤ Ґвбп Є Є: і
і ; T1n = A1 x A2 x ... x An, в® і
і ; T1n 室Ёвбп ўл§®ў®¬ Їа®жҐ¤га trans_proc Ё і
і ; matrixmul_proc, Ї®Є ўбҐ ¬ ваЁжл Ґ Ўг¤гв і
і ; ЇҐаҐ¬®¦Ґл. і
і ; і
і ; Џа®жҐ¤га trans_proc ўлзЁб«пҐв н«Ґ¬Ґвл Є ¦¤®© і
і ; ¬ ваЁжл A(A1,.....An), Ї®Є Їа®жҐ¤га і
і ; matrixmul_proc ўлЇ®«пҐв 㬮¦ҐЁҐ ¬ ваЁжл Ai Ё і
і ; Ai+1. „«п 㬮¦ҐЁп Їа®жҐ¤га matrixmul_proc і
і ; ЁбЇ®«м§гҐв Їа®жҐ¤гал matrix_row Ё matrix_elem. і
і ; і
і ; ЋЇаҐ¤Ґ«Ёвм б⥪®ў®Ґ Їа®бва бвў® і
і ; і
і trans_stack stackseg 400 і
і і
і ; ЋЇаҐ¤Ґ«ҐЁҐ ¬ ваЁз®© бвагЄвгал ¤«п ЇҐаҐ¤ в®зле і
і ; ¬ ваЁж а §¬Ґа®¬ 4x4 і
і і
і a_matrix struc і
і a11 dq ? і
і a12 dq ? і
і a13 dq ? і
і a14 dq ? і
і a21 dq ? і
і a22 dq ? і
і a23 dq ? і
і a24 dq ? і
і a31 dq 0h і
і a32 dq ? і
і a33 dq ? і
і a34 dq ? і
і a41 dq 0h і
і a42 dq 0h і
і a43 dq 0h і
і a44 dq 1h і
і a_matrix ends і
і ; і
і ; ЏаҐ¤Ї®« Ј Ґ¬, зв® ®¤® ᮥ¤ЁҐЁҐ еа Ёвбп ў і
і ; ®¤®© Ї®§ЁжЁЁ Ё, б«Ґ¤®ў ⥫м®, Ё¬ҐҐв ¤ў Ў®а і
і ; Ї а ¬Ґва®ў. Ћ¤ Є®, ў®§¬®¦® Ё Ў®«м襥 Є®«ЁзҐбвў® і
і ; ᮥ¤ЁҐЁ©. і
і ; і
і alp_deg struc і
і alpha_deg1 dd ? і
і alpha_deg2 dd ? і
і alp_deg ends і
і ; і
і tht_deg struc і
і theta_deg1 dd ? і
і theta_deg2 dd ? і
і tht_deg ends і
і ; і
і A_array struc і
і A1 dq ? і
і A2 dq ? і
і A_array ends і
і ; і
і D_array struc і
і D1 dq ? і
і D2 dq ? і
і D_array ends і
і ; і
і ; ‘ҐЈ¬Ґв ¤ ле - trans_data і
і ; і
і trans_data segment rw public і
і Amx a_matrix<> і
і Bmx a_matrix<> і
і Tmx a_matrix<> і
і ALPHA_DEG alp_deg<> і
і THETA_DEG tht_deg<> і
і A_VECTOR A_array<> і
і D_VECYOR D_array<> і
і ZERO dd 0 і
і d180 dd 180 і
і NUM_JOINT equ 1 і
і NUM_ROW equ 4 і
і NUM_COL equ 4 і
і REVERSE DB 1H і
і trans_data ends і
і і
і assume ds:trans_data, es:trans_data і
і ; і
і ; ‘ҐЈ¬Ґв trans_code ᮤҐа¦Ёв Їа®жҐ¤гал ¤«п і
і ; ўлзЁб«ҐЁп н«Ґ¬Ґв®ў ¬ ваЁжл Ё 㬮¦ҐЁп ¬ ваЁж. і
і ; і
і trans_code segment er public і
і truns_proc proc far і
і ; і
і ; ‚лзЁб«Ёвм гЈ«л «мд Ё вҐв ў а ¤Ё е Ё§ Ёе § 票© і
і ; ў Ја ¤гб е і
і ; і
і fldpi і
і fdiv d180 і
і ; і
і ; “¬®¦Ёвм ЏЁ/180 і
і ; і
і fld st і
і fmul qword ptr ALPHA_DEG[ecx*8] і
і fxch st(1) і
і fmul qword ptr THETA_DEG[ecx*8] і
і ; і
і ; ’Ґв (ў а ¤Ё е) ў ST і
і ; Ё «мд (ў а ¤Ё е) ў ST(1) і
і ; і
і ; ‚лзЁб«ҐЁҐ н«Ґ¬Ґв®ў ¬ ваЁжл і
і ; і
і ; a11 = COS вҐв і
і ; a12 = -COS «мд * SIN вҐв і
і ; a13 = SIN «мд * SIN вҐв і
і ; a14 = A * COS вҐв і
і ; a21 = SIN вҐв і
і ; a22 = COS «мд * COS вҐв і
і ; a23 = -SIN «мд * COS вҐв і
і ; a24 = A * SIN вҐв і
і ; a32 = SIN «мд і
і ; a33 = COS «мд і
і ; a34 = D і
і ; a31 = a41= a42 = a43 = 0.0 і
і ; a44 = 1 і
і ; і
і ; ђҐЈЁбва EBX ᮤҐа¦Ёв ᬥ饨Ґ ¤«п ¬ ваЁжл і
і ; і
і fsincos ; COS вҐв ў ST і
і ; SIN вҐв ў ST(1) і
і fld st ; г¤ў®Ёвм COS вҐв і
і fst [ebx].a11 ; COS вҐв ў a11 і
і fmul qword ptr A_VECTOR[ecx*8] і
і fstp [ebx].a14 ; A * COS вҐв ў a14 і
і fxch st(1) ; SIN вҐв ў ST і
і fst [ebx].a21 ; SIN вҐв ў a21 і
і fld st ; г¤ў®Ёвм SIN вҐв і
і fmul qword ptr A_VECTOR[ecx*8] і
і fstp [ebx].a24 ; A * SIN вҐв ў a24 і
і fld st(2) ; «мд ў ST і
і fsincos ; COS «мд ў ST і
і ; SIN «мд ў ST(1) і
--------------------------------------------------------------------------
‚ б«Ґ¤го饬 а §¤Ґ«Ґ ЇаЁўҐ¤Ґл ЇаЁ¬Ґал Їа®Ја ¬¬ ўлзЁб«ЁвҐ«м®Ј® е а ЄвҐа
¤«п Їа®жҐбб®а i486, ЇЁб лҐ бᥬЎ«ҐаҐ ASM386/486. ќвЁ ЇаЁ¬Ґал
Ё««обваЁагов ҐЄ®в®алҐ Ї®«Ґ§лҐ ЇаЁҐ¬л ¤«п а §а Ў®вЄЁ ўлзЁб«ЁвҐ«мле
Їа®Ја ¬¬ле Їа®¤гЄв®ў Ё бЁб⥬ ®б®ўҐ Їа®жҐбб®а i486.
`¤`Є20.1 ЏаЁ¬Ґа гб«®ў®Ј® ўҐвў«ҐЁп`*
Љ Є 㦥 ®Ўб㦤 «®бм ў ѓ« ўҐ 15, а §«ЁзлҐ зЁб«®ўлҐ Є®¬ ¤л ў®§¤Ґ©бвўгов
ЎЁвл Є®¤ гб«®ўЁп б«®ў б®бв®пЁп ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩
в®зЄ®©, е®вп бгйҐбвўгҐв ¬®¦Ґбвў® бЇ®б®Ў®ў ¤«п в®Ј®, зв®Ўл ॠ«Ё§®ў вм
гб«®ў®Ґ ўҐвў«ҐЁҐ, б«Ґ¤го饥 § ба ўҐЁҐ¬. „ «ҐҐ ЇаЁўҐ¤Ґ ®б®ў®©
Ї®¤е®¤:
- ‚лЇ®«Ёвм ба ўҐЁҐ.
- ‘®еа Ёвм б«®ў® б®бв®пЁп. (‘«®ў® б®бв®пЁп ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б
Ї« ў о饩 в®зЄ®© ¬®¦® б®еа Ёвм Їаאַ ў ॣЁбвॠAX.)
- Џа®ўҐаЁвм ЎЁвл Є®¤ гб«®ўЁп.
- ЏҐаҐ©вЁ Ї® १г«мв вг.
Ќ ђЁбгЄҐ 20-1 ЇаҐ¤бв ў«Ґ да Ј¬Ґв Їа®Ја ¬¬л, Є®в®ал© Ё««обваЁагҐв, Є Є
¬®¦® ба ўЁвм ¤ў 室пйЁҐбп ў Ї ¬пвЁ ўҐйҐбвўҐлҐ зЁб« ¤ў®©®Ј®
д®а¬ в (Ї®¤®Ў п Їа®Ја ¬¬ ¬®¦Ґв Ўлвм ЁбЇ®«м§®ў б Є®¬ ¤®© FTST).
—Ёб« , Є®в®алҐ ба ўЁў овбп ў н⮬ да Ј¬ҐвҐ, §ў л A Ё B. ЋЇҐа жЁп
ба ўҐЁп вॡгҐв § Јаг§ЄЁ зЁб« A ў ўҐаиЁг ॣЁбва®ў®Ј® б⥪ ¬®¤г«п
®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®©, § ⥬ ба ўҐЁп ҐЈ® б зЁб«®¬ B,
ўлЇ®«пп ЇаЁ н⮬ ®ЇҐа жЁо ў®ббв ®ў«ҐЁп Ё§ б⥪ . Џ®б«Ґ 祣® б«®ў®
б®бв®пЁп § ЇЁблў Ґвбп ў ॣЁбва AX. A Ё B Ё¬Ґов зҐвлॠў®§¬®¦ле
Ї®ап¤Є , ЎЁвл C3, C2 Ё C0 Є®¤ гб«®ўЁп гЄ §лў ов, Є Є®© Ё§ нвЁе Ї®ап¤Є®ў
гбв ®ў«Ґ. ’аЁ ЎЁв а бЇ®« Ј овбп ў ўҐа奬 Ў ©вҐ б«®ў б®бв®пЁп ¬®¤г«п
®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®© в Є, зв®Ўл ᮮ⢥вбвў®ў вм д« Ј ¬
г«п, зҐв®бвЁ Ё ЇҐаҐ®б (ZF, PF Ё CF), Є®Ј¤ Ў ©в § ЇЁблў Ґвбп ў® д« ЈЁ.
‚® да Ј¬ҐвҐ Їа®Ја ¬¬л д« ЈЁ ZF, PF Ё CF ॣЁбва EFLAGS гбв ў«Ёў овбп ў
§ зҐЁп ЎЁв®ў C3, C2 Ё C0 б«®ў б®бв®пЁп, § ⥬ ЁбЇ®«м§гҐвбп ®ЇҐа жЁп
гб«®ў®Ј® ЇҐаҐе®¤ ¤«п в®Ј®, зв®Ўл Їа®ўҐаЁвм д« ЈЁ. ђҐ§г«мвЁагой п
Їа®Ја ¬¬ ®зҐм Є®¬Ї Єв Ё § ЇЁблў Ґвбп ўбҐЈ® «Ёим ў бҐ¬м Є®¬ ¤.
Љ®¬ ¤ FXAM ®Ў®ў«пҐв ўбҐ зҐвлॠЎЁв Є®¤ гб«®ўЁп. Ќ ђЁбгЄҐ 20-2
Ї®Є § ®, Є Є в Ў«Ёж ЇҐаҐе®¤®ў ¬®¦Ґв Ўлвм ЁбЇ®«м§®ў ¤«п в®Ј®, зв®Ўл
®ЇаҐ¤Ґ«Ёвм е а ЄвҐа Їа®б¬®ваҐле ўҐ«ЁзЁ. ’ Ў«Ёж ЇҐаҐе®¤®ў (FXAM_TBL)
ᮤҐа¦Ёв 16 ¬Ґв®Є, Ї® ®¤®© ¤«п Є ¦¤®Ј® ў®§¬®¦®Ј® Є®¤ гб«®ўЁп. ЋЎа вЁвҐ
ўЁ¬ ЁҐ, зв® зҐвлॠ§ 票п ᮤҐа¦ в ®¤® Ё ⮦Ґ - "EMPTY" (Їгбв®).
ЏҐаўлҐ ¤ў § зҐЁп Є®¤ гб«®ўЁп ᮮ⢥вбвўгов Ї®§ЁжЁЁ "EMPTY". „ў ¤агЈЁҐ
§ зҐЁп ў в Ў«ЁжҐ, Є®в®алҐ б®¤Ґа¦ в "EMPTY", ЁЄ®Ј¤ Ґ Ўг¤гв
ЁбЇ®«м§®ў л Їа®жҐбб®а®¬ i486 Ё«Ё ¬ ⥬ вЁзҐбЄЁ¬ б®Їа®жҐбб®а®¬ 387(TM), ®
¬®Јгв Ўлвм ЁбЇ®«м§®ў л ЇаЁ ўлЇ®«ҐЁЁ Їа®Ја ¬¬л б®Їа®жҐбб®аҐ 80287.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і . і
і A DQ ? і
і B DQ ? і
і . і
і . і
і FLD A ; ‡ Јаг¦ Ґв A ў ўҐаиЁг б⥪ FPU і
і FCOMP B ; ‘а ўҐЁҐ A:B, ўлв «ЄЁў ЁҐ A і
і FSTSW AX ; ‘®еа пҐв १г«мв в ў ॣЁбвॠAX і
і ; і
і ; Љ®¤л гб«®ўЁп ᮤҐа¦ вбп ў ॣЁбвॠ–Џ“ AX і
і ; (ђҐ§г«мв вл ба ўҐЁп) і
і ; ‡ Јаг§Є Є®¤®ў гб«®ўЁп ў® д« ЈЁ і
і ; і
і SAHF і
і ; і
і ; €бЇ®«м§гҐв гб«®ўлҐ ЇҐаҐе®¤л ¤«п в®Ј®, зв®Ўл і
і ; ®ЇаҐ¤Ґ«Ёвм Є Є гЇ®а冷зҐл A Ё B і
і ; і
і JP A_B_UNORDERED ; ’ҐбвЁа®ў ЁҐ ЎЁв C2 (PF) і
і JB A_LESS ; ’ҐбвЁа®ў ЁҐ ЎЁв C0 (CF) і
і JE A_EQUAL ; ’ҐбвЁа®ў ЁҐ ЎЁв C3 (ZF) і
і A_GREATHER: ; C0 (CF) = 0, C3 (ZF) = 0 і
і . і
і . і
і A_EQUAL: ; C0 (CF) = 0, C3 (ZF) = 1 і
і . і
і . і
і A_LESS: ; C0 (CF) = 1, C3 (ZF) = 0 і
і . і
і . і
і A_UNORDERED: ; C2 (PF) = 1 і
і . і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-1. “б«®ў®Ґ ‚Ґвў«ҐЁҐ ЇаЁ ‘а ўҐЁЁ
”а Ј¬Ґв Їа®Ја ¬¬л ўлЇ®«пҐв Є®¬ ¤г FXAM Ё б®еа пҐв б«®ў® б®бв®пЁп.
‡ ⥬ Ё¤Ґв ¬ ЁЇг«пжЁп ЎЁв ¬Ё Є®¤ гб«®ўЁп ¤«п ®Є®з ⥫쮣® ўлў®¤ зЁб«
ў ॣЁбва AX, Є®в®а®Ґ а ў® Є®¤г гб«®ўЁп, 㬮¦Ґ®¬г 2. ЏаЁ н⮬
ўЄ«оз Ґвбп ®Ўг«ҐЁҐ ҐЁбЇ®«м§гҐ¬ле ЎЁв®ў ў Ў ©вҐ, Є®в®ал© б®¤Ґа¦Ёв Є®¤,
Їа®Ёб室Ёв б¤ўЁЈ ЎЁв C3 ўЇа ў® в Є, зв®Ўл ® Ўл« б®бҐ¤Ё¬ б ЎЁв®¬ C2, Ё
§ ⥬ Їа®Ёб室Ёв б¤ўЁЈ Є®¤ ¤«п в®Ј®, зв®Ўл 㬮¦Ёвм ҐЈ® 2. Џ®«г祮Ґ
§ 票Ґ ЁбЇ®«м§гҐвбп Є Є Ё¤ҐЄб, Ї® Є®в®а®¬г ўлЎЁа Ґвбп ®¤ Ё§ ¬Ґв®Є Ё§
в Ў«Ёжл ЇҐаҐе®¤®ў FXAM TBL (㬮¦ҐЁҐ Є®¤ гб«®ўЁп вॡгҐвбп Ё§-§ 2-е
Ў ©в®© ¤«Ёл Є ¦¤®Ј® § зҐЁп ў в Ў«ЁжҐ). Љ®¬ ¤ ЎҐ§гб«®ў®Ј® ЇҐаҐе®¤
JMP Їа ў«пҐв Їа®жҐбб®а зҐаҐ§ в Ў«Ёжг ЇҐаҐе®¤®ў Є Їа®жҐ¤гаҐ, Є®в®а п
ᮤҐа¦Ёв Їа®Ја ¬¬г (Ґ Ї®Є § го ў ЇаЁ¬ҐаҐ) ¤«п ®Ўа Ў®вЄЁ Є ¦¤®Ј®
ў®§¬®¦®Ј® १г«мв в Є ¬ ¤л FXAM.
`¤`Є20.2 ЏаЁ¬Ґал ®Ўа Ў®вЄЁ ЁбЄ«о票©`*
‘гйҐбвўгҐв ¬®¦Ґбвў® Ї®¤е®¤®ў ¤«п ЇЁб Ёп ®Ўа Ў®взЁЄ®ў ЁбЄ«озЁвҐ«мле
бЁвг жЁ©. Ћ¤Ё Ї®«Ґ§л© ЇаЁҐ¬ - н⮠ᤥ« вм Їа®жҐ¤гаг ®Ўа Ў®вЄЁ
ЁбЄ«оз票© Ё§ ваҐе з б⥩: "Їа®«®Ј ", "⥫ " Ё "нЇЁ«®Ј ". ќв Їа®жҐ¤га
ўл§лў Ґвбп зҐаҐ§ ЇаҐалў ЁҐ ®¬Ґа 16.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і ; ’ Ў«Ёж ЇҐаҐе®¤®ў ¤«п Їа®жҐ¤гал Їа®ўҐаЄЁ і
і ; і
і FXAM_TBL DD POS_UNNORM, POS_NAN, NEG_UNNORM, NEG_NAN, і
і & POS_NORM, POS_INFINITY, NEG_NORM, і
і & NEG_INFINITY, POS_ZERO, EMPTY, NEG_ZERO, і
і & EMPTY, POS_DENORM, EMPTY, NEG_DENORM, EMPTY і
і . і
і . і
і ; Џа®ўҐаЁвм ST Ё б®еа Ёвм १г«мв в (Є®¤л гб«®ўЁп) і
і ; і
і FXAM і
і XOR EAX, EAX ; ЋзЁбвЁвм ॣЁбва EAX і
і FSTSW AX і
і ; і
і ; ‚лзЁб«ҐЁҐ б¬ҐйҐЁп ў в Ў«ЁжҐ ЇҐаҐе®¤®ў і
і ; і
і AND AX, 0100011100000000B ; ЋзЁбвЁвм ўбҐ ЎЁвл і
і ; Єа®¬Ґ C3, C2-C0 і
і SHR EAX, 6 ; ‘¤ўЁгвм C2-C0 Є Є (000XXX00) і
і SAL AH, 5 ; “бв ®ўЁвм C3 Є Є (00X00000) і
і OR AL, AH ; ‘«Ёвм C3 Ё C2-C0 (00XXXX00) і
і XOR AH, AH ; “¤ «Ёвм бв аго Є®ЇЁо C3 і
і ; і
і ; ЏҐаҐ©вЁ Є Їа®жҐ¤гॠЇ® Є®¤г гб«®ўЁп і
і ; і
і JMP FXAM_TBL[EAX] і
і ; і
і ; ЊҐвЄЁ в Ў«Ёжл ЇҐаҐе®¤ , Ї® ®¤®© ¤«п ®Ўа Ў®вЄЁ і
і ; Є ¦¤®Ј® ў®§¬®¦®Ј® १г«мв в FXAM і
і ; і
і POS_UNNORM: і
і . і
і POS_NAN: і
і . і
і NEG_UNNORM: і
і . і
і NEG_NAN: і
і . і
і POS_NORM: і
і . і
і POS_INFINITY: і
і . і
і NEG_NORM: і
і . і
і NEG_INFINITY: і
і . і
і POS_ZERO: і
і . і
і EMPTY: і
і . і
і NEG_ZERO: і
і . і
і POS_DENORM: і
і . і
і NEG_DENORM: і
і . і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-2. “б«®ў®Ґ ‚Ґвў«ҐЁҐ ЇаЁ ЋЇҐа жЁЁ FXAM
ЏаЁ ЇҐаҐ¤ зҐ гЇа ў«ҐЁп Їа®жҐ¤гаг ®Ўа Ў®вЄЁ ЁбЄ«о票п, ўбҐ ЇаҐалў Ёп
§ ЇаҐй овбп ЇЇ а вл¬ бЇ®б®Ў®¬. Џа®«®Ј ўлЇ®«пҐв ўбҐ дгЄжЁЁ, Є®в®алҐ
¤®«¦л Ўлвм § йЁйҐл ®в ў®§¬®¦®Ј® ЇаҐалў Ёп Ў®«ҐҐ ўлб®ЄЁ¬ ЇаЁ®аЁвҐв®¬.
ЋЎлз® нв® б®еа ҐЁҐ ॣЁбва®ў Ё ЇҐаҐ¤ з ¤Ё Ј®бвЁзҐбЄ®© Ёд®а¬ жЁЁ Ё§
¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў ой© в®зЄ®© ў Ї ¬пвм. Љ®Ј¤ ЄаЁвЁзҐбЄЁ©
Їа®жҐбб Ўг¤Ґв § ўҐаиҐ, Їа®«®Ј ¬®¦Ґв а §аҐиЁвм ЇаҐалў Ёп ¤«п в®Ј®, зв®Ўл
Ї®§ў®«Ёвм ®Ўа Ў®взЁЄ ¬ ЇаҐалў Ё© б Ў®«ҐҐ ўлб®ЄЁ¬ ЇаЁ®аЁвҐв®¬ ўлЇ®«Ёвмбп
а миҐ ®Ўа Ў®взЁЄ ЁбЄ«о票п.
’Ґ«® ®Ўа Ў®взЁЄ ЁбЄ«озҐЁп Їа®б¬ ваЁў Ґв ¤Ё Ј®бвЁзҐбЄго Ёд®а¬ жЁо Ё
ॠЈЁагҐв в®, зв® Ґ®Ўе®¤Ё¬® б в®зЄЁ §аҐЁп Їа®Ја ¬¬®Ј® Їа®¤гЄв . ќв
ॠЄжЁп ¬®¦Ґв Ё¬Ґвм ¤Ё Ї §® ®в ЇаҐалў Ёп ўлЇ®«ҐЁп ¤«п в®Ј®, зв®Ўл
ўл¤ вм б®®ЎйҐЁҐ, ¤® Ї®ЇлвЄЁ г« ¤Ёвм ҐЇ®« ¤Єг Ё Їа®¤®«¦Ёвм ®а¬ «м®Ґ
ўлЇ®«ҐЁҐ.
ќЇЁ«®Ј, б®Ўб⢥®, ўлЇ®«пҐв ¤Ґ©бвўЁп ®Ўа влҐ Їа®«®Јг, ў®§ўа й п
Їа®жҐбб®а ў б®бв®пЁҐ, ЇаЁ Є®в®а®¬ ¬®¦® Ўл«® Ўл ў®§®Ў®ўЁвм ®а¬ «м®Ґ
ўлЇ®«ҐЁҐ. ќЇЁ«®Ј Ґ ¤®«¦Ґ § Јаг¦ вм Ґ¬ бЄЁа®ў л© д« Ј ЁбЄ«озҐЁп ў
¬®¤г«м ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®© Ё«Ё Ї®вॡ®ў вм Ґ¬Ґ¤«Ґ®
¤агЈ®© ЁбЄ«озЁвҐ«м®© бЁвг жЁЁ.
Ќ аЁбгЄ е ®в ђЁбгЄ 20-3 ¤® ђЁбгЄ 20-5 Ї®Є § л бЄҐ«ҐвлҐ б奬л
Ёб室ле Є®¤®ў бᥬЎ«ҐаҐ ASM386/486 ваҐе ®Ўа Ў®взЁЄ®ў ЁбЄ«озЁвҐ«мле
бЁвг жЁ©. ЏаЁ н⮬ ¤Ґ¬®бваЁагҐвбп Є Є ¬®Јгв Ўлвм ЇЁб л Їа®«®Ј Ё нЇЁ«®Ј
ў а §«Ёзле бЁвг жЁпе, ¬ҐбвҐ, Ј¤Ґ ¤®«¦® Ўлвм Ї®¬ҐйҐ® § ўЁбп饥 ®в
ЇаЁ¬ҐҐЁп ⥫® ®Ўа Ў®взЁЄ ЁбЄ«о票п, бв®пв Є®¬¬Ґв аЁЁ.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і SAVE_ALL PROC і
і ; і
і ; ‘®еа Ёвм ॣЁбвал, § ҐбвЁ і
і ; ®в®Ўа ¦ҐЁҐ б®бв®пЁп FPU ў б⥪ і
і ; і
і PUSH EBP і
і MOV EBP, ESP і
і SUB ESP, 108 і
і ; і
і ; ‘®еа Ёвм Ї®«®Ґ б®бв®пЁҐ FPU, а §аҐиЁвм ЇаҐалў Ёп і
і ; і
і FNSAVE [EBP-108] і
і STI і
і ; і
і ; „ «ҐҐ б«Ґ¤гҐв Їа®Ја ¬¬ ®Ўа Ў®взЁЄ ЁбЄ«о票© і
і ; ў § ўЁбЁ¬®бвЁ ®в 楫Ё ®Ўа Ў®вЄЁ і
і ; і
і ; ЋзЁбвЁвм д« ЈЁ ЁбЄ«о票© ў б«®ўҐ б®бв®пЁп і
і ; (Є®в®а®Ґ 室Ёвбп ў Ї ¬пвЁ) і
і ; ‚®ббв ®ўЁвм ¬®¤ЁдЁжЁа®ў ®Ґ ®в®Ўа ¦ҐЁҐ б®бв®пЁп і
і ; і
і MOV BYTE PTR [EBP-104], 0H і
і FRSTOR [EBP-108] і
і ; і
і ; Ћбў®Ў®¤Ёвм б⥪, ў®ббв ®ўЁвм ॣЁбвал і
і ; і
і MOVE ESP, EBP і
і . і
і . і
і POP EBP і
і ; і
і ; ‚Ґагвмбп Є ЇаҐаў л¬ ўлзЁб«ҐЁп¬ і
і ; і
і IRET і
і SAVE_ALL ENDP і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-3. ЋЎа Ў®взЁЄ €бЄ«озҐЁп Џ®«®Ј® ‘®бв®пЁп
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і SAVE_ENVIRONMENT PROC і
і ; і
і ; ‘®еа Ёвм ॣЁбвал, § ҐбвЁ і
і ; ®Єа㦥ЁҐ FPU ў б⥪ і
і ; і
і PUSH EBP і
і і
і MOV EBP, ESP і
і SUB ESP, 28 і
і ; і
і ; ‘®еа Ёвм ®Єа㦥ЁҐ FPU, а §аҐиЁвм ЇаҐалў Ёп і
і ; і
і FNSTENV [EBP-28] і
і STI і
і ; і
і ; „ «ҐҐ б«Ґ¤гҐв Їа®Ја ¬¬ ®Ўа Ў®взЁЄ ЁбЄ«о票© і
і ; ў § ўЁбЁ¬®бвЁ ®в 楫Ё ®Ўа Ў®вЄЁ і
і ; і
і ; ЋзЁбвЁвм д« ЈЁ ЁбЄ«о票© ў б«®ўҐ б®бв®пЁп і
і ; (Є®в®а®Ґ 室Ёвбп ў Ї ¬пвЁ) і
і ; ‚®ббв ®ўЁвм ¬®¤ЁдЁжЁа®ў ®Ґ ®в®Ўа ¦ҐЁҐ ®Єа㦥Ёп і
і ; і
і MOV BYTE PTR [EBP-24], 0H і
і FLDENV [EBP-28] і
і ; і
і ; Ћбў®Ў®¤Ёвм б⥪, ў®ббв ®ўЁвм ॣЁбвал і
і ; і
і MOVE ESP, EBP і
і POP EBP і
і ; і
і ; ‚Ґагвмбп Є ЇаҐаў л¬ ўлзЁб«ҐЁп¬ і
і ; і
і IRET і
і SAVE_ENVIRONMENT ENDP і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-4. ЋЎа Ў®взЁЄ €бЄ«озҐЁп ‘®Єа 饮Ј® ‚६ҐЁ Ћ¦Ё¤ Ёп
’ҐЄбвл ђЁбгЄ е 20-3 Ё 20-4 ®зҐм Ї®е®¦Ё; Ёе ®в«ЁзЁҐ § Є«оз Ґвбп в®«мЄ®
ў ўлЎ®аҐ Є®¬ ¤ ¤«п б®еа ҐЁп Ё ў®ббв ®ў«ҐЁп б®бв®пЁп ¬®¤г«п ®Ўа Ў®вЄЁ
®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®©. ‚лЎ®а §¤Ґбм § Є«оз Ґвбп ў Ї®ўл襮©
¤Ё Ј®бвЁзҐбЄ®© Ёд®а¬ жЁЁ, ЇаҐ¤®бв ў«пҐ¬®© Є®¬ ¤®© FNSAVE, Ё Ў®«ҐҐ
Ўлбвал¬ ўлЇ®«ҐЁҐ¬ Є®¬ ¤л FNSTENV. „«п вҐе ЇаЁ«®¦ҐЁ©, Є®в®алҐ
згўб⢨⥫мл Є ўаҐ¬ҐЁ ®¦Ё¤ Ёп ЇаҐалў Ёп Ё«Ё Є®в®ал¬ Ґ ¤®
Їа®б¬ ваЁў вм ᮤҐа¦Ё¬®Ґ ॣЁбва®ў, Є®¬ ¤ FNSTENV б®Єа й Ґв
Їа®¤®«¦ЁвҐ«м®бвм "ЄаЁвЁзҐбЄ®© §®л", ў вҐзҐЁҐ Є®в®а®© Їа®жҐбб®а Ґ ўЁ¤Ёв
вॡ®ў Ёп ¤агЈЁе ЇаҐалў Ё©.
Џ®б«Ґ ўлЇ®«ҐЁп ⥫ ®Ўа Ў®взЁЄ ЁбЄ«о票п, нЇЁ«®Ј ЇаЁЈ®в ў«Ёў Ґв
Їа®жҐбб®а ¤«п в®Ј®, зв®Ўл Їа®¤®«¦Ёвм ўлЇ®«ҐЁҐ ®в в®зЄЁ ЇаҐалў Ёп (в®
Ґбвм, Є®¬ ¤л, б«Ґ¤го饩 § в®©, Є®в®а п ᮧ¤ « Ґ¬ бЄЁа®ў ®Ґ
ЁбЄ«о票Ґ). ЋЎа вЁвҐ ўЁ¬ ЁҐ, зв® д« ЈЁ ЁбЄ«озҐЁп ў Ї ¬пвЁ, Є®в®алҐ
§ Јаг¦ Ґвбп ў ¬®¤г«м ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®©, ®Ўа й овбп ў
г«м ¤«п ЇҐаҐ§ Јаг§ЄЁ (д ЄвЁзҐбЄЁ, ў нвЁе ЇаЁ¬Ґа е ®Ўг«пҐвбп ўбҐ
®в®Ўа ¦ҐЁҐ б«®ў б®бв®пЁп).
ЏаЁ¬Ґал ђЁбгЄ е 20-3 Ё 20-4 ЇаҐ¤Ї®« Ј ов, зв® б ¬ ®Ўа Ў®взЁЄ
ЁбЄ«озҐЁп Ґ Ўг¤Ґв ЇаЁзЁ®© ¤агЈ®© Ґ¬ бЄЁа㥬®Ј® ЁбЄ«о票п. ’ ¬, Ј¤Ґ
нв® ў®§¬®¦®, ¬®¦® ЇаЁ¬Ґпвм ®ЎйЁ© Ї®¤е®¤, Ї®Є § л© ђЁбгЄҐ 20-5.
Ћб®ў®© ЇаЁҐ¬ - б®еа Ёвм Ї®«®Ґ б®бв®пЁҐ ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б
Ї« ў о饩 в®зЄ®© Ё § ⥬ § Јаг§Ёвм ®ў®Ґ гЇа ў«по饥 б«®ў® ў Їа®«®ЈҐ.
ЋЎа й Ґ¬ ў иҐ ўЁ¬ ЁҐ в®, зв® ¤® Ўлвм ®зҐм ®бв®а®¦л¬ ЇаЁ
а §а Ў®вЄҐ ®Ўа Ў®взЁЄ®ў ЁбЄ«о票© нв®Ј® вЁЇ ¤«п в®Ј®, зв®Ўл гЎҐаҐзм
®Ўа Ў®взЁЄ ®в ЎҐбЄ®Ґзле ®Ўа 饨©.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і . і
і . і
і . і
і LOCAL_CONTROL DW ? ; €ЁжЁ «Ё§Ёа®ў ® і
і . і
і . і
і . і
і REENTRANT PROC і
і ; і
і ; ‘®еа Ёвм ॣЁбвал, § ҐбвЁ і
і ; ®в®Ўа ¦ҐЁҐ б®бв®пЁп FPU ў б⥪ і
і ; і
і PUSH EBP і
і . і
і . і
і . і
і MOV EBP, ESP і
і SUB ESP, 108 і
і ; і
і ; ‘®еа Ёвм Ї®«®Ґ б®бв®пЁҐ FPU, § Јаг§Ёвм ®ў®Ґ і
і ; гЇа ў«по饥 б«®ў®, а §аҐиЁвм ЇаҐалў Ёп і
і ; і
і FNSAVE [EBP-108] і
і FLDCW LOCAL_CONTROL і
і STI і
і . і
і . і
і . і
і ; і
і ; „ «ҐҐ б«Ґ¤гҐв Їа®Ја ¬¬ ®Ўа Ў®взЁЄ ЁбЄ«о票© і
і ; ў § ўЁбЁ¬®бвЁ ®в 楫Ё ®Ўа Ў®вЄЁ і
і ; ѓҐҐаЁа㥬®Ґ §¤Ґбм Ґ¬ бЄЁа®ў ®Ґ ЁбЄ«о票Ґ і
і ; Ўг¤Ґв ЇаЁзЁ®© ўл§®ў ®Ўа Ў®взЁЄ ЁбЄ«о票©. і
і ; …б«Ё Ґ®Ўе®¤Ё¬ «®Є «м п Ї ¬пвм, в® ¬®¦® і
і ; а бЇ®«®¦Ёвм ¤ лҐ ў б⥪Ґ. і
і . і
і . і
і . і
і ; ЋзЁбвЁвм д« ЈЁ ЁбЄ«о票© ў б«®ўҐ б®бв®пЁп і
і ; (Є®в®а®Ґ 室Ёвбп ў Ї ¬пвЁ) і
і ; ‚®ббв ®ўЁвм ¬®¤ЁдЁжЁа®ў ®Ґ ®в®Ўа ¦ҐЁҐ б®бв®пЁп і
і ; і
і MOV BYTE PTR [EBP-104], 0H і
і FRSTOR [EBP-108] і
і ; і
і ; Ћбў®Ў®¤Ёвм б⥪, ў®ббв ®ўЁвм ॣЁбвал і
і ; і
і MOVE ESP, EBP і
і . і
і . і
і POP EBP і
і ; і
і ; ‚Ґагвмбп ў в®зЄг, Ј¤Ґ Їа®Ё§®и«® ЇаҐалў ЁҐ і
і ; і
і IRET і
і REENTRANT ENDP і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-5. ђҐҐвҐа ЎҐ«мл© ЋЎа Ў®взЁЄ €бЄ«о票©
`¤`Є20.3 ЏаЁ¬Ґа ЇҐаҐў®¤ зЁб« б Ї« ў о饩 в®зЄ®© ў бЁ¬ў®«мл© ўЁ¤ `*
‚лзЁб«ЁвҐ«млҐ Їа®Ја ¬¬л ¤®«¦л д®а¬Ёа®ў вм бў®Ё १г«мв вл ¤«п в®Ј®,
зв®Ўл ®Ё Ўл«Ё ў®бЇаЁЁ¬ Ґ¬л Ё зЁв Ґ¬л Ї®«м§®ў ⥫Ґ¬ Їа®Ја ¬¬л. ‚
Ў®«миЁб⢥ б«гз Ґў, зЁб«®ўлҐ १г«мв вл ўлў®¤пвбп Є Є бва®ЄЁ бЁ¬ў®«®ў
ASCII ¤«п в®Ј®, зв®Ўл Ёе ¬®¦® Ўл«® ®вЇҐз в вм Ё«Ё Їа®б¬®ваҐвм ¤ЁбЇ«ҐҐ.
ќв®в ЇаЁ¬Ґа Ї®Є §лў Ґв, Є Є ўҐ«ЁзЁ б Ї« ў о饩 в®зЄ®© ¬®¦Ґв Ўлвм
ЇҐаҐўҐ¤Ґ ў ¤ҐбпвЁзго бва®Єг ASCII бЁ¬ў®«®ў. ”гЄжЁп, Ї®Є § п
ђЁбгЄҐ 20-6, ¬®¦Ґв Ўлвм ўл§ў Ё§ Їа®Ја ¬¬ п§лЄ е PL/M-386/486,
Pascal386/486, FORTRAN-386/486 Ё«Ё ASM386/486.
ЏаЁ ЇЁб ЁЁ Їа®Ја ¬¬л ®Ўа й «®бм ўЁ¬ ЁҐ ᪮॥ Єа вЄ®бвм, бЄ®а®бвм
Ё в®з®бвм ўлЇ®«ҐЁп, 祬 ¬ ЄбЁ¬Ё§ жЁо зЁб« § з йЁе жЁда. ‘¤Ґ«
Ї®ЇлвЄ ®бв ўЁвм жҐ«лҐ ў Ёе б®Ўб⢥ле ®Ў« бвпе ¤«п в®Ј®, зв®Ўл
ЇаҐ¤®вўа вЁвм б«гз ©лҐ ®иЁЎЄЁ ЇаЁ ЇҐаҐў®¤Ґ зЁбҐ«.
€бЇ®«м§гп зЁб« ў ўҐйҐб⢥®¬ д®а¬ ⥠а биЁаҐ®© в®з®бвЁ, нв
Ї®¤Їа®Ја ¬¬ ¤®бвЁЈ Ґв ў Ёег¤иҐ¬ б«гз Ґ в®з®бвЁ ваЁ Ґ¤ЁЁжл ў 16-⮬
¤ҐбпвЁз®¬ а §а拉 ¤«п ҐжҐ«Ґ«®зЁб«Ґле ўҐ«ЁзЁ Ё«Ё 楫ле зЁбҐ«, Ў®«миЁе
祬 10**(18). ќв® ¤ў®© п в®з®бвм. …б«Ё зЁб«® Ё¬ҐҐв ¤ҐбпвЁзл© Ї®а冷Є,
¬ҐмиЁ© 祬 100, в®з®бвм б®бв ў«пҐв ®¤ Ґ¤ЁЁж ў 17-⮬ ¤ҐбпвЁз®¬
а §а拉.
Ѓ®«ҐҐ ўлб®Є п в®з®бвм ¬®¦Ґв Ўлвм ¤®бвЁЈгв ЇаЁ Ў®«миЁе § ва в е
Їа®Ја ¬¬Ёа®ў ЁҐ, 㢥«ЁзҐЁЁ а §¬Ґа Їа®Ја ¬¬л Ў®«ҐҐ Ё§Є®© нд䥪⨢®бвЁ.
`¤`Є20.3.1 ‘®бв ў«пойЁҐ з бвЁ дгЄжЁЁ `*
ЏҐаҐў®¤ зЁбҐ« ॠ«Ё§гҐвбп ваҐ¬п ®в¤Ґ«мл¬Ё ¬®¤г«п¬Ё. ѓ« ўго а Ў®вг
ўлЇ®«пҐ¬ ¬®¤г«м FLOATING TO ASCII (—Ёб«® б Ї« ў о饩 в®зЄ®© ў
ASCII-бва®Єг). „агЈЁҐ ¬®¤г«Ё ЇаҐ¤бв ў«Ґл ®в¤Ґ«м®, Ї®в®¬г зв® ®Ё Ё¬Ґов
Ў®«ҐҐ ®ЎйҐҐ § 票Ґ. Ћ¤Ё Ё§ Ёе, GET POWER 10 (‚§пвм б⥯Ґм 10-вЁ),
ЁбЇ®«м§гҐвбп в Є¦Ґ Ё Ї®¤Їа®Ја ¬¬®© ЇҐаҐў®¤ зЁбҐ« Ё§ ASCII ўЁ¤ ў д®а¬ в б
Ї« ў о饩 в®зЄ®©. „агЈ®© ¬ «ҐмЄЁ© ¬®¤г«м, TOP STATUS (‘®бв®пЁҐ ўҐаиЁл
б⥪ ), Ё¤ҐвЁдЁжЁагҐв в®, з⮠室Ёвбп ў ўҐаиЁҐ зЁб«®ў®Ј® ॣЁбва®ў®Ј®
б⥪ .
`¤`Є20.3.2 ‘®Ј« иҐЁп Ї® ЁбЄ«озҐЁп¬ `*
ЌҐ®Ўе®¤Ё¬® ЇаҐ¤®вўа вЁвм дгЄжЁо ®в ЈҐҐаЁа®ў Ёп ўгваЁ ҐҐ
ЁбЄ«озЁвҐ«мле бЁвг жЁ©. ЏаЁЁ¬ овбп «оЎлҐ зЁб«®ўлҐ § 票п, ЇаЁ н⮬
в®«мЄ® ў®§¬®¦лҐ ЁбЄ«озҐЁп § Ё¬ ов б⥪ зЁб«®ўле ॣЁбва®ў.
‹оЎ®Ґ § 票Ґ, Ї®б« ®Ґ ў зЁб«®ў®© б⥪, Їа®ўҐапҐвбп бгйҐбвў®ў ЁҐ,
вЁЇ (NaN Ё«Ё ЎҐбЄ®Ґз®бвм) Ё б®бв®пЁҐ (¤Ґ®а¬ «м®Ґ, ®«м, § Є). ђ §¬Ґа
бва®ЄЁ вҐбвЁагҐвбп ЇаЁ ¬ЁЁ¬ «м®¬ Ё ¬ ЄбЁ¬ «м®¬ § 票Ё. …б«Ё ўҐаиЁ
ॣЁбва®ў®Ј® б⥪ Їгбв Ё«Ё а §¬Ґа бва®ЄЁ б«ЁиЄ®¬ ¬ «, дгЄжЁп ў®§ўа й Ґв
Є®¤ ®иЁЎЄЁ.
ЏҐаҐЇ®«ҐЁҐ Ё ®ваЁж ⥫쮥 ЇҐаҐЇ®«ҐЁҐ ЇаЁ ®зҐм Ў®«миЁе Ё«Ё ®зҐм
¬ «ҐмЄЁе зЁб« е ЇаҐ¤®вўа и овбп ўгваЁ дгЄжЁЁ.
ђЁбг®Є 20-6. Џ®¤Їа®Ја ¬¬ ЏҐаҐў®¤ —ЁбҐ« б Џ« ў о饩 ’®зЄ®© ў ASCII ‚Ё¤
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і і
і SOURCE і
і і
і +1 $title('ЏҐаҐў®¤ зЁб« б Ї« ў о饩 в®зЄ®© ў ASCII ўЁ¤') і
і і
і і
і name floating_to_ascii і
і і
і public floating_to_ascii і
і extrn get_power_10:near, tos_status:near і
і ; і
і ; ќв Ї®¤Їа®Ја ¬¬ ЇҐаҐў®¤Ёв зЁб«® б Ї« ў о饩 в®зЄ®© і
і ; Ё§ ўҐаиЁл б⥪ FPU ў бва®Єг вЁЇ ASCII Ё ®в¤Ґ«пҐв і
і ; б⥯Ґм 10, ¬ бив ЎЁагп § 票Ґ (ў ¤ў®Ёз®¬ ўЁ¤Ґ). і
і ; Њ ЄбЁ¬ «м п ¤«Ё бва®ЄЁ бЁ¬ў®«®ў ॣ㫨агҐвбп і
і ; Ї а ¬Ґв஬, Є®в®ал© ¤®«¦Ґ Ўлвм Ў®«миҐ 1. і
і ; ЌҐ-®а¬ «млҐ § 票п, ¤Ґ®а¬ «млҐ § зҐЁп Ё ЇбҐў¤® і
і ; -г«Ё ЇҐаҐў®¤пвбп Є®а४в®. Ћ¤ Є®, Ґ-®а¬ «млҐ і
і ; ўҐ«ЁзЁл Ё ЇбҐў¤®-г«Ё Ў®«ҐҐ Ґ Ї®¤¤Ґа¦Ёў овбп і
і ; Їа®жҐбб®а®¬ i486 (ў ᮮ⢥вбвўЁЁ б® бв ¤ а⮬ IEEE) Ё і
і ; ўгв॥ Ґ ЈҐҐаЁаговбп. ‚®§ўа й Ґ¬®Ґ § 票Ґ і
і ; гЄ §лў Ґв бЄ®«мЄ® ¤ў®Ёзле а §а冷ў в®з®бвЁ Ўл«® і
і ; Ї®вҐап® ў Ґ-®а¬ «мле Ё«Ё ¤Ґ®а¬ «мле § 票пе. і
і ; ’ Є¦Ґ гЄ §лў Ґвбп Ё ўҐ«ЁзЁ ¬ вЁббл ЇбҐў¤®-г«п і
і ; (¤ў®Ёзл¬ Ї®ап¤Є®¬). –Ґ«лҐ зЁб« ¬ҐмиЁҐ 10**18 і
і ; ЇҐаҐў®¤пвбп в®з®, Ґб«Ё ЇаЁЁ¬ ой п бва®Є ASCII і
і ; бЁ¬ў®«®ў ᮤҐа¦Ёв ¤®бв в®з®Ґ Є®«ЁзҐбвў® Ї®§ЁжЁ© ¤«п і
і ; жЁда нвЁе зЁбҐ«. ‚ Їа®вЁў®¬ б«гз Ґ § 票Ґ і
і ; ЇҐаҐў®¤Ёвмбп ў гзго ®в жЁо. і
і ; і
і ; ‚ § ўЁбЁ¬®бвЁ ®в १г«мв в Ї®¤Їа®Ја ¬¬ ўл¤ Ґв і
і ; б«Ґ¤гойЁҐ § 票п: і
і ; і
і ; 0 ЇҐаҐў®¤ ўлЇ®«Ґ, а §¬Ґа бва®ЄЁ ®ЇаҐ¤Ґ«Ґ і
і ; 1 Ґ¤®ЇгбвЁ¬лҐ аЈг¬Ґвл і
і ; 2 в®зл© жҐ«®зЁб«Ґл© ЇҐаҐў®¤, а §¬Ґа бва®ЄЁ і
і ; ®ЇаҐ¤Ґ«Ґ і
і ; 3 Ґ®ЇаҐ¤Ґ«Ґ®бвм і
і ; 4 + NaN (Ґ-зЁб«®) і
і ; 5 - NaN і
і ; 6 + ЃҐбЄ®Ґз®бвм і
і ; 7 - ЃҐбЄ®Ґз®бвм і
і ; 8 ўбваҐзҐ ЇбҐў¤®-®«м, а §¬Ґа бва®ЄЁ ®ЇаҐ¤Ґ«Ґ і
і ; і
і ; €вҐадҐ©б ¤«п ўл§®ў Ё§ PLM-386/486 і
і ; і
і ; floating_to_ascii: і
і ; procedure (number, denormal_ptr, string_ptr, size_ptr, і
і ; field_size, power_ptr) word external; і
і ; declare (denormal_ptr, string_ptr, power_ptr, size_ptr) і
і ; pointer; і
і ; declare field_size word; і
і ; string_size based size_ptr word; і
і ; declare number real; і
і ; declare denormal integer based denormal_ptr; і
і ; і
і і
і ; declare power integer based power_ptr; і
і ; end floating_to_ascii; і
і ; і
і ; ‚Ґ«ЁзЁ б Ї« ў о饩 в®зЄ®© ¤®«¦ Ўлвм ўҐаиЁҐ і
і ; б⥪ FPU. ќв Ї®¤Їа®Ја ¬¬ вॡгҐв ваЁ бў®Ў®¤лҐ і
і ; ॣЁбва ў б⥪Ґ Ё Ї®б«Ґ ®ва Ў®вЄЁ ўлв «ЄЁў Ґв і
і ; ЇҐаҐ¤ ў Ґ¬лҐ § зҐЁп Ё§ б⥪ . Џ®«гзҐ п бва®Є і
і ; Ўг¤Ґв Ё¬Ґвм з «мл© бЁ¬ў®« «ЁЎ® "+", «ЁЎ® "-", і
і ; гЄ §лў п § Є ўҐ«ЁзЁл. ‡ ⥬ б«Ґ¤гов ¤ҐбпвЁзлҐ і
і ; жЁдал ў ASCII ўЁ¤Ґ. —Ёб«®ў®Ґ § 票Ґ бва®ЄЁ вЁЇ і
і ; ASCII Ўг¤Ґв а ў® (ASCII ‘’ђЋЉЂ)*10**ЏЋђџ„ЋЉ. …б«Ё і
і ; ¤ ®Ґ зЁб«® Ўл«® г«Ґ¬, в® бва®Є Ўг¤Ґв ᮤҐа¦ вм і
і ; в®«мЄ® § Є Ё ®¤Ё бЁ¬ў®« 0. ‚Ґ«ЁзЁ а §¬Ґа бва®ЄЁ і
і ; (string_size) гЄ §лў Ґв Ї®«го ¤«Ёг бва®ЄЁ бЁ¬ў®«®ў, і
і ; ўЄ«оз п бЁ¬ў®« § Є . ‘ва®Є (0) ўбҐЈ¤ Ўг¤Ґв і
і ; ᮤҐа¦ вм § Є. ‚®§¬®¦®, зв® а §¬Ґа бва®ЄЁ Ўг¤Ґв і
і ; ¬ҐмиҐ а §¬Ґа Ї®«п. ќв® Ўлў Ґв ЇаЁ г«пе Ё 楫ле і
і ; зЁб« е. ЏбҐў¤®-®«м ўл¤ Ґв ®б®Ўл© Є®¤ ў®§ўа в . ЏаЁ і
і ; ¤Ґ®а¬ «мле зЁб« е гЄ §лў Ґвбп б⥯Ґм ¤ўге і
і ; ЇаҐ¤бв ў«Ґ®Ј® § 票п. ‘⥯Ґм ¤ҐбпвЁ Ё бва®Є Ўг¤гв і
і ; в ЄЁ¬Ё ¦Ґ, Є Є Ґб«Ё Ўл ўҐ«ЁзЁ Ўл« Ўл Їа®бвл¬ г«Ґ¬. і
і ; і
і ; ќв Ї®¤Їа®Ја ¬¬ в®з® ўл¤ Ґв ¤ҐбпвЁзлҐ жҐ«лҐ ¤® 18 і
і ; жЁда. –Ґ«лҐ ўҐ«ЁзЁл Ё¬Ґов ¤ҐбпвЁзл© Ї®Є § вҐ«м і
і ; б⥯ҐЁ ў бва®ЄҐ Ё§ г«Ґ©. ЏаЁ ҐжҐ«ле ўҐ«ЁзЁ е і
і ; в®з®бвм १г«мв в § Є«озҐ ў ¤ўге Ї®б«Ґ¤Ёе і
і ; ¤ҐбпвЁзле жЁда е (¤ў®© п в®з®бвм). „«п і
і ; ¬ бив ЎЁа®ў Ёп ўҐ«ЁзЁл ў ¤Ё Ї §®Ґ, ЇаЁҐ¬«Ґ¬®¬ ¤«п і
і ; ¤ ле вЁЇ BCD, ЁбЇ®«м§говбп Є®¬ ¤л ў®§ўҐ¤ҐЁп ў і
і ; б⥯Ґм. „«п ЇҐаҐў®¤ ЁбЇ®«м§гҐвбп ०Ё¬ ®ЄагЈ«ҐЁп, і
і ; ¤Ґ©бвўгойЁ© ЇаЁ ўе®¤Ґ ў Ї®¤Їа®Ја ¬¬г. і
і ; і
і ; ‘«Ґ¤гойЁҐ ॣЁбвал Ґ ўЁ¤л: і
і ; і
і ; eax ebx ecx edx esi edi eflags і
і ; і
і ; ЋЇаҐ¤Ґ«ҐЁҐ б⥪ . і
і ; і
і ebp_save equ dword ptr [ebp] і
і es_save equ ebp_save + size ebp_save і
і return_ptr equ es_save + size es_save і
і power_ptr equ return_ptr + size return_ptr і
і field_size equ power_ptr + size power_ptr і
і size_ptr equ field_size + size size_ptr і
і string_ptr equ size_ptr + size size_ptr і
і denormal_ptr equ string_ptr + size string_ptr і
і і
і parms_size equ size power_ptr + size field_size + і
і & size size_ptr + size string_ptr + і
і & size denormal_ptr і
і ; і
і ; ЋЇаҐ¤Ґ«ҐЁҐ ЁбЇ®«м§гҐ¬ле Є®бв в. і
і ; і
і BCD_DIGITS equ 18 ; Љ®«ЁзҐбвў® жЁда ў ўҐ«ЁзЁҐ вЁЇ BCD і
і WORD_SIZE equ 4 і
і BCD_SIZE equ 10 і
і MINUS equ 1 ; ЋЇаҐ¤Ґ«ҐЁҐ ўл¤ ў Ґ¬ле § 票© і
і NAN equ 4 ; ‚лЎа лҐ §¤Ґбм в®злҐ ўҐ«ЁзЁл - і
і INFINITY equ 6 ; ў ¦л. ЋЁ ¤®«¦л ᮮ⢥вбвў®ў вм і
і INDEFINITE equ 3 ; ў®§¬®¦л¬ ўл¤ ў Ґ¬л¬ § зҐЁп¬ Ё і
і PSEUDO_ZERO equ 8 ; вҐбвЁа®ў вмбп ў ⮬ ¦Ґ Ї®ап¤ЄҐ, Є Є і
і INVALID equ -2 ; Ї®Є § ® ў нв®© Їа®Ја ¬¬Ґ. і
і ZERO equ -4 і
і DENORMAL equ -6 і
і UNNORMAL equ -8 і
і NORMAL equ 0 і
і EXACT equ 2 і
і ; і
і ; ЋЇаҐ¤Ґ«ҐЁҐ Ї®«®¦ҐЁп ўаҐ¬Ґ®© ®Ў« бвЁ еа ҐЁп. і
і ; і
і power_two equ word ptr [ebp - WORD_SIZE] і
і bcd_value equ tbyte ptr power_two - BCD_SIZE і
і bcd-byte equ byte ptr bcd_value і
і fraction equ bcd_value і
і і
і lokal_size equ size power_two + size bcd_value і
і ; і
і ; ‚뤥«Ёвм ¤®бв в®зл© ®ЎкҐ¬ б⥪ ¤«п і
і ; ўаҐ¬Ґле १г«мв в®ў. і
і ; і
і stack stackseg (lokal_size+6) ; ‚뤥«Ёвм Їа®бва бвў® б⥪ і
і ; ¤«п «®Є «мле ¤ ле. і
і +1 $eject і
і і
і code segment public er і
і extrn power_table:qword і
і ; і
і ; Љ®бв вл, ЁбЇ®«м§гҐ¬лҐ нв®© дгЄжЁҐ©. і
і ; і
і even ; ЋЇвЁ¬Ё§Ёа®ў вм ¤® 16 жЁда. і
і const10 dw 10 ; Џ®¤аҐЈг«Ёа®ў вм § 票Ґ ¤«п і
і ; ; б«ЁиЄ®¬ Ў®«миЁе BCD. і
і ; і
і ; ЏҐаҐўҐбвЁ ЎЁвл C3, C2, C1 Ё C0 ў і
і ; § з йЁҐ д« ЈЁ Ё ўҐ«ЁзЁл, ЁбЇ®«м§гп і
і ; Їа®жҐ¤гаг tos_status. і
і ; і
і status_table db UNNORMAL, NAN, UNNORMAL+MINUS, і
і & NAN+MINUS, NORMAL, INFINITY, і
і & NORMAL+MINUS, INFINITY+MINUS, і
і & ZERO, INVALID, ZERO+MINUS, INVALID, і
і & DENORMAL, INVALID, DENORMAL+MINUS, INVALID і
і floting_to_ascii proc і
і і
і call tos_status ; Џ®б¬®ваҐвм б®бв®пЁҐ ST(0) і
і ; і
і ; ‚§пвм ¤ҐбЄаЁЇв®а Ё§ в Ў«Ёжл і
і ; і
і movzx eax, status_table[eax] і
і cmp al,INVALID ; ST(0) Їгбв? і
і jne not_empty і
і ; і
і ; ST(0) - Їгбв! ‚®§ўа й Ґв § 票Ґ б®бв®пЁп. і
і ; і
і ret parms_size і
і ; і
і ; “¤ «Ёвм ЎҐбЄ®Ґз®бвм Ё§ б⥪ Ё ўл©вЁ. і
і ; і
і found_infinity: і
і fstp st(0) ; Ћбв ўЁвм fstp і
і jmp short exit_proc і
і ; і
і ; „«Ё бва®ЄЁ б«ЁиЄ®¬ ¬ « ! і
і ; ‚л¤ Ґв Є®¤ Ґ¤®ЇгбвЁ¬®бвЁ. і
і ; і
і small_string: і
і mov al,INVALID і
і exit_proc: і
і leave ; ‚®ббв ®ўЁвм б⥪ і
і і
і pop es і
і ret parms_size і
і ; і
і ; ‚ ST(0) 室Ёвбп NaN Ё«Ё і
і ; Ґ®ЇаҐ¤Ґ«Ґ®бвм. ‘®еа Ёвм § 票Ґ і
і ; ў Ї ¬пвЁ Ё Їа®б¬®ваҐвм ¤а®Ў®Ґ Ї®«Ґ і
і ; ¤«п в®Ј®, зв®Ўл ®в«ЁзЁвм і
і ; Ґ®ЇаҐ¤Ґ«Ґ®бвм ®в ®Ўлз®Ј® NaN. і
і ; і
і NAN_or_indefinite: і
і fstp fraction ; „«п Їа®ўҐаЄЁ - г¤ «Ёвм § 票Ґ і
і ; Ё§ б⥪ . і
і test al,MINUS ; Џ®б¬®ваҐвм ЎЁв § Є . і
і fwait ; “ЎҐ¤Ёвмбп ў ўлЇ®«ҐЁЁ б®еа ҐЁп. і
і jz exit_proc ; …б«Ё Ї®«®¦ЁвҐ«мл© § Є, в® Ґ і
і ; ¬®¦Ґв Ўлвм Ґ®ЇаҐ¤Ґ«Ґ®бвмо. і
і і
і mov ebx,0C0000000H ; Џ®¤ ўЁвм ўҐаеЁҐ 32 а §ап¤ ¤а®Ў®© і
і ; з бвЁ. і
і і
і ; ‘а ўЁвм а §ап¤л 63-32 і
і sub ebx,dword ptr fraction + 4 і
і і
і ; ђ §ап¤л 31-0 ¤®«¦л Ўлвм г«п¬Ё і
і or ebx,dword ptr fraction і
і jnz exit_proc і
і і
і ; “бв ®ўЁвм ўл¤ ў Ґ¬®Ґ § 票Ґ і
і ; Ґ®ЇаҐ¤Ґ«Ґ®бвм і
і mov al,INDEFINITE і
і jmp exit_proc і
і ; і
і ; ‚뤥«Ёвм ¬Ґбв® ў б⥪Ґ ¤«п «®Є «мле ЇҐаҐ¬Ґле і
і ; Ё гбв ®ўЁвм Ї а ¬Ґва ¤аҐб жЁЁ. і
і ; і
і not_empty: і
і push es ; ‘®еа Ёвм а Ў®зЁ© ॣЁбва і
і enter local_size,0 ; “бв ®ўЁвм ¤аҐб жЁо б⥪ і
і і
і ; Џа®ўҐаЁвм, ¤®бв в®з® «Ё ¬Ґбв ў бва®ЄҐ і
і mov ecx,field_size і
і cmp ecx,2 і
і jl small_string і
і і
і dec ecx ; “бв ®ўЁвм бЁ¬ў®« § Є і
і і
і ; Џ®б¬®ваҐвм, ¬®¦Ґв Ўлвм бва®Є б«ЁиЄ®¬ Ў®«ми п ¤«п вЁЇ BCD і
і cmp ecx,BCD_DIGITS і
і jbe size_ok і
і і
і ; € зҐ гбв ®ўЁвм ¬ ЄбЁ¬ «мл© а §¬Ґа бва®ЄЁ і
і mov ecx,BCD_DIGITS і
і size_ok: і
і cmp al,INFINITY ; Њ®¦Ґв Ўлвм ЎҐбЄ®Ґз®бвм? і
і і
і ; ‚®§ўа вЁвм § 票Ґ б®бв®пЁп ¤«п + Ё«Ё - ЎҐбЄ®Ґз®бвЁ і
і jge found_infinity і
і і
і cmp al,NAN ; Њ®¦Ґвм Ўлвм NaN Ё«Ё і
і jge NAN_or_indefinite ; Ґ®ЇаҐ¤Ґ«Ґ®бвм і
і і
і ; і
і ; “бв ®ўЁвм ўл¤ ў Ґ¬®Ґ § 票Ґ Ї® 㬮«з Ёо і
і ; Ё Їа®ўҐаЁвм, ®а¬ «Ё§®ў ® «Ё зЁб«®. і
і ; і
і fabs ; €бЇ®«м§®ў вм в®«мЄ® Ї®«®¦ЁвҐ«млҐ § зҐЁп і
і ; і
і ; ЃЁв § Є ў ॣЁбвॠAL ᮤҐа¦Ёв ЁбвЁл© § Є ўҐ«ЁзЁл. і
і ; і
і xor edx,edx ; Џ®¤Ј®в®ўЁвм Є®бв вг 0 і
і mov edi,denormal_ptr ; ЋЎг«Ёвм бзҐвзЁЄ ¤Ґ®а¬ «мле зЁбҐ« і
і mov [edi],dx і
і mov ebx,power_ptr ; ЋЎг«Ёвм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ і
і mov [ebx],dx і
і mov dl,al і
і and dl,1 і
і add dl,EXACT і
і cmp al,ZERO ; Џа®ўҐаЁвм ®«м і
і jae convert_integer ; ЏҐаҐ©вЁ Їа®Ја ¬¬г ў®§ўҐ¤ҐЁп ў і
і ; б⥯Ґм, Ґб«Ё § 票Ґ а ў® г«о. і
і і
і fstp fraction і
і fwait і
і mov al,bcd_byte + 7 і
і or byte ptr bcd_byte +7,80h і
і fld fraction і
і fxtract і
і test al,80h і
і jnz normal_value і
і і
і fld1 і
і fsub і
і ftst і
і fstsw ax і
і sahf і
і jnz set_unnormal_count і
і ; і
і ; Ќ ©¤Ґ ЇбҐў¤®-®«м і
і ; і
і fldlg2 ; ЋжҐЁвм б⥯Ґм ¤ҐбпвЁ і
і add dl,PSEUDO_ZERO - EXACT і
і fmulp st(2),st і
і fxch ; ‚§пвм б⥯Ґвм ¤ҐбпвЁ і
і fistp word ptr [ebx] ; “бв ®ўЁвм б⥯Ґм ¤ҐбпвЁ і
і jmp convert_integer і
і і
і set_unnormal_count: і
і fxtract ; ‚§пвм Ёб室го ¤а®Ўм, і
і ; Ё ®а¬ «Ё§®ў вм. і
і fxch ; ‚§пвм бзҐвзЁЄ Ґ-®а¬ «мле зЁбҐ« і
і fchs і
і fistp word ptr [edi] ; “бв ®ўЁвм бзҐвзЁЄ і
і ; Ґ-®а¬ «мле зЁбҐ« і
і і
і ; і
і ; ‚лзЁб«Ёвм ¤ҐбпвЁзго ўҐ«ЁзЁг ў¬Ґб⥠б нвЁ¬ зЁб«®¬ і
і ; ўгваЁ ®¤®Ј® Ї®ап¤Є . і
і ; і
і ; ‚ᥣ¤ ЇаЁ ®ЄагЈ«ҐЁЁ Ўг¤Ґв ЇаЁбгвбвў®ў вм ®иЁЎЄ і
і ; Ё§-§ Ї®вҐаЁ в®з®бвЁ. ‚ १г«мв вҐ, ¬л і
і ; ЇаҐ¤ ¬ҐаҐ® ЇаЁ ўлзЁб«ҐЁЁ Ї®ап¤Є Ґ бв «Ё і
і ; а бб¬ ваЁў вм LOG10 ®в § зҐЁп ¤а®ЎЁ. ’ Є Є Є і
і ; ¤а®Ўм ўбҐЈ¤ Ў®«миҐ Ё«Ё а ў 1 Ё ¬ҐмиҐ ¤ўге, в® і
і ; LOG10 ®в нв®© ¤а®ЎЁ Ґ Ё§¬ҐпҐв ®б®ў®© в®з®бвЁ і
і ; дгЄжЁЁ. „«п в®Ј®, зв®Ўл Ї®«гзЁвм ¤ҐбпвЁзл© і
і ; Ї®а冷Є ўҐ«ЁзЁл, ¤® Їа®б⮠㬮¦Ёвм б⥯Ґм і
і ; ¤ўге LOG10(2) Ё ®ЄагЈ«Ёвм १г«мв в б і
і ; ®вбҐзҐЁҐ¬ ¤® 楫®Ј®. і
і ; і
і normal_value: і
і fstp fraction ; „«п ¤ «мҐ©иҐЈ® ЁбЇ®«м§®ў Ёп і
і ; б®еа Ёвм Ї®«Ґ ¤а®ЎЁ. і
і fist power_twq ; ‘®еа Ёвм б⥯Ґм ¤ўге і
і fldlg2 ; ‚§пвм LOG10(2) і
і ; ’ҐЇҐам ¬®¦® ЎҐ§®Ї б® ЁбЇ®«м§®ў вм і
і ; power_two і
і fmul ; Џ®¤Ј®в®ўЁвм LOG10 ®в Ї®ап¤Є зЁб« і
і fistp word ptr [ebx] ; ‡¤Ґбм ¬®¦Ґв Ўлвм ЇаЁ¬ҐҐ «оЎ®© і
і ; ०Ё¬ ®ЄагЈ«ҐЁп і
і ; і
і ; Џа®ўҐаЁвм, зв®Ўл ўҐ«ЁзЁ зЁб« і
і ; ЁвҐаЇаҐвЁа®ў « бм Є Є 楫®Ґ. і
і ; і
і ; CX Ё¬ҐҐв ¬ ЄбЁ¬ «м® Ї®§ў®«Ґ®Ґ Є®«ЁзҐбвў® ¤ҐбпвЁзле жЁда. і
і ; і
і fwait ; Ћ¦Ё¤ вм ¤®ЇгбвЁ¬®© б⥯ҐЁ ¤ҐбпвЁ і
і ; і
і ; ‚®§ўҐбвЁ ¤Ґбпвм ў б⥯Ґм ўҐ«ЁзЁл § зҐЁп і
і ; і
і movsx si,word ptr [ebx] і
і sub esi,ecx ; Џ®¤Ј®в®ўЁвм ў AX Ґ®Ўе®¤Ё¬л© і
і ; Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп. і
і ja adjust_result ; ЏҐаҐ©вЁ, Ґб«Ё зЁб«® Ґ Ї®¤е®¤Ёв і
і ; і
і ; —Ёб«® ¬Ґ¦¤г 1 Ё 10**(field_size - а §¬Ґа Ї®«п) і
і ; Џа®ўҐаЁвм 楫®зЁб«Ґ®бвм і
і ; і
і fild power_two ; ‚®ббв ®ўЁвм з «м®Ґ § 票Ґ і
і sub dl,NORMAL-EXACT ; ЏҐаҐўҐбвЁ ў в®з®Ґ ўл¤ ў Ґ¬®Ґ і
і ; § 票Ґ і
і fld farction і
і fscale ; Џ®¤Ј®в®ўЁвм Ї®«го ўҐ«ЁзЁг, ў нв®© і
і ; Є®¬ ¤Ґ ® Ґ Ї®авЁвбп і
і fst st(1) ; ‘Є®ЇЁа®ў вм § 票Ґ ¤«п ба ўҐЁп і
і frndint ; Џа®ўҐаЁвм 楫®зЁб«Ґ®бвм і
і fcomp ; ‘а ўЁвм § зҐЁп і
і fstsw ax ; ‘®еа Ёвм б®бв®пЁҐ і
і sahf ; C3 = 1, § зЁв нв® Ўл« 楫®Ґ зЁб«® і
і і
і jnz convert_integer і
і і
і fstp st(0) ; “¤ «Ёвм ҐжҐ«®зЁб«Ґ®Ґ § 票Ґ і
і add dl,NORMAL-EXACT ; ‚®ббв ®ўЁвм з «м®Ґ ўл¤ ў Ґ¬®Ґ і
і ; § 票Ґ і
і ; і
і ; Њ бив ЎЁа®ў вм зЁб«® ўгваЁ ¤Ё Ї §® , і
і ; Ї®§ў®«Ґ®Ј® д®а¬ ⮬ BCD. ЋЇҐа жЁп і
і ; ¬ бив ЎЁа®ў Ёп ўл¤ Ґв зЁб«® ўгваЁ ®¤®Ј® і
і ; ¤ҐбпвЁз®Ј® Ї®ап¤Є ўҐ«ЁзЁл ЁЎ®«м襣® і
і ; ¤ҐбпвЁз®Ј® зЁб« , ЇаҐ¤бв ўЁ¬®Ј® ¤«п ¤ ®© ¤«Ёл і
і ; бва®ЄЁ. і
і ; і
і ; ‚Ґ«ЁзЁ б⥯ҐЁ ¤ҐбпвЁ ¤«п ¬ бив ЎЁа®ў Ёп і
і ; 室Ёвбп ў ॣЁбвॠSI. і
і ; і
і adjust_result: і
і mov eax,esi ; Џ®¤Ј®в®ўЁвм ¤«п ў®§ўҐ¤ҐЁп ў і
і ; б⥯Ґм і
і mov word ptr [ebx],ax ; “бв ®ўЁвм з «мго ўҐ«ЁзЁг і
і ; б⥯ҐЁ ¤ҐбпвЁ і
і neg eax ; ‚лзҐбвм Ґ¤ЁЁжг ¤«п Є ¦¤®Ј® Ї®ап¤Є і
і ; ўҐ«ЁзЁл, Є®в®ал© ¬ бив ЎЁагҐвбп і
і ; § 票Ґ. і
і call get_power_10 ; Љ®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп і
і ; ЇаҐ¤бв ў«пҐвбп Є Є Ї®а冷Є Ё ¤а®Ўм. і
і fld fraction ; ‚§пвм ¤а®Ўм і
і fmul ; Љ®¬ЎЁЁа®ў вм ¤а®ЎЁ і
і mov esi,ecx ; ‚®§ўҐбвЁ ¤Ґбпвм ў ¬ ЄбЁ¬ «мго і
і ; б⥯Ґм і
і shl esi,3 ; „«п в®Ј®, зв®Ўл § 票Ґ BCD і
і ; ўе®¤Ё«® ў бва®Єг і
і fild power_two ; Љ®¬ЎЁЁа®ў вм б⥯Ґм ¤ўге і
і faddp st(2),st і
і fscale ; Џ®¤Ј®в®ўЁвм Ї®«®Ґ § 票Ґ, і
і ; Ї®а冷Є ®бв «бп Ґ ва®гвл¬ і
і fstp st(1) ; “¤ «Ёвм Ї®а冷Є і
і ; і
і ; Џа®ўҐам⥠гбв ®ў«Ґ®Ґ § 票Ґ Ї® в Ў«ЁжҐ і
і ; в®зле б⥯ҐҐ© ¤ҐбпвЁ. ‘㬬 алҐ ®иЁЎЄЁ ®жҐЄЁ і
і ; ўҐ«ЁзЁл Ё б⥯Ґ®© дгЄжЁЁ ¬®Јгв ЇаЁўҐбвЁ Є і
і ; ⮬г, зв® § 票Ґ ®¤®Ј® Ї®ап¤Є ўҐ«ЁзЁл Ўг¤Ґв і
і ; «ЁЎ® б«ЁиЄ®¬ ¬ «ҐмЄ®Ґ, «ЁЎ® б«ЁиЄ®¬ Ў®«м讥 ¤«п і
і ; Ї®«п вЁЇ BCD. „«п гбва ҐЁп нв®© Їа®Ў«Ґ¬л і
і ; Їа®вҐбвЁаг©вҐ Ї®«г祮Ґ § 票Ґ - пў«пҐвбп «Ё і
і ; ®® б«ЁиЄ®¬ Ў®«миЁ¬ Ё«Ё б«ЁиЄ®¬ ¬ «ҐмЄЁ¬. ‡ ⥬ і
і ; ®вॣ㫨аг©вҐ ҐЈ® Ё § 票Ґ б⥯ҐЁ ¤ҐбпвЁ. і
і ; і
і test_power: і
і ; і
і ; ‘а ўЁвҐ б в®з®© б⥯Ґмо. €бЇ®«м§г©вҐ б«Ґ¤гойго і
і ; б⥯Ґм ЇаЁ 㬥м襨Ё CX Ґ¤ЁЁжг. і
і ; і
і fcom power_table[esi]+type power_table і
і fstsw ax ; ЌҐ ¤® ¦¤ вм і
і sahf ; …б«Ё C3=C0=0, в® б«ЁиЄ®¬ Ў®«м讥 і
і jb test_for-small і
і fidiv const10 ; € зҐ гбв ®ўЁвм § 票Ґ і
і and dl,not EXACT ; “¤ «Ёвм д« Ј в®Ј®, зв® зЁб«® в®з®Ґ і
і inc word ptr [ebx] ; “бв ®ўЁвм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ і
і jmp short in_range ; ЏҐаҐўҐбвЁ § 票Ґ ў 楫®Ґ вЁЇ BCD і
і і
і test_for_small: і
і fcom power_table[esi] ; Џа®ўҐаЁвм ®в®бЁвҐ«мл© а §¬Ґа і
і і
і fstsw ax ; ЌҐ ¦¤ вм і
і sahf ; …б«Ё C0 = 0, в® ST(0) Ў®«миҐ Ё«Ё і
і ; а ўҐ Ё¦иҐ© Ја ЁжҐ і
і jc in_range ; ЏҐаҐўҐбвЁ § 票Ґ ў 楫®Ґ вЁЇ BCD і
і fimul const10 ; Џ®¤®Ј вм § 票Ґ Ї®¤ ¤Ё Ї §® і
і dec word ptr [ebx] ; Џ®¤®Ўа вм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ і
і in_range: і
і frndint ; Џ®¤Ј®в®ўЁвм 楫®Ґ § 票Ґ і
і ; і
і ; “⢥তҐЁҐ: 0 <= TOS <= 999,999,999,999,999,999 і
і ; —Ёб«® TOS Ўг¤Ґв в®з® ЇаҐ¤бв ў«Ґ® і
і ; 18-о жЁда ¬Ё ў д®а¬ ⥠BCD. і
і ; і
і convert_integer: і
і fbstp bcd_value ; ‘®еа Ёвм зЁб«® ў д®а¬ ⥠BCD і
і ; і
і ; ЏаЁ б®еа ҐЁЁ д®а¬ в BCD гбв ®ўЁвм ॣЁбвал і
і ; ¤«п ЇҐаҐў®¤ ў ASCII ўЁ¤. і
і ; і
і mov esi,BCD_SIZE-2 ; €ЁжЁ «Ё§Ёа®ў вм § 票Ґ і
і ; Ё¤ҐЄб BCD і
і mov cx,0f04h ; “бв ®ўЁвм бзҐвзЁЄ б¤ўЁЈ Ё ¬ бЄг і
і mov ebx,1 ; “бв ®ўЁвм з «мл© а §¬Ґа ASCII і
і ; Ї®«п ¤«п § Є і
і mov edi,string_ptr ; ‚§пвм ¤аҐб з « ASCII бва®ЄЁ і
і mov ax,ds ; ‘Є®ЇЁа®ў вм DS ў ES і
і mov es,ax і
і cld ; “бв ®ўЁвм ०Ё¬ ўв®¬ вЁзҐбЄ®Ј® і
і ; ¤®Ў ў«ҐЁп Ґ¤ЁЁжл і
і mov al,'+' ; ЋзЁбвЁвм Ї®«Ґ § Є і
і test dl,MINUS ; Џа®ўҐаЁвм ®ваЁж ⥫쮥 § 票Ґ і
і jz positive_result і
і і
і mov al,'-' і
і positive_result: і
і stosb ; “бв ®ўЁвм гЄ § ⥫м бва®ЄЁ і
і ; Ї®б«Ґ¤Ё© § Є і
і and dl,not MINUS ; ‚лЄ«озЁвм ЎЁв § Є і
і fwait ; Ћ¦Ё¤ вм ®Є®з Ёп Є®¬ ¤л fbstp і
і ; і
і ; €бЇ®«м§гҐ¬лҐ ॣЁбвал: і
і ; і
і ; AH: Ў ©в б® § 票Ґ¬ вЁЇ BCD і
і ; AL: § 票Ґ бва®ЄЁ ASCII і
і ; DX: ў®§ўа й Ґ¬®Ґ § 票Ґ і
і ; CH: ¬ бЄ BCD = 0fh і
і ; CL: бзҐвзЁЄ б¤ўЁЈ BCD = 4 і
і ; BX: иЁаЁ Ї®«п бва®ЄЁ ASCII і
і ; ESI: Ё¤ҐЄб Ї®«п BCD і
і ; DI: гЄ § вҐ«м Ї®«п бва®ЄЁ BCD і
і ; DS, ES: ¤аҐб ᥣ¬Ґв бва®ЄЁ ASCII і
і ; і
і ; “¤ «Ёвм з «млҐ г«Ё Ё§ зЁб« . і
і ; і
і ; і
і skip_leading_zeroes: і
і mov ah,bcd_byte[esi] ; ‚§пвм Ў ©в BCD і
і mov al,ah ; ‘Є®ЇЁа®ў вм § 票Ґ і
і shr al,cl ; ‚§пвм ўҐаеоо Ї® Ї®ап¤Єг жЁдаг і
і and al,0fh ; “бв ®ўЁвм д« Ј г«п і
і jnz enter_odd ; ‚л©вЁ Ё§ жЁЄ« , Ґб«Ё ў з «Ґ і
і ; ®Ў аг¦Ґл Ґ г«Ё і
і і
і mov al,ah ; ‚§пвм б®ў Ў ©в BCD і
і and al,0fh ; ‚§пвм Ё¦оо Ї® Ї®ап¤Єг жЁдаг і
і jnz enter-even ; ‚л©вЁ Ё§ жЁЄ« , Ґб«Ё ®Ў аг¦Ґл і
і ; Ґг«ҐўлҐ жЁдал і
і і
і dec esi ; “¬ҐмиЁвм Ё¤ҐЄб BCD і
і jns skip_leading_zeroes і
і ; і
і ; ‚бп ¬ вЁбб б®бв®Ёв Ё§ г«Ґ© і
і ; і
і mov al,'0' ; “бв ®ўЁвм з «мл© ®«м і
і stosb і
і inc ebx ; “ўҐ«ЁзЁвм ¤«Ёг бва®ЄЁ і
і jmp short exit_with_value і
і ; і
і ; ’ҐЇҐам а биЁа塞 бва®Єг жЁда ¬Ё ®в і
і ; 0 ¤® 9 Ї® ®¤®© жЁдॠЎ ©в і
і ; і
і digit_loop: і
і mov ah,bcd_byte[esi] ; ‚§пвм Ў ©в BCD і
і mov al,ah і
і shr al,cl ; ‚§пвм ўҐаеоо Ї® Ї®ап¤Єг жЁдаг і
і enter_odd: і
і add al,'0' ; ЏҐаҐўҐбвЁ ў ASCII і
і stosb ; ‡ ҐбвЁ жЁдаг ў бва®Єг ASCII і
і mov al,ah ; ‚§пвм Ё¦оо Ї® Ї®ап¤Єг жЁдаг і
і and al,0fh і
і inc ebx ; “ўҐ«ЁзЁвм бзҐвзЁЄ а §¬Ґа Ї®«п і
і enter-even: і
і add al,'0' ; ЏҐаҐўҐбвЁ ў ASCII і
і stosb ; ‡ ҐбвЁ жЁдаг ў бва®Єг ASCII і
і inc ebx ; “ўҐ«ЁзЁвм бзҐвзЁЄ а §¬Ґа Ї®«п і
і dec esi ; ЏҐаҐ©вЁ Є б«Ґ¤го饬㠡 ©вг BCD і
і jns digit_loop і
і ; і
і ; ЏҐаҐў®¤ § Є®зҐ. “бв ®ўЁвм а §¬Ґа і
і ; бва®ЄЁ Ё ®бв в®Є і
і ; і
і exit_with_value: і
і mov edi,size_ptr і
і mov word ptr [edi],bx і
і mov eax,edx ; “бв ®ўЁвм ўл¤ ў Ґ¬®Ґ § 票Ґ і
і jmp exit_proc і
і і
і floating_to_ascii endp і
і code ends і
і end і
і і
і і
і +1 $title(‚лзЁб«Ёвм § 票Ґ 10**AX) і
і і
і ; ќв Ї®¤Їа®Ја ¬¬ ўлзЁб«пҐв § 票Ґ б⥯ҐЁ і
і ; 10**EAX. ’®зл© аҐ§г«мв в ўл¤ Ґвбп ¤«п § 票© ў і
і ; ¤Ё Ї §®Ґ 0 <= EAX < 19. ‚ᥠॣЁбвал Їа®§а зл і
і ; Ё § 票Ґ ўл¤ Ґвбп ў TOS Є Є ¤ў зЁб« : Ї®а冷Є і
і ; ў ST(1) Ё ¤а®Ўм ў ST(0). ‚Ґ«ЁзЁ Ї®ап¤Є ¬®¦Ґв і
і ; ЇаҐўли вм ЁЎ®«миЁ© Ї®а冷Є зЁб« ў а биЁаҐ®¬ і
і ; ўҐйҐб⢥®¬ д®а¬ вҐ. ‚ Їа®Ја ¬¬Ґ ЁбЇ®«м§говбп і
і ; ваЁ б⥪®ўле ॣЁбва . і
і ; і
і name get_power_10 і
і public get_power_10, power_table і
і і
і stack stackseg 8 і
і і
і code segment public er і
і ; і
і ; €бЇ®«м§®ў вм в®злҐ § зҐЁп ®в 1.0 ¤® 1E18. і
і ; і
і even ; ЋЇвЁ¬Ё§Ёа®ў вм 16-вЁ ЎЁв®ўл© ¤®бвгЇ і
і power_table dq 1.0,1e1,1e2,1e3 і
і і
і dq 1e4,1e5,1e6,1e7 і
і і
і dq 1e8,1e9,1e10,1e11 і
і і
і dq 1e12,1e13,1e14,1e15 і
і і
і dq 1e16,1e17,1e18 і
і і
і get_power_10 proc і
і cmp eax,18 ; Џа®ўҐаЁвм ¤Ё Ї §® 0 <= AX < 19 і
і ja out_of_range і
і і
і fld power_table[eax*8] ; ‚§пвм в®з®Ґ § 票Ґ і
і fxtract ; Ћв¤Ґ«Ёвм б⥯Ґм Ё і
і ; ¤а®Ўго з бвм і
і ret ; Ћбв ўЁвм fxtract і
і ; і
і ; ‚лзЁб«Ёвм § 票Ґ, ЁбЇ®«м§гп Є®¬ ¤г ў®§ўҐ¤ҐЁп і
і ; ў б⥯Ґм. €бЇ®«м§говбп б«Ґ¤гойЁҐ б®®в®иҐЁп: і
і ; і
і ; 10**X = 2**(log2(10)*X) і
і ; 2**(I+F) = 2**I * 2**F і
і ; і
і ; …б«Ё ST(1) = I Ё ST(0) = 2**F, в® Є®¬ ¤ fscale і
і ; ўл¤ Ґв 2**(I+F). і
і ; і
і out_of_range: і
і і
і fldl2t ; TOS = LOG2(10) і
і enter 4,0 і
і і
і ; ‘®еа Ёвм § 票Ґ б⥯ҐЁ ¤ҐбпвЁ, P і
і ; і
і mov [ebp-4],eax і
і і
і ; TOS, X = LOG2(10)*P = LOG2(10**P) і
і ; і
і fimul dword ptr [ebp-4] і
і fld1 ; “бв ®ўЁвм TOS = -1.0 і
і fchs і
і fld st(1) ; ‘Є®ЇЁа®ў вм § 票Ґ б⥯ҐЁ Ї® і
і ; ®б®ў Ёо ¤ў і
і frndint ; TOS = I; -ЎҐбЄ®Ґз®бвм < I <= X, і
і ; Ј¤Ґ I - 楫®Ґ і
і ; ђҐ¦Ё¬ ®ЄагЈ«ҐЁп Ґ Ё¬ҐҐв § зҐЁп і
і fxch st(2) ; TOS = X, ST(1) = -1.0 і
і ; ST(2) = I і
і fsub st,st(2) ; TOS, F = X-I: і
і ; -1.0 < TOS <= 1.0 і
і і
і ; ‚®ббв ®ўЁвм з «мл© аҐ¦Ё¬ гЇа ў«ҐЁп в®з®бвмо і
і pop eax і
і f2xm1 ; TOS = 2**(F) - 1.0 і
і leave ; ‚®ббв ®ўЁвм б⥪ і
і fsubr ; Џ®¤Ј®в®ўЁвм 2**(F) і
і ret ; Ћбв ўЁвм fsubr і
і і
і get_power_10 endp і
і і
і code ends і
і end і
і і
і +1 $title(ЋЇаҐ¤Ґ«ҐЁҐ ᮤҐа¦Ё¬®Ј® ॣЁбва TOS) і
і ; і
і ; ќв Ї®¤Їа®Ја ¬¬ ўл¤ Ґв § 票Ґ ®в 0 ¤® 15 ў і
і ; ॣЁбва EAX ў ᮮ⢥вбвўЁЁ б ᮤҐа¦ ЁҐ¬ ўҐаиЁл і
і ; б⥪ FPU. ‚ᥠॣЁбвал Їа®§а зл, Ї®н⮬㠮訡ЄЁ і
і ; ЁбЄ«озҐл. ‚л¤ ў Ґ¬®Ґ § 票Ґ ᮮ⢥вбвўгҐв і
і ; ЎЁв ¬ C3, C2, C1 Ё C0 Є®¬ ¤л FXAM. і
і ; і
і name tos_status і
і public tos_status і
і і
і stack stackseg 6 і
і і
і code segment public er і
і і
і tos_status proc і
і fxam ; ‚§пвм б®бв®пЁҐ ॣЁбва TOS і
і fstsw ax ; ‚§пвм ⥪г饥 б®бв®пЁҐ і
і mov al,ah ; Џ®«®¦Ёвм ЎЁвл 10-8 ў ЎЁвл 2-0 і
і and eax,4007h ; Њ бЄЁа®ў вм ЎЁвл C3, C2, C1 Ё C0 і
і shr ah,3 ; Џ®«®¦Ёвм ЎЁв C3 ў ЎЁв 11 і
і or al,ah ; Џ®«®¦Ёвм ЎЁв C3 ў ЎЁв 3 і
і mov ah,0 ; ЋзЁбвЁвм ў®§ўа й Ґ¬®Ґ § 票Ґ і
і ret і
і і
і tos_status endp і
і і
і code ends і
і end і
і і
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
`¤`Є20.3.3 ‘ЇҐжЁ «млҐ Є®¬ ¤л `*
”гЄжЁЁ ®ЇҐаЁагов а §«Ёзл¬Ё зЁб«®ўл¬Ё Є®¬ ¤ ¬Ё, вЁЇ ¬Ё ¤ ле Ё
гЇа ў«пов в®з®бвмо. Џ®Є § лҐ Є®¬ ¤л пў«повбп Є®¬ ¤ ¬Ё ¤«п
ўв®¬ вЁзҐбЄ®Ј® ЇҐаҐў®¤ зЁбҐ« ў BCD ўЁ¤ (¤ў®Ёз®- ¤ҐбпвЁзл© Є®¤). ЏаЁ
н⮬ ўлзЁб«пҐвбп 10-вЁ Єа ⮥ § 票Ґ 楫®зЁб«Ґ®© ўҐ«ЁзЁл, ®ЇҐа жЁЁ
ўлЇ®«повбп ®¤®ўаҐ¬Ґ®, гбв ў«Ёў Ґвбп бЁеа®Ё§ жЁп ¤ ле Ё
ЁбЇ®«м§гҐвбп ®аЁҐвЁа®ў ®Ґ ®ЄагЈ«ҐЁҐ ў ¬®¤г«Ґ ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б
Ї« ў о饩 в®зЄ®©.
ЃҐ§ вЁЇ ¤ ле а биЁаҐ®© в®з®бвЁ Ё ўбв஥®© нЄбЇ®ҐжЁ «м®©
дгЄжЁЁ, Ґ ¬®¦Ґв Ўлвм ¤®бвЁЈгв ¤ў®© п в®з®бвм нв®© дгЄжЁЁ ЇаЁ
бЄ®а®бвЁ Ё а §¬ҐаҐ ЇаЁўҐ¤Ґ®Ј® ЇаЁ¬Ґа .
”гЄжЁп Ў §ЁагҐвбп зЁб«®ў®¬ вЁЇҐ ¤ ле BCD ¤«п ЇҐаҐў®¤ Ё§ ¤ў®Ёз®Ј® б
Ї« ў о饩 в®зЄ®© ў ¤ҐбпвЁз®Ґ. Ћб®ў п а Ў®в § Є«оз Ґвбп ў
¬ бив ЎЁа®ў ЁЁ § 票п б Ї« ў о饩 в®зЄ®© ¤® ЇаЁҐ¬«Ґ¬®Ј® ®Ја ЁзҐ®Ј®
¤Ё Ї §® § 票© вЁЇ BCD. „«п в®, зв®Ўл ЇҐз в вм १г«мв в Ё§ 9-вЁ
жЁда, Ґ®Ўе®¤Ё¬® в®з® Їа®ўҐбвЁ ¬ бив ЎЁа®ў ЁҐ ¤ ®© ўҐ«ЁзЁл ў 楫®Ґ
¬Ґ¦¤г 10**(8) Ё 10**(9). Ќ ЇаЁ¬Ґа, зЁб«® +0.123456789 вॡгҐв Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп Ї®ап¤Є 10**(9) ¤«п в®Ј®, зв®Ўл Ї®«гзЁвм зЁб«®
+123456789.0, Є®в®а®Ґ ¬®¦Ґв еа Ёвмбп ў 9-вЁ жЁда е вЁЇ BCD. Љ®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп ¤®«¦Ґ Ўлвм в®з®© б⥯Ґмо 10-вЁ ¤«п в®Ј®, зв®Ўл
ЇаҐ¤®вўа вЁвм Ё§¬ҐҐЁп жЁда ЇаЁ ЇҐз вЁ.
ќвЁ Ї®¤Їа®Ја ¬¬л ¤®«¦л Їа ўЁ«м® ЇҐаҐў®¤Ёвм ўбҐ § 票п, в®з®
ЇаҐ¤бв ўЁ¬лҐ ў ¤ҐбпвЁз®¬ ўЁ¤Ґ, ў Ї®«Ґ, § ¤ ®Ј® а §¬Ґа . –Ґ«®зЁб«ҐлҐ
§ 票п, Є®в®алҐ Ї®¤е®¤пв Ї®¤ ¤ л© а §¬Ґа бва®ЄЁ, Ґв Ґ®Ўе®¤Ё¬®бвЁ
¬ бив ЎЁа®ў вм, ¬®¦® ба §г б®еа пвм ў д®а¬Ґ BCD. ЌҐжҐ«®зЁб«ҐлҐ
§ 票п, в®з® ЇаҐ¤бв ўЁ¬лҐ ў ¤ҐбпвЁз®¬ ўЁ¤Ґ ў ЇаҐ¤Ґ« е а §¬Ґа бва®ЄЁ,
в Є¦Ґ ЇҐаҐў®¤пвбп в®з®. Ќ ЇаЁ¬Ґа, зЁб«® 0.125 в®з® ЇаҐ¤бв ўЁ¬® Є Є ў
¤ў®Ёз®¬ ўЁ¤Ґ, в Є Ё ў ¤ҐбпвЁз®¬. „«п в®Ј®, зв®Ўл ЇҐаҐўҐбвЁ нв® § 票Ґ
б Ї« ў о饩 в®зЄ®© ў ¤ҐбпвЁзл© ўЁ¤, ¤® ўлЎа вм Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп 1000. ‚ १г«мв ⥠Ї®«гзЁ¬ зЁб«® 125. ЏаЁ ¬ бив ЎЁа®ў ЁЁ
ўҐ«ЁзЁ, дгЄжЁп ¤®«¦ ®бв ў«пвм б«Ґ¤ в ¬, Ј¤Ґ Ўг¤Ґв а бЇ®« Ј вмбп
¤ҐбпвЁз п в®зЄ ў Є®Ґз®¬ ¤ҐбпвЁз®¬ § 票Ё.
`¤`Є20.3.4 ЋЇЁб ЁҐ ®ЇҐа жЁЁ`*
ЏҐаҐў®¤ зЁб« б Ї« ў о饩 в®зЄ®© ў ¤ҐбпвЁзл© ASCII ўЁ¤ Їа®ў®¤Ёвбп ў ваЁ
®б®ўле и Ј : ®ЇаҐ¤Ґ«ҐЁҐ ўҐ«ЁзЁл зЁб« , ¬ бив ЎЁа®ў ЁҐ ҐЈ® ¤«п
ЇаҐ¤бв ў«ҐЁп ў ўЁ¤Ґ BCD Ё ЇҐаҐў®¤ ¤ ле вЁЇ BCD ў ¤ҐбпвЁзго бЁ¬ў®«мго
ASCII § ЇЁбм.
ЋЇаҐ¤Ґ«ҐЁҐ ўҐ«ЁзЁл १г«мв в вॡгҐв 宦¤ҐЁп в Є®Ј® § 票п зЁб«
X, ЇаЁ Є®в®а®¬ иҐ зЁб«® Ўл«® Ўл ЇаҐ¤бв ўЁ¬® ў ўЁ¤Ґ I x 10**(X), Ј¤Ґ 1.0
у I < 10.0. Њ бив ЎЁа®ў ЁҐ зЁб« вॡгҐв ҐЈ® 㬮¦ҐЁп Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп 10**(S) в Є, зв®Ўл १г«мв в Ўл« жҐ«л¬, Ґ ᮤҐа¦ йЁ¬
¤ҐбпвЁзле жЁда Ў®«миҐ, 祬 ®вўҐ¤Ґ® ¤«п нв®Ј® ¬Ґбв ў бва®ЄҐ бЁ¬ў®«®ў
ASCII.
Џ®б«Ґ ¬ бив ЎЁа®ў Ёп, ®ЄагЈ«ҐЁп Ё ЇҐаҐў®¤ ў вЁЇ BCD зЁб«®
ЇаҐ¤бв ў«пҐвбп ў д®а¬Ґ, 㤮Ў®© ¤«п ЇҐаҐў®¤ ў ¤ҐбпвЁзл© ASCII ўЁ¤ «оЎл¬
Їа®Ја ¬¬л¬ ®ЎҐбЇҐзҐЁҐ¬.
ђҐ «Ё§ жЁп ўбҐе нвЁе ваҐе и Ј®ў вॡгҐв ЇаҐ¤Ґ«м®Ј® ўЁ¬ Ёп Є ¤Ґв «п¬.
„«п з « ®Ўа вЁвҐ ўЁ¬ ЁҐ, зв® Ґ Є ¦¤ п ўҐ«ЁзЁ б Ї« ў о饩 в®зЄ®©
Ё¬ҐҐв зЁб«®ў®Ґ § 票Ґ. Џ®¤Їа®Ја ¬¬®© ЇҐаҐў®¤ ¬®Јгв Ўлвм ўбваҐзҐл Ё
в ЄЁҐ ўҐ«ЁзЁл Є Є ЎҐбЄ®Ґз®бвм, Ґ®ЇаҐ¤Ґ«Ґ®бвм Ё«Ё NaN. Џ®н⮬г нв
Ї®¤Їа®Ја ¬¬ ¤®«¦ 㬥вм ®Ї®§ ў вм нвЁ ўҐ«ЁзЁл Ё ®¤®§ з® ®ЇаҐ¤Ґ«пвм
Ёе.
’ Є¦Ґ ЇаЁбгвбвўгов ®б®ЎлҐ б«гз Ё зЁб«®ўле § 票©. ЌҐ®а¬ «млҐ ўҐ«ЁзЁл
Ё¬Ґов зЁб«®ў®Ґ § 票Ґ Ё ¤®«¦л Ўлвм ®в«ЁзЁ¬л дгЄжЁҐ©, в Є Є Є ®Ё
гЄ §лў ов в®, зв® Ўл« Ї®вҐап в®з®бвм ў Їа®жҐбᥠЇа®ўҐ¤ҐЁп
ЇаҐ¤иҐбвўгойЁе ўлзЁб«ҐЁ©.
ЋЇаҐ¤Ґ«Ёў, зв® зЁб«® Ё¬ҐҐв зЁб«®ў®Ґ § 票Ґ Ё ®а¬ «Ё§®ў ® (ЇаЁ
Ґ®Ўе®¤Ё¬®бвЁ гбв ®ўЄ ᮮ⢥вбвўгойЁе д« Ј®ў бЁЈ «Ё§ЁагҐв ўл§ў ®©
Їа®Ја ¬¬Ґ, зв® нв® Ґ®а¬ «м®Ґ зЁб«®), ¬®¦® ¬ бив ЎЁа®ў вм ўҐ«ЁзЁг ў
¤Ё Ї §®Ґ вЁЇ BCD.
`¤`Є20.3.5 Њ бив ЎЁа®ў ЁҐ ўҐ«ЁзЁ `*
„«п в®Ј®, зв®Ўл ¬ бив ЎЁа®ў вм зЁб«®, Ґ®Ўе®¤Ё¬® ®ЇаҐ¤Ґ«Ёвм ҐЈ® ўҐ«ЁзЁг.
„®бв в®з® ўлзЁб«Ёвм ўҐ«ЁзЁг б в®з®бвмо ¤® 1 Ґ¤ЁЁжл Ё«Ё ЇаЁ Єа ⮬ 10
Є®нддЁжЁҐвҐ, 㬮¦Ґл¬ вॡ㥬го ўҐ«ЁзЁг. Џ®б«Ґ ¬ бив ЎЁа®ў Ёп
зЁб« Їа®ў®¤Ёвбп Їа®ўҐаЄ ¤«п в®Ј®, зв®Ўл Ї®б¬®ваҐвм Ї®Ї « «Ё १г«мв в ў
®¦Ё¤ Ґ¬л© ¤Ё Ї §®. …б«Ё Ґв, ⮠१г«мв в ¬®¦Ґв Ўлвм ЁбЇа ў«Ґ ®¤Ё
¤ҐбпвЁзл© Ї®а冷Є ўўҐае Ё«Ё ўЁ§ ®в вॡ㥬®© ўҐ«ЁзЁл. Џ®¤бв஥зл© вҐбв
Ї®б«Ґ ¬ бив ЎЁа®ў Ёп Ґ®Ўе®¤Ё¬ ¤«п гбва ҐЁп ҐЁ§ЎҐ¦®© Ґв®з®бвЁ ў
¬ бив ЎЁа®ў ®¬ § 票Ё.
’ Є Є Є ®жҐЄ § зҐЁп ¤«п Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп ¤®«¦ Ўлвм
¤®бв в®з® Ў«Ё§Є®©, в® ЁбЇ®«м§гҐвбп Ўлбвал© ЇаЁҐ¬ ¬ бив ЎЁа®ў Ёп.
‚Ґ«ЁзЁ ®жҐЁў Ґвбп 㬮¦ҐЁҐ¬ б⥯ҐЁ 2, Є®в®а п ЇаҐ¤бв ў«пҐв Ё§ ᥡп
Ґб¬ҐйҐл© Ї®а冷Є зЁб« б Ї« ў о饩 в®зЄ®©, ᮮ⢥вб⢥® б зЁб«®¬
log(10) ®в 2. ЋЄагЈ«ҐЁҐ १г«мв в ¤® 楫®Ј® ¤ Ґв ®жҐЄг ¤®бв в®з®©
в®з®бвЁ. €Ј®аЁагп ¤а®ЎЁ, § 票Ґ ў १г«мв ⥠¬®¦Ґв Ё¬Ґвм ¬ ЄбЁ¬ «мго
®иЁЎЄг 0.32.
€бЇ®«м§гп § 票Ґ ўҐ«ЁзЁл Ё а §¬Ґа зЁб«®ў®© бва®ЄЁ, ¬®¦® ўлзЁб«Ёвм
Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп. ‚ Їа®жҐ¤гॠЇҐаҐў®¤ зЁб« ўлзЁб«ҐЁҐ
Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп пў«пҐвбп б ¬®© Ґв®з®© ®ЇҐа жЁҐ©. „«п нв®Ј®
ЁбЇ®«м§гҐвбп б®®в®иҐЁҐ 10**(X) = 2**(X * log(10) 2) Ё Є®¬ ¤ F2XM1.
‚ ᮮ⢥вбвўЁЁ б ®Ја ЁзҐЁп¬Ё ¤Ё Ї §® § 票©, а §аҐиҐле Є®¬ ¤®©
F2XM1, § 票Ґ б⥯ҐЁ 2 а §ЎЁў Ґвбп 楫го Ё ¤а®Ўго Є®¬Ї®Ґвл.
‘®®в®иҐЁҐ 2**(I + F) = 2**(I) x 2**(F) Ї®§ў®«пҐв ЁбЇ®«м§®ў вм ЁбвагЄжЁо
FSCALE ¤«п в®Ј®, зв®Ўл ЇҐаҐЄ®¬ЎЁЁа®ў вм § 票Ґ 2**(F), ўлзЁб«Ґ®Ґ
Є®¬ ¤®© F2XM1, Ё з бвм 2**(I).
`¤`Є20.3.5.1 ЌҐв®з®бвм ЇаЁ ¬ бив ЎЁа®ў ЁЁ`*
ЏаЁ ўлзЁб«ҐЁЁ Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп ў®§ЁЄ Ґв Ґв®з®бвм Ё§-§
®бв в®зле г«Ґ©, Ї®¬ҐйҐле ў ¤а®Ў®© ўҐ«ЁзЁҐ б⥯ҐЁ 2 ЇаЁ ®в¤Ґ«ҐЁЁ
§ зЁ¬ле ЎЁв®ў 楫®© з бвЁ. „«п Є ¦¤®Ј® 楫®Ј® § зЁ¬®Ј® ЎЁв ў § 票Ё
б⥯ҐЁ 2, ®в¤Ґ«Ґле ®в ¤а®Ўле ЎЁв®ў, ў ¤а®Ў®© з бвЁ вҐапҐвбп ®¤Ё ЎЁв
в®з®бвЁ ЇаЁ § Ї®«ҐЁЁ г«п¬Ё ¬ҐҐҐ § з йЁе ЎЁв®ў.
„® 14 ЎЁв®ў ¬®¦Ґв Ўлвм Ї®вҐап® ў ¤а®Ў®© з бвЁ, в Є Є Є ЁЎ®«ми п
¤®ЇгбвЁ¬ п ўҐ«ЁзЁ Ї®ап¤Є зЁб« б Ї« ў о饩 в®зЄ®© б®бв ў«пҐв 2**(14) -
1. ќвЁ ЎЁвл ҐЇ®б।б⢥® Ё 㬥ми ов в®з®бвм ўлзЁб«ҐЁп Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп, 祬 Ё ўл§лў ов 㬥м襨Ґ в®з®бвЁ б ¬®Ј® § 票п зЁб« .
„«п зЁбҐ« ў ¤Ё Ї §®Ґ 10**(с30) ¬ ЄбЁ¬ «м®Ґ зЁб«® ЎЁв®ў в®з®бвЁ,
Ї®вҐапле ЇаЁ ўлЇ®«ҐЁЁ ¬ бив ЎЁа®ў Ёп, ¤®бвЁЈ Ґв 8-¬Ё.
`¤`Є20.3.5.2 ЏаҐ¤гЇаҐ¦¤ҐЁҐ ЇҐаҐЇ®«ҐЁ© Ё ®ваЁж ⥫мле ЇҐаҐЇ®«ҐЁ© `*
„а®Ў п з бвм зЁб« Ё Ї®Є § вҐ«м ®в¤Ґ«Ґл ¤агЈ ®в ¤агЈ ¤«п в®Ј®, зв®Ўл
Ё§ЎҐ¦ вм ЇҐаҐЇ®«ҐЁ© Ё ®ваЁж ⥫мле ЇҐаҐЇ®«ҐЁ© ЇаЁ ўлзЁб«ҐЁЁ
¬ би ЎЁа®ў ®© ўҐ«ЁзЁл. Ќ ЇаЁ¬Ґа, ¤«п в®Ј®, зв®Ўл Їа®Ё§ўҐбвЁ
¬ бив ЎЁа®ў ЁҐ зЁб« 10**(-4932) ¤® 10**(8), вॡгҐвбп Є®нддЁжЁҐв
¬ бив ЎЁа®ў Ёп 10**(4950), Є®в®ал© Ґ ¬®¦Ґв Ўлвм ЇаҐ¤бв ў«Ґ Їа®жҐбб®а®¬
i486.
Ћв¤Ґ«Ёў Ї®Є § вҐ«м Ё ¤а®Ўм, ®ЇҐа жЁп ¬ бив ЎЁа®ў Ёп Ўг¤Ґв Їа®бв®
бЄ« ¤лў вм Ї®Є § ⥫Ё ®в¤Ґ«м® ®в 㬮¦ҐЁп ¤а®ЎҐ©. ќв аЁд¬ҐвЁзҐбЄ п
®ЇҐа жЁп ўЄ«оз Ґв ¬ «лҐ жҐ«лҐ зЁб« , «ҐЈЄ® ЇаҐ¤бв ўЁ¬лҐ Їа®жҐбб®а®¬ i486.
`¤`Є20.3.5.3 ЋЄ®з ⥫м п ॣ㫨஢Є `*
‚®§¬®¦®, зв® б⥯Ґ п дгЄжЁп Get Power 10 ¬®¦Ґв ўл¤ вм १г«мв в
¬ бив ЎЁа®ў Ёп ўҐ«ЁзЁл в Є, зв® Ї®«гзЁвбп зЁб«®, Ё¬Ґо饥 Ў®«миҐ
а §а冷ў, 祬 ¬®¦Ґв Ўлвм ЇаҐ¤бв ў«Ґ® ў бва®ЄҐ ASCII бЁ¬ў®«®ў. Ќ ЇаЁ¬Ґа,
¬ бив ЎЁа®ў ЁҐ зЁб« 9.9999999999999999 x 10**(4900) б Є®нддЁжЁҐв®¬
1.00000000000000010 x 10**(-4883) ¤ «® Ўл ў १г«мв ⥠зЁб«®
1.00000000000000009 x 10**(18). € Є®нддЁжЁҐв ¬ бив ЎЁа®ў Ёп
ᮮ⢥вбвўгҐв в®з®бвЁ ¬®¤г«п ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩 в®зЄ®© Ё
१г«мв в ᮮ⢥вбвўгҐв в®з®бвЁ ЇҐаҐў®¤ , ® зЁб«® Ґ ¬®¦Ґв Ўлвм
ЇаҐ¤бв ў«Ґ® ў д®а¬ ⥠BCD. ‚®в Ї®зҐ¬г Ґ®Ўе®¤® Ї®б«Ґ ¬ бив ЎЁа®ў Ёп
Їа®ўҐбвЁ вҐбвЁа®ў ЁҐ ўҐ«ЁзЁл १г«мв в . ђҐ§г«мв в ¬®¦® 㬮¦Ёвм Ё«Ё
а §¤Ґ«Ёвм 10, ў § ўЁбЁ¬®бвЁ ®в в®Ј®, пў«пҐвбп «Ё १г«мв в
ᮮ⢥вб⢥® б«ЁиЄ®¬ ¬ «л¬ Ё«Ё б«ЁиЄ®¬ Ў®«миЁ¬.
`¤`Є20.3.6 ‚л室®© д®а¬ в `*
„«п ¬ ЄбЁ¬ «м®© ЈЁЎЄ®бвЁ ўл室®Ј® д®а¬ в , Ї®§ЁжЁп ¤ҐбпвЁз®© в®зЄЁ
гЄ §лў Ґвбп ¤ў®Ёзл¬ жҐ«л¬ зЁб«®¬, §лў Ґ¬л¬ § 票Ґ¬ Ї®Є § ⥫п
б⥯ҐЁ. …б«Ё Ї®Є § ⥫м б⥯ҐЁ а ўҐ г«о, в® ¤ҐбпвЁз п в®зЄ
ЇаҐ¤Ї®« Ј Ґвбп бЇа ў ®в б ¬®© Їа ў®© жЁдал. Џ®Є § ⥫м б⥯ҐЁ Ў®«миЁ©
г«п Ї®Є §лў Ґв, Є Є ¬®Ј® ®бв в®зле г«Ґ© Ґ Ї®Є §лў Ґвбп. „«п Є ¦¤®©
Ґ¤ЁЁжҐ Ё¦Ґ г«п ¤ҐбпвЁз п в®зЄ ў бва®ЄҐ б¤ўЁЈ Ґвбп «Ґў®.
Џ®б«Ґ¤Ё© и Ј ЇҐаҐў®¤ зЁб« - нв® б®еа Ёвм १г«мв в ў ўЁ¤Ґ BCD Ё
гЄ § вм, Ј¤Ґ 室Ёвбп ¤ҐбпвЁз п в®зЄ . ‘ва®Є вЁЇ BCD § ⥬
а бЇ Є®ўлў Ґвбп ў ¤ҐбпвЁзго бва®Єг Ё§ ASCII бЁ¬ў®«®ў. ‡ Є
гбв ў«Ёў Ґвбп ў ᮮ⢥вбвўЁЁ б® § Є®¬ ®аЁЈЁ «м®Ј® § 票п.
`¤`Є20.4 ЏаЁ¬Ґал ваЁЈ®®¬ҐваЁзҐбЄЁе ўлзЁб«ҐЁ© `*
‚ н⮬ ЇаЁ¬ҐаҐ ¬®¤Ґ«ЁагҐвбп ЄЁҐ¬ вЁЄ агЄЁ а®Ў®в Ї® Ј®¬®ЈҐл¬ ¬ ваЁж ¬
ЇаҐ®Ўа §®ў Ё© а §¬Ґа®¬ 4 x 4, ЇаҐ¤«®¦Ґл¬ „Ґ ўЁв®¬ Ё • а⥡ҐаЈ®¬
(1,2). ЏҐаҐ¤ в®злҐ Ё Ї®ў®а®влҐ ®в®иҐЁп ¬Ґ¦¤г ᬥ¦л¬Ё §ўҐмп¬Ё агЄЁ
®ЇЁб л б Ї®¬®ймо нвЁе ¬ ваЁж, ЁбЇ®«м§гп ¬ ваЁзл© ¬Ґв®¤ D-H. „«п Є ¦¤®Ј®
§ўҐ Ї®бв஥ Ј®¬®ЈҐ п ¬ ваЁж ЇаҐ®Ўа §®ў Ё© а §¬Ґа®¬ 4 x 4, Є®в®а п
ЇаҐ¤бв ў«пҐв Є®®а¤Ё вго бЁб⥬㠧ўҐ (L(i)) ў ᮥ¤ЁҐЁЁ (J(i)) ў
ᮮ⢥вбвўЁЁ б ЇаҐ¤л¤г饩 Є®®а¤Ё в®© бЁб⥬®© (J(i-1),L(i-1)).
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД 1. J.Denavit and R.S.Hartenberg,
"A Kinematic Notation for Lower-Pair Mechanisms Based on Matrices." J.
Applied Mechanics, June 1955, pp. 215-221
2. C.S.George Lee, "Robert Arm Kinematics, Dinamics, and Control." IEEE
Computer, Dec. 1982.
‘«Ґ¤гойЁҐ зҐвлॠЈҐ®¬ҐваЁзҐбЄЁҐ ўҐ«ЁзЁл Ї®«®бвмо ®ЇЁблў ов ¤ўЁ¦ҐЁҐ
«оЎ®© Ї ал ᮥ¤ЁҐЁҐ/§ўҐ® (J(i),L(i)), Є Є Ї®Є § ® ђЁбгЄҐ 20-7.
вҐв (i) = “Ј®« ¬Ґ¦¤г ®бмо x(i) Ё ®бмо x(i-1) ЇаЁ Ї®ў®а®вҐ ў®ЄагЈ ®бЁ
z(i-1) Їа®вЁў з б®ў®© бв५ЄЁ. d(i) = ђ ббв®пЁҐ ®в (i-1)-®© Є®®а¤Ё в®©
бЁбвҐ¬л ў¤®«м ®бЁ z(i-1) ¤® ®бЁ x(i). a(i) = ђ ббв®пЁҐ ¤® i-®©
Є®®а¤Ё в®© бЁбвҐ¬л ®в ®бЁ z(i-1) ў¤®«м ®бЁ -x(i). «мд (i) = “Ј®« ¬Ґ¦¤г
®бмо z(i) Ё ®бмо z(i-1) ЇаЁ Ї®ў®а®вҐ ў®ЄагЈ ®бЁ x(i) Їа®вЁў з б®ў®©
бв५ЄЁ.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і і
і zi-1 xi-1 і
і yi-1 і 90 / і
і \ ГДДДДДД\ / і
і \ і /\ вҐв і
і \ і / \ і
і \ і / * і
і \ і / і
і ‘Ћ…„€Ќ…Ќ€… i-1 Г Д Д Д Д Д Д Д Д Д Д ДДВДД і
і і і і
і і і і
і і і і
і «мд i і і і
і \ і і і
і \ і і
і \ * <ДДДіДДД\ di і
і \ і \ 90 і
і zi \ і і і і
і \ yi \ і і і і
і \ / \ і і і і
і \ / \ і і і і
і \ / \ і і і і
і ДДДДДДДДДДДДДДДДДБДДДДДДБДДДДДДДДДДДДД xi ДДБДД і
і ‘Ћ…„€Ќ…Ќ€…i+1 і
і і
і ГДДДДДД ai ДДДДДДґ і
і 240486/103 і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁбг®Є 20-7. Ћв®иҐЁп ЊҐ¦¤г ‘¬Ґ¦л¬Ё ‡ўҐмп¬Ё
Њ ваЁж ЇаҐ®Ўа §®ў Ё© A(i)(i-1) вЁЇ D-H ¤«п ᬥ¦ле Є®®а¤Ё вле
гз бвЄ®ў ®в ᮥ¤ЁҐЁп (i-1) ¤® ᮥ¤ЁҐЁп (i) ўлзЁб«пҐвбп Є Є:
A(i)(i-1) = T(z,d) x T(z,вҐв ) x T(x,a) x T(x, «мд )
Ј¤Ґ:
T(z,d) ЇаҐ¤бв ў«пҐв ЇҐаҐ¤ зг ў¤®«м ®бЁ z(i-1)
T(z,вҐв ) ЇаҐ¤бв ў«пҐв Ї®ў®а®в гЈ« вҐв ў®ЄагЈ ®бЁ z(i-1)
T(x,a) ЇаҐ¤бв ў«пҐв ЇҐаҐ¤ зг ў¤®«м ®бЁ x(i)
T(x, «мд ) ЇаҐ¤бв ў«пҐв Ї®ў®а®в гЈ« «мд ў®ЄагЈ ®бЁ x(i)
A(i)(i-1) =
і COSвҐв(i) -COS «д(i)SINвҐв(i) SIN «д(i)SINвҐв(i) COSвҐв(i) і
і і
і SINвҐв(i) COS «д(i)COSвҐв(i) -SIN «д(i)COSвҐв(i) SINвҐв(i) і
і і
і 0 SIN «д(i) COS «д(i) d(i) і
і і
і 0 0 0 1 і
Љ®¬Ї®§Ёв п Ј®¬®ЈҐ п ¬ ваЁж T, Є®в®а п ЇаҐ¤бв ў«пҐв б®Ў®© Ї®§ЁжЁо Ё
®аЁҐв жЁо Ї ал ᮥ¤ЁҐЁҐ/§ўҐ® Ї® ®в®иҐЁо Є ®б®ў®© бЁб⥬Ґ,
Ї®«гз Ґвбп Ї®б«Ґ¤®ў ⥫мл¬ г¬®¦ҐЁҐ¬ ¬ ваЁж ЇаҐ®Ўа §®ў Ё© вЁЇ D-H ¤«п
ᬥ¦ле Є®®а¤Ё вле гз бвЄ®ў.
T(i)(0) = A(1)(0) x A(2)(1) x ... x A(i)(i-1)
ЏаЁ¬Ґа Їа®Ја ¬¬л ђЁбгЄҐ 20-8 Ё««обваЁагҐв, Є Є ¬®¦® ўлЇ®«Ёвм
ЇҐаҐ¤ в®зл© Їа®жҐбб, ЁбЇ®«м§гп ў®§¬®¦®бвЁ ®Ўа Ў®вЄЁ ®ЇҐа жЁ© б Ї« ў о饩
в®зЄ®© Їа®жҐбб®а i486. Џа®Ја ¬¬ б®бв®Ёв Ё§ ¤ўге Ј« ўле Їа®жҐ¤га. ЏҐаў п
Їа®жҐ¤га TRANS PROC ЁбЇ®«м§гҐвбп ¤«п ўлзЁб«ҐЁп н«Ґ¬Ґв®ў ў Є ¦¤®©
¬ ваЁжҐ A(i)(i-1) вЁЇ D-H. ‚в®а п Їа®жҐ¤га MATRIXMUL PROC 室Ёв
Їа®Ё§ўҐ¤ҐЁҐ ¤ўге Ї®б«Ґ¤®ў ⥫мле ¬ ваЁж вЁЇ D-H.
ђЁбг®Є 20-8. ЏаЁ¬Ґа ЉЁҐ¬ вЁЄЁ ђгЄЁ ђ®Ў®в
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і і
і і
і Name ROT_MATRIX_CAL і
і ; і
і ; ќв®в ЇаЁ¬Ґа Ё««обваЁагҐв ЁбЇ®«м§®ў ЁҐ Є®¬ ¤ б і
і ; Ї« ў о饩 в®зЄ®© Їа®жҐбб®а i486 Ё з бвЁз® і
і ; дгЄжЁо FSINCOS, Є®в®а п ¤ Ґв § 票п бЁгб Ё і
і ; Є®бЁгб ®¤®ўаҐ¬Ґ®. Џа®Ја ¬¬ ўлзЁб«пҐв і
і ; Є®¬Ї®§ЁвлҐ ¬ ваЁжл, Ї® Є®в®ал¬ а Ў®в Ґв ¬Ґе Ё§¬ і
і ; ЇҐаҐ¤ зЁ. і
і ; і
і ; ‚ н⮬ ЇаЁ¬ҐаҐ а бᬮвॠ⮫쪮 ЄЁҐ¬ вЁЄ і
і ; а®Ў®в . і
і ; і
і ; …б«Ё Є®¬Ї®§Ёв п ¬ ваЁж , гЇ®¬пгв п ўлиҐ, і
і ; § ¤ Ґвбп Є Є: і
і ; T1n = A1 x A2 x ... x An, в® і
і ; T1n 室Ёвбп ўл§®ў®¬ Їа®жҐ¤га trans_proc Ё і
і ; matrixmul_proc, Ї®Є ўбҐ ¬ ваЁжл Ґ Ўг¤гв і
і ; ЇҐаҐ¬®¦Ґл. і
і ; і
і ; Џа®жҐ¤га trans_proc ўлзЁб«пҐв н«Ґ¬Ґвл Є ¦¤®© і
і ; ¬ ваЁжл A(A1,.....An), Ї®Є Їа®жҐ¤га і
і ; matrixmul_proc ўлЇ®«пҐв 㬮¦ҐЁҐ ¬ ваЁжл Ai Ё і
і ; Ai+1. „«п 㬮¦ҐЁп Їа®жҐ¤га matrixmul_proc і
і ; ЁбЇ®«м§гҐв Їа®жҐ¤гал matrix_row Ё matrix_elem. і
і ; і
і ; ЋЇаҐ¤Ґ«Ёвм б⥪®ў®Ґ Їа®бва бвў® і
і ; і
і trans_stack stackseg 400 і
і і
і ; ЋЇаҐ¤Ґ«ҐЁҐ ¬ ваЁз®© бвагЄвгал ¤«п ЇҐаҐ¤ в®зле і
і ; ¬ ваЁж а §¬Ґа®¬ 4x4 і
і і
і a_matrix struc і
і a11 dq ? і
і a12 dq ? і
і a13 dq ? і
і a14 dq ? і
і a21 dq ? і
і a22 dq ? і
і a23 dq ? і
і a24 dq ? і
і a31 dq 0h і
і a32 dq ? і
і a33 dq ? і
і a34 dq ? і
і a41 dq 0h і
і a42 dq 0h і
і a43 dq 0h і
і a44 dq 1h і
і a_matrix ends і
і ; і
і ; ЏаҐ¤Ї®« Ј Ґ¬, зв® ®¤® ᮥ¤ЁҐЁҐ еа Ёвбп ў і
і ; ®¤®© Ї®§ЁжЁЁ Ё, б«Ґ¤®ў ⥫м®, Ё¬ҐҐв ¤ў Ў®а і
і ; Ї а ¬Ґва®ў. Ћ¤ Є®, ў®§¬®¦® Ё Ў®«м襥 Є®«ЁзҐбвў® і
і ; ᮥ¤ЁҐЁ©. і
і ; і
і alp_deg struc і
і alpha_deg1 dd ? і
і alpha_deg2 dd ? і
і alp_deg ends і
і ; і
і tht_deg struc і
і theta_deg1 dd ? і
і theta_deg2 dd ? і
і tht_deg ends і
і ; і
і A_array struc і
і A1 dq ? і
і A2 dq ? і
і A_array ends і
і ; і
і D_array struc і
і D1 dq ? і
і D2 dq ? і
і D_array ends і
і ; і
і ; ‘ҐЈ¬Ґв ¤ ле - trans_data і
і ; і
і trans_data segment rw public і
і Amx a_matrix<> і
і Bmx a_matrix<> і
і Tmx a_matrix<> і
і ALPHA_DEG alp_deg<> і
і THETA_DEG tht_deg<> і
і A_VECTOR A_array<> і
і D_VECYOR D_array<> і
і ZERO dd 0 і
і d180 dd 180 і
і NUM_JOINT equ 1 і
і NUM_ROW equ 4 і
і NUM_COL equ 4 і
і REVERSE DB 1H і
і trans_data ends і
і і
і assume ds:trans_data, es:trans_data і
і ; і
і ; ‘ҐЈ¬Ґв trans_code ᮤҐа¦Ёв Їа®жҐ¤гал ¤«п і
і ; ўлзЁб«ҐЁп н«Ґ¬Ґв®ў ¬ ваЁжл Ё 㬮¦ҐЁп ¬ ваЁж. і
і ; і
і trans_code segment er public і
і truns_proc proc far і
і ; і
і ; ‚лзЁб«Ёвм гЈ«л «мд Ё вҐв ў а ¤Ё е Ё§ Ёе § 票© і
і ; ў Ја ¤гб е і
і ; і
і fldpi і
і fdiv d180 і
і ; і
і ; “¬®¦Ёвм ЏЁ/180 і
і ; і
і fld st і
і fmul qword ptr ALPHA_DEG[ecx*8] і
і fxch st(1) і
і fmul qword ptr THETA_DEG[ecx*8] і
і ; і
і ; ’Ґв (ў а ¤Ё е) ў ST і
і ; Ё «мд (ў а ¤Ё е) ў ST(1) і
і ; і
і ; ‚лзЁб«ҐЁҐ н«Ґ¬Ґв®ў ¬ ваЁжл і
і ; і
і ; a11 = COS вҐв і
і ; a12 = -COS «мд * SIN вҐв і
і ; a13 = SIN «мд * SIN вҐв і
і ; a14 = A * COS вҐв і
і ; a21 = SIN вҐв і
і ; a22 = COS «мд * COS вҐв і
і ; a23 = -SIN «мд * COS вҐв і
і ; a24 = A * SIN вҐв і
і ; a32 = SIN «мд і
і ; a33 = COS «мд і
і ; a34 = D і
і ; a31 = a41= a42 = a43 = 0.0 і
і ; a44 = 1 і
і ; і
і ; ђҐЈЁбва EBX ᮤҐа¦Ёв ᬥ饨Ґ ¤«п ¬ ваЁжл і
і ; і
і fsincos ; COS вҐв ў ST і
і ; SIN вҐв ў ST(1) і
і fld st ; г¤ў®Ёвм COS вҐв і
і fst [ebx].a11 ; COS вҐв ў a11 і
і fmul qword ptr A_VECTOR[ecx*8] і
і fstp [ebx].a14 ; A * COS вҐв ў a14 і
і fxch st(1) ; SIN вҐв ў ST і
і fst [ebx].a21 ; SIN вҐв ў a21 і
і fld st ; г¤ў®Ёвм SIN вҐв і
і fmul qword ptr A_VECTOR[ecx*8] і
і fstp [ebx].a24 ; A * SIN вҐв ў a24 і
і fld st(2) ; «мд ў ST і
і fsincos ; COS «мд ў ST і
і ; SIN «мд ў ST(1) і
Соседние файлы в папке INTEL486