Материал: 1117

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

предпочтительным методом является выполнение функции с номером 4Ch. Именно эта функция и используется в приведенном примере.

stacksg segment para ‘Stack’

 

db

100h

 

; стек объемом 256 байтов

stacksg ends

 

 

datasg segment para ‘Data’

; начало сегмента данных

datasg ends

 

 

codesg segment para ‘Code’

; начало сегмента кода

. . .

 

 

EhcoLoop:

 

 

mov

ah,1

; функция DOS ввода с клавиатуры

int

21h

; получить следующую клавишу

cmp

al,13

; это клавиша enter?

jz EchoDone

; да, выполняем эхоотображение

mov

dl,al

; поместить символ в dl

mov

ah,2

; функция DOS вывода на экран

int

21h

; вывести на экран символ

jmp

EchoLoop

; отобразить следующий символ

EchoDone:

 

 

mov

ah,4ch

; функция DOS завершения программы

int

21h

; завершить программу

. . .

codesg ends end

4.46. Базовая система ввода-вывода

Если нет нужной функции DOS, обратитесь к базовой системе вводавывода IBM PC BIOS. В отличие от DOS и прикладных программ BIOS хранится в памяти, доступной только по чтению (ROM или ПЗУ).

BIOS является программным обеспечением нижнего уровня. Даже DOS использует для управления аппаратурой функции BIOS. Аналогично DOS BIOS позволяет "скрыть" различия между различными компьютерами

иустройствами. С помощью функций BIOS можно установить режим экрана, управлять цветами, получить информацию о дисплейном адаптере

ит.д. [1, с. 151165].

Программное обеспечение коммуникаций управляет портом IBM PC с помощью инструкций in и out, поскольку ни DOS, ни BIOS не предусматривают адекватной поддержки. Подробнее см. уч. пос., ч.8.

4.47. Выражения

51

Выражения можно использовать там же, где допускается использование констант. Ассемблер поддерживает вычисление выражений, включая вложенные скобки, арифметические, логические операции и операции отношения, а также множество операций, предназначенных для таких целей, как выделение сегмента и смещения для меток и определение размера переменных в памяти. Например:

MemVar db 0

 

dw 0

 

dw 0

 

dw 0

 

NextVardb ?

 

. . .

 

mov

ax,seg MemVar

;загрузки в ds постоянного значения

mov

ds,ax

; сегмента, в котором находится MemVar

mov

bx,offset MemVar +(1+ (3*2))

mov

byte ptr [bx],1

 

Вэтой программе используется сложное выражение, включающее в себя операции *, +, и offset, при вычислении которого получается значение offset MemVar+7, которое представляет собой адрес NextVar. Наконец, для выбора байтовой операции при сохранении константы 1 в ячейке, на которую указывает регистр bx (что представляет собой NextVar), используется операция byte ptr.

Примечание. При вычислении всех выражений должно получаться значение-константа.

Здесь offset MemVar – это значение-константа, представляющее собой смещение переменной MemVar в ее сегменте (например, смещение этой переменной от начала сегмента данных может быть равным 5000). Сохраненное в переменной MemVar значение (в приведенном выше примере оно равно нулю) может изменяться, сама переменная MemVar, конечно, никуда не перемещается.

Так как значения-константы точно известны, ассемблер может вычислять состоящие из постоянных значений выражения так же, как он ассемблирует исходный текст программы (т.е. исходный код). Для ассемблера выражение offset MemVar + 7 совершенно аналогично выражению 5000 + 7. Поскольку все элементы выражения неизменяемы и определены во время ассемблирования, выражение можно свести к одному значению - константе.

Ввыражениях могут использоваться следующие операции:

(), size, offset, ptr, *, /, +, - (бинарные)

Другие операции, которые могут использоваться в выражениях (LENGTH, MASK, WIDTH, . (селектор элемента структуры), HIGH,

52

LOW, : (переопределение сегмента), SEG, THIS, .TYPE, LARGE, SHORT, SMALL) *, /, shl, shr, +, - (бинарные), eq, ge, gt, le, lt, ne, not, and, or, xor (см. уч. пос., ч.6).

53

4.48. Биты, байты, слова, двойные и учетверенные слова

Как было отмечено выше (см. п. 4.5), основной единицей памяти компьютера является бит. В бите может храниться значение 0 или 1. Байт состоит из 8 битов. В каждом из 8-разрядных регистров процессора (al, ah, bl, cl, ch, dl и dh) и в каждой из более чем 1 000 000 адресуемых ячеек памяти хранится ровно 1 байт. (Если быть точным, то количество адресуемых ячеек равно 220, т.е. 1 048 576).

Набор символов компьютера включает в себя строчные и прописные символы, цифры от 0 до 9, специальные графические символы, научные и специальные символы, а также различные знаки пунктуации и прочие символы – всего 256 символов. Набор символов построен таким образом, что в 1 байте хранится 1 символ.

Байт – это наименьшая единица адресации процессора. В нем может храниться один символ, одно беззнаковое значение от 0 до 255 или одно значение со знаком в диапазоне от -128 до +127. Байт не подходит для хранения значений с плавающей точкой и указателей на память.

Следующая по величине единица памяти процессора – это слово. Оно вдвое превосходит по размеру байт (содержит 16 битов). Фактически слово хранится в памяти в виде двух последовательных байтовых ячеек. Адресное пространство процессора можно рассматривать как немногим более 500 000 слов. В каждом из 16-разрядных регистров (регистр ax, bx, cx, dx и др.) также хранится одно слово.

Число 65 535 представляет собой максимальную величину целого без знака, хранящегося в слове. Целые со знаком могут принимать значения в диапазоне от -32 768 до +32 767.

Слова могут адресоваться по любому смещению в данном сегменте, значения размером в слово можно использовать в качестве указателей памяти. Например, регистры bx, bp, si и di размером в слово используются как указатели на память.

Значения, хранимые в виде 32-битовых (4-байтовых) элементов, называются двойными словами. Процессор 8086 не может непосредственно работать с 32-битовыми целыми значениями, но выполнять 32-разрядные арифметические операции (с помощью двух последовательных 16-разрядных операций) можно с помощью таких инструкций, как adc и sbb. В двойных словах беззнаковые целые могут принимать значения в диапазоне от 0 до 4 294 967 295, а целые со знаком – в диапазоне от -2 147 483 648 до +2 147 483 647.

Учетверенными словами называются 64-битовые значения (восемь байтов). В процессоре 8086 встроенная поддержка учетверенных слов отсутствует. Процессор 8086 не может непосредственно работать с 64-

54

битовыми целыми значениями, но выполнять 64-разрядные арифметические операции (с помощью четырех последовательных 16разрядных операций) можно с помощью таких инструкций, как adc и sbb.

Ассемблер поддерживает еще один тип данных – элемент данных длиной 10 байтов. Этот 10-байтовый элемент данных может, например, использоваться для хранения суммы учетверенных слов.

Значения размером в слово, двойное или учетверенное слово в памяти хранятся таким образом, что младший байт следует первым. То есть если значение размером в слово хранится по адресу 0, то биты 7-0 значения записаны по адресу 0, а биты 15-8 – по адресу 1.

Аналогично, если значение размером в двойное слово хранится по адресу 5, то биты 7-0 хранятся по адресу 5, биты 15-8 хранятся по адресу 6, биты 23-16 – по адресу 7, а биты 31-24 – по адресу 8.

4.49. Представление числовых значений

Легче всего пользоваться десятичными значениями: mov cx,100 ; установить счетчик в значение 100.

Ассемблер считает значения десятичными, если не указано противное. Десятичные значения иногда не подходят для программирования на языке ассемблера.

Можно указать ассемблеру, что число выражено в двоичном виде, если поместить в конце числа букву b (при этом число должно состоять только из 0 и 1, поскольку это единственные две цифры, допустимые в двоичном представлении). Например, десятичное значение 100 выражается в двоичном виде как 1100100b.

Последняя инструкция с операндами в двоичном представлении будет иметь вид:

mov cx,1100100b ; установить счетчик в значение 100 В восьмеричном виде последний пример принимает вид:

mov cx,144o ; установить счетчик в значение 100 mov cx,144q ; установить счетчик в значение 100

Суффиксы o и q указывают на восьмеричную запись. В шестнадцатеричном виде последний пример принимает вид:

mov cx,64h ; установить счетчик в значение 100 Шестнадцатеричные числа обозначаются суффиксом h. Кроме того,

шестнадцатеричные числа должны начинаться с одной из цифр 0-9, так как шестнадцатеричное число типа bad4h может ошибочно интерпретироваться как метка. Пример, в котором используется как число

0bad4h, так и метка bad4h: datasg segment para ‘Data’

bad4h dw 0

;метка bad4h

 

55

Источник: https://studfile.net/preview/16407174/