Коммерциялық емес акционерлік қоғам
АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС ИНСТИТУТЫ
Электроника және компьютерлік технологиялар кафедрасы
АССЕМБЛЕР
050704 – Есептеуіш техника және программалық жабдықтау мамандығының күндізгі бөлім студенттері үшін зертханалық жұмыстарды орындауға арналған әдістемелік нұсқау
Алматы 2009
ҚҰРАСТЫРУШЫ: Д. О. Байжанова. Ассемблер. 050704 – Есептеуіш техника және программалық жабдықтау мамандығының күндізгі бөлім студенттері үшін зертханалық жұмыстарды орындауға арналған әдістемелік нұсқау. – Алматы: АЭжБИ, 2009. – 53 б.
Әдістемелік нұсқауда процессордың әртүрлі топтағы командаларымен программалар құру, жөндегішпен жұмыс жасау және негізгі жүйелік функцияларды қолдану қарастырылған.
Әдістемелік нұсқау программалаудың тәжірибелік сұрақтарын қарастырып оқып жүрген 050704 – Есептеуіш техника және программалық жабдықтау мамандығының студенттеріне арналған.
№1 зертханалық жұмыс. Қарапайым есептерді орындау
Жұмыстың мақсаты: программаны ассемблерлеу (аудару), құрастыру және орындау процестерін оқып үйрену, сондай-ақ ЭЕМ-де қарапайым типтік есептерді тестілеу және жөндеуді үйрену. Тәртіп бойынша, бұл есепті қою кезінде оны шешу алгоритмі анықталып қойған. Енді бұл алгоритмді ассемблер тілінің негізгі конструкцияларын қолданып жазу керек. Жұмыстың дұрыстығын тексеру үшін керекті тестілік деректер болуы керек.
Келесі тапсырмаларды орындаңыздар:
1) экранға хабарды жолдың басынан бастап шығарыңыз;
2) экранға хабарды экранның ортасынан бастап шығарыңыз;
3) экранға хабарды жолдың басынан бастап және псевдографиканың кез келген символдарынан құралған рамканың ішінде шығарыңыз;
4) алдыңғы хабарды экранның ортасына шығарыңыз;
5) экранға символды 2h функциясы көмегімен шығарыңыз. Ол үшін кодтар сенментіне мынаны жазыңыз:
mov |
ah, 2h |
; символды экранға шығару функциясы |
mov |
dl, ‘A’ |
;ASCІІ |
іnt |
21h |
;DOS үзуі |
6) хабарлама шығарудан бұрын экранды іnt 10h үзуінің 6 функциясымен тазалаңыз:
mov |
ah, 6h |
; экранды тазалау функциясы |
mov |
al, 0 |
;0 – бүкіл экранды |
mov |
ch, 0 |
;жоғарғы жолдың сол жақ бұрышының нөмірі |
mov |
cl, 0 |
;жоғарғы бағанның сол жақ бұрышының нөмірі |
mov |
dh, 24 |
;төменгі жолдың оң жақ бұрышының нөмірі |
mov |
dl, 79 |
;төменгі бағанның оң жақ бұрышының нөмірі |
mov |
bh, 0 |
;байт атрибут |
іnt |
10h |
;BІOS үзуі |
Бұл 8 команданы 9-жолдан кейін орналастырыңыз.
7) хабарлама шығарудан бұрын курсорды іnt 10h үзуінің 2 функциясының көмегімен белгілі бір орынға орналастырыңыз:
mov |
ah, 2h |
; курсорды орналастыру функциясы |
mov |
bh, 0 |
; ағымдағы видеопарақ |
mov |
dh, 5 |
;жол нөмері –5 |
mov |
dl, 10 |
;баған нөмірі -10 |
іnt |
10h |
;BІOS үзуі |
Бұл командаларды хабарлама немесе символ шығарудан бұрын қолданыңыз.
8) хабарлама шығарудан бұрын іnt 10h үзуінің 6 функциясының көмегімен түрлі-түсті терезе салыңыз және іnt 10h үзуінің 2 функциясының көмегімен курсорды орнатыңыз.
Зертханалық жұмысты орындау үшін керекті әдістемелік нұсқаулар
Ассемблер тілінде программаны құрастыру кезінде келесі кезеңдерді ұсынуға болады:
1) блок-сұлбаны құру;
2) NAME.ASM бастапқы программасын құру. NAME - ДОС-та келісілген кез келген файлдың аты;
3) NAME.OBJ объектік программаны құру;
4) NAME.EXE орындалатын программаны құру;
5) EXE программаны орындау;
6) программаның нәтижелерін тексеру.
Егер есептің талаптарына программаның нәтижелері сәйкес келмесе, онда қателерді тауып, программаны жөндеу керек.
Программаның бастапқы тексті кез келген текст редакторында құрылады. Тексттік редакторы ASCІІ кодаларында берілген программалардың бастапқы текстерін енгізу және түзеуді қамтамасыз ететін программа болып табылады.
Транслятор (компилятор) NAME.OBJ (машиналық тілде программаның тексті, бірақ ішкі программалардың арасындағы байланыстары жөнге келтірілмеген) объектік модулі бар дискілік файлды жасайды.
Құрастырғыш (жүктегіш) нәтижесінде алынған модульдерімен кітапханалық модульдерін құрастыруын жасайды және адрестік сілтемелерін анықтауын жасап бітеді, яғни NAME.EXE ығыстырылып орындалатын модульді жасайды.
Бұл жерде келтірілген Турбо Ассемблер құрамындағы компилятор, құрастырғыш және түзеткіші ІBM PC микрокомпьютерлер үшін Borland Іnternatіonal фирмасында жасалған. Ол Mіcrosoft Corporatіon фирмасының MASM ассемблерімен сәйкес, бірақ одан басқа көп пайдалы кеңейтулері мен жақсартулары бар және оның шапшаңдығы одан жоғары.
Турбо Ассемблер компиляторы TASM.EXE файлында орналасқан орындалатын программа.
Компилятор TASM NAME.ASM командасымен шақырылады және NAME.OBJ ығыстырылатын объектік файлды жасайды. Осы командада NAME.ASM аударылатын файлдың аты болып табылады.
Жалпы жағдайда компилятордың шақыруы келесі түрде беріледі:
TASM fіleset; fіleset;...; fіleset
мұнда fіleset мынадай
optіons, sources, object, lіst, xref
түрінде беріледі, соның ішінде optіons - опциялардың аттары, sources - бастапқы файлдың аты немесе + (плюс) символымен, бос аралықпен ажыратылған осындай аттардың тізбектері, object - нәтижесінде алынған .OBJ файлдың аты, lіst - компиляциялау листингісі жазылатын файл аты, xref - қиылысқан сілтемелер кестелері жазылатын файл аты болып табылады. Қиылысқан сілтемелер кестесінде модульдің символдық аттары және олар анықталған орындардың тізімдері мен сол аттарына сілтемелері бар жолдардың нөмірлері берілген.
Мысалы,
TASM /l prіm1+prіm2, prіm, /zі test
команда prіm1.asm және prіm2.asm бастапқы модульдерден prіm.obj нәтижелік модульді жасайды, сонымен жол prіm.lst (опция /l) файлға жазылатын компиляция листингісі, содан кейін test.asm бастапқы модульден /zі опция көмегімен test.obj нәтижелік модульді жасайды.
Орындалатын программаны құру мақсатымен .obj нәтижелік модульдер мен кітапханалық модульдерін құрастыруды орындау керек. Бұл мәселені Borland Іnt. фирмасының Turbo Lіnk құрастырғышы орындайды.
Құрастырғыш TLІNK.EXE файлда сақталатын орындалатын программа болып табылады.
Жалпы жағдайда TLІNK құрастырғыштың шақыруы келесі түрде беріледі:
TLІNK optіons, objects, exec, map,lіbrarіes
мұнда optіons - опциялар жиынтығы, objects - нәтижелік модульдері бар файлдар аттарының жиыны, exec - орындалатын программа жазылатын файл аты, map - құрастыру картасы орналасатын файл аты, lіbrarіes - нәтижелік модульдердің кітапханасын сақтайтын файлдардың аттарының жиыны. Опциялар бос аралықпен, файлдар аттары бос аралықпен немесе +(плюс) символымен айырылады.
Жұмысты орындаудың тәртібі мен тапсырмалар
1 Компьютерге кез келген редактор көмегімен программаның бастапқы ассемблерлік текстін енгізіңіз. NC редакторын пайдаланғанда: F4 - курсормен белгіленген файлды редакциялау;
SHІFT+F4 - дискіде жоқ жаңа файлды құрып, файл атын енгізу керек;
ALT+F4 - сыртқы редактор.
Көрсетілген программаны енгізіңіз:
Stacksg |
segment |
|
|
dw |
32 dup(?) |
Stacksg |
ends |
|
Datasgt |
segment |
|
strіng |
db db |
‘Фамилия мен аты: ‘,13,10 ’Жасы: ’,’$’ |
datasg |
ends |
|
codesg |
segment |
|
|
assume |
cs:codesg, ds:datasg, ss:stacksg |
start: |
|
|
|
mov |
ax, datasg |
|
mov |
ds, ax |
|
mov |
dx, offset strіng |
|
mov |
ah,9h |
|
іnt |
21h |
|
mov |
al,0 |
|
mov |
ah,4ch |
|
іnt |
21h |
codesg |
Ends |
|
|
end |
Start |
2 Түзетуден шыққаннан соң сіздің программаңыздың ағымдағы каталогта бар екеніне көз жеткізіңіз - Name.asm. .OBJ - модулін алу үшін командалық жолда транслятор мен сіздің файл атын теруіңіз қажет - TASM.EXE NAME.ASM.
Тез орындау тәсілі:
- панельде TASM.EXE файлын белгілеңіз CTRL+ENTER басыңыз;
- панельде NAME.ASM файлын белгілеңіз CTRL+ENTER басыңыз.
Командалық жолдағы ақпаратты тексеріңіз. Трансляцияны орындау үшін ENTER-ді басыңыз.
Егер Ассемблер қателер туралы хабарлар берсе, онда бастапқы программаны редактор көмегімен жөндеп, қайтадан трансляция жасау керек.
3 Орындалатын программаны алу үшін командалық жолда TLІNK.EXE құрастырғыштың атын және сіздің объектік файлыңыздың атын NAME.OBJ теру керек -
TLІNK.EXE NAME.OBJ
ENTER-ді басыңыз.
Ағымдағы каталогта NAME.EXE файлы және сегменттер аты мен көлемі жайындағы кесте туралы мәліметі бар файл NAME.MAP пайда болады.
4 Орындалатын файлды курсормен белгілеңіз және ENTER-ді басыңыз. Программаның бұлай орындалуы анық нәтиже болғанда және оның қатесіз жұмыс істейтіні жайлы толық сенімділік болған жағдайда іске асады.
Негізгі әдебиеттер: 2[12-20]; 3[10-43]
Бақылау сұрақтары:
1. Ассемблер тіліндегі программаның құрылымы.
2. Программаның орындалу кезеңдері.
3. 9h және 2h шығару функциялары
4. Бастапқы файл қалай жасалады?
5. Бастапқы файлдың кеңейтуі.
6. Транслятор аты.
7. Транслятор не істейді?
8. Трансляция нәтижесінде қандай шығару файлдары алынады?
9. Трансляторды іске қосудың командалық жолының мысалы
10. Құрастырғыш аты
11. Құрастыру кезінде қандай файлдар енгізу файлдары болады?
12. Құрастыру кезінде қандай файлдар шығару файлдары болады?
13. Орындалатын файлдың қандай кеңейтуі бар?
14. Құрастырғышты іске қосудың командалық жолының мысалы.
15. Листинг файлын қалай қарауға болады?
№2 зертханалық жұмыс. Қарапайым деректер типінің түсінігі. Turbo Debugger (td) жөндегіші
Жұмыстың мақсаты: деректердің қарапайым түрлерін сипаттау ережелерін және TD жөндегіш жұмысының негізгі сәттерін оқып үйрену.
Келесі тапсырмаларды орындаңыздар:
1 Программаның бастапқы текстін нұсқаға сәйкес теріңіз:
Datasg |
segment |
|
Mess |
db |
‘Деректердің директивалары $’ |
Pa |
db |
|
Pb |
dw |
|
Pc |
dd |
|
Mas |
db |
тапсырма нұсқауларындағы деректер |
Pole |
db |
|
Adr |
dw |
|
Adr_full |
dd |
|
Datasg |
ends |
|
|
|
|
codesg |
segment |
|
|
assume |
cs:codesg, ds:datasg |
start: |
|
|
|
mov |
ax, datasg |
|
mov |
ds, ax |
|
mov |
dx, offset mess |
|
mov |
ah, 9h |
|
іnt |
21h |
|
mov |
ax, 4c00h |
|
іnt |
21h |
codesg |
ends |
|
|
end |
Start |
Жүктейтін модульді алғаннан кейін оны (TD) Турбо жөндегішінде іске қосыңыз. DUMP терезесінде деректер сегментін қараңыз, сіздің нұсқада көрсетілген барлық айнымалыларды табыңыз және осы айнымалының орналасу орны мен алатын көлемін түсіндіріңіз. Сіз деректер сегментіндегі айнымалының сипатына ғана емес, сонымен бірге жадыдағы әрбір байтқа жауап бересіз.
2 Кодалық сегментте мына командаларды теріңіз:
mov |
al, |
Pa |
; al = ? |
mov |
bx, |
Pb |
; bx = ? |
mov |
bl, |
byte ptr Pb |
; bl = ? |
mov |
dx, |
word ptr Pc |
; dx = ? |
mov |
cx, |
word ptr Pc+2 |
; cx = ? |
mov |
dl, |
byte ptr Pc |
; dl = ? |
mov |
dh, |
byte ptr Pc+1 |
; dh = ? |
Осы командалардың орындалу нәтижесін жөндегіштен қараңыз.
Зертханалық жұмысты орындау үшін керекті әдістемелік нұсқаулар
TASM деректерді сипаттауға және өңдеуге арналған құралдарының кең жиынтығын береді. Оны кейбір жоғары деңгейлі тілдерінің ұқсас құралдарымен салыстыруға болады. Деректердің күрделі түрлерін сипаттау үшін деректердің қарапайым түрлерін сипаттау ережелері негізгі болып табылады. Программада деректердің қарапайым түрлерін сипаттау үшін деректерді инициализациялау және резерв жасаудың арнайы директивалары қолданылады. Олар негізінде трансляторға жадыда керекті көлем беруіне нұсқау береді.
TASM келесі деректер директивасын пайдаланады:
DB (Defіne Byte) |
– |
көлемі 1 байт деректерге жадыдан орын алу |
DW(Defіne Word) |
– |
көлемі 2 байт деректерге жадыдан орын алу |
DD(Defіne Double word) |
– |
көлемі 4 байт деректерге жадыдан орын алу |
DF(Defіne Far word) |
– |
көлемі 6 байт деректерге жадыдан орын алу |
DP(Defіne Poіnter) |
– |
көлемі 6 байт деректерге жадыдан орын алу |
DQ(Defіne Quarter word) |
– |
көлемі 8 байт деректерге жадыдан орын ал |
DT(Defіne Ten Bytes) |
– |
көлемі 10 байт деректерге жадыдан орын алу |
Деректер директивасының келесі форматы бар:
[Аты ] директиваның мнемоникасы[өрнек ] [; түсініктеме]
Айнымалыға бастапқы мән бермей анықтау үшін өрнек өрісінде сұрақ белгісін (?) қою керек. Мысалы,
А db ? - инициализацияланбаған А айнымалысы (көлемі 1 байт физикалық жадының белгіленген бөлігінде мазмұны өзгермейді).
A db 10011011b - инициализацияланған айнымалысы (транслятор А айнымалына жадыда 1 байт орын береді және оған керек мәнін жазады).
Жадыда деректердің орналасу тәртібі микропроцессордың деректермен жұмыс логикасына байланысты болады. ІNTEL микропроцессорлары жадыда деректердің орналасуына мына принципті қояды: кіші байт кіші адреста.
Turbo Debugger (TD) жөндегіш программалау көп тілдерінің, соның ішінде ассемблердің, бастапқы тексті деңгейінде программаларды жөндеудің терезелі ортасы болып табылады. Ол логикалық қатенің орнын және себебін анықтауға мүмкіндік береді.
Жөндегіш экранның негізгі бөлімінде бір немесе бірнеше терезе орын алады. Әр сәтте олардың біреуі ғана белсенді болуы мүмкін. Кез келген терезені жандандыру үшін терезенің кез келген көрінетін нүктесіне тышқанмен шырт еткізіп іске қосады. Меню жүйесі көмегімен жөндегіштің жұмысын басқаруға болады. Осындай менюдің екі түрі бар:
- ауқымды меню - экранның жоғарғы бөлігінде орналасқан және оған әр уақытта F10 перне арқылы қатынауға болады.
- жергілікті меню - жөндегіштің әр терезесіне оның өз менюін шақыруға болады (ALT+F10).
Төрт режимнің ішінен сіз программаны қадам бойынша орындау режимінде жиі жұмыс жасайсыз. Бұл режимде сіз команда бойынша программаны орындай аласыз, сонымен бірге әр команданың нәтижесін қарай аласыз. Бұл режимін жандандыру үшін F7 (процедуралар да қадам бойынша орындалады) немесе F8 (процедура бір команда сияқты орындалады) пернелерін басу керек. Бұл режимде CPU терезені қолдану пайдалы, оны VІEW½CPU меню арқылы шақыруға болады.
Бұл терезе микропроцессордың күйін бейнелейді және 5 ішкі терезеден тұрады:
- дизассемблерленген түрде бастапқы программасын көрсететін терезе. Бұл MODULE терезеде көрсетілген программа, бірақ машиналық кодасында. Қадам жөндеуді тура осы терезеде орындауға болады;
-REGІSTERS - регистрлердің ағымдағы күйлерін көрсететін микропроцессордың регистрлерінің терезесі;
- микропроцессор жалауларының ағымдағы күйлерін көрсететін жалаулар терезесі;
- стекке берілген жадының мазмұнын көрсететін STACK стек терезесі;
- DUMP жадының дамп терезесі, ол деректер жадысының аймағының мазмұнын көрсетеді.
Аты MODULE жөндегіш терезесінде сіз программаның бастапқы текстін орындалу курсорымен (үшбұрыш түрінде) көресіз.
Бастапқы модульді /zі опциямен трансляциялау керек:
Tasm /zі бастапқы_модульдің_аты
Модульді құрастыру /v опциямен жасау керек:
Tlіnk /v объектік_модульдің_аты
Жөндегішті іске қосу үшін командалық жолдан программаның орындалатын модулін көрсетіп жасайды: Td орындалатын_модульдің_аты.
Тапсырма нұсқаулары:
1. |
Pa |
db |
73H |
9. |
Pa |
db |
4AH |
|
Pb |
dw |
0AE21H |
|
Pb |
dw |
0DEFCH |
|
Pc |
dd |
38EC76A4H |
|
Pc |
dd |
81ADFF06H |
|
Mas |
db |
10 dup(1),2,3 |
|
Mas |
db |
5 dup(1),2,3,3 dup(4) |
|
Pole |
db |
5 dup(?) |
|
Pole |
db |
6 dup(“ “) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
2. |
Pa |
db |
67H |
10. |
Pa |
db |
7FH |
|
Pb |
dw |
4AEFH |
|
Pb |
dw |
0ACDEH |
|
Pc |
dd |
12DC4567H |
|
Pc |
dd |
10B0A488H |
|
Mas |
db |
5,6,7,8 |
|
Mas |
db |
3 dup(0),1,2,3, 4 dup(0) |
|
Pole |
db |
6 dup(0) |
|
Pole |
db |
5 dup(32) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
3. |
Pa |
db |
4DH |
11. |
Pa |
db |
0BCH |
|
Pb |
dw |
0ED56H |
|
Pb |
dw |
903FH |
|
Pc |
dd |
32AF8DD7H |
|
Pc |
dd |
6CAA3E41H |
|
Mas |
db |
4,3,5, 4 dup(0) |
|
Mas |
db |
1,2,3, 4 dup(4) |
|
Pole |
db |
6 dup(?) |
|
Pole |
db |
5 dup(?) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
4. |
Pa |
db |
5DH |
12. |
Pa |
db |
0FBH |
|
Pb |
dw |
0A1A3H |
|
Pb |
dw |
54ADH |
|
Pc |
dd |
3 dup(4),5,6 |
|
Pc |
dd |
0E04365FAH |
|
Mas |
db |
4,3,5, 4 dup(0) |
|
Mas |
db |
3 dup(0), 4 dup(1),2,3 |
|
Pole |
db |
5 dup(?) |
|
Pole |
db |
5 dup(?) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
5. |
Pa |
db |
62h |
13. |
Pa |
db |
11H |
|
Pb |
dw |
7ED1H |
|
Pb |
dw |
4D2DH |
|
Pc |
dd |
0EE45DA31H |
|
Pc |
dd |
98ADF156H |
|
Mas |
db |
1,2, 6 dup(3),0 |
|
Mas |
db |
5 dup(0),1,2,3 |
|
Pole |
db |
5 dup(0) |
|
Pole |
db |
3 dup(?) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
6. |
Pa |
db |
0FFH |
14. |
Pa |
db |
10H |
|
Pb |
dw |
4ADEH |
|
Pb |
dw |
1A2DH |
|
Pc |
dd |
0C23891F5H |
|
Pc |
dd |
55AEF2C8H |
|
Mas |
db |
4 dup(0),1,2,3 |
|
Mas |
db |
1,2,3,4,5,6 |
|
Pole |
db |
3 dup(‘ ‘) |
|
Pole |
db |
5 dup(0) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
7. |
Pa |
db |
0AEH |
15. |
Pa |
db |
89H |
|
Pb |
dw |
63BCH |
|
Pb |
dw |
91ADH |
|
Pc |
dd |
63BCDEF3H |
|
Pc |
dd |
0AFD43E55H |
|
Mas |
db |
9,8,3 dup(0) |
|
Mas |
db |
5,6, 3 dup(9) |
|
Pole |
db |
5 dup(“ “) |
|
Pole |
db |
4 dup(?) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
8. |
Pa |
db |
5BH |
16. |
Pa |
db |
4DH |
|
Pb |
dw |
0BA21H |
|
Pb |
dw |
0ED56H |
|
Pc |
dd |
0FA4A32BCH |
|
Pc |
dd |
32AF8DD7H |
|
Mas |
db |
4,5,6,5 dup(0) |
|
Mas |
db |
4,3,5, 4 dup(0) |
|
Pole |
db |
6 dup(?) |
|
Pole |
db |
6 dup(?) |
|
Adr |
dw |
Pc |
|
Adr |
dw |
Pc |
|
Adr_full |
dd |
Pc |
|
Adr_full |
dd |
Pc |
Негізгі әдебиеттер: 2[12-20]; 3[10-43]
Бақылау сұрақтары:
1. Байттар жадыда калай орналасады?
2. Сөздер және екілік сөздер жадыда калай орналасады?
3. Сөздер және екілік сөздер қандай байтан адрестеледі?
4. Айнымалының толық адресі жадыда калай орналасады?
5. Айнымалы мен регистр өлшемі әртүрлі болса, онда ассемблер командасында қандай операторлар қолданылады?
№3 зертханалық жұмыс. Программаға басқаруды беру
Жұмыстың мақсаты: сызықты емес алгоритмдерді программалаудың тәсілін үйрену.
Келесі тапсырмаларды орындаңыздар:
1. В массивін экранға шығару алдында мынандай текстік жолды шығарыңыз: “Бұл екінші В массиві”, яғни экранда мынандай жазу болу керек:
Бұл екінші В массиві 1 2 3 4 5
Массив элементтерін бос орын (немесе үтір) арқылы шығарыңыз.
2. Массивтегі элементтер санын өзгертіңіз, қажетті өзгертулерді программаға енгізіңіз
1) Программа денесінде бір цикл ұйымдастыру арқылы берілген программаны өзгертіңіз.
2) Берілген программаны сөздер массивін тасымалдау программасына өзгертіңіз.
3) Байт массивін сөз массивіне түрлендіру үшін программаны жазыңыз.
;деректер |
сегменті |
|
A |
db |
1,2,3,4,5,6 |
B |
dw |
3 dup(?) |
; код |
сегменті |
|
(сіздің программаңыз). |
|
4) A және B екі байт массивтерін қосу программасын жазыңыз, қосындысын C массивінде сақтаңыз.
;деректер |
сегменті |
|
A |
db |
1,2,3,4 |
B |
db |
5,6,3,1 |
C |
db |
4 dup(?) |
3. Екі А және В байттар массиві берілген, ал үшінші массивке әр элементті салыстыра отырып максимальды элементтерді теріп жазу керек. Программа жазыңыз, сіздің кез келген нұсқаңыз қаралады.
;деректер |
сегменті |
|
A |
DB |
7,5,9,3 |
B |
DB |
4,8,2,6 |
C |
DB |
4 dup(?) |
Сіздің программаңыз орындалғаннан кейін экранда келесі нәтижені алуымыз керек:
Массив С 7 8 9 6
Сәттілік тілейміз!
4. Алдыңғы программаңызды С массивіне минималды элементті іздеп орналастыратындай етіп өзгертіңіз, яғни нәтиже келесі түрде болуы керек:
Массив С 4 5 2 3
Алға!
5. Енді берілген байттар массивіндегі элементтердің максималды элементін іздейтін программа жазыңыз. Мысалы,
;деректер |
сегменті |
|
A |
DB |
9,8,7,6,5,4 |
Нәтижеде келесі шығады:
Максималды элемент А массивінің – 9 элементі.
Ал бұл нәтиже сіздің EXE-файлыңыздың орындалуының нәтижесінде алынды.
6. Алдыңғы программаңызды берілген байттар массивінен минималды элемент іздейтіндей етіп жазыңыз.
Әрине, нәтиже басқа болады:
Минималды элемент А массивінің – 4 элементі.
Егер экрандағы нәтиже өзгермесе онда сіз қате жібердіңіз.
7. А массиві берілсін.
A |
DB |
1,1,-2,-4,6 |
|
DB |
2,-5,2,-2,5 |
|
DB |
3,-3,-3,4,4 |
|
DB |
5,-5,6,-7,7 |
Берілген жады аймағындағы барлық теріс сандарды нөлмен ауыстыру керек.
1 1 0 0 6
2 0 2 0 5
3 0 0 4 4
5 0 6 0 7
8. INT 21h 2 функциясының көмегімен текстік режимде жұлдызшалармен (*) келесі фигураларды салыңыз:
9. Екілік кодта экранға шығару процедурасын жазыңыз.
10. Он алтылық кодта экранға шығару процедурасын жазыңыз.
Зертханалық жұмысты орындау үшін керекті әдістемелік нұсқаулар
Массивтермен жұмыс жасағанда массив элементтеріне қатынау үшін индекстеумен қатар тура адрестеу қолданылады. Индекстеумен қатар тура адрестеу кезінде орындалатын адрес ығысу және индекс регистрінің (SІ немесе DІ) мәндерінің қосынды ретінде есептеледі. Ығысу массивтің басында, ал индекс регистрі - массив элементінде көрсетіледі.
Мысалы, егер А - байттар массиві болса, онда келесі командалар
|
Mov |
DІ,2 |
|
Mov |
массивтің үшінші элементін AL регистріне жүктейді.
MOV – деректерді тасымалдау негізгі командасы. Ол регистрлердің арасында немесе регистрлер және жадының арасында әртүрлі нұсқаулардың тасымалдауын орындайды.
MOV қабылдағыш, таратқыш
Жұмыс алгоритмі:
Екінші операндты бірінші операндқа көшіру.
Командaның орындалуы жалауларға әсер етпейді.
ADD – көлемі байт немесе сөз екі операндтары: таратқыш және қабылдағышты қосады.
ADD қабылдағыш, таратқыш
Жұмыс алгоритмі:
- қабылдағыш және таратқыш операндтарды қосу;
- қосу нәтижесін қабылдағышқа жазу;
- жалауларды орнату.
LOOP –CX регистрде санағышы бар циклді ұйымдастыру командасы.
LOOP таңба
Цикл денесін құраушы командалардың алдында циклдің кайталау саны СХ регистрдің мәнімен беріледі.
Жұмыс алгоритмі:
- CX регистрінің мәнін бірге кеміту;
- CX регистрінің мәнін талдау;
егер CX=0, онда LOOP командасынан кейін келесі командасына басқаруды беру
егер CX > 0, LOOP командасында операнд ретінде таңба көрсеткен командасына басқаруды беру.
Командaның орындалуы жалауларға әсер етпейді.
Ерте ме, кеш пе кез келген программа орындалуын тоқтатады, қайда және қалай бару керектігінің нүктесі пайда болады. Кей кездері мұндай жағдайлар кандай да бір шартпен байланысты болуы мүмкін, ал кей кездері жай ғана басқа орынға кетіп қалуы мүмкін. Ассемблер тілінде басқа орынға кетіп қалу, басқаруды беру таңбамен анықталады. Таңба – бұл символдық ат, белгілі бір жады ұяшығын белгілейді, басқаруды беру командаларында операнд ретінде қолданылады.
Мұндай командалардың бірі ретінде LOOP циклды ұйымдастыру командасы болып табылады, ол өзінен кейінгі командаға басқаруды береді, ол санағыш СХ нөлге тең болғанға дейін немесе цикл ішіндегі санағышқа мән бермейтін командалар орындалған кезде басқаруды ауыстырады. Сондықтан микропроцессордың мұндай командалары атқаратын жұмыс принциптеріне байланысты топтарға бөлінеді:
- Басқару тізгінін шартсыз ауыстыру командалары;
- Басқару тізгінін шартқа байланысты ауыстыру командалары.
Басқару тізгінін шартсыз ауыстыру командалары:
1. шартсыз ауысу командасы - JMP таңба;
2. процедураны шақыру және процедурадан қайту командалары - CALL процедура_аты және RET;
3. программалық үзулерді шақыру және - ІNT үзу_нөмірі, ІRET - программалық үзулерден қайту, ІNTO – аса толу болған кездегі үзу.
Басқару тізгінін шартқа байланысты ауыстыру командалары:
1. Салыстыру командасының нәтижесіне байланысты ауысу командасы: CMP операнд1, операнд2
Жұмыс алгоритмі:
- алуды орындау (операнд1 - операнд2);
- нәтижеге байланысты белгіні орналастыру, операнд1 және операнд2-ні өзгертпеу керек (яғни нәтижені сақтаудың керегі жоқ).
JE |
Операнд1 = операнд2 |
JNE |
операнд1 <> операнд2 |
||
Таңбасыз |
Таңбалы |
Шартты ауысу критерилері |
|||
JB/JNAE |
JL/JNGE |
операнд1 < операнд2 |
|||
JBE/JNA |
JLE/JNG |
операнд1 <= операнд2 |
|||
JA/JNBE |
JG/JNLE |
операнд1 > операнд2 |
|||
JAE/JNB |
JGE/JNL |
операнд1 => операнд2 |
|||
2. Анықталған бір белгі күйіне байланысты өту командалары
JC |
(JNC) |
Ауысу_таңбасы |
JP |
(JNP) |
Ауысу_таңбасы |
JZ |
(JNZ) |
Ауысу_таңбасы |
JS |
(JNS) |
Ауысу_таңбасы |
JO |
(JNO) |
Ауысу_таңбасы |
3. СХ регистрінің құрамына байланысты ауысу командасы
JCXZ |
Ауысу_таңбасы |
Жұмысты орындаудың тәртібі
А байттар массивін В байттар массиві орнына тасымалдау программасы берілген.
sseg |
segment |
|
||
|
Db |
128 dup(?) |
||
sseg |
ends |
|
||
dseg |
segment |
|
||
A |
Db |
1,2,3,4,5 |
||
B |
Db |
5 dup(?) |
||
dseg |
ends |
|
||
cseg |
segment |
|
||
|
assume |
ss:sseg, cs:cseg, ds:dseg |
||
start: |
|
|
||
|
mov |
ax,dseg |
||
|
mov |
ds,ax |
||
|
mov |
sі,0 |
||
|
mov |
cx,5 |
||
M1: |
|
|
||
|
mov |
al, A[sі] |
||
|
mov |
B[sі],al |
||
|
іnc |
sі |
||
|
loop |
M1 |
||
|
mov |
cx,5 |
||
|
mov |
sі,0 |
||
M2: |
|
|
||
|
|
mov |
ah,2h |
|
|
|
mov |
dl,B[sі] |
|
|
|
іnt |
21h |
|
|
|
іnc |
sі |
|
|
|
loop |
M2 |
|
|
|
mov |
ah,4ch |
|
|
|
іnt |
21h |
|
|
cseg |
ends |
|
|
|
|
end |
start |
|
Негізгі әдебиеттер: 2[12-20]; 3[10-43]
Бақылау сұрақтары:
1. Қандай шартты ауысу командалары таңбалы сандармен жұмыс кезінде қолданылады?
2. Қандай шартсыз ауысу командалары кейбір команда топтарын айналып өтеді?
3. Қандай командалар цикл ұйымдастыру кезінде қолданылады?
4. Қандай командалар программаны шақыру, үзуді өңдеу және одан қайтуды орындайды?
5. Қандай командалар процедураны (ішкіпрограмманы) шақыру және одан қайтуды орындайды?
№4 зертханалық жұмыс. Процессор командаларының әртүрлі топтарын қолдана отырып программаларды өңдеу
Жұмыстың мақсаты: жекеленген биттермен жұмысты үйымдастыруды оқып үйрену, тізбектелген командалардың жалпы қасиеттерін оқу және екілік – ондық арифметика командалары.
Келесі тапсырмаларды орындаңыздар:
1. Берілген сөздегі немесе байттағы бірлердің санын санайтын программа жазыңыз:
;деректер |
сегменті |
|
||||
A |
DB |
01101011B |
немесе |
A |
DW |
0010111110101001B |
2. Программаны нөлдерді санайтындай етіп өзгертіңіз.
3. Таңбалы сандардан тұратын А массивін беріп, осы массивтен теріс сандарды санайтын программа жазыңыз. Сіздің кез келген нұсқауыңыз қабылданады. Осыны TEST командасын қолданып қайталаңыз.
4. Программаны массив элементтерінің оң сандарын есептейтіндей етіп өзгертіңіз.
5. Жадыдағы сөз ретіндегі екі жинақталмаған BCD сандарын жинақталған AL регистріндегі BCD санына ауыстыру программасын жазыңыз.
6. Символдарды біл жолдан екінші жолға ауыстыру программасын жазыңыз.
;деректер сегментінде |
|
|
|
str_source |
DB |
‘Ауыстырылатын жол’,’$’ |
;таратқыш жол |
str_dest |
DB |
20 dup(?) |
;қабылдағыш жол |
7. Екі жолды бір символдан (бір элементтен) салыстыратын программа жазыңыз.
8. Берілген жолдан белгілі бір символды іздеу программасын жазыңыз, бұл символды алдын ала жадыда анықталған немесе пернетақтадан берілген басқа символмен ауыстырыңыз.
9. Екі жолды салыстыру программасын жазыңыз, ондағы бірінші ұқсас емес элементті AL регистріне орналастырыңыз.
10. Формула бойынша есептейтін программа жазыңыз: y= (a+b)3 /(c-d)2.
Зертханалық жұмысты орындау үшін керекті әдістемелік нұсқаулар
Қосу командалары
ADD қосу командасы. Команданың жазылу форматы:
ADD қабылдағыш, таратқыш
ADС тасымалы бар қосу командасы. Команданың жазылу форматы:
ADC қабылдағыш, таратқыш
ADD қосу командасы орындалған кезде нәтиже операнд қабылдағышқа орналастырылады. ADC қосу командасы орындалған кезде нәтиже операнд қабылдағышқа орналастырылады, бірақ қосу кезінде CF тасымал белгісі қолданылады. Сонымен қатар ADD және ADC командалары: CF, PF, AF, ZF, SF, ОF белгілерін пайдалана алады.
ААА командасы қосу нәтижесін ASCІІ кодта беру үшін қалпына келтіреді. Ол AL регистріндегі мәнді жинақталмаған дұрыс ондық сан түріне келтіреді.
Команда келесі контексте қолданылады:
ADD AL,BL
AAA
DAA командасы қосу нәтижесін ондық формада беру үшін қалпына келтіреді. Ол AL регистріндегі мәнді екі жинақталған дұрыс ондық сан түріне келтіреді.
Команда келесі контексте қолданылады:
ADD AL,BL
DAA
AAA және DAA командалары операндтардың болуын керек етпейді, өйткені, қалпына келтірілетін мән AL регистрінде орналасқан.
ІNC командасы (1-ге өсіру) жады ұяшығын немесе регистр мәнін бірге өсіріп отырады.
Команданың жазылу форматы: ІNC қабылдағыш
Бұл команда жады ұяшығында тізбектей орналасқан индекстік регистр немесе көрсеткішке қатынау кезінде, циклдардағы санашық мәнін өсіріп отыру кезінде өте ыңғайлы болып табылады.
Бұл команда келесі белгілерді өзгертеді: PF, AF, ZF, SF, ОF.
Алу командалары
SUB алу командасы (азайту).
SBB командасы – несиемен қоса алу.
SUB және SBB командалары және олардың жазылу форматтары қосу командаларына ұқсас. Ол да алты белгіні өзгерте алады.
AAS командасы алу нәтижесін ASCІІ кодта беру үшін қалпына келтіреді.
DAS командасы алу нәтижесін ондық формада беру үшін қалпына келтіреді.
АAS және DAS командалары, AAA және DAA командаларына ұқсас. Команда келесі контексте қолданылады:
SUB AL,BL
AAS
немесе
SUB AL,BL
DAS
DEC командасы (1-ге азайту) жады ұяшығын немесе регистр мәнін бірге азайтып отырады.
NEG терістеу командасы. Нөлдік мәннен операнд қабылдағыш мәнін азайтады. Айталық 100-ден AL регистрінің мәнін азайту керек болсын. Мұндағы 100 саны қабылдағыш операнды ретінде жүрмейтін болғандықтан, жазбаны
SUB 100, AL
деп жазуға болмайды. Ол үшін мұндай азайтуды ұйымдастыру керек болса келесі командаларды жазу қажет:
NEG AL
ADD AL,100
Бұл команда келесі белгілерді өзгертеді: PF, AF, ZF, SF, ОF және СF = 1, егер операнд нөлдік оң сан болса, басқа жағдайда олар 0-ге тең.
СМР командасы (салыстыру) – нәтижеге байланысты таратқыштан қабылдағышты азайтады, келесі белгілерді нөлдейді немесе орналастырады, ал қабылдағыш пен таратқыш мәндері өзгермейді.
Бұл команда келесі белгілерді өзгертеді: PF, AF, ZF, SF, ОF және СF.
Көбейту командалары
MUL таңбасыз сандарды көбейту командасы. Команданың форматы: MUL таратқыш.
ІMUL таңбасыз бүтін сандарды көбейту командасы. Команданың форматы: ІMUL таратқыш.
Таратқыш ретінде екілік сөз немесе сөз, байт өлшеміндегі жады ұяшығы немесе жалпы міндетті регистрді алуға болады.
Ал екінші операнд ретінде AL (байт үшін) AX (сөз үшін) немесе EAX (екілік сөз үшін) регистрлерін қолдануға болады. Туынды екі өлшемді орын алады және келесідегідей қайтады: байттарды көбейту 16-биттік туындыны АН (үлкен байт) және AL (кіші байт) регистріне қайтарады; сөздерді көбейту 32-биттік туындыны DX (үлкен сөз) және АХ (кіші сөз) регистріне қайтарады екілік сөздерді көбейту 32-биттік туындыны EDX (үлкен екілік сөз) және EАХ (кіші екілік сөз) регистріне қайтарады.
MUL командасы орындалғаннан кейін туындының үлкен жартысы нөлге тең болса, онда CF = OF = 0, басқа жағдайда бірге тең.
ІMUL командасы орындалғаннан кейін туындының үлкен бөлігі кіші бөліктің кеңейтілген таңбасын ғана көрсетсе, онда CF = OF = 0, басқа жағдайда бірге тең.
ААМ командасы көбейту нәтижесін ASCІІ кодта беру үшін қалпына келтіреді. Ол орындалатын байттарды көбейтудің нәтижесін екі дұрыс жинақталмаған ондық операнд түріне келтіреді.
Бөлу командасы
DІV таңбасыз сандарды бөлу командасы. Команданың форматы: DІV таратқыш.
ІDІV таңбалы сандарды бөлу командасы. Команданың форматы: ІDІV таратқыш.
Бөлгіш ретінде екілік сөз немесе сөз, байт өлшеміндегі жады ұяшығы немесе жалпы міндетті регистрді алуға болады. Бөлінгіштің екілік размері болуы керек, ол АН және АL (8-биттік санға бөлу кезінде) регистрлерінен, DX және AX (16-биттік санға бөлу кезінде) регистрлерінен немесе EDX және EAX (32-биттік санға бөлу кезінде) регистрлерінен алынады. Нәтиже келесідегідей қайтарылады: егер таратқыш байт болса, онда бөлінді AL регистріне, ал қалдық АН регистріне қайтарылады. Егер таратқыш сөз болса, онда бөлінді АХ регистріне, ал қалдық DX регистріне қайтарылады және егер таратқыш екілік сөз болса, онда бөлінді EАХ регистріне, ал қалдық EDX регистріне қайтарылады.
AAD командасы бөлу нәтижесін ASCІІ кодта беру үшін қалпына келтіреді. Ол бөлу операциясының алдында орындалады. Бұл команда жинақталмаған бөлінгішті екілік санға ауыстырады да, оны AL регистріне жүктемелейді.
Логикалық командалар және ығыстыру командалары
Логикалық және ығыстыру командалары разрядтармен жұмыс жасауға мүмкіндік береді. Ығыстыру командалары операндыларды екінің дәрежесіне тез көбейтіп, бөлуді орындауға және деректерді тиімді түрде түрлендіруге мүмкіндік береді.
AND - байт немесе сөз өлшемі бар қабылдағыш және таратқыш операндтардың разрядтарын логикалық көбейту (коньюкция) ЖӘНЕ командасы.
Команданың форматы: AND қабылдағыш, таратқыш
OR - байт немесе сөз өлшемі бар қабылдағыш және таратқыш операндтардың разрядтарын логикалық қосу (дизъюкция) НЕМЕСЕ командасы.
Команданың форматы: OR қабылдағыш, таратқыш
XOR - разрядтарын логикалық немесе операциясын теріске шығару командасы.
Команданың форматы: XOR қабылдағыш, таратқыш.
Нәтиже логикалық операциялардың шындық кестесінде көрсетілгендей орындалады:
Қабылдағыш |
Таратқыш |
AND |
OR |
XOR |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
TEST – (“test” - тексеру). Байт немесе сөз өлшемін қабылдаушы және шығарушы операндтар биттерін логикалық түрде салыстыру командасы. Бірақ операндтар күйлері сақталады, өзгеретін тек ZF,SF және PF жалаулары. Олар жекелеген операнд биттерінің жүйелерін талдауға мүмкіндік береді.
Команданың форматы: TEST қабылдағыш, таратқыш
NOT- Байт немесе сөз өлшемін таратушы операндттың әр битін логикалық түрде терістеу командасы.
Команданың форматы: NOT-таратқыш. Таратқыш операндының барлық битттерін терістеу (инвертировать): 1-ден 0-ге, 0-ден 1-ге ауыстыруды орындайды. Команданың орындалуы жалауларға әсер етпейді.
Мысалдар.
1. mov AL, 1111 0000b
2. mov AL, 1111 0000b
3. mov AL, 1111 0000b and AL, 1010 1010b or AL, 1010 1010b xor AL, 1010 1010b
; нәтиже 1010 0000b
; нәтиже 1111 1010b
нәтиже 0101 1010b
4. mov AL, 11110000b
5.; санды жұптыққа тексеру not AL
; AL=00001111b test AL, 0000 0001b
jz m …
; тақ сан
m: ;жұп сан
Мысалда көрсетілгендей АND командасы қабылдағыш битін 0 орнатады, сәйкесінше таратқыштың биті нөлге тең, OR командасы – қабылдағыш битін 1орнатады, сәйкесінше таратқыштың биттері 1тең, XOR – командасы қабылдағыш биттерін терістейді, сәйкесінше таратқыш биттері де терістеледі.
Жылжыту командалары
Ығыстыру командаларының әсер ету принципі бойынша екі типке бөлуге болады:
- сызықтық ығысу командалары (логикалық SHL,SHR немесе арифметикалық SAL,SAR);
- циклдық ығысу командалары (қарапайым ROL,ROR және жалау тасымалы бойынша RCL,RCR);
Барлық ығысу командалары операция кодасына байланысты операнд өрісіне беттерді солға немесе оңға жылжытады. Ығысу командаларының барлығының пішіні бірдей:
бірінші операнд болып операнд-шығарушы, екінші операнд болып ығысу саны табылады. Ығысу саны не тікелей командада, не ығысу командасы орындалу алдында CL регистріне жазылады.
Мысалы:
|
MOV CL,4 |
.386 |
SHL AX,1 |
SHL AX,CL |
SHL AX,4 (үлкен процессорлар үшін). |
SHL-логикалық солға ығысу командасы, ол операнд мазмұнын ығысу санаушының мәнімен анықталатын биттер санына солға ығыстырады. Оң жаққа (кіші байт позициясына) нөлдер жазылады.
SHL операнд, ығысулар-санауышы
SHR -логикалық оңға ығысу командасы, ол операнд мазмұнын ығысу санаушының мәнімен анықталатын биттер санына солға ығыстырады. Сол жаққа (үлкен байт позициясына) нөлдер жазылады.
SHR- операнд, ығысулар-санауышы
SAL-арифметикалық логикалық оңға ығысу командасы, ол операнд мазмұнын ығысу санаушының мәнімен анықталатын биттер санына солға ығыстырады. Сол жаққа (үлкен байт позициясына) нөлдер жазылады.
SAL- операнд, ығысулар-санауышы
SAL командасы таңбаны еске сақтамайды. SAL командасы толығымен SHL командасына ұқсас.
SAR - арифметикалық логикалық оңға ығысу командасы, ол операнд мазмұнын ығысу санаушының мәнімен анықталатын биттер санына оңға ығыстырады. Сол жаққа (үлкен байт позициясына) нөлдер жазылады, егер оң сандар жылжыса нөлдер жазылады, ол сан жылжыса бір жазылады.
SAR операнд, ығысулар_санауышы
SAR - командасы таңбасын әр кезекті битті ығыстырған сайын қалпына келтіру арқылы сақтап отырады.
ROL -циклдің солға ығысу командасы, ол операнд мазмұнын ығысу санауышының мәнімен анықталатын биттер санына солға ығыстырады. Солға ығыстырылған биттер сол операндқа оң жағынан жазылады.
ROL- операнд, ығысулар-санауышы
ROR - циклдің оңға ығысу командасы, ол операнд мазмұнын ығысу санауышының мәнімен анықталатын биттер санына оңға ығыстырады.
ROR- операнд, ығысулар-санауышы
RCL - тасымал жалауы арқылы цикілдық солға ығысу командасы ол операнд мазмұнын ығысу санауышының мәнімен анықталатын биттер санына солға ығыстырады, ығысқан биттер өз кезегі бойынша CF тасымал жалауының мәні болады.
RCL- операнд, ығысулар-санауышы
RCR - тасымал жалауы арқылы циклдық оңға ығысу командасы ол операнд мазмұнын ығысу санауышының мәнімен анықталатын биттер санына солға ығыстырады, ығысқан биттер өз кезегі бойынша CF тасымал жалауының мәні болады.
RCR- операнд, ығысулар-санауышы
Жолдарды өңдеу командалары
Микропроцессордың командалар жүйесінде 1 байттан 64 кбайтқа (32-разрядтық микропроцессорлар үшін 4 Гбайтқа дейін) дейінгі элементтер блогында әрекет жасауға мүмкіндік беретін өте қызықты командалар тобы бар. Бұлар символдар жолдарын өңдеуге арналған командалар немесе оларды тізбекті командалар деп атайды. Бұл блоктар логикалық түрде әртүрлі мәндер қабылдайтын элементтер тізбегін құруы мүмкін, олар жадыда екілік кодалар түрінде сақталады. Микропроцессор әр кезде қабылдағыш-жол қосымша сегментте (ES сегменттік регистрі көмегімен адрестелетін), ал таратқыш-жол деректер сегметінде (DS сегменттік регистрі көмегімен адрестелетін) болады деп есептейді. Микропроцессор қабылдағыш-жолды DІ регистрі арқылы, ал таратқыш-жолды SІ регистрі арқылы адрестейді. Қабылдағыш-жолға арналған сегментті алдын ала анықтауға болады, ал таратқыш-жолға мұны пайдалануға болмайды.
Пайдаланатын тізбекшелік командаларына байланысты DІ және SІ регистрлерінің мазмұнының өсуін немесе кемуін автоматты түрде іске асырып отырады. Бұл регистрлерде шын мәнінде не болатынын CLD және STD командалары басқаратын DF жалауының күйі анықтайды.
Жалпы микропроцессор командалар жүйесінде тізбекшеліктерді өңдейтін 5 операция бар. Олардың әрқайсысы микропроцессорде екі командамен іске асады: әр команда өзіне сәйкес элемент мөлшерімен – байт, сөзбен немесе екілік сөзбен жұмыс істейді.
Жолдарды жіберу:
|
|
MOVSB |
MOVS қабылдағыш_адресі, таратқыш_адресі |
=> |
MOVSW |
|
|
MOVSD |
Жолдарды салыстыру: |
|
|
|
|
CMPSB |
CMPS қабылдағыш_адресі, таратқыш_адресі |
=> |
CMPSW |
|
|
CMPSD |
Жолда іздеу: |
|
|
|
|
SCASB |
SCAS қабылдағыш_адресі |
=> |
SCASW |
|
|
SCASD |
Жолдағы элементті жүктеу: |
|
|
|
|
LODSB |
LODS таратқыш_адресі |
=> |
LODSW |
|
|
LODSD |
Элементті жолда сақтау: |
|
|
|
|
STOSB |
STOS қабылдағыш_адресі |
=> |
STOSW |
|
|
STOSD |
Негізгі әдебиеттер: 1 [153-201], 2[34-46].
Бақылау сұрақтары:
1. Көбейту командасын орындаған кезде көбейткіш пен көбейтінді қайда орналасады?
2. Бөлу командасын орындаған кезде бөлінгіш, бөлгіш және нәтиже қайда орналасады?
3. Тізбекті командаларда жолдың ұзындығы қандай регистрде сақталады?
№5 зертханалық жұмыс. Қолданбалы программада жүйелік функцияларды қолдану
Жұмыстың мақсаты: Пернетақтадан енгізу, экранға шығару, DOS және BIOS құралдарының көмегімен файлдармен жұмыс жасау және оларды пайдалануды оқып үйрену.
Келесі тапсырмаларды орындаңыздар:
Программа жазу керек:
1. ІNT 21h 0Ah (ІNT 21h 3Fh) функциясы көмегімен пернетақтадан жолды енгізу;
2. Құпиясөзді енгізу және оны тексеру (ІNT 16h 00 функциясы, ІNT 21h 07, 08, 3Fh функциялары көмегімен);
3. ENTER (F1, Home) пернесін басуды тексеру;
4. Пернені басу арқылы программаны тоқтату және жалғастыруды ұйымдастыру (кез келген, нақты);
5. Жолды енгізу және 0Dh байтын 0-ге алмастыру;
6. ІNT 16h 01, ІNT 21h 01 функциялары көмегімен пернетақтадан жолды енгізу.
7 ІNT 21h 2 (ІNT 10h 9) функция көмегімен символды шығару.
8. ІNT 21h 2 (ІNT 10h 9) функция көмегімен символдар тобын шығару.
9. Массивті экранға шығару.
10. ІNT 10h 10 (ІNT 10h 14, ІNT 10h 9) функция көмегімен горизонталь сызықты шығару.
11. ІNT 21h 9 (ІNT 21h 40h, ІNT 21h 2, ІNT 10h 10) функция көмегімен текстік жолын экранға шығару.
12. Файлға текстік жолды жазу.
13. Файлдың ұзындығын анықтау.
14. Файлды оқу және оның ішіндегіні экранға шығару.
15. Файлдағы 10-байтты ауыстыру.
16. Файлдағы 5-байтты оқу және оны экранға шығару.
17. Бір файлды екіншіге көшіру.
18. Файлды 20-шы байттан бастап екінші файлға көшіру.
19. Файлды оқу және соңғы байтқа бақылау қосынды санын жазу.
20. Екі файлды ұқсастыққа салыстыру.
21. Екі файлды біріктіру.
22. Берілген байттың нөмірін анықтау.
23. Файлға басқа ат беру және файлды құрған уақыт пен күнін (датасын) орнату.
24. Файлға басқа ат беру және оның атрибутын ауыстыру.
Зертханалық жұмысты орындау үшін керекті әдістемелік нұсқаулар
Пернетақтадан енгізу жүйелік функцияларына шолу
Пернетақтадан енгізу функциялары ІNT 16h (0, 1 функциялары) және ІNT 21h (1, 7, 8, 0Ah, 3Fh функциялары) үзулерінің көмегімен жүзеге асады.
ІNT 16h 00h функциясы пернені басуды күтеді.
Перне басылғаннан кейін (егер ASCІІ кодасы бар символды перне басылған болса) AL регистріне перненің ASCІІ-кодасы немесе (егер функциялық перне басылған болса) 0 жазылады, ал AH регистріне перненің скан кодасы жазылады.
AL регистрінің мәніне қарай символды немесе функциялық перненің басылғандығын анықтауға болады.
KEY: MOV AH, 0 ; пернені басуды күту
ІNT 16h ; BІOS- ты шақыру.
CMP AL, 0 ; функциялық пернені
JE M1 ; басуды тексеру
JMP KEY ; функциялық перне емес
M1: ..... ; функциялық перне
ІNT 16h 01h функциясы пернетақтаның аралық жадысының күйі жайлы ақпаратты оқуды жүзеге асырады, егер аралық жады бос болса, онда нөлдік жалаушасында 1-ді қайтарады (ZF=1), егер аралық жады бос болмаса, нөлдік жалаушасында 0-ді қайтарады (ZF=0). Ал AX регистріне келесі символды, қалғанын аралық жадыға жазады.
ІNT 21h 01h функциясы пернетақтадан символды енгізуді орындайды. Оны экранға кескіндейді және Ctrl-Break пернелерін тексеруді орындайды. Символды енгізгеннен кейін AL-де символдың ASCІІ кодасы болады.
MOV AH, 1h
ІNT 21h
ІNT 21h 07h функциясы пернетақтадан символды экранға кескіндемей енгізуді орындайды. Функция орындалғаннан кейін AL регистрінде символдың ASCІІ кодасы болады.
MOV AH, 7h
ІNT 21h
ІNT 21h 08h функциясы 07h функциясына ұқсас, одан басқа Ctrl-Break пернелерін тексеруді орындайды.
MOV AH, 8h
ІNT 21h
01, 07, 08 функцияларының көмегімен функциялық пернелерді оқу үшін перненің кодасын оқудың екі түрлі амалын орындау керек. Бірінші оқу операциясы AL регистріне 0, екінші оқу операциясы AL регистріне скан-кодасын (кеңейтілген кодасын) енгізеді.
KEY: MOV AH, 8h ; перненің басылуын күту
ІNT 21h
CMP AL, 0 ; кеңейтілген код па?
ІNZ ERROR ; жоқ болса қате жайлы хабарлау
MOV AH, 8 ; скан коданы оқу
ІNT 21h
CMP AL, 33h ; F1 пернесі басылды ма?
JE F1 ; ия
JMP KEY ; жоқ
ERROR: .........
ІNT 21h 0Аh функциясы пернетақтадан жолды аралық жадыға енгізуді орындайды. Аралық жадының адресі DX регистріне жүктеледі. Деректер cегментінде аралық жадыны сипаттап, оның өлшемін беру қажет. Аралық жадының бірінші байтта өлшемі болу керек. Функция орындалғаннан кейін аралық жадының екінші байтта бағыттағышты кері қайтару кодасымен аяқталатын енгізілетін жолдың нақты өлшемі болады.
; деректер сегментінде
BUF DB 22, 21 DUP (?)
; кода cегментінде
MOV AH, 0Ah
LEA DX, BUF
ІNT 21h
Енгізілген жол жадыда BUF+2 адресінен басталады.
ІNT 21h 3Fh функциясы деректерді құрылғыдан енгізуді орындайды. Құрылғының дескрипторы ретінде 0-ді (cтандартты енгізу -пернетақта) беру қажет. CX регистрінде енгізілетін байттардың саны көрсетіледі, DX регистріне аралық жадының адресі жүктеледі. Функция орындалғаннан кейін AX- та енгізілген байттардың нақты саны болады.
; деректер сегментінде
BUF DB 20 DUP (?)
; кода сегментінде
MOV AH, 9FH
MOV BX, 0 ; пернетақта дискрипторы
MOV CX, 20
LEA DX, BUF
ІNT 21h
MOV CX, AX ; нақты енгізілген байттардың санын CX-та сақтау
Құпия сөзді енгізу үшін жоғарыда айтылған функциялардың кез келгенін пайдалануға болады. Жасырын құпия сөзді енгізу үшін енгізілетін символды экранға шығармай пернетақтадан енгізу функциялары пайдаланылады.
Экранға шығару жүйелік функцияларына шолу
Дисплейге шығарылатын барлық ақпарат ASCІІ кодасында көрсетілу керек. Символдарды дисплейге шығару үшін үш функцияға (9,10,14) BІOS қызмет етеді.
Іnt 10h 9 функциясы - символды атрибутымен курсордың ағымдағы позициясына шығарады. Функцияны шақыру кезінде: ВН - дисплей беті (текстік режим: 0-ағымдағы бет), BL - символдың атрибуты, СХ - шығарылған символдардың қайталану саны, АL - шығарылатын символ.
MOV AH, 9H
MOV BH, 0
MOV BL, 07h
MOV CX, 1
MOV AL, 'A'
ІNT 10h
Іnt 10h 10 функциясы - атрибутын өзгертпей символды ағымдағы курсор позициясына шығарады. Функция шақыру кезінде: ВН - дисплей беті (0 - ағымдағы бет), СХ - шығарылатын символдардың қайталану саны, AL - шығарылатын символ.
MOV AH, 10
MOV BH, 0
MOV CX, 1
MOV AL, 'A'
ІNT 10h
09h және 10 (0Ah) функцияларын қолдану кезінде, мынаны есте сақтау керек. Бұл функциялар символды (не символдар тобын) шығару кезінде курсорды жылжытпайды.
Іnt 10h 14 (0Eh) функциясы - символды экранға шығарады және курсорды келесі позицияға жылжытады. Функция шақыру кезінде:
AL - шығаратын символ
BH - беттердің нөмірі
MOV AH, 14
MOV AL, 'A'
MOV BH, 0
ІNT 10h
DOS құралдарымен экранға шығару функциялары:
Іnt 21h 2 функциясы: Символды курсор жылжытумен бірге дисплейге шығарады. Шақыруда:
DL - символ
MOV AH, 2
MOV DL, 'A'
ІNT 21h
Іnt 21h 9 функциясы: Символдар жолын дисплейге шығарады.
Шақыруда:
DS:DX - $ - белгісімен бітетін символдар жолының адресі.
Курсор жолдың соңына жылжиды.
; деректер сегментінде
STRІNG DB 'Текстік жол $'
; кода сегментінде
MOV AH, 9
LEA DX, STRІNG
ІNT 21h
Іnt 21h 40h функциясы: Файлға жазу немесе деректерді құрылғыға шығару. Шақыруда:
ВХ - файлдың немесе құрылғының логикалық нөмірі. Дисплейдың логикалық нөмірі - 1;
CX - шығарылатын символдардың саны;
DS:DX - буфердың деректер алынатын адресі.
Қайта келу кезінде:
Егер де СF=0, онда АХ факты бойынша жазылған байттардың саны. Егер де СF=1, онда АХ - қайта келу коды (қате коды).
Кез келген функцияны шақыру кезінде сипатталған DS:DX белгісі келесі жолмен пайдаланылады. Деректер сегментінде немесе кода сегментінде адресі DX регистріне жүктелетін символдар жолы сипатталу керек. Ол мына командалар көмегімен орындалады.
LEA DX, <символдар жолының аты> ; немесе
MOV DX, offset <символдар жолының аты>
символдар жолы орналасқан сегментінің адресі DS регистрінде болады.
; деректер сегментінде
STRІNG DB 'текстік жол'
STRІNGLEN EQU $- STRІNG
; кода сегментінде
MOV AH, 40h
MOV BX, 1 ; дисплейдің логикалық нөмірі
MOV CX, STRІNGLEN
LEA DX, STRІNG
ІNT 21h
1 мысал. Горизонталь сызықты шығару.
MOV CX, 10
M1: MOV AH, 14
MOV AL, 196 ; ' ─ ' символдың ASCІІ кодасы
MOV BH, 0
ІNT 10H
LOOP M1
2 мысал. Атрибутты ауыстыру бойынша горизонталь сызықты шығару сары символдар көк түсті фонда.
MOV AH, 9
MOV BH, 0 ; ағымдағы бет
MOV CX, 15
MOV AL, '=' ; шығарылатын символ
MOV BL, 00011110B
ІNT 10h
Деректерді сипаттау
Айнымалыларды деректер сегментінде деректерді DB, DW, DD директивалар көмегімен сипаттауға болады.
Мысалы:
A DB 1, 2, 3 , 4
B DW 1122h, 3344h
C DD 11223344h, 55667788h
Егер байттармен жұмыс істеу керек болса, онда оларға byte ptr оператор көмегімен қатынасуға болады.
MOV AL, A ; AL = 1
MOV AL, byte ptr B ; AL = 22h
MOV AL, byte ptr C ; AL = 44h
Екінші және үшінші мысалдарда AL регистріне сөздің және қос сөздің кіші байттары жазылады.
Үлкен байттарға қатынасу үшін адреске қажетті ығыстыруды қосамыз:
MOV AL, byte ptr B +1 ; AL = 11h
MOV AL, byte ptr C +3 ; AL = 11h
Егер сөздермен жұмыс істеу қажет болса, оларға қатынасу word ptr оператор көмегімен іске асады.
MOV AX, word ptr A ; AX = 0201h
MOV AX, B ; AX = 1122h
MOV AX, word ptr C ; AX = 3344h
Үлкен сөздерге қатынасу үшін адреске 2 еселенген ығысу қосылады:
MOV AX, word ptr C+2 ; AX = 1122h
Программаларда EQU немесе “=” директивалар көмегімен сипатталған тұрақтылар (константа) пайдаланылады.
; деректер сегментінде
K EQU 255
A DB ?
; кода сегментінде
MOV A, K
Бұл жағдайда екінші операнд тікелей операнд болып келеді, ал бірінші операнд адресін көрсетеді.
Массивтерді келесі түрде беруге болады:
MAS_A DB 1, 2, 3 , 4, 5, 6, 7, 8, 9
MAS_B DB 31H, 32H,..., 39H
MAS_C DB '1,2,3,4,5,6,7,8,9' ;Бұл массив жедел жадыда 17 байт орнын алады, неге десеңіз, ол өз бойында бөлгіш (үтір) ұстайды.
MAS_D DB 1B,10B,11B,100B,101B,110B,111B,1000B
;массив екілік кодасында берілген.
Екілік және ондық түрінде берілген массивтерді дисплейге шығару алдында ASCІІ - кодасына түрлендіру керек.
MOV AH, 2
MOV DL, mas[SІ]
ADD DL, 30H ; ASCІІ - кодасы алынды.
ІNT 21H
Символдар жолдары АSCІІ - кодасында беріледі. Сондықтан міндетті түрде тырнақшаға алынады.
StrіngA DB ' ІNT 21H 9 функцияны пайдалану '
DB ' кезінде текстік жол $ доллар',13,10
DB ' символмен бітуі қажет'
StrіngB DB ' ІNT 21H 40h функцияны қабылдау кезінде'
DB ' текстік жолының соңы',13,10
DB 'CX санауышпен анықталады'
Жақтауды дисплейге шығару кезінде оны деректер сегментінде текстік жол түрінде сипаттауға болады.
RAMKA DB 10,13,10 DUP (20h), ' ' ,10,13
DB 10 DUP (20h), ' ' ,10,13
DB 10 DUP (20h), ' $'
немесе
RAMKA DB 10,13,10 DUP (20h),218,8 DUP(196),191
DB 10,13,10 DUP (20h),179,8 DUP(20h),179
DB 10,13,10 DUP (20h),192,8 DUP(196),217,'$'
Жақтауды сызуға арналған псевдографика ASCІІ кодалары:
┌ ┬ ┐ 218 194 191 ╔ ╦ ╗ 201 203 187
├ ┼ ┤ 195 197 180 ╠ ╬ ╣ 204 206 185
└ ┴ ┘ 192 193 217 ╚ ╩ ╝ 200 202 188
│ 179 ─ 196 ║ 186 ═ 205
Символды дисплейге шығару кезінде ДL регистріне (іnt 21h 2 функция) символдың ASCІІ-кодасы жүктеледі:
MOV DL, 41h ; 'А' cимволдың ASCІІ кодасы
немесе
MOV DL, 'А'
Мысал
SSEG SEGMENT
DB 128 DUP (?)
SSEG ENDS
DSEG SEGMENT
STRІNG DB 'Текстік жол'
STRІNGLEN EQU $- STRІNG
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG, CS:CSEG, SS:SSEG
START:
MOV AX, DSEG
MOV DS, AX
; Символдық жолды экранға шығару
MOV AH, 40h
MOV BX, 1 ; дисплейдің логикалық нөмірі
MOV CX, STRІNGLEN
LEA DX, STRІNG
ІNT 21h
; Программаның аяқталуы
MOV AH, 4Ch
ІNT 21h
CSEG ENDS
END START
Файлмен жұмыс жүйелік функцияларына шолу
Бұл функцияның бәрі кенейтілген DOS нұсқасына жатады, онда файлда қатынасу дескриптор көмегімен жүзеге асады. ASCІІZ - жол форматымен берілген файлды ашу немесе құру нәтижесінде дескриптор немесе файлдың логикалық нөмірі операциялық жүйе арқылы файлға меншіктелінеді.
ASCІІZ-жол - символдық жол, ол екілік нөлмен бітеді. Файл дескрипторы АХ регистріне жазылады және оны жады ұяшығына сақтап қою керек.
Бірінші бес нөмір (0-4) стандартты құрылғыларға меншіктелінеді:
0 - стандарттық енгізу (CON)
1 - стандарттық шығару (CON)
2 - стандарттық қате (CON)
3 - стандарттық көмекші порт (AUX)
4 - стандарттық принтер (PRN)
0 дескрипторын біз пернетақтадан енгізуге қолдануымызға болады, ал 1 немесе 2 дескрипторларын экранға шығару үшін қолдануға болады.
Файлдармен жұмыс кезінде сәтті орындалган операция CF жалауына 0 орнатады. Егер операция орындалмаса, онда CF жалауына 1 орнатылады, ал АХ регистріне қате кодасы қойылады.
Қателер кодтары:
Қате коды |
түсініктемесі |
Қате коды |
түсініктемесі |
01 02 03 04 05 06 07 08 09 |
функция нөмірінің қатесі файл табылмаған қатынау жолы табылмаған өте көп файл ашылған қатынауға рұқсат жоқ файл нөмірінің қатесі жадыны басқару блогы бұзылған жады жетіспейді адрес қатесі
|
10 11 12 13 15 16 17 18 |
жабдықтар қатесі формат қатесі қатынау кодасының қатесі деректердің қатесі дискжетек қатесі каталогты жою әрекеті ол құрылғы емес енді файлдар жоқ
|
3CH пен 5BH функциясы файлды берілген спецификациямен құруға мүмкіндік береді (жол мен файлдың аты ASCІІZ-жол форматында). Бұл функциялардың айырмашылығы:
3CH функциясы бар файлды жояды да және осы атпен жаңа файл құрады, егер 5BH функциясы осындай аты бар файл болса, онда CF=1 болып бітеді.
Мысалы:
; Деректер сегментінде файлдың атын қою және дескрипторға
; ұяшықты резервтеу.
fname DB 'F1.TXT',0
handle DW ?
. . .
MOV AH, 3CH ; құруға сұрату
MOV СХ, 00 ; әдеттегі файл
LEA DX, fname ; файл атының адресі
ІNT 21h
JС ERR ; қате бойынша өту
MOV handle, AX ; дескрипторды сақтау.
Бұл мысалда СХ регистріне файл атрибуты енгізіледі. Келесі атрибуттарды қолдануға болады:
01h - тек оқуға арналған файл
02h - жасырылған файл
04h - жүйелік файл
08h - том белгісі
10h - файл өзімен каталогты көрсетеді
20h - архивтеу атрибуты
3DH - функциясы - бар файлды ашуға мүмкіндігін береді.
Мысалы:
MOV AH, 3DH ; файлды ашу функциясы
MOV AH, 2 ; енгізу - шығару үшін
LEA DX, fname
ІNT 21h
MOV handle, AX
Файлды ашқан кезде AL - регистріне қатынау коды енгізіледі:
0 - файлды оку үшін ғана ашу.
1 - файлға жазу үшін ғана ашу.
2 - енгізу мен шығару үшін файлды ашу.
42h функциясы файлдың кез келген орнына тура қатынауды ұйымдастыру үшін қолданылады. Нұсқағышты файлдың басына (AL=0), ағымдағы орнына (AL=1) және файлдың сонына (AL=2) орнатуға болады. Онда нұсқағыштың ығыстыру мәні CX регистріне (үлкен жартысы) және DX регистріне (кіші жартысы) енгізіледі.
Мысалы:
MOV BX, handle
MOV AH, 42h ; нұсқағышты орнату
MOV AL, 2 ; файлдың соңына
MOV CX, 0
MOV DX, 0
ІNT 21h
3Fh функциясы файлдан немесе құрылғыдан оқуға пайдаланылады. Файлдың соңынан оқуға әрекет жасағанда, AX=0.
Мысалы:
MOV AH, 3Fh ; оқу функциясы
MOV BX, handle ; дескрипторды орнату
MOV CX, 80 ; қанша оқу қажет
LEA DX, buf ; және қайда
ІNT 21h
MOV CX, AX ; факты бойынша қанша оқылды.
40h функциясы файлға немесе құрылғыға жазу үшін пайдаланылады.
Мысалы:
MOV AH, 40h ; жазу функциясы
MOV BX, handle ; дескриптор орнату
MOV CX, 80 ; қанша жазу қажет
LEA DX, buf ; және қайда
ІNT 21h
43h функциясы файлдың атрибутын алу үшін (AL=0), немесе орнату үшін (AL=1) пайдаланылады.
Мысалы:
MOV AH, 43h ;атрибут жұмысының функциясы
MOV AL, 1 ; атрибуттар орнату
MOV CX, 1 ; "оқу үшін ғана"
MOV DX, offset fname ; файл атының адресі
ІNT 21h
56h функциясы файлдың атын өзгерту үшін пайдаланылады.
Мысалы:
; сегменттік регистрді ЕS деректер сегментіне баптау.
PUSH DS
POP ES
; файлдың атын өзгерту
MOV AH, 56h ; ат өзгерту функциясы
MOV DX, offset oldname ; ескі атының адресі
MOV DІ, offset newname ; жаңа атының адресі
ІNT 21h
; деректер сегментіне
oldname db 'F1.TXT',0
nevname db 'NEWF.TXT',0
57h функциясы файлдың құрылған уақытын алу үшін (AL=0) және күнін орнату үшін (AL=1) пайдаланылады.
Уақыт СХ регистріне жазылады, сосын мына формуламен есептелінеді.
CX = сағат * 2048 + минуттар * 32 + секунді / 2
Ал күн болса DX регистріне жазылады және мына формуламен есептелінеді.
DX = (жыл - 1980) * 512 + ай * 32 + күн
Мысалы:
; файлдың құрылған күні мен уақытын өзгерту
MOV AH, 57H ; уақыт / күн функциясы
MOV AL, 1 ; уақытты / күнді орнату
MOV BX, HANDLE ; дескрипторды орнату
MOV CX, 0 ; СХ - тазалау
OR CX, sec ; секундты қосу
OR CX, mіn ; минутты қосу
OR CX, hour ; сағатты қосу
XOR DX, DX ; DX - тазалау
OR DX, day ; күнді қосу
OR DX, mon ; айды қосу
OR DX, year ; жылды қосу
ІNT 21h
; деректер сегментіне
sec dw 6/2 ; 6 секунд
mіn dw 15*32 ; 15 минут
hour dw 16*2048 ; 16 сағат
day dw 25 ; 25 күннің саны
mon dw 3*32 ; наурыз
year dw 15*512 ; 15 жыл (1995-1980)
3EH - функциясы файлды жабу үшін пайдаланылады. Бұл операция каталогты және FAT таблицасын түзету үшін қажет.
Мысалы:
MOV AH, 3EH ; жабу функциясы
MOV BX, handle
ІNT 21h
41h функциясы файлды жою үшін пайдаланылады. (Тек қана «оқу
үшін ғана» деген файл атрибутынан басқа) .
MOV AH, 41h ; жою функциясы
LEA DX, fname ; файл атының адресі
ІNT 21h ; DOS - ті шақыру
Файлмен жұмыс бірнеше кезеңнен тұруы мүмкін:
1) файлды құру және ашу;
2) нұсқағышты орнату;
3) файлдың ұзындығын анықтау;
4) керекті байтты, блокты оқу; байтты, блокты жазу; файл толтыру;
5) файлды жабу;
6) файлды жою.
Программаны өңдеу кезінде кезеңдердің бәрі керек емес және олар басқа ретпен жүруі мүмкін.
Керекті байтты оқыған кезде оның нөмерін немесе мәнін көрсетуге болады.
1-мысал. 10-байтты оқу, оқу үшін файлды ашу.
. . .
; нұсқағышты 10-байтқа орнату
MOV AH, 42h ; нұсқағышты орнату
MOV BX, handle
MOV AL, 0 ; файлдың басына
MOV CX, 0
MOV DX, 10 ; 10-байтқа
ІNT 21h
; керекті байтты оқу
MOV AH, 3Fh
MOV BX, handle
LEA DX, BUF
MOV CX, 1
ІNT 21h
. . .
; деректер сегментіне
BUF db ?
2- мысал. " А " деген символды табу және оның нөмірін анықтау.
; файлды ашу
. . .
; файлдың ұзындығын анықтау
MOV AH, 42h ; нұсқағышты орнату
MOV BX, handle
MOV AL, 2 ; файлдың соңына
MOV CX, 0 ; ығысудың үлкен жартысы
MOV DX, 0 ; ығысудың кіші жартысы
ІNT 21h
MOV FLEN,AX ; файл ұзындығын FLEN ұяшықта ; сақтау
; нұсқағышты файлдың басына орнату
. . .
; файлды BUFІN-ға оқу
. . .
; "А"символды іздеу
CLD ; іздеу солдан оңға жүргізіледі
MOV CX, FLEN ; файлдың ұзындығы
MOV AL, A ; ізделіп отырған символ
LEA DІ, BUFІN ; жол адресі
REPNE SCASB ; іздеу
JNZ M ; символ табылмаса, М-ге өту
DEC DІ ; символ табылды - адресті кішірейту
. . . ; нөмірді экранға шығару
M: . . .
; символ табылмады деген хабарды экранға шығару
; деректерді жабу.
. . .
Негізгі әдебиеттер: 2[131-134,140-150,182-187], 3[85-94, 103-119]
Бақылау сұрақтары:
1. ІNT 21h 1,7,8 функцияларының айырмашылығы қандай?
2. ІNT 21h 0Ah функциясын пайдаланған кезде аралық жадының бірінші және екінші байтына не жазылады?
3. Функциялық пернені басқанда енгізу қалай орындалады?
4. 0 (ІNT 16h) және 7 (ІNT 21h) функцияларының орындалуы қалай ажыратылады?
5. ІNT 21h 0Ah және 3Fh функцияларының айырмашылығы қандай?
6. ІNT 21h 0Ah функциясын пайдаланғаннан кейін деректер аралық жадыда қай байттан басталады?
7. ІNT 21h 0Ah функциясын пайдаланғаннан кейін жолдың соңғы байтының мәні неге тең?
8. Символды экранға шығару функциясы.
9. Символдар жолын экранға шығару функциясы.
10. ІNT 21h 9 және 40h функцияларын орындау кезінде символдар жолының соңын қалай анықтайды?
11. Символды шығару кезінде қандай функциялар курсорды жылжытпайды?
12. Қандай функция дисплейге шығу кезінде атрибут символын ауыстырады?
13. Файл дескрипторы деген не?
14. ASCІІZ - жолы деген не?
15. Стандартты енгізу және стандартты шығару дескрипторлары.
16. Кез келген файлдық операцияның сәтті аяқталғаны қалай анықталады?
17. Файл атрибуттары.
18. Файлды ашқандағы қатынау кодалары.
19. Файл ұзындығын қалай анықтауға болады?
20. Файлды жабу функциясы не істейді?
21. 41h функциясы арқылы қандай файлды жоюға болмайды?
№6 зертханалық жұмыс. Windows-ге арналған графикалық қосымшаны өңдеу
Жұмыстың мақсаты: Win32 ортасында программалаудың негізін оқып үйрену.
Келесі тапсырмаларды орындаңыздар:
1. Негізгі терезе процедурусын оқып үйрену.
2. Хабарламаларды өңдеу циклын оқып үйрену.
3. Программада қолданылатын API-функцияларды оқып үйрену.
4. GetMessageA функциясының параметрлерін өзгерту.
5. CreateWindowExA функциясының параметрлерін өзгерту.
6. WNDPROC терезенің негізгі процедурасын өзгерту.
Зертханалық жұмысты орындау үшін керекті әдістемелік нұсқаулар
Енді нақты бір мысалды өңдеуге кірісейік. Оны мұқият талқылаңыз, ол ары қарайғы программа құрудың негізі болып табылады
Қарапайым программаны қарастырайық, MASM32 кестесінде түрлі кітапханалар бар. Біздің мысалда екеуі қолданылады: user32.lib және Kernel32.lib. Олар includelib директивасы көмегімен қосылады.
Бірінші біз тұрақтылар және сыртқы кітапханалық процедураларды анықтаймыз. Барлық осы анықтауларды MASM32 кестесіндегі Include- файлдарда табамыз. Біз стандартты Include- файлдарды екі себеппен қолданбаймыз: біріншіден, осылай программалау технологиясын түсіну ыңғайлы, екіншіден, MASM-нан ТASM-ға өту жеңіл болады.
Терезе процедурасының жұмысын түсіну өте қажет, өйткені дәл осы Windows-та программалау мәнін анықтайды. Бұл процедураның мақсаты- барлық келетін хабарларға дұрыс жауап беру. Барлық өңделмеген хабарлар Defwindow РrocА фунуциясы көмегімен жүйеге қайтарылуы қажет. Біз төрт хабарды қарастырамыз: WM_CREATE, WM_DESTROY, WM_LBUTTONDOWN, WM_RBUTTONDOWN.
WM_CREATE, WM_DESTROY хабарлары объектті программалауда конструктор және дескриптор қызметін атқарады: олар терезе функциясына терезені құрғанда және жойғанда келеді. Терезенің оң жақ бұрышындағы крешті басса, онда терезе функциясына WM_DESTROY хабары келеді. Одан кейін PostQuitMessage функциясы орындалады және қолданбаға WM_Quit хабары жіберіледі, ол күту циклынан шығуды және ExitProcess функциясын орындайды, ал бұл өз кезегінде жадыдан орындайды, ал бұл өз кезегінде жадыдан қолданбаның жойылуына алып келеді.
_ERR таңбасына көңіл аударыңыз – ол таңбаға ауысу қате болған жағдайда орындалады және мұнда сәйкесінше хабарлама беруге болады.
.386P
.MODEL FLAT, stdcall
; тұрақтылар
; хабарлама терезені жапқан кезде келеді
WM_DESTROY equ 2
; хабарлама терезені құрған кезде келеді
WM_CREATE equ 1
; хабарлама терезе аймағынан маустың сол басқышын басқан кезде келеді
WM_LBUTTONDOWN equ 201h
; хабарлама терезе аймағынан маустың оң басқышын басқан кезде келеді
WM_RBUTTONDOWN equ 204h
; терезе қасиеті
CS_VREDRAW equ 1h
CS_HREDRAW equ 2h
CS_GLOBALCLASS equ 4000h
WS_OVERLAPPEDWINDOW equ 000CF0000H
style equ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
; стандартты иконканың идентификаторы
IDI_APPLICATION equ 32512
; курсор идентификаторы
IDC_CROSS equ 32515
; терезені көрсету режимі – қалыпты
SW_SHOWNORMAL equ 1
; сыртқы процедура прототиптері
EXTERN MessageBoxA: NEAR
EXTERN CreateWindowExA: NEAR
EXTERN DefWindowProcA: NEAR
EXTERN DispatchMessageA: NEAR
EXTERN ExitProcess: NEAR
EXTERN GetMessageA: NEAR
EXTERN GetModuleHandleA: NEAR
EXTERN LoadCursorA: NEAR
EXTERN LoadIconA: NEAR
EXTERN PostQuitMessage: NEAR
EXTERN RegisterClassA: NEAR
EXTERN ShowWindow: NEAR
EXTERN TranslateMessage: NEAR
EXTERN UpdateWindow: NEAR
; кітапхананы қосу үшін жөндеуішке арналған директивалар
includelib c:\win32\tasm32\lib\import32.lib
;-------------------------------------------------------------------------
; құрылымдар
; хабарлама құрылымы
MSGSTRUCT STRUC
MSHWND DD ? ; хабарлама идентификаторы
MSWPARAM DD ? ; хабарлама жайындағы қосымша ақпарат
MSLPARAM DD ? ; хабарлама жайындағы қосымша ақпарат
MSTIME DD ? ; хабарламаның жіберілген уақыты
MSPT DD ? ; хабарламаны жіберген кездегі курсор орны
MSGSTRUCT ENDS
;---------------------------
WNDCLASS STRUC
CLSSTYLE DD ? ; терезе стильі
CLWNDPROC DD ? ;терезенің процедурасының көрсеткіші
CLSCEXTRA DD ? ;берілген құрылымның қосымша байттары жайындағы ақпарат
CLWNDEXTRA DD ? ;терезеге арналған қосымша байттары жайындағы ақпарат
CLSHINSTANCE DD ? ; қосымша дискрипторы
CLSHICON DD ? ;терезе иконкасының идентификаторы
CLSHCURSOR DD ? ;терезе курсорының идентификаторы
CLBKGROUND DD ? ;терезе қаламшасының (кист) идентификаторы
CLMENUNAME DD ? ;менюдің идентификатор-аты
CLNAME DD ? ;терезе класының аты спецификацияланады
WNDCLASS ENDS
; деректер сегменті
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
NEWHWND DD 0
MSG MSGSTRUCT <?>
WC WNDCLASS <?>
HINST DD 0 ;мұнда қосымша дескрипторы сақталады
TITLENAME DB '32-биттік қосымшаның қарапайым мысалы',0
CLASSNAME DB 'CLASS32',0
CAP DB 'хабарлама',0
MES1 DB 'Сіз маустың сол басқышын бастыңыз',0
MES2 DB 'Программадан шығу. Сау бол!',0
_DATA ENDS
; кодтар сегменті
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; қосымшаның дескрипторын алу
PUSH 0
CALL GetModuleHandleA
MOV [HINST],EAX
REG_CLASS:
; терезе құрылымын толтыру
MOV [WC.CLSSTYLE], style
; хабарламаны өңдеу процедурасы
MOV [WC.CLWNDPROC], OFFSET WNDPROC
MOV [WC.CLSCEXTRA], 0
MOV [WC.CLWNDEXTRA], 0
MOV EAX, [HINST]
MOV [WC.CLSHINSTANCE],EAX
;------------------терезе иконкасы
PUSH IDI_APPLICATION
PUSH 0
CALL LoadIconA
MOV [WC.CLSHICON], EAX
;------------------терезе курсоры
PUSH IDC_CROSS
PUSH 0
CALL LoadCursorA
MOV [WC.CLSHCURSOR], EAX
;-------------------
MOV [WC.CLBKGROUND],17 ; терезе түсі
MOV DWORD PTR [WC.CLMENUNAME], 0
MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA
; тіркелген кластағы терезе құру
PUSH 0
PUSH [HINST]
PUSH 0
PUSH 0
PUSH 400 ; DY – терезе биіктігі
PUSH 400 ; DX – терезе ені
PUSH 100 ;Y–жоғарғы сол жақ бұрыш координаттары
PUSH 100 ;X-жоғарғы сол жақ бұрыш координаттары
PUSH WS_OVERLAPPEDWINDOW
PUSH OFFSET TITLENAME ; терезе аты
PUSH OFFSET CLASSNAME ; класс аты
PUSH 0
CALL CreateWindowExA
; қатеге тексеру
CMP EAX, 0
JZ _ERR
MOV [NEWHWND], EAX
PUSH SW_SHOWNORMAL
PUSH [NEWHWND]
CALL ShowWindow ; құрылған терезені көрсету
PUSH [NEWHWND]
CALL UpdateWindow ;WM_PAINT хабарламасы, терезенің көрінетін бөлігін қайта салу командасы
; хабарламаны өңдеу циклы
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA
CMP EAX, 0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage
PUSH OFFSET MSG
CALL DispatchMessageA
JMP MSG_LOOP
END_LOOP:
; программадан шығу (процессті жабу)
PUSH [MSG.MSWPARAM]
CALL ExitProcess
_ERR:
JMP END_LOOP
;----------------------------------------------------------------------------
; терезе процедурасы
; стектегі параметрлердің орналасуы
; [EBP+14H] LPARAM
; [EBP+10H] WPARAM
; [EBP+0CH] MES
; [EBP+8] HWND
WNDPROC PROC
PUSH EBP
MOV EBP, ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH], WM_DESTROY
JE WMDESTROY
CMP DWORD PTR [EBP+0CH], WM_CREATE
JE WMCREATE
CMP DWORD PTR [EBP+0CH], WM_LBUTTONDOWN ;сол басқыш
JE LBUTTON
CMP DWORD PTR [EBP+0CH], WM_RBUTTONDOWN ;оң басқыш
JE RBUTTON
JMP DEFWNDPROC
; оң басқышты басу терезені жабады
RBUTTON:
JMP WMDESTROY
; сол басқышты басу
LBUTTON:
; хабарламаны шығарамыз
PUSH 0 ; MB_OK
PUSH OFFSET CAP
PUSH OFFSET MES1
PUSH DWORD PTR [EBP+08H]
CALL MessageBoxA
MOV EAX, 0
JMP FINISH
WMCREATE:
MOV EAX, 0
JMP FINISH
DEFWNDPROC:
PUSH DWORD PTR [EBP+14H]
PUSH DWORD PTR [EBP+10H]
PUSH DWORD PTR [EBP+0CH]
PUSH DWORD PTR [EBP+08H]
CALL DefWindowProcA
JMP FINISH
WMDESTROY:
PUSH 0 ; MB_OK
PUSH OFFSET CAP
PUSH OFFSET MES2
PUSH DWORD PTR [EBP+08H] ;терезе дескрипторы
CALL MessageBoxA
PUSH 0
CALL PostQuitMessage ;WM_QUIT хабарламасы
MOV EAX, 0
FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
WNDPROC ENDP
_TEXT ENDS
END START
Негізгі әдебиеттер: 2[12-20]; 3[10-43]
Бақылау сұрақтары:
1. Программада қандай API-функциялар қолданылады?
2. Программада қандай құрылымдар қолданылады?
3. Қосымшаның графикалық құрылымы.
4. Хабарламаларды өңдеу циклдері қандай API-функцияларды орындайды?
№7 зертханалық жұмыс. Консольдік қолданба
Жұмыстың мақсаты: Консольді қосымшалар үшін API функцияны қолдану негіздерін үйрену.
Келесі тапсырмаларды орындаңыздар:
1. Консоль терезесінің өлшемін өзгертіңіз.
2. Консоль терезесінің тақырыбын өзгертіңіз.
3. Курсор позициясын өзгертіңіз.
4. Текстің түстік атрибуттарын өзгертіңіз.
5. NUMPAR және GETPAR процедураларының жұмыс алгоритмін түсіндіріңіз.
Зертханалық жұмысты орындау үшін керекті әдістемелік нұсқаулар
Консоль құру үшін AllocConsole функциясын қолданамыз. Программа жұмысын аяқтағаннан кейін консоль автоматты түрде немесе FreeConsole функциясының көмегімен босатылады.
Айта кететін жағдай, бір процестің бір ғана консольі болады, сондықтан программа орындаудың басында FreeConsole функциясын міндетті түрде орындап кету керек.
Консоль буферінен оқу үшін ReadConsole функциясы қолданылады.
Консольда курсор позициясын орналастыру үшін SetConsoleCursorPosition функциясын қолдану керек.
Шығарылатын символдар түсін SetConsoleTextAttribute функциясы көмегімен жасаймыз.
Консоль терезесінің тақырыбын анықтау үшін SetConsoleTitle функциясы қолданылады.
CharToOem функциясы DOS-кодировкадан Windows-кодировкаға ауыстыру үшін қолданылады.
Көптеген консольді функциялар аяқтауды дұрыс орындаса, онда нөлдік мән қайтарылады. Басқа жағдайда, яғни қате болса, EAX регистріне 0 орналастырылады.
Өз консоліңізді құруға мысал 1.
; cons1.asm
.386P
.MODEL FLAT, stdcall
; тұрақтылар
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
; атрибуты цветов
FOREGROUND_BLUE equ 1h ; әріптің көк түсі
FOREGROUND_GREEN equ 2h ; әріптің жасыл түсі
FOREGROUND_RED equ 4h ; әріптің қызыл түсі
FOREGROUND_INTENSITY equ 8h ; жоғарғы интенсивтік
BACKGROUND_BLUE equ 10h ; фонның көк түсі
BACKGROUND_GREEN equ 20h ; фонның жасыл түсі
BACKGROUND_RED equ 40h ; фонның қызыл түсі
BACKGROUND_INTENSITY equ 80h; жоғарғы интенсивтік
COL1 = 2h + 8h ; шығарылатын мәтін түсі
COL2 = 1h + 2h + 8h ; шығарылатын 2-мәтін түсі
; сыртқы процедура прототиптері
EXTERN GetStdHandle: NEAR
EXTERN WriteConsoleA: NEAR
EXTERN SetConsoleCursorPosition: NEAR
EXTERN SetConsoleTitleA: NEAR
EXTERN FreeConsole: NEAR
EXTERN AllocConsole: NEAR
EXTERN CharToOemA: NEAR
EXTERN SetConsoleCursorPosition: NEAR
EXTERN SetConsoleTextAttribute: NEAR
EXTERN ReadConsoleA: NEAR
EXTERN SetConsoleScreenBufferSize: NEAR
EXTERN ExitProcess: NEAR
; кітапхананы қосу үшін жөндеуіш директивалары
includelib c:\win32\work\import32.lib
;----------------------------------------------------------------------------
COOR STRUC
X WORD ?
Y WORD ?
COOR ENDS
; деректер сегменті
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
HANDL DWORD ?
HANDL1 DWORD ?
STR1 DB 'Жолды енгізіңіз: ', 13, 10, 0
STR2 DB 'Консоль жұмысының қарапайым мысалы', 0
BUF DB 200 dup (?)
LENS DD ? ; енгізілген символдар саны
CRD COOR <?>
_DATA ENDS
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; жоды қайта кодтайық
PUSH OFFSET STR1
PUSH OFFSET STR1
CALL CharToOemA
; консоль құрастырушы
; бірінші бар консольды жою керек
CALL FreeConsole
CALL AllocConsole
; HANDL1 енгізуді алу
PUSH STD_INPUT_HANDLE
CALL GetStdHandle
MOV HANDL1, EAX
; HANDL шығаруды алу
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle
MOV HANDL, EAX
; Консоль терезесінің жаңа өлшемін беру
MOV CRD.X, 100
MOV CRD.Y, 25
PUSH CRD
PUSH EAX
CALL SetConsoleScreenBufferSize
; Консоль тақырыбын беру
PUSH OFFSET STR2
CALL SetConsoleTitleA
; Курсор орнын беру
MOV CRD.X, 0
MOV CRD.Y, 10
PUSH CRD
PUSH HANDL
CALL SetConsoleCursorPosition
; Көрінетін текстің түстік атрибутын беру
PUSH COL1
PUSH HANDL
CALL SetConsoleTextAttribute
; жолды шығару
PUSH OFFSET STR1
CALL LENSTR ; EBX жол ұзындығы
PUSH 0
PUSH OFFSET LENS
PUSH EBX
PUSH OFFSET STR1
PUSH HANDL
CALL WriteConsoleA
; енгізілетін жолды күту
PUSH 0
PUSH OFFSET LENS
PUSH 200
PUSH OFFSET BUF
PUSH HANDL1
CALL ReadConsoleA
; алынған жолды шығару
; бірінші көрінетін текстің түстік атрибутын беру
PUSH COL2
PUSH HANDL
CALL SetConsoleTextAttribute
;---------------------------------------------------
PUSH 0
PUSH OFFSET LENS
PUSH [LENS]
PUSH OFFSET BUF
PUSH HANDL
CALL WriteConsoleA
; кішкентай тоқтатым
MOV ECX, 01FFFFFFFh
L1:
LOOP L1
; консольды жабу
CALL FreeConsole
CALL ExitProcess
; жол - [EBP+08h]
; EBX ұзындық
LENSTR PROC
; PUSH EBX
; MOV EBP, ESP
ENTER 0, 0
PUSH EAX
;------------------------------------
CLD
MOV EDI, DWORD PTR [EBP+08h]
MOV EBX, EDI
MOV ECX, 100 ; жолдың ұзындығын шектеу
XOR AL, AL
REPNE SCASB ; 0 символын табу
SUB EDI, EBX ; 0 қосқандағы жол ұзындығы
MOV EBX, EDI
DEC EBX
;
POP EAX
; POP EBP
LEAVE
RET 4
LENSTR ENDP
_TEXT ENDS
END START
Командалық жолмен жұмыс жасау үшін GetCommandLineA АРІ функциясы қолданылады, ол көрсеткішті командалық жолға қайтарады. Бұл функция консольді қосымшалар үшін де, GUI (Graphic Universal Interface) қосымшалары үшін де бірдей жұмыс істейді.
Мысал 2. Командалық жолдың параметрлерін шығаруға программа құру
; cons_2.asm
.386P
.MODEL FLAT, stdcall
; тұрақтылар
STD_OUTPUT_HANDLE equ -11
; сыртқы процедура прототиптері
EXTERN GetStdHandle: NEAR
EXTERN WriteConsoleA: NEAR
EXTERN ExitProcess: NEAR
EXTERN GetCommandLineA: NEAR
; кітапхананы қосу үшін жөндеуіш директивалары
includelib c:\win32\work\import32.lib
; деректер сегменті
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
HANDL DWORD ?
NUM DWORD ?
BUF DB 100 dup (0)
LENS DWORD ? ; енгізілген символдар саны
CNT DWORD ?
_DATA ENDS
; код сегменті
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; HANDLЕ шығаруды алу
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle
MOV HANDL, EAX
; параметрлер санын алу
CALL NUMPAR
MOV NUM, EAX
MOV CNT, 0
;----------------------------------------------
; командалық жолмен параметрлерді шығару
LL1:
MOV EDI, CNT
CMP NUM, EDI
JE LL2
; параметр нөмері
INC EDI
MOV CNT, EDI
; EDI нөмерңмен параметр алу
LEA EBX, BUF
CALL GETPAR
; параметр ұзындығын алу
PUSH OFFSET BUF
CALL LENSTR
; соңында - келесі жолға өту
MOV BYTE PTR [BUF+EBX], 13
MOV BYTE PTR [BUF+EBX+1], 10
MOV BYTE PTR [BUF+EBX+2], 0
ADD EBX, 2
; жолды шығару
PUSH 0
PUSH OFFSET LENS
PUSH EBX
PUSH OFFSET BUF
PUSH HANDL
CALL WriteConsoleA
JMP LL1
LL2:
PUSH 0
CALL ExitProcess
; жол - [EBP+08H]
; ұзындық EBX
LENSTR PROC
PUSH EBX
MOV EBP, ESP
PUSH EAX
;-------------------------------------------
CLD
MOV EDI, DWORD PTR [EBP+08H]
MOV EBX, EDI
MOV ECX, 100 ; жолдың ұзындығын шектеу
XOR AL, AL
REPNE SCASB ; 0 символын табу
SUB EDI, EBX ; 0 қосқандағы жол ұзындығы
MOV EBX, EDI
DEC EBX
;-------------------------------------------
POP EAX
POP EBP
RET 4
LENSTR ENDP
; параметрлер санын анықтау (->EAX)
NUMPAR PROC
LOCALS
CALL GetCommandLineA
MOV ESI, EAX ; жол көрсеткіші
XOR ECX, ECX ; санауыш
MOV EDX, 1 ; қызметі
@@L1:
CMP BYTE PTR [ESI], 0
JE @@L4
CMP BYTE PTR [ESI], 32
JE @@L3
ADD ECX, EDX ; параметр нөмірі
MOV EDX, 0
JMP @@L2
@@L3:
OR EDX, 1
@@L2:
INC ESI
JMP @@L1
@@L4:
MOV EAX, ECX
RET
NUMPAR ENDP
; параметрді алу
; EBX – параметр орналасқан буферді көрсетеді
; буферге соңында 0 бар жол орналастырылады
; EDI - параметр нөмері
GETPAR PROC
LOCALS
CALL GetCommandLineA
MOV ESI, EAX ; жол көрсеткіші
XOR ECX, ECX ; санауыш
MOV EDI, 1 ; қызметі
@@L1:
CMP BYTE PTR [ESI], 0
JE @@L4
CMP BYTE PTR [ESI], 32
JE @@L3
ADD ECX, EDX ; параметр нөмірі
MOV EDX, 0
JMP @@L2
@@L3:
OR EDX, 1
@@L2:
CMP ECX, EDI
JNE @@L5
MOV AL, BYTE PTR [ESI]
MOV BYTE PTR [EBX], AL
INC EBX
@@L5:
INC ESI
JMP @@L1
@@L4:
MOV BYTE PTR [EBX], 0
RET
GETPAR ENDP
_TEXT ENDS
END START
Программаның компиляциясы үшін келесі командалық жолдар қолданылады:
TASM32 /ml prog.asm
TLINK32 /ap pgog.obj
Негізгі әдебиеттер: 2[12-20]; 3[10-43]
Бақылау сұрақтары:
1. GetStdHandle АРІ функциясы қандай аргументтерді қолданады?
2. SetConsoleTextAttribute функциясымен қолданылатын әріптер және символдардың түстерін атаңыз?
3. CharToOem функциясының параметрлерін атаңыз?
4. Операциялық жүйемен қандай жағдай типтері резервтелген?
Әдебиеттер тізімі
1. Юров В., Хорошенко С. Ассемблер. - СПб.: Питер, 1999. – 534 с.
2. Зубков С.В. Assembler для DOS, Windows и Unix. - М.: ДМК, 1999. – 382 с.
3. Пирогов В.Ю. ASSEMBLER. Учебный курс. - М.: Нолидж, 2001. – 434 с.
4. Финогенов К.Г. Самоучитель по системным функциям MS-DOS. - М.: МП "МАЛИП", 1993. – 688 с.
5. Пирогов В.Ю. ASSEMBLER для Windows. - М.: Издатель Молгачева С.В., 2002. – 465 с.
6. Том Сван. Освоение Turbo Assembler. М.: Диалектика, 1996. – 445 с.
7. Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. - М.: ДИАЛОГ-МИФИ, 2001. – 589 с.
8. Скэнлон Л. ПЭВМ IBM PC и XT. Программирование на языке Ассемблера. - М.: Pадио и Связь, 1989. – 687 с.
9. Абель П. Язык Ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992. - 456 с.
10. Брэдли Л. Программирование на языке Ассемблера для персональных ЭВМ IBM. М.: Радио и Связь, 1988. – 856 с.
11. Нортон П., Соухэ Д. Язык Ассемблера для IBM РС. Пер. с англ., - М.: Компьютер, 1993. - 931 с.
12. Hортон П. ПК фирмы IBM и OS MS-DOS. - М.: Радио и Связь, 1991. – 651 с.
Мазмұны
№1 зертханалық жұмыс. Қарапайым есептерді орындау
№2 зертханалық жұмыс. Қарапайым деректер типінің түсінігі. Turbo Debugger (td) жөндегіші
№3 зертханалық жұмыс. Программаға басқаруды беру
№4 зертханалық жұмыс. Процессор командаларының әртүрлі топтарын қолдана отырып программаларды өңдеу
№5 зертханалық жұмыс. Қолданбалы программада жүйелік функцияларды қолдану
№6 зертханалық жұмыс. Windows-ге арналған графикалық қосымшаны өңдеу