adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
бой 65534 (беззнаковое число) или -2 (число со знаком).
Если это кажется непонятным, прочитайте одну из книг, реко-
мендуемых в конце данного руководства (или одну из книг по Ас-
семблеру, изданных в СССР, например книгу Бредли). Это позволит
вам больше узнать об арифметике с дополнением до двух - средстве,
с помощью которого процессор 8086 обрабатывает числа со знаком. К
сожалению, мы не располагаем здесь местом, чтобы подробно расска-
зать об арифметике значений со знаком, хотя для программиста это
представляет собой одну из важных тем, которую нужно хорошо пони-
мать. Пока же запомните, что инструкции ADD, SUB, ADC и SBB рабо-
тают одинаково хорошо как с беззнаковыми значениями, так и со
значениями со знаком, поэтому для таких операций не требуется
специальных инструкций сложения или сочетания. Знак имеет значе-
ние в операциях умножения или деления (как вы увидите далее), а
также при преобразовании размеров данных.
TASM2 #1-5/Док = 204 =
Преобразование размеров данных
-----------------------------------------------------------------
Иногда бывает необходимо преобразовать слова в байты или на-
оборот. При этом, как и в других действиях, значения могут быть
со знаком или без знака.
Давайте сначала рассмотрим преобразование слова в байт. Это
довольно просто: нужно только избавиться от старшего байта слова.
Например:
.
.
.
mov ax,5
mov bl,al
.
.
.
Здесь значение 5 размером в слово в регистре AX преобразует-
ся в байтовое значение 5 в регистре BL. Конечно, вы должны быть
уверены, что преобразуемое вами значение поместится в байте. По-
пытка преобразовать в байт значение 100h с помощью инструкций:
.
.
.
mov dx,100h
mov al,dl
.
.
.
была бы безуспешной, так как в регистр AL был бы записан только
младший (нулевой) байт.
Преобразование беззнакового байтового значения в слово зак-
лючается просто в обнулении старшего байта слова. Например, инс-
трукции:
.
.
.
mov cl,12
mov al,cl
mov ah,0
.
.
.
преобразуют беззнаковое значение 12 в регистре CL в значение 12
размером в слово в регистре AX.
Преобразование в слово байтового значения со знаком несколь-
ко более сложно, поэтому в процессоре 8086 для выполнения этой
задачи предусмотрена специальная инструкция CBW. Инструкция CBW
преобразует байтовое значение со знаком в регистре AL в значение
со знаком размером в слово в регистре AX. В следующем фрагменте
программы байтовое значение со знаком -1 в регистре DH преобразу-
ется в значение со знаком размером в слово в регистре DX (-1):
.
.
.
mov dh,-1
mov al,dh
cbw
mov dx,ax
.
.
.
В наборе инструкций процессора 8086 для преобразования слова
со знаком в регистре AX в двойное слово со знаком в регистрах DX:
AX (старшее слово содержится в регистре AX) предусмотрена специ-
альная инструкция CWD. Следующие инструкции преобразуют значение
со знаком +10000 (размером в слово), содержащееся в регистре AX,
в значение со знаком +10000 (размером в двойное слово), содержа-
щееся в паре регистров DX:AX:
.
.
.
mov ax,10000
cwd
.
.
.
Беззнаковые значения размером в слово можно преобразовать в
беззнаковые значения размером в двойное слово путем обнуления
старшего слова значения.
Доступ к сегментным регистрам
-----------------------------------------------------------------
Хотя для перемещения значений в сегментные регистры и из них
можно использовать инструкцию MOV, это особый случай, более огра-
ниченный, чем другие случаи использования инструкции MOV. Если
одним из операндов инструкции MOV является сегментный регистр, то
другим операндом должен быть регистр общего назначения или ячейка
памяти. Загрузить константу в сегментный регистр непосредственно
невозможно, и невозможно непосредственно скопировать один сегмен-
тный регистр в другой сегментный регистр.
Так как имена сегментов являются константами, необходимо
загружать сегментные регистры таким же образом, как общие регист-
ры или переменную в памяти. Вот, например, два способа установки
регистра ES в значение сегмента .DATA:
.
.
.
.DATA
DataSeg DW @Data
.
.
.
.CODE
.
.
.
mov ax,@Data
mov es,ax
.
.
.
mov ex,[DataSeg]
.
.
.
Вместо этого хотелось бы сделать следующее:
mov es,@Data ; недопустимо!
но это работать не будет.
Чтобы скопировать содержимое одного сегментного регистра в
другой сегментный регистр, вам придется передать значение через
регистр общего назначения или память. Инструкции:
.
.
.
mov ax,cs
mov ds,ax
.
.
.
и
.
.
.
push cs
pop ds
.
.
.
копируют содержимое регистра CS в DS. Первый метод работает быст-
рее, но при втором методе требуется меньший объем кода.
Не удивляйтесь, при работе с инструкцией MOV вы сталкивае-
тесь с ограничениями, когда дело касается сегментных регистров,
ведь в большинстве инструкций сегментные регистры вовсе не допус-
кается использовать в качестве операндов. Сегментные регистры
можно заносить в стек и извлекать из стека, но этим дело и огра-
ничивается. В операциях сложения, вычитания, логических операциях
или сравнениях их использовать нельзя.
|
adfun.ru
|
|
|
|