Жанр: Учеба

Справочник программиста на IBM PC

сторінка №39

вают входными регистрами. Снова и снова Вы будете встречать
слова "при входе BX должен содержать ...", описывающие спецификацию
входных регистров. Аналогично, при возврате из прерывания
некоторые регистры возвращают значения или статусную информацию.
Они называются выходными регистрами и мы описываем их словами
"при выходе AX содержит ...". Зачастую одно прерывание содержит
много функций. В частности, операционная система впихнула практически
все свои возможности в прерывание 21H. Поэтому при вызове
прерывания необходимо указывать номер функции. Все прерывания
(как BIOS так и DOS) передают номер функции в AH (иногда в AL
содержится номер подфункции).
Все сказанное в основном служит только чтобы дать первое
представление о предмете. Но если Вы будете внимательно просматривать
простейшие примеры, содержащиеся в этой книге, то Вы поймете
стоящую за ними логику. Язык ассемблера имеет репутацию
трудного языка. Но то, что Вы только что прочитали - настоящая
чепуха. Имеется достаточно сложностей и в языках высокого уровня.
И если ошибки в ассемблерной программе бывает очень сложно обнаружить,
то в основном это связано с тем, что сам текст программы
намного длиннее, чем эквивалентный текст на языке высокого уровня
(однако ассемблерный код намного плотнее). В настоящее время
многие профессионалы пишут программы на языке C, затем анализируют
эффективность и переписывают критические кусочки программы,
которые расходуют много времени, на языке ассемблера. Невозможность
написания таких ассемблерных процедур может иногда свести
усилия программиста к нулю. Поэтому найдите хороший букварь по
ассемблеру и приступайте! Возможно самой большой наградой для Вас
станет момент, когда Вы наконец действительно станете понимать
как же работает компьютер.
Приложение Г. Включение ассемблерных процедур в программы на
Бейсике.

Процедуры на языке ассемблера состоят из строк байтов машинного
кода. При выполнении этой процедуры Бейсик передает управление
из последовательности инструкций, составляющих программу на Бейсике,
в то место, где хранятся инструкции, которые могут быть
декодированы в последовательность инструкций языка ассемблера.
При завершении ассемблерной процедуры управление возвращается в
то место бейсиковской программы, откуда была вызвана процедура.
В этой книге ассемблерные процедуры, используемые в программах
на Бейсике, приведены в двух видах. В обоих видах процедуры включены
в программу, а не хранятся в виде отдельного дискового файла.
При первом способе требуется, чтобы коды процедуры находились
в отдельном месте в памяти, а при втором, менее принятом, этого
не требуется.
В первом способе процедура помещается в операторы DATA и программа
пересылается в неиспользуемую часть памяти, а затем вызывается
оператором CALL. Надо позаботиться о том, чтобы код процедуры
не накладывался на какие-либо данные и наоборот. Обычное
решение этой проблемы состоит в том, что процедура помещается в
те адреса памяти, к которым Бейсик не может получить доступ.
Поскольку интерпретатор Бейсика не может иметь доступ за пределы
64K, то для системы, скажем, с памятью 256K, нужно поместить
процедуру в старшие 64K. Для систем с памятью 128K Вы должны
вычислить сколько памяти требуется операционной системе, Бейсику
и драйверам устройств. Допустимо, чтобы они занимали 25K плюс
64K, используемых Бейсиком. В системах с 64K используйте при
старте команду CLEAR, которая ограничивает объем памяти доступный
для Бейсика. CLEAR,n ограничивает Бейсик n байтами. Затем поместите
процедуру в самые верхние адреса памяти.
Для указания начала области, куда будет помещена процедура,
используйте оператор DEF SEG, а затем с помощью оператора READ
считываются байты процедуры и помещаются в память до тех пор,
пока вся процедура не будет помещена на место. Например:

100 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx '10-байтная процедура
110 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx
300 '''помещаем процедуру в память
310 DEF SEG = &H3000 'указываем на область памяти
320 FOR N = 0 TO 9 'для каждого из 10 байтов
330 READ Q 'читаем байт данных
340 POKE N,Q 'помещаем его в память
350 NEXT

После того как процедура загружена в память и Вы хотите ее
использовать, необходимо чтобы последний оператор DEF SEG указывал
на начало процедуры. Затем присвойте целой переменной значение
0 и напишите оператор CALL с именем этой переменной. Если
процедуре передаются параметры, то они должны быть указаны в
скобках в конце оператора CALL. Например:

500 DEF SEG = &H3000 'указываем на начало процедуры
510 DOGS = 12 'у нее 3 параметра
520 CATS = 44 '
530 POSSUMS = 1 '
540 CASUALTIES = 0 'начинаем выполнение с 1-го байта
550 CALL CASUALTIES(DOGS,CATS,POSSUMS) 'выполняем процедуру
Имеется намного более простой и экономичный способ создания
ассемблерных процедур, который избегает проблемы распределения
памяти. Надо просто создать процедуру в виде строковой переменной
внутри программы. Каждый байт может быть закодирован с помощью
CHR$. Затем используйте функцию VARPTR для определения положения
этой строки в памяти. Смещение по которому находится эта переменная
хранится в двух байтах, которые идут за тем, на который укажет
VARPTR (в первом байте содержится длина строки). Затем этот
адрес используется для вызова процедуры. Отметим способ, которым
используется оператор DEF SEG, для указания на сегмент данных
Бейсика, с тем чтобы полученное смещение указывало на адрес строки
для оператора CALL. Например:

100 DEF SEG 'устанавливаем сегмент на данные Бейсика
110 X$ = "CHR$(B4)+..." 'код процедуры
120 Y = VARPTR(X$) 'получаем дескриптор строки
130 Z = PEEK(Y+1)+PEEK(Y+2)*256 'вычисляем ее адрес
140 CALL Z

Многие значения, выражаемые через CHR$() могут быть представлены
и в виде символов ASCII. Вы можете писать ROUT = CHR$(12) + "AB"
вместо ROUT = CHR$(12) + CHR$(65) + CHR$(66). На самом деле большинство
символов ASCII могут вводиться путем нажатия клавиши Alt,
наборе номера кода на дополнительной клавиатуре, а затем отпускания
клавиши Alt. Однако коды от 0 до 31 не могут быть введены
таким образом для наших целей.
Приложение Д. Использование драйвера устройства ANSI.SYS.

ANSI.SYS это небольшая программа, входящая в состав операционной
системы, которая может быть загружена в память, с тем чтобы
увеличить возможности MS DOS. Она не сделана частью COMMAND.COM с
целью экономия памяти, когда она не используется. Средства, предоставляемые
ANSI.SYS, могут быть использованы для удобства программирования,
но они могут также служить средством достижения
некоторой программной совместимости с не IBM-овскими машинами,
использующими MS DOS. Этот драйвер не предоставляет никаких добавочных
возможностей, которых нельзя было бы добиться другим образом,
но он делает некоторые возможности управления клавиатурой и
терминалом намного более простыми (и обычно более медленно). Все
свойства драйвера ANSI.SYS описаны в этой книге под соответствующим
заголовком.
ANSI.SYS может быть загружен только во время загрузки операционной
системы. Начиная с версии 2.0 система автоматически ищет
файл CONFIG.SYS, так же как и файл AUTOEXEC.BAT. Файл CONFIG.SYS
содержит различные параметры, такие как число создаваемых буферов
для файлов. Но он содержит также и имена тех драйверов устройств,
которые должны быть загружены и включены в COMMAND.COM. ANSI.SYS
как раз и является таким драйвером. Надо просто включить в этот
файл строку DEVICE = ANSI.SYS. Она может быть единственной строкой
в файле. Для создания этого файла можно воспользоваться командой
COPY. Надо просто ввести с терминала такие строки:

COPY CON: CONFIG.SYS "CR"
DEVICE = ANSI.SYS "CR"
"F6" "CR"

Нажатие клавиши F6 записывает символ Ctrl-Z (ASCII 26), отмечающий
конец файла.
Приложение Е. Набор инструкций микропроцессора 8088.

Число тактов, которое надо добавить для вычисления эффективного
адреса следующее:

компоненты адреса операнды такты

(а) база или индекс [BX],[BP],[DI],[SI] 5
(б) смещение метка или смещение 6
(в) база + индекс [BX][SI], [BX][DI] 7
[BP][SI], [BP][DI] 8
(г) смещение + база или индекс [BX],[BP],[DI],[SI] + смещ. 9
(д) смещение + база + индекс [BX][SI],[BX][DI] + смещ. 11
[BP][SI],[BP][DI] + смещ. 12

Необходимо добавить также 2 такта при пересечении сегмента. Вот
времена инструкций:

инструкция такты байты

AAA 4 1
AAD 60 2
AAM 83 1
AAS 4 1
ADC регистр, регистр 3 2
ADC регистр, память 9(13) + EA 2-4
ADC память, регистр 16(24) + EA 2-4
ADC регистр, значение 4 3-4
ADC память, значение 17(25) + EA 3-6
ADC аккумулятор, значение 4 2-3
ADD регистр, регистр 3 2
ADD регистр, память 9(13) + EA 2-4
ADD память, регистр 16(24) + EA 2-4
ADD регистр, значение 4 3-4
ADD память, значение 17(25) + EA 3-6
ADD аккумулятор, значение 4 2-3
AND регистр, регистр 3 2
AND регистр, память 9(13) + EA 2-4
AND память, регистр 16(24) + EA 2-4
AND регистр, значение 4 3-4
AND память, значение 17(25) + EA 3-6
AND аккумулятор, значение 4 2-3
CALL близкая процедура 23 3
CALL далекая процедура 36 5
CALL словный указатель в памяти 29 + EA 2-4
CALL словный регистр указатель 24 2
CALL двухсловный указатель в памяти 57 + EA 2-4
CBW 2 1
CLC 2 1
CLD 2 1
CLI 2 1
CMC 2 1
CMP регистр, регистр 3 2
CMP регистр, память 9(13) + EA 2-4
CMP память, регистр 9(13) + EA 2-4
CMP регистр, значение 4 3-4
CMP память, значение 10(14) + EA 3-6
CMP аккумулятор, значение 4 2-3
CMPS приемник, источник 22(30) 1
CMPS (REP) приемник, источник 9 + 22(30)/повтор 1
CWD 5 1
DAA 4 1
DAS 4 1
DEC словный регистр 2 1
DEC байтный регистр 3 2
DEC память 15(23) + EA 2-4
DIV байтный регистр 80-90 2
DIV словный регистр 144-162 2
DIV байт памяти (86-96) + EA 2-4
DIV слово памяти (154-172) + EA 2-4
ESC значение, память 8(12) + EA 2-4
ESC значение, регистр 2 2
HLT 2 1
IDIV байтный регистр 101-112 2
IDIV словный регистр 165-185 2
IDIV байт памяти (107-118) + EA 2-4
IDIV слово памяти (175-194) + EA 2-4
IMUL байтный регистр 80-98 2
IMUL словный регистр 128-154 2
IMUL байт памяти (86-104) + EA 2-4
IMUL слово памяти (138-164) + EA 2-4
IN аккумулятор, байт значения 10(14) 2
IN аккумулятор, DX 8(12) 1
INC словный регистр 2 1
INC байтный регистр 3 2
INC память 15(23) + EA 2-4
INT 3 52 1
INT значение байта, отличное от 3 51 2
INTO 53 или 4 1
IRET 32 1
JCXZ короткая метка 18 или 6 2
JMP короткая метка 15 2
JMP близкая метка 15 3
JMP далекая метка 15 5
Jxxx короткая метка 16 или 4 2
LAHF 4 1
LDS словный регистр, двойное слово памяти 24 + EA 2-4
LEA словный регистр, слово памяти 2 + EA 2-4
LES словный регистр, двойное слово памяти 24 + EA 2-4
LOCK 2 1
LODS строка-источник 12(16) 1
LODS (REP) строка-источник 9+13(17)/повтор 1
LOOP короткая метка 17 или 5 2
LOOPE короткая метка 18 или 6 2
LOOPNE короткая метка 19 или 5 2
LOOPNZ короткая метка 19 или 5 2
LOOPZ короткая метка 18 или 6 2
MOV память, аккумулятор 10(14) 3
MOV аккумулятор, память 10(14) 3
MOV регистр, регистр 2 2
MOV регистр, память 8(12) + EA 2-4
MOV память, регистр 9(13) + EA 2-4
MOV регистр, значение 4 2-3
MOV значение, регистр 10(14) + EA 3
MOV сегментный регистр, словный регистр 2 2
MOV сегментный регистр, слово памяти 8(12) + EA 2-4
MOV словный регистр, сегментный регистр 2 2
MOV слово памяти, сегментный регистр 9(13) + EA 2-4
MOVS приемник, источник 18(26) 1
MOVS (REP) приемник, источник 9+17(25)/повтор 1
MUL байтный регистр 70-77 2
MUL словный регистр 118-133 2
MUL байт памяти (76-83) + EA 2-4
MUL слово памяти (128-143) + EA 2-4
NEG регистр 3 2
NEG память 16(24) + EA 2-4
NOP 3 1
NOT регистр 3 2
NOT память 16(24) + EA 2-4
OR регистр, регистр 3 2
OR регистр, память 9(13) + EA 2-4
OR память, регистр 16(24) + EA 2-4
OR регистр, значение 4 3-4
OR память, значение 17(25) + EA 3-6
OR аккумулятор, значение 4 2-3
OUT байт значения, аккумулятор 10(14) 2
OUT DX, аккумулятор 8(12) 1
POP регистр 12 1
POP сегментный регистр 12 1
POP память 25 + EA 2-4
POPF 12 1
PUSH регистр 15 1
PUSH сегментный регистр 14 1
PUSH память 24 + EA 2-4
PUSHF 14 1
RCL регистр, 1 2 2
RCL регистр, CL 8+4/бит 2
RCL память, 1 15(23) + EA 2
RCL память, 1 20(28)+EA+4/бит 2
RCR регистр, 1 2 2
RCR регистр, CL 8+4/бит 2
RCR память, 1 15(23) + EA 2
RCR память, 1 20(28)+EA+4/бит 2
REP 2 1
REPE 2 1
REPNE 2 1
REPZ 2 1
REPNZ 2 1
RET (внутрисегментный, без POP) 20 1
RET (внутрисегментный, с POP) 24 3
RET (межсегментный, без POP) 32 1
RET (межсегментный, с POP) 31 3
ROL регистр, 1 2 2
ROL регистр, CL 8+4/бит 2
ROL память, 1 15(23) + EA 2
ROL память, 1 20(28)+EA+4/бит 2
ROR регистр, 1 2 2
ROR регистр, CL 8+4/бит 2
ROR память, 1 15(23) + EA 2
ROR память, 1 20(28)+EA+4/бит 2
SAHF 4 1
SAL регистр, 1 2 2
SAL регистр, CL 8+4/бит 2
SAL память, 1 15(23) + EA 2
SAL память, 1 20(28)+EA+4/бит 2
SAR регистр, 1 2 2
SAR регистр, CL 8+4/бит 2
SAR память, 1 15(23) + EA 2
SAR память, 1 20(28)+EA+4/бит 2
SBB регистр, регистр 3 2
SBB регистр, память 9(13) + EA 2-4
SBB память, регистр 16(24) + EA 2-4
SBB регистр, значение 4 3-4
SBB память, значение 17(25) + EA 3-6
SBB аккумулятор, значение 4 2-3
SCAS приемник 15(19) 1
SCAS (REP) приемник 9+15(19)/повтор 1
SHL регистр, 1 2 2
SHL регистр, CL 8+4/бит 2
SHL память, 1 15(23) + EA 2
SHL память, 1 20(28)+EA+4/бит 2
SHR регистр, 1 2 2
SHR регистр, CL 8+4/бит 2
SHR память, 1 15(23) + EA 2
SHR память, 1 20(28)+EA+4/бит 2
STC 2 1
STD 2 1
STI 2 1
STOS приемник 11(15) 1
STOS (REP) приемник 9+10(14)/повтор 1
SUB регистр, регистр 3 2
SUB регистр, память 9(13) + EA 2-4
SUB память, регистр 16(24) + EA 2-4
SUB регистр, значение 4 3-4
SUB память, значение 17(25) + EA 3-6
SUB AL, значение 4 2-3
TEST регистр, регистр 3 2
TEST регистр, память 9(13) + EA 2-4
TEST регистр, значение 5 3-4
TEST память, значение 11 + EA 3-6
TEST AL, значение 4 2-3
WAIT 3 + 5n 1
XCNG AL, словный регистр 3 1
XCNG память, регистр 17(25) + EA 2-4
XCNG регистр, регистр 4 2
XLAT таблица-источник 11 1
XOR регистр, регистр 3 2
XOR регистр, память 9(13) + EA 2-4
XOR память, регистр 16(24) + EA 2-4
XOR регистр, значение 4 3-4
XOR память, значение 17(25) + EA 3-6
XOR AL, значение 4 2-3
Приложение Ж. Набор инструкций микропроцессора 80286.


Придерживаясь схемы, принятой в данной книге, здесь перечислены
инструкции только для режимов реальной адресации. Более мощный
микропроцессор 80286 не требует добавочного времени на вычисление
эффективных адресов, нет также отличия в выполнении команд над
байтными и словными переменными. Звездочка указывает, что Вы
должны добавить один такт, если при вычислении смещения суммируются
три элемента. Буква m указывает число байтов следующей
инструкции, а n - число повторений.

такты байты

AAA 3 1
AAD 14 2
AAM 16 2
AAS 3 1
ADC регистр/память с регистром 2,7* 2
ADC значение с регистром/памятью 3,7* 3-4
ADC значение с аккумулятором 3 2-3
ADD регистр/память с регистром 2,7* 2
ADD значение с регистром/памятью 3,7* 3-4
ADD значение с аккумулятором 3 2-3
AND регистр/память с регистром 2,7* 2
AND значение с регистром/памятью 3,7* 3-4
AND значение с аккумулятором 3 2-3
CALL прямой внутри сегмента 7+m 3
CALL косвенный через регистр/память внутри сег-та 7+m,11+m* 2
CALL прямой между сегмента 13+m 5
CBW 2 1
CLC 2 1
CLD 2 1
CLI 3 1
CMC 2 1
CMP регистр/память с регистром 2,6* 2
CMP регистр с регистром/памятью 2,7* 2
CMP значение с регистром/памятью 3,6* 3-4
CMP значение с аккумулятором 3 2-3
CMPS повторенный CX раз 5 + 9n 2
CMPS байт или слово 8 1
CWD 2 1
DAA 3 1
DAS 3 1
DEC регистр/память 2,7* 2
DEC регистр 2 1
DIV байтный регистр 14 2
DIV словный регистр 22 2
DIV байт памяти 17* 2
DIV слово памяти 25* 2
ESC 9-20* 2
HLT 2 1
IDIV байтный регистр 17 2
IDIV словный регистр 25 2
IDIV байт памяти 20* 2
IDIV слово памяти 28* 2
IMUL байтный регистр 13 2
IMUL словный регистр 21 2
IMUL байт памяти 16* 2
IMUL слово памяти 24* 2
IMUL умножение на целое значение 21,24* 3-4
IN фиксированный порт 5 2
IN переменный порт 5 1
INC регистр/память 2,7* 2
INC регистр 2 1
INS строка 5 + 4m 2
INS байт или слово 5 1
INT указанный тип 23 + m 2
INT тип 3 23 + m 1
INTO 24 + m или 3 1
IRET

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.