Другое: Всякие мелочи
Описание
Характеристики учебной работы
Список файлов
- Всякие мелочи
- ASCII.GIF 21,96 Kb
- Assume.txt 6,75 Kb
- FAQ.txt 28,79 Kb
- [2009] Большаков С.А. - Методическое пособие по выполнению ЛР по СП.pdf 2,02 Mb
- [СП] Директивы.doc 41,5 Kb
- [СП] Загрузка и выполнение программ в DOS.doc 71 Kb
- [СП] Записи.doc 35,5 Kb
- [СП] Сегментная структура программ.doc 57 Kb
- [СП] Справочник команд.doc 78,5 Kb
- Взаимодействие команд с флагами EFLAGS.mht 34,3 Kb
- Возврат из процедур.txt 430 b
- Вывод строки через 21h и 10h.asm 1,6 Kb
- Вывод шестнадцатеричного в десятичной.asm 2,44 Kb
- Использование XLAT для перевода числа из DEC в HEX.asm 1,41 Kb
- Макросредства Ассемблера.mht 73,67 Kb
- Массив из 28 букв алфавита.asm 1,57 Kb
- Низкоуровневое программирование для дZенствующих - Введение в машинный код.mht 225,43 Kb
- Параметры командной строки в PSP.JPG 161,4 Kb
- Регистр.htm 2,89 Kb
- Регистры процессора.PNG 50,07 Kb
- Урок bat-аники.mht 188,92 Kb
- Условные переходы.PNG 59,34 Kb
Распознанный текст из изображения:
б б 55 65 56 69 б
аб
о
с
оо
а
1
с
6
15
Е
а о 55 'о
а 55 о
61
6
6 (
(
ео
г
66
а
61
65 6
5
в
66
о
55
56
5
55
О
ЕО
Е
16
9
(
с
65 (
Директива ASSUME указывает Турбо Ассемблеру, что в значение
какого сегмента установлен данный сегментный регистр. Директиву
ASSUME CS: требуется указывать в каждой программе, в которой ис-
пользуются стандартные сегментные директивы, так как Турбо Ас-
семблеру необходимо знать о сегменте кода для того, чтобы устано-
вить выполняемую программу. Кроме того, обычно используются
директивы ASSUME DS: и ASSUME ES:, благодаря которым Турбо Ас-
семблер знает, к каким ячейкам памяти вы можете адресоваться в
данный момент.
Директива ASSUME позволяет Турбо Ассемблеру проверить допус-
тимость каждого обращения к именованной ячейке памяти с учетом
значения текущего сегментного регистра. Рассмотрим следующий при-
мер:
.
.
.
Data1 SEGMENT WORD 'DATA'
Var1 DW 0
Data1 ENDS
.
.
.
Data2 SEGMENT WORD 'DATA'
Var2 DW 0
Data2 ENDS
Code SEGMENT WORD 'CODE'
ASSUME CS:Code
ProgramStart:
mov ax,Data1
mov ds,ax ; установить DS в Data1
ASSUME DS:Data1
mov ax,[Var2] ; попытаться загрузить Var2 в AX
; это приведет к ошибке, так как
; Var2 недоступна в сегменте
; Data1
.
.
.
mov ah,4ch ; номер функции DOS для
; завершения программы
int 21h ; завершить программу
Code ENDS
END ProgramStart
Турбо Ассемблер отмечает в данной программе ошибку, так как
в ней делается попытка получить доступ к переменной памяти Var2,
когда регистр DS установлен в значение сегмента Data1 (к Var2
нельзя адресоваться, пока DS не будет установлен в значение сег-
мента Data2).
Важно понимать, что Ассемблер на самом деле не знает, что
регистр DS установлен в значение Data1. С помощью директивы
ASSUME вы указали Турбо Ассемблеру, что нужно сделать такое допу-
щение. Директива ASSUME дает вам способ в любой момент сообщить
Ассемблеру о значении сегментного регистра, после чего Турбо Ас-
семблер будет сообщать вам, если вы пытаетесь сделать невозмож-
ное.
Однако Турбо Ассемблер не может перехватывать все подобные
ошибки. Когда в ссылке на память используется именованная пере-
менная памяти (такая, как Var1 и Var2 в предыдущем примере), Тур-
бо Ассемблер может проверить допустимость этой ссылки, так как
каждая именованная переменная памяти явным образом связана с сег-
ментом. Невозможно сообщить Турбо Ассемблеру, к какому сегменту
пытается обратиться инструкция:
mov al,[bx]
В этом случае Турбо Ассемблер должен предположить, что зна-
чение сегментного регистра DS соответствует тому сегменту, к ко-
торому вы хотите обратиться.
Если в данный момент сегментный регистр не указывает ни на
какой именованный сегмент, то чтобы сообщить об этом Ассемблеру,
можно использовать в директиве ASSUME ключевое слово NOTHING.
Например:
.
.
.
mov ax,0b800h
mov ds,ax
ASSUME ds:NOTHING
.
.
.
Здесь регистр DS устанавливается таким образом, чтобы указы-
вать на цветной графический экран, а затем Турбо Ассемблеру сооб-
щается, что регистр DS не указывает ни на какой именованный сег-
мент. Вот еще один способ ссылки на цветной графический экран:
.
.
.
ColorTextSeg SEGMENT AT 0B8000h
ColorTextMemory LABEL BYTE
ColorTextSeg ENDS
.
.
.
mov ax,ColorTextSeg
mov ds,ax
ASSUME ds:ColorTextSeg
.
.
.
Обратите внимание, что в директиве AT, которая следует за
директивой SEGMENT, задается явный начальный адрес сегмента.
Сделаем последнее замечание по директиве ASSUME: в некоторых
случаях она может привести к тому, что Турбо Ассемблер будет ис-
пользовать для доступа к памяти не тот сегментный регистр, кото-
рый вы ожидаете, а другой. Рассмотрим, например, следующий фраг-
мент программы:
.
.
.
Data1 SEGMENT WORD 'DATA'
Var1 DW 0
Data1 ENDS
Data2 SEGMENT WORD 'DATA'
Var2 DW 0
Data2 ENDS
Code SEGMENT WORD 'CODE'
ASSUME CS:Code
ProgramStart:
mov ax,Data1
mov ds,ax ; установить DS в Data1
ASSUME DS:Data1
mov ax,Data2
mov es,ax ; установить ES в Data2
ASSUME ES:Data2
mov ax,[Var2] ; загрузить Var2 в AX -
; Турбо Ассемблер укажет
; процессору 8086, что
; загрузку нужно выполнять
; относительно ES, так как
; к Var2 нельзя получить
; доступ относительно DS
.
.
.
mov ah,4ch ; функция DOS завершения
; работы программы
int 21h ; завершить программу
Code ENDS
END ProgramStart
Данный пример должен быть вам знаком: это модифицированная
версия фрагмента программы, использованного нами ранее для того,
чтобы показать, как директива ASSUME позволяет Турбо Ассемблеру
указать вам, когда вы пытаетесь использовать недопустимую ссылку
на память. Однако в данном примере сообщение об ошибке не выво-
дится. Но это не означает, что Турбо Ассемблер позволяет вам сде-
лать ошибку. Он модифицирует инструкцию:
mov ax,[Var2]
для доступа к Var2 относительно сегментного регистра ES, а не
сегментного регистра DS.
Это происходит по следующим причинам. Две директивы ASSUME
информируют Турбо Ассемблер о том, что регистр DS установлен в
значение сегмента Data1, а ES установлен в значение сегмента
Data2. Турбо Ассемблер совершенно правильно заключает, что к Var2
нельзя получить доступ относительно регистра DS, однако Var2 дос-
тупно относительно сегментного регистра ES. В итоге Турбо Ассем-
блер включает перед инструкцией MOV специальный код (префикс пе-
реопределения сегмента), чтобы указать процессору 8086, что вмес-
то сегментного регистра DS нужно использовать сегментный регистр
ES.
Какое все это имеет для вас значение? Это значит, что если
вы корректно используете директивы ASSUME, позволяя Турбо Ассем-
блеру узнать о текущих установленных для регистров DS и ES значе-
ниях, то он может автоматически вам помочь, проверяя возможность
доступа к именованным переменным в памяти и в некоторых случаях
даже может выполнить автоматическую корректировку сегмента
RU.ASM.CHAINIK FAQ
ðåäàêöèÿ îò 14.01.2004
Äàííûé FAQ ïîñòèòñÿ ðàç â íåäåëþ â ýõîêîíôåðåíöèþ RU.ASM.CHAINIK
Åãî âñåãäà ìîæíî âçÿòü íà faqserver'å ïî
àäðåñó 2:5058/96.111, òîïèê 'asmfaq'.
---------------------------------------- ----------------------------------------
Ñîäåðæàíèå:
1. Ïîêàæèòå ìàëåíüêóþ ïðîãðàììêó òèïà 'Hello, world!'
2. À êàê åå çàïóñòèòü (ñëèíêîâàòü, àñññåìáëèðîâàòü)?
3. À ãäå ìîæíî âçÿòü tasm è tlink?
4. ×òî òàêîå PSP?
5. Ãäå õðàíèòñÿ êîìàíäíàÿ ñòðîêà è êàê åå ïîëó÷èòü?
6. Êàê óçíàòü ïîëíûé ïóòü ê çàïóùåííîé ïpîãpàììå èç íåå ñàìîé?
7. ×òî òàêîå ïðåðûâàíèå è êàê îíî ðàáîòàåò?
8. ×òî òàêîå âåêòîð ïðåðûâàíèÿ?
9. À êàê ìîæíî ñãåíåðèðîâàòü çâóê?
10. ×òî ëó÷øå - ñòàíäàðòíûå èëè óïðîùåííûå äèðåêòèâû îïðåäåëåíèÿ ñåãìåíòîâ?
11. Äëÿ ÷åãî íóæíà êîìàíäà LEA. Òî æå ñàìîå ìîæåò è OFFSET, äà è Tasm
çàìåíÿåò LEA íà MOV...OFFSET.
12. Îòêóäà ïðîãðàììà óçíàåò àäðåñ ñåãìåíòà? Ïîñëå êîìïèëÿöèè ñòîèò mov ax,1.
13. Êàê ñäåëàòü COM ñ îòëàäî÷íîé èíôîðìàöèåé, ïîíèìàåìîé TD ?
14. Íå ïîëó÷àåòñÿ! COM åñòü, TDS åñòü, à TD îòëàäî÷íóþ èíôîðìàöèþ íå
âèäèò: "Program has no symbol table"
15. Êàê ðàñ÷èòàòü êîëè÷åñòâî ïàìÿòè, íåîáõîäèìîå äëÿ ðåçèäåíòà?
16. Íå ìîãó çàïóñòèòü äî÷åðíþþ çàäà÷ó ôóíêöèåé 4Bh
17. Íå âûäåëÿåòñÿ ïàìÿòü ïî ôóíêöèè 48h
18. Äà âðîäå âñå åñòü, ïî÷åìó íå âûäåëÿåò-òî?
19. Êàê ñæàòü áëîê ïàìÿòè, çàíèìàåìûé ïðîãðàììîé?
20. À ÷òî çà êîìàíäà òàêàÿ rdtsc?
21. È åùå, ðàññêàæèòå ðóññêèì ÿçûêîì, ÷òî òàêîå ðåêóðñèÿ (íèêîãäà íå
ñòàëêèâàëñÿ!)?
22. Ðàññêàæèòå ïðî ñîïðîöåññîð, êàê åãî èñïîëüçîâàòü?
23. ×òî äåëàòü, åñëè "Relative jump out of range"?
24. (À êàêèå-íèáóäü ññûëêè â èíòåðíåòå?) -> ñìîòðèòå â êîíöå ôàêà
25. À ÷òî òàêîå CMOS è êàê ñ íåé ðàáîòàòü?
26. ×òî äåëàòü, åñëè ìåòêè îäèíàêîâûå?
27. Êàê âûâåñòè ÷èñëî â øåñòíàäöàòåðè÷íîì âèäå?
28. Êàê ñëèíêîâàòü äðàéâåð óñòðîéñòâà?
29. Ïî÷åìó ïðîãðàììà â îòëàä÷èêå ðàáîòàåò, à áåç îòëàä÷èêà - íåò?
30. À êàê ïîä Windows íà àññåìáëåðå ïèñàòü?
last. À êàê ýòî ... ñäåëàòü?
---------------------------------------- ------------------------------------
Q1: Ïîêàæèòå ìàëåíüêóþ ïðîãðàììêó òèïà 'Hello, world!'
A: Âîò ïðèìåð: Ñëèíêîâàòü â com ôàéë (ÿ áû âàì ïîêà âîîáùå íå ðåêîìåíäîâàë
èñïîëüçîâàòü EXE).
..model tiny ; ìîäåëü ïàìÿòè - äåëàåì com-ôàéë
..code ; ñåãìåíò êîäà èëè ïpîñòî - êîä
..startup ; ñòàpòîâàÿ òî÷êà ïpîãpàììû
mov ah,09 ; ôyíêöèÿ N9 - âûâîä òåêñòà íà ýêpàí
mov dx,offset msg ; â dx çàíîñèì àäpåñ ñîîáùåíèÿ msg
int 21h ; âûçîâ òàê íàçûâàåìîãî Ñåpâèñà Äîñà
; (â ah äëÿ íåãî íîìåp ôyíêöèè)
ret ; â ÑÎÌ-ôàéëå òàê ìîæíî çàâåpøàòü ïpîãpàììó
; â ÅÕÅ - íåìíîãî ñëîæíåå...
msg db 'Hello, world! $' ; ñîîáùåíèå (äîëæíî îêàí÷èâàòüñÿ íà '$')
end ; êîíåö ôàéëà
---------------------------------------- ------------------------------------
Q2: À êàê åå çàïóñòèòü (ñëèíêîâàòü, àñññåìáëèðîâàòü)?
A: Âîò òàê:
tasm hello.asm
tlink /t hello.obj
---------------------------------------- ------------------------------------
Q3: À ãäå ìîæíî âçÿòü tasm è tlink?
A: Îíè âîîáùå-òî íå freeware, íî åñëè î÷åíü íàäî :)
(http://zigar.narod.ru/faq/minimum.zip)
A2: Íà ôàêñåðâåðå 2:5058/96.111, ïîä èìåíåì tasm. (~250 Kb UUE)
---------------------------------------- ------------------------------------
Q4: ×òî òàêîå PSP?
A: PSP - ñòðóêòóðà, ôîðìèðóåìàÿ äëÿ êàæäîé çàïóùåííîé ïðîãðàììû,
ñîäåðæàùàÿ ìíîæåñòâî ïîëåçíîé èíôîðìàöèþ, â ÷àñòíîñòè, êîìàíäíóþ ñòðîêó
è åå äëèíó. Ïpè çàïóñêå ïpîãpàììû (êàê ÑÎÌ, òàê è ÅÕÅ) ds è es ñîäåpæàò
ñåãìåíòíûé àäpåñ PSP. Äëÿ COM-ôàéëîâ îí ðàâåí åùå è cs.
---------------------------------------- ------------------------------------
Q5: Ãäå õðàíèòñÿ êîìàíäíàÿ ñòðîêà è êàê åå ïîëó÷èòü?
A: Êîìàíäíàÿ ñòðîêà (àðãóìåíòû, ïåðåäàâàåìûå çàïóñêàåìîé ïðîãðàììå
÷åðåç êîìàíäíóþ ñòðîêó DOS (DOS-prompt) è óêàçûâàåìûå ïîñëå èìåíè
ïðîãðàììû) õðàíÿòñÿ ïî àäðåñó PSP:[80h] â ôîðìàòå pascal-ñòðîêè.
Ïðèìåð:
C:\DOS> format a:/u/t:80/n:9
Êîìàíäíàÿ ñòðîêà " a:/u/t:80/n:9", ïåðåäàííàÿ ïðîãðàììå format, áóäåò
õðàíèòñÿ ïî óêàçàííîìó àäðåñó â ñëåäóþùåì âèäå:
db 0Eh," a:/u/t:80/n:9"
+=[x]=Dump============================== ===
| ds:0080 0E 20 61 3A 2F 75 2F 74 . a:/u/t
| ds:0088 3A 38 30 2F 6E 3A 39 0D :80/n:9
---------------------------------------- ------------------------------------
Q6: Êàê óçíàòü ïîëíûé ïóòü ê çàïóùåííîé ïpîãpàììå èç íåå ñàìîé?
A:
mov ax,1203h
int 2Fh ;ïîëó÷èì ñåãìåíò äàííûõ DOS
mov ax,ds
lds si,ds:[bp-1Ah] ;â ds:si - óêàçàòåëü íà ïîëíûé ïóòü
---------------------------------------- ------------------------------------
Q7: ×òî òàêîå ïðåðûâàíèå è êàê îíî ðàáîòàåò?
A: Ïðåðûâàíèå - ýòî èìåííî ïðåðûâàíèå ïðîãðàììû äëÿ âûïîëíåíèÿ
êàêîé-ëèáî äðóãîé ðàáîòû.
Íåîáõîäèìî pàçëè÷àòü ïpîãpàììíûå è àïïàpàòíûå ïpåpûâàíèÿ.
Àïïàpàòíûå ãåíåpÿòñÿ óñòpîéñòâàìè, à ïpîãpàììíûå âûçûâàþòñÿ ñàìîé
ïpîãpàììîé è ÿâëÿþòñÿ ôàêòè÷åñêè àíàëîãàìè âûçîâà ïîäïpîãpàìì, âûçîâàìè
ñèñòåìíûõ ôóíêöèé DOS, íàïpèìåp. Àïïàðàòíûå ïðåðûâàíèÿ ïðåðûâàþò
ïðîãðàììó â íåîáõîäèìûé ìîìåíò, íàïðèìåð, ïî ïðèõîäó áàéòà îò ìîäåìà, ïî
äâèæåíèþ ìûøè è ò.ï.
Ñìîòðèòå ïåðâûé ïðèìåð 'Hello, world!', òàì èñïîëüçóåòñÿ int 21h -
ïðåðûâàíèå íîìåð 21h, êîòîðîå îòâå÷àåò çà ôóíêöèè ÄÎÑ.  ah ó íàñ áûëî
09h - ýòî ôóíêöèÿ âûâîäà òåêñòà íà ýêðàí, íà÷èíàÿ ñ àäðåñà ds:dx.
---------------------------------------- -----------------------------------
Q8: ×òî òàêîå âåêòîð ïðåðûâàíèÿ?
A: Ýòî àäðåñ, ïî êîòîðîìó áóäåò ñäåëàí ïåðåõîä â ñëó÷àå âûçîâà
ñîîòâåñòâóþùåãî ïðåðûâàíèÿ. Íàïðèìåð, â ñëó÷àå, åñëè â ïðîãðàììå ñòîèò
'INT 21h', àäðåñ ïåðåõîäà áåðåòñÿ èç ÿ÷åéêè ïî àäðåñó 0000:21h*4 (ïî 4
áàéòà íà îäèí âåêòîð ïðåðûâàíèÿ).
---------------------------------------- ------------------------------------
Q9: À êàê ìîæíî ñãåíåðèðîâàòü çâóê?
A: Âîò òàê:
;
; ïîäïðîãðàììà ãåíåðàöèè çâóêà
; Âõîä: ÀX= ÷àñòîòà çâóêà â Ãö
;
Sound proc near
push ax ;ñîõðàíèòü ðåãèñòðû
push bx
push dx
mov bx,ax ;÷àñòîòà
mov ax,34DDh
mov dx,12h ;(dx,ax)=1193181
cmp dx,bx ;åñëè bx < 18Ãö, òî âûõîä
jnb Done ;÷òîáû èçáåæàòü ïåðåïîëíåíèÿ
div bx ;ax=(dx,ax)/bx
mov bx,ax ;ñ÷åò÷èê òàéìåðà
in al,61h ;ïîðò ÐÂ
or al,3 ;óñòàíîâèòü áèòû 0-1
out 61h,al
mov al,00001011b ;óïðàâëÿþùåå ñëîâî òàéìåðà:
;êàíàë 2, ðåæèì 3, äâîè÷íîå ñëîâî
mov dx,43h
out dx,al ;âûâîä â ðåãèñòð ðåæèìà
dec dx
mov al,bl
RET достает из стека только смещение для возврата; процедура должна находится в том же сегменте, из которого ее вызывают (ближняя процедура - NEAR (по умолчанию));
RETF достает из стека сегмент и смещение; процедура может находится в любом сегменте, независимо от того, откуда ее вызывают (дальняя процедура - FAR или DWORD PTR);
IRET достает из стека сегмент, смещение и адрес флагов. Используется для выхода из прерываний.
Распознанный текст из изображения:
Прй
Р Р ' д Р
1рдрбр
\ 1 р '1 р цр р д Сй рб
Фй П рцр
Р Ф
1 р р р р
тбсомс А
П 'БРБСОЫСА' « » р СА Р р д р р рд ф БР5СОМВд» р р БРБСОМ РЗ
»ф д С«д АК р р р РП
3» Р 'К б;р р д р Р,д, Ф,р РБР, „БОЬРБР „рд „р
Р й Р' ф ПР Р. Р «Р Ф» «10066ОКО!ООМ ВОЬ«
р р «й р . ПРАЬ 1 РЗ Р 1 1 1 1 ЬМ 'ЗК « "ПР Р Р Р р ПОБ, 7 р ЗВ ф
3 * Р Пр Р й БОЬ,, р д й р Е ФМ„,, р П б р
БМ бгд р 7
3 рйбМ р рб 620ЫЗ
опьб д "пд 3
моь
681Ь
+вгь
"пр б Поь=згг
пр р.
с опь 6133
р р гбтБ СОМ бр
ЗР5 сОмс и
Г д д БОЬбгд «д
6878
+вгь
681Ь
ЗВОЬ
пры Поь = мг
136 ЗАЬ 206 11Ь ЗАЬ
С ОПЬ 6133
ор дзьзАЗ 20811ьздь Абсп 'с и'6 ' р 6 3
Ъ» 066 7 ПОБ рб р М др 781Ь «й р
Распознанный текст из изображения:
Знаковые команды
!б Оитр !! дгеагег — переход, если больше)
!де фнпр Кбгеагег ог ег!па! переход, если больше или равно)
!! фнпр 11'1еао — переход, если меньше)
)1е ашир !!'1еаа ог ег!па! — переход, если меньше или равно)
1па Ошпр 1!'по! нгеагег — переход, если не больше)
)пне ~шпр 1!'по! агеаГег ог сапа! — переход, если не больше и не равно)
ш! Ошпр 1!'пог 1еаа — переход, если не меньше)
!п1е фнпр !! по! 1еаз ог ег!иа! — переход, если не меньше и не равно)
Беззнаковые команды
)а Ошпр !ГаЬоче — переход, если выше)
)ае Ошпр К аЬоче ог ег!па! — переход, если выше или равно)
1Ь !!шпр 1ГЬе!очч — переход, если ниже)
)Ье Яшар 11'Ье1очч ог ег!иа! — переход, если ниже или равно)
!па фнпр !1 по! аЬоче — переход, если не выше)
)пас ~1шпр 1! пог аЬоче ог сапа! — переход, если не выше и не равно)
)пЬ (~шпр 1Г по! Ье1очч — переход, если не ниже)
Примеры команд, нечувствительных к знаку числа
1е ()шпр К ецио! — переход, если равно)
1пе 1!шпр 11 по! ег!иа! — переход, если не равно)
)с фнпр 1Г сазту — переход, если флаг Сг установлен)
1схг фапр 11СХ=0 — переход, если СХ=О)
Начать зарабатывать