• 検索結果がありません。

Èíèöèàëèçàöèÿ, ñîõðàíåíèå è âîññòàíîâëåíèå

6. Àðèôìåòèêà ñ ïëàâàþùåé òî÷êîé 166

6.7. Óïðàâëåíèå ñîïðîöåññîðîì

6.7.4. Èíèöèàëèçàöèÿ, ñîõðàíåíèå è âîññòàíîâëåíèå

Åñëè íà ìîìåíò íà÷àëà âû÷èñëåíèé âàì íå èçâåñòíî (èëè âûçûâà-åò ñîìíåíèÿ) ñîñòîÿíèå àðèôìâûçûâà-åòè÷åñêîãî ñîïðîöåññîðà, íî ïðè ýòîì âû òî÷íî çíàåòå, ÷òî íèêàêîé ïîëåçíîé äëÿ âàñ èíôîðìàöèè åãî ðåãèñòðû íå ñîäåðæàò, ìîæíî ïðèâåñòè åãî ¾â èñõîäíîå ñîñòîÿíèå¿ ñ ïîìîùüþ êîìàíäû finit èëè fninit (finit ïðåäñòàâëÿåò ñîáîé îáîçíà÷åíèå äëÿ wait fninit, ñì. Ÿ 6.7.2). Ïðè ýòîì â ðåãèñòð CR çàíîñèòñÿ çíà÷åíèå 037Fh (îêðóãëåíèå â áëèæíþþ ñòîðîíó, íàèáîëüøàÿ âîçìîæíàÿ òî÷íîñòü, âñå èñêëþ÷åíèÿ çàìàñêèðîâàíû); ðåãèñòð SR îáíóëÿåòñÿ, ÷òî îçíà÷àåò TOP=0, âñå ôëàãè ñáðîøåíû, âêëþ÷àÿ ôëàãè èñêëþ÷èòåëüíûõ ñèòóàöèé; ðåãè-ñòðû FIP, FDP, TW òàêæå îáíóëÿþòñÿ; ðåãèðåãè-ñòðû, ñîñòàâëÿþùèå ñòåê, íèêàê íå èçìåíÿþòñÿ, íî ïîñêîëüêó TW îáíóë¼í, âñå îíè ñ÷èòàþòñÿ ñâîáîäíûìè (íå ñîäåðæàùèìè ÷èñåë).

Ñ ïîìîùüþ êîìàíäû fsave ìîæíî ñîõðàíèòü âñ¼ ñîñòîÿíèå ñîïðîöåñ-ñîðà, òî åñòü ñîäåðæèìîå âñåõ åãî ðåãèñòðîâ, â îáëàñòè ïàìÿòè, ÷òîáû ïîòîì âîññòàíîâèòü åãî. Ýòî ïîëåçíî, åñëè íóæíî âðåìåííî ïðåêðàòèòü íåêèé âû÷èñëèòåëüíûé ïðîöåññ, âûïîëíèòü êàêèå-òî âñïîìîãàòåëüíûå âû÷èñëåíèÿ, çàòåì âåðíóòüñÿ ê îòëîæåííîìó ïðîöåññó âû÷èñëåíèé. Äëÿ ñîõðàíåíèÿ âàì ïîòðåáóåòñÿ îáëàñòü ïàìÿòè äëèíîé 108 áàéò; êîìàíäà fsave èìååò îäèí îïåðàíä, ýòî îïåðàíä òèïà ¾ïàìÿòü¿, ïðè÷¼ì óêàçû-âàòü åãî ðàçìåð íå íóæíî. Ìíåìîíèêà fsave íà ñàìîì äåëå îáîçíà÷àåò äâå ìàøèííûå êîìàíäû wait è fnsave. Ïîñëå ñîõðàíåíèÿ ñîñòîÿíèÿ â ïàìÿòè ñîïðîöåññîð ïðèâîäèòñÿ ¾â èñõîäíîå ñîñòîÿíèå¿ òî÷íî òàê æå, êàê ïðè êîìàíäå finit (ñì. âûøå), òàê ÷òî ïîñëå fsave îòäåëüíî äàâàòü êîìàíäó finit íå íóæíî. Âîññòàíîâèòü ñîõðàí¼ííîå ðàíåå ñîñòîÿíèå ñî-ïðîöåññîðà ìîæíî êîìàíäîé frstor; êàê è fsave, ýòà êîìàíäà èìååò îäèí îïåðàíä òèïà ¾ïàìÿòü¿, äëÿ êîòîðîãî íå íóæíî óêàçûâàòü ðàçìåð, ïî-ñêîëüêó èñïîëüçóåòñÿ îáëàñòü ïàìÿòè ðàçìåðîì 108 áàéò.

Èíîãäà âîçíèêàåò ïîòðåáíîñòü ñîõðàíèòü èëè âîññòàíîâèòü òîëüêî âñïîìîãà-òåëüíûå ðåãèñòðû ñîïðîöåññîðà. Ýòî äåëàåòñÿ êîìàíäàìè fsetenv, fnsetenv è fldenv ñ èñïîëüçîâàíèåì îáëàñòè ïàìÿòè äëèíîé 28 áàéò; ïîäðîáíîå îïèñàíèå ýòèõ êîìàíä îñòàâëÿåì çà ðàìêàìè ïîñîáèÿ.

 çàâåðøåíèå ðàçãîâîðà î ñîïðîöåññîðå óïîìÿíåì êîìàíäó fnop. Êàê ìîæíî äîãàäàòüñÿ, ýòî î÷åíü âàæíàÿ êîìàíäà: îíà íå äåëàåò íè÷åãî.

Ïðèëîæåíèå: òåêñò ôàéëà stud_io.inc

Âåðñèÿ äëÿ ÎÑ Linux

;; system dependend part ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; generic 3-param syscall

%macro _syscall_3 4 push edx push ecx push ebx push %1 push %2 push %3 push %4 pop edx pop ecx pop ebx pop eax int 0x80 pop ebx pop ecx pop edx

%endmacro

; syscall_exit is the only syscall we use that has 1 parameter

%macro _syscall_exit 1

mov ebx, %1 ; exit code mov eax, 1 ; 1 = sys_exit int 0x80

%endmacro

;; system dependent part ends here ;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; %1: descriptor %2: buffer addr %3: buffer length

; output: eax: read bytes

%macro _syscall_read 3 _syscall_3 3,%1,%2,%3

%endmacro

; %1: descriptor %2: buffer addr %3: buffer length

; output: eax: written bytes

%macro _syscall_write 3 _syscall_3 4,%1,%2,%3

%endmacro

%macro PRINT 1 pusha pushf jmp %%astr

%%str db %1, 0

%%strln equ $-%%str

%%astr: _syscall_write 1, %%str, %%strln popfpopa

%endmacro

%macro PUTCHAR 1 pusha pushf

%ifstr %1

mov al, %1

%elifnum %1

mov al, %1

%elifidni %1,al

%elifidni %1,ahnop mov al, ah

%elifidni %1,bl mov al, bl

%elifidni %1,bh mov al, bh

%elifidni %1,cl mov al, cl

%elifidni %1,ch mov al, ch

%elifidni %1,dl mov al, dl

%elifidni %1,dh mov al, dh

%else

mov al, %1 ; memory location such as [var]

%endif

sub esp, 2 ; reserve memory for buffer mov edi, esp

mov [edi], al _syscall_write 1, edi, 1 add esp, 2

popfpopa

%endmacro

%macro GETCHAR 0 pushf push edi sub esp, 2 mov edi, esp

_syscall_read 0, edi, 1 cmp eax, 1

jne %%eof_reached xor eax,eax mov al, [edi]

jmp %%gcquit

%%eof_reached:

xor eax, eax

not eax ; eax := -1

%%gcquit:

add esp, 2

pop edi

popf

%endmacro

%macro FINISH 0-1 0 _syscall_exit %1

%endmacro

Âåðñèÿ äëÿ FreeBSD

Ýòà âåðñèÿ îòëè÷àåòñÿ îò ïðåäûäóùåé òîëüêî îïðåäåëåíèåì ìàêðîñîâ _syscall3 è _syscall_exit, ïîýòîìó öåëèêîì ìû å¼ íå ïðèâîäèì. ×òîáû ïî-ëó÷èòü ðàáî÷èé ôàéë äëÿ ÎÑ FreeBSD, âîçüìèòå âûøåïðèâåä¼ííûé òåêñò äëÿ ÎÑ Linux è çàìåíèòå îïðåäåëåíèÿ ýòèõ ìàêðîñîâ íà ñëåäóþùèå:

;; freebsd-specific things ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

%macro _syscall_3 4 push %4 push %3 push %2 mov eax, %1 push eax int 0x80 jnc %%ok

neg eax

%%ok: add esp, 16

%endmacro

%macro _syscall_exit 1

push %1 ; exit code mov eax, 1 ; 1 = sys_exit push eax

int 0x80

; no cleanup - this will never return anyway

%endmacro

;; system dependent part ends here ;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Ëèòåðàòóðà

[1] Ý. Òàííåíáàóì. Àðõèòåêòóðà êîìïüþòåðà. 4-å èçäàíèå. ÑÏá.: Ïèòåð, 2003.

[2] Çóáêîâ Ñ. Â. Assembler äëÿ DOS, Windows è UNIX. Ì.:ÄÌÊ, 2006.

[3] Áàóðí Ñ. Îïåðàöèîííàÿ ñèñòåìà UNIX. Ì.:Ìèð, 1986.

[4] Ðîáà÷åâñêèé À. Ì. Îïåðàöèîííàÿ ñèñòåìà UNIX. Èçä-âî ¾BHV¿, Ñàíêò-Ïåòåðáóðã, 1997.

[5] The Netwide Assembler: NASM. http://www.nasm.us/doc/ Èìååò-ñÿ ðóññêèé ïåðåâîä, âûïîëíåííûé AsmOs group; ñì. íàïðèìåð, http://opslab.org.ru/nasm

[6] Raymond Filiatreault. Simply FPU (an FPU tutorial). 2003.

http://www.ray.masmcode.com/fpu.html

Äîìàøíÿÿ ñòðàíèöà ýòîé êíèãè â ñåòè Èíòåðíåò ðàñïîëîæåíà ïî àäðåñó

http://www.stolyarov.info/books/asm_unix Çäåñü âû ìîæåòå ïîëó÷èòü òåêñòû ïðèìåðîâ ïðîãðàìì, ïðèâåä¼ííûõ â ýòîé êíèãå, à òàêæå

ýëåêòðîííóþ âåðñèþ ñàìîé êíèãè.

Îãëàâëåíèå

Ïðåäèñëîâèå äëÿ ïðåïîäàâàòåëåé . . . 3

Ïðåäèñëîâèå äëÿ ñòóäåíòîâ . . . 5

Áëàãîäàðíîñòè è ïîñâÿùåíèå . . . 7

1. Ââåäåíèå 8 Ÿ 1.1. Ìàøèííûé êîä è àññåìáëåð . . . 8

Ÿ 1.2. Îñîáåííîñòè ïðîãðàììèðîâàíèÿ ïîä óïðàâëåíèåì ìóëüòè-çàäà÷íûõ îïåðàöèîííûõ ñèñòåì . . . 14

Ÿ 1.3. Ìàøèííîå ïðåäñòàâëåíèå öåëûõ ÷èñåë . . . 17

Ÿ 1.3.1. Áåççíàêîâûå ÷èñëà . . . 18

Ÿ 1.3.2. Çíàêîâûå ÷èñëà; äîïîëíèòåëüíûé êîä . . . 20

Ÿ 1.4. Èñòîðèÿ ïëàòôîðìû i386 . . . 22

Ÿ 1.5. Çíàêîìèìñÿ ñ èíñòðóìåíòîì . . . 24

Ÿ 1.6. Ìàêðîñû èç ôàéëà stud_io.inc . . . 32

2. Ïðîöåññîð i386 33 Ÿ 2.1. Ñèñòåìà ðåãèñòðîâ i386 . . . 33

Ÿ 2.2. Ïàìÿòü, ðåãèñòðû è êîìàíäà mov . . . 37

Ÿ 2.2.1. Ïàìÿòü ïîëüçîâàòåëüñêîé çàäà÷è. Ñåêöèè . . . 37

Ÿ 2.2.2. Äèðåêòèâû äëÿ îòâåäåíèÿ ïàìÿòè . . . 39

Ÿ 2.2.3. Êîìàíäà mov . . . 44

Ÿ 2.2.4. Âèäû îïåðàíäîâ . . . 45

Ÿ 2.2.5. Ïðÿìàÿ è êîñâåííàÿ àäðåñàöèÿ . . . 46

Ÿ 2.2.6. Îáùèé âèä èñïîëíèòåëüíîãî àäðåñà . . . 48

Ÿ 2.2.7. Ðàçìåðû îïåðàíäîâ è èõ äîïóñòèìûå êîìáèíàöèè . 50 Ÿ 2.2.8. Êîìàíäà lea . . . 52

Ÿ 2.3. Öåëî÷èñëåííàÿ àðèôìåòèêà . . . 53

Ÿ 2.3.1. Ïðîñòûå êîìàíäû ñëîæåíèÿ è âû÷èòàíèÿ . . . 53

Ÿ 2.3.2. Ñëîæåíèå è âû÷èòàíèå ñ ïåðåíîñîì . . . 55

Ÿ 2.3.3. Êîìàíäû inc, dec, neg è cmp . . . 55

Ÿ 2.3.4. Öåëî÷èñëåííîå óìíîæåíèå è äåëåíèå . . . 56

Ÿ 2.4. Óñëîâíûå è áåçóñëîâíûå ïåðåõîäû . . . 58

Ÿ 2.4.1. Áåçóñëîâíûé ïåðåõîä è âèäû ïåðåõîäîâ . . . 58

Ÿ 2.4.2. Óñëîâíûå ïåðåõîäû ïî îòäåëüíûì ôëàãàì . . . 60

Ÿ 2.4.3. Ïåðåõîäû ïî ðåçóëüòàòàì ñðàâíåíèé . . . 61

Ÿ 2.4.4. Óñëîâíûå ïåðåõîäû è ðåãèñòð ECX; öèêëû . . . 63

Ÿ 2.5. Ïîáèòîâûå îïåðàöèè . . . 65

Ÿ 2.5.1. Ëîãè÷åñêèå îïåðàöèè . . . 65

Ÿ 2.5.2. Îïåðàöèè ñäâèãà . . . 66

Ÿ 2.5.3. Ïðèìåð . . . 68

Ÿ 2.6. Ñòåê, ïîäïðîãðàììû, ðåêóðñèÿ . . . 72

Ÿ 2.6.1. Ïîíÿòèå ñòåêà è åãî ïðåäíàçíà÷åíèå . . . 72

Ÿ 2.6.2. Îðãàíèçàöèÿ ñòåêà â ïðîöåññîðå i386 . . . 73

Ÿ 2.6.3. Äîïîëíèòåëüíûå êîìàíäû ðàáîòû ñî ñòåêîì . . . . 75

Ÿ 2.6.4. Ïîäïðîãðàììû: îáùèå ïðèíöèïû . . . 75

Ÿ 2.6.5. Âûçîâ ïîäïðîãðàìì è âîçâðàò èç íèõ . . . 77

Ÿ 2.6.6. Îðãàíèçàöèÿ ñòåêîâûõ ôðåéìîâ . . . 78

Ÿ 2.6.7. Îñíîâíûå êîíâåíöèè âûçîâîâ ïîäïðîãðàìì . . . . 81

Ÿ 2.6.8. Ëîêàëüíûå ìåòêè . . . 83

Ÿ 2.6.9. Ïðèìåð . . . 84

Ÿ 2.7. Ñòðîêîâûå îïåðàöèè . . . 90

Ÿ 2.8. Åù¼ íåñêîëüêî èíòåðåñíûõ êîìàíä . . . 93

Ÿ 2.9. Çàêëþ÷èòåëüíûå çàìå÷àíèÿ . . . 94

3. Àññåìáëåð NASM 95 Ÿ 3.1. Ñèíòàêñèñ ÿçûêà àññåìáëåðà NASM . . . 95

Ÿ 3.2. Ïñåâäîêîìàíäû . . . 97

Ÿ 3.3. Êîíñòàíòû . . . 99

Ÿ 3.4. Âû÷èñëåíèå âûðàæåíèé âî âðåìÿ àññåìáëèðîâàíèÿ . . . . 100

Ÿ 3.4.1. Âû÷èñëÿåìûå âûðàæåíèÿ è îïåðàöèè â íèõ . . . . 100

Ÿ 3.4.2. Êðèòè÷åñêèå âûðàæåíèÿ . . . 101

Ÿ 3.4.3. Âûðàæåíèÿ â ñîñòàâå èñïîëíèòåëüíîãî àäðåñà . . . 103

Ÿ 3.5. Ìàêðîñðåäñòâà è ìàêðîïðîöåññîð . . . 103

Ÿ 3.5.1. Îñíîâíûå ïîíÿòèÿ . . . 103

Ÿ 3.5.2. Ïðîñòåéøèå ïðèìåðû ìàêðîñîâ . . . 105

Ÿ 3.5.3. Îäíîñòðî÷íûå ìàêðîñû; ìàêðîïåðåìåííûå . . . 108

Ÿ 3.5.4. Óñëîâíàÿ êîìïèëÿöèÿ . . . 110

Ÿ 3.5.5. Ìàêðîïîâòîðåíèÿ . . . 114

Ÿ 3.5.6. Ìíîãîñòðî÷íûå ìàêðîñû è ëîêàëüíûå ìåòêè . . . 116

Ÿ 3.5.7. Ìàêðîñû ñ ïåðåìåííûì ÷èñëîì ïàðàìåòðîâ . . . . 118

Ÿ 3.5.8. Ìàêðîäèðåêòèâû äëÿ ðàáîòû ñî ñòðîêàìè . . . 120

Ÿ 3.6. Êîìàíäíàÿ ñòðîêà NASM . . . 121