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