
3. Двоично-десятичный формат (bcd).
Если взять число в распакованном десятичном формате, например 00090204 и сжать это число, сохраняя только правые цифры каждого байта, то получим число 0924h. Такой формат называется двоично-десятичным (BCD - Binary Coded Devimal). Он содержит только десятичные цифры от 0 до 9. Длина двоично-десятичного представления два раза меньше ASCII-представления. Заметим, что двоично-десятичное число 0924 имеет основание 10 и, будучи преобразованным в число с основание 16 (т.е. в шестнадцатеричное представление), даст 039Ch. Для обработки чисел в таком формате существуют две команды:
DAA - десятичная коррекция для сложения,
DAS - десятичная коррекция для вычитания.
При выполнении команд DAA и DAS учитывается значение признака переноса между тетрадами (AF). После выполнения команды AF сбрасывается в 0.
Пример использования:
Inc Al
Daa
ЗАДАНИЕ №1
mov count,16; переменная count в которой
;будет количество 0 бит в младшем и старшем байтах строки
mov dl,"h";первый байт
mov cx,8
a0: shl dl,1
sbb count,0; если найден 1 бит, тогда из count вычитается 1
loop a0
mov dl,"y";последний байт
mov cx,8
a1: shl dl,1
sbb count,0
loop a1
ЗАДАНИЕ №2
model small
include io.asm ; подключение модуля io.asm
.stack 100h
.data
d db 28
m db 3
g db 82
z dw ? ; для результата
.code start: ; точка входа в программу
mov ax,@data ; загрузка адреса сегмента данных
mov ds,ax
mov al,2 ; 2 à al
mul d ; ax := al * d (=2d)
mov z,ax ; 2d à z
mov al,g ; g - al
mul m ; gm à ax
sub z,ax ; в z - результат вычисления
outint z ; вывод z (если z может быть отрицательно)
или outword z ; вывод z (если z неотрицательно)
mov ax,4C00h ; завершение работы
int 21h
end start
Команды безусловной передачи управления.
Команды передачи управления нужны для того, чтобы передавать выполнение программы в различные секции команд. В их число входят также команды вызова подпрограмм. Команды вызова подпрограмм вызывают подпрограммы, а команды перехода передают управление указанной ячейке без сохранения адреса возврата. Команда условного перехода позволяет ЭВМ думать. Условные команды могут проверить результат предыдущих действий и изменить течение программы на основе полученного результата.
Близкие и дальние переходы
Команды перехода модифицируют указатель команды IP и, возможно, регистр сегмента кодов CS. Эти регистры показывают, какая следующая команда должна быть выполнена. Команда перехода является специальным случаем пересылки MOV данных в регистр или пару регистров; и некоторые ЭВМ действительно выполняют команду перехода именно таким способом. Однако способы загрузки пары регистров CS:IP в микропроцессоре 8086 во многом отличаются от способов, используемых для других регистров.
Прежде всего мы должны ввести некоторые определения. Если команда перехода изменяет только регистр IP, это близкий переход (NEAR-переход), так как переход происходит внутри сегмента. Если переход изменяет регистр CS, это далекий (FAR-переход). Атрибуты NEAR и FAR используются при работе ассемблера. Любая метка в программе на языке ассемблера имеет атрибут либо NEAR, либо FAR, также, как данные имеют атрибуты BYTE или BGRD. В некоторых примерах этой главы имеются процедуры, которые используют атрибут NEAR в операторе PROC. Это означает, что метка, связанная с оператором PROC (имя процедуры) имеет атрибут NEAR. Ассемблер использует эту информацию для того, чтобы определить, какой тип команды перехода или вызова породить при переходе к этой метке. Поскольку большинство процедур - подпрограммы, атрибут NEAR или FAR оператора SROC также определяет тип порождаемой команды возврата. Вызов FAR-процедуры сохраняет значения как регистра CS, так и регистра IP, тогда как вызов NEAR-процедуры оставляет в стеке только значение регистра IP, Команда возврата должна учитывать, какой тип вызова был сделан, чтобы подпрограмма могла вернуться к правильному месту.
Адресация переходов.
Если адрес перехода или вызова подпрограммы является частью самой команды (как данные в командах с непосредственным операндом), это - непосредственный переход. Если адрес перехода команды содержится в регистре или ячейке памяти, это - косвенный переход так как команда требует загрузки адреса, извлекаемого из некоторого промежуточного места хранения; программа не может перейти прямо в необходимое место, и должна идти туда косвенно.
Существуют два метода вычисления адреса перехода. Если в команде указано значение адреса, это абсолютный переход, т.е. переход по абсолютному адресу. Команда может указать место перехода, как некоторое расстояние от нее самой. Этот метод перехода называется относительным переходом.
Преимущество относительных переходов в том, что программа наиболее часто переходит к близлежащим ячейкам; команда перехода может использовать однобайтовое смещение. Если смещение трактуется, как число в дополнительном коде, то двухбайтовая команда относительного перехода (один байт - код операции, и один байт смещение) может выполнить переход на 127 байт вперед или на 128 байт назад внутри программы. Микропроцессор 8086 имеет два типа - относительных переходов: один имеет однобайтовое смещение, другой двухбайтовое.
В микропроцессоре 8086 все условные переходы имеют однобайтовое смещение. Иногда это неудобно, например, в случае условного перехода к ячейке, находящейся на расстоянии в 150 байт от текущего места. В таких случаях программа должна использовать пару переходов, условный и безусловный; далее приводится пример такого метода перехода. В обычных же случаях однобайтовые смещения условных переходов в микропроцессоре 8066 минимизируют объем программы, необходимой для реализации любой заданной функции.
При расчете смещения относительного перехода микропроцессор 8086 отсчитывает смещения от значения указателя команд, которое получится после выполнения команды. Если точка перехода следует непосредственно за переходом, смещение равно 0. При переходе к самой команде перехода смещение равно -2. При двухбайтовом смещении переход может быть сделан в диапазоне -32768 - 32767 байт от значения регистра IP после выполнения команды перехода.
Команды безусловной передачи управления.
Безусловный переход - это такой переход, который передает управление всякий раз, когда он выполняется. Наоборот, условный переход проверяет текущее состояние микропроцессора, чтобы определить, передавать управление или нет. Существует три вида команд безусловной передачи управления - команды переходов и вызовов подпрограмм:
- команды безусловного перехода:
JMP SHORT - в пределах 128 байт вверх и вниз (только непосредственный операнд),
JMP NEAR - в пределах текущего сегмента (непосредственная и косвенная адресация),
JMP FAR - в любую точку памяти (непосредственная и косвенная адресация).- команды вызова:
CALL NEAR - вызов подпрограммы внутри текущего сегмента,
CALL FAR - вызов подпрограммы, находящейся в другом сегменте.
Операнды аналогичны соответствующим командам перехода, все команды вызова безусловны.
- команды возврата:
RET NEAR - близкий выход из подпрограммы,
RET FAR - дальний выход из подпрограммы.
Команды JMP просто изменяют текущее содержимое счетчика команд (если переход дальний, то и содержимое сегментного регистра СP) на новое, указанное в операнде.
Близкий вызов CALL сохраняет текущее значение регистра IP в стеке и записывает в IP новое, указанное в команде, значение. Дальний вызов CALL FAR, задает новые значения сегмента и смещения для дальнейшего выполнения программы и сохраняет в стеке как регистр IP, так и регистр CS. Близкий непосредственный вызов – это относительный переход, использующий двухбайтовое поле смещения.
Все остальные команды вызова - абсолютные переходы. Непосредственный вызов CALL FAR требует четырехбайтовое поле операнда для указания новых значений для регистров С5 и IP. Косвенные близкие вызовы типа загружают однословный операнд в регистр IP. Дальние вызовы загружают двойное слово из памяти в пару регистров CS:IP; первое слово загружается в регистр IP, а второе - в регистр CS. Если команда указывает регистр в качестве операнда косвенного далекого вызова, результат непредсказуем; микропроцессор 8086 берет новое значение регистра CS неизвестно откуда. Ни в коем случае нельзя использовать эту модификацию команды.
Командам CALL соответствуют команды возврата RET. Все возвраты - косвенные переходы, поскольку они извлекают адрес перехода из вершины стека. Близкий возврат извлекает из стека одно слово и помещает его в регистр IP, а далекий возврат извлекает два слова, помещая слово из меньшего адреса в регистр IP, а слово из большего адреса в регистр CS.
Программы могут модифицировать возвраты как ближнего, так и дальнего типа, указывая параметр счетчика байтов. Команда возврата прибавляет его значение к указателю стека после извлечения из него адреса (адресов) возврата. Такая команда позволяет программе удалять параметры из стека без использования специальных команд POP; тем самым подчеркивается, что стек - носитель передаваемых подпрограмме параметров.
Пример команды:
RET FAR 2
ЗАДАНИЕ №3
cseg segment
org 100h
start
metka:
mov cx 65535
mov ah,9
mov dx, offset string
int 21h;
loop metka
string db "hi"
mov ah,10h;
int 16h
ЗАДАНИЕ №4
.586
.model flat, stdcall
.stack 4096
.data
.code
proc_1 proc ; начало процедуры
push ebp ; пролог: сохранение EBP
mov ebp, esp ; пролог: инициализация EBP
mov eax, [ebp+8] ; доступ к аргументу 4
mov ebx, [ebp+12] ; доступ к аргументу 3
mov ecx, [ebp+16] ; доступ к аргументу 2
pop ebp ; эпилог: восстановление EBP
ret 12
proc_1 endp
main proc
push 2
push 3
push 4
call proc_1
ret
main endp
end main
Вывод: Получено освоение принципов работы с битовой информацией и форматом представления данных. Приобретение навыков организации подпрограмм и безусловных переходов.