КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Представление чисел в ассемблере
Система команд ассемблера. Режимы адресации ассемблера.
Режим адресации: косвенная регистровая. Исполнительный адрес операнда (точнее, смещение относительно начала сегмента данных (data)) содержится в одном из регистров BX, BP, SI и DI. Для указания косвенной адресации этот регистр должен заключаться в квадратные скобки. Например, перешлём в регистр AX содержимое 16-разрядного слова, хранящегося в памяти DS: BX:
mov AX, [BX]
Если мы хотим сделать это принудительно, то пишем так:
mov AX, ES {BX]
Описываем пример: var x: Word; b: Byte; ... asm mov ax, X add ah, B mov X, ax
Замечание: регистр написания идентификаторов регистров значения не имеет.
Режим адресации: прямая. Смещение операнда задаётся в теле программы и помещается в регистр DS.
Режим адресации: по базе (или базовая адресация). Базовый регистр BX (или BP) содержит базу (адрес начала некоторого фрагмента памяти) относительно которой ассемблер вычисляет смещение. Пример:
mov ax, [bx] + 10
Где “+10” означает, что мы отодвинулись на 10 ячеек после регистра BX.
Режим адресации: индексная. Один из индексных регистров (SI и DI) указывает положение элементов относительно начала некоторой области памяти. Например:
mov SI, 15 mov ah, AOB [SI] mov SI, 0 mov AOB [SI] ah
В этом примере байтовый массив AOB описан ранее. В индексный регистр SI мы переслали число 15. В регистр ah мы переслали то, что хранится в массиве AOB по адресу si (т.е. по адресу 15). Затем мы в регистр SI переслали 0. И наконец в ячейку [SI] (15-ю по счёту) массива AOB мы поместили значение регистра ah, т.е. 0. Другими словами, мы просто заменили значение в 15-ой ячейке массива AOB на ноль.
Режим адресации: по базе (базовая регистровая).
Вариант индексной адресации в случае, когда индексируемая область памяти задаётся своей базой. Этот вариант удобен, когда нужно обработать двумерные массивы.
Пример: опишем байтовый массив АОВ. Перешлём в регистр bx значение 20, перешлём в регистр si значение 2 и перешлём в регистр ax значение, которое размещается в элементе массива АОВ под номером [bx][si].
var AOB: array [0 … 9; 0 … 9] mov bx, 20 mov si, 2 mov ax, AOB[bx][si]
Пояснение: в регистр bx мы пересылаем не 2, а 20 т.к. в памяти элементы массива хранится последовательно.
В памяти числа представляются в перевёрнутом виде, а в регистрах – в прямом виде. Например, слово (W) и двойное слово (DW) ассемблер представляет в следующем виде:
A = 98 = 001100010 = ‘62h
В ячейках регистра это будет выглядеть вот так:
Директивы ассемблера (идентификаторы для объявления): § DB – define byte § DW – define word § DD – define double word
Общий вид операции определения: [имя] DB [операнд]
Здесь может быть несколько вариантов: xdb? – если операнд не определён; xdb254; xdb-2; xdbOPEh; и т.д.
Пример: M db 2,-2,?,”*” В ячейках будет определено: 2 | -2 | неизвестно что | * (символ звёздочка)
Ещё пример: R DB 5(dup(0)) В ячейках будет: 0 | 0 | 0 | 0 | 0
Ещё пример: y DB -7,3(dup(0,2(dup(?))) В ячейках будет: -7 | 0 |? |? | 0 |? |? | 0 |? |? (семёрка, а затем трижды по 0??) Задача: Написать матрицу 20*30 неизвестно чего. Пишем так: A DB 20(sup(30(dup?)));
Ещё пример: опишем две переменные как слова, занесём в первую из них символьное значение 01, а во вторую – единичку. S1 DW ‘01’ (‘01’ кодируется как 30h, 31h) S2 DW ‘1’ (‘1’ кодируется как 31h) В ячейках получится: 31 | 30 | 31 | 00
Ещё пример: если нам нужно определить Х как двойное слово с содержимым 12345678h, то вот как всё будет обстоять: X DD 12345678h Получим: 78 | 56 | 94 | 12
Задача: описать две переменные – х и у как 4 и 3. Затем описать третью переменную, которая будет равна х+у. Пишем:
x DB 4 y DB 3 z DB? mov ax, x (отправили в регистр ax значение 4) add ax, y (прибавим к содержимому регистра ax значение 3) mov z, ax (помещаем в регистр z содержимое регистра ax)
На этом с примерами всё.
Команды перемещения: o mov <приёмник>, <источник> – перенести значение приёмник из источника o push <источник> – записать в стек o pop <приёмник> – извлечь значение из стека o xcgh <источник>, <приёмник> – поменять значения источника и приёмника o xlat <таблица> – загрузить в AL байт из таблицы o in <аккумулятор>, <порт> – считать из порта в аккумулятор o out <порт>, <аккумулятор> – вывести в порт из аккумулятора
Команды пересылки адреса: o lea <регистр>, <память 16> – загрузить исполнительный адрес o lds <регистр 16>, <память 32> – загрузить полный адрес
Ограничения команды mov: 1. Из памяти в память пересылать нельзя. Обязательно нужен пересылочный регистр. Например, можно сделать так: mov ax, x mov x, ax 2. Константу или переменную нельзя пересылать в регистр DS. Можно сделать это, используя пересылочный регистр. Вот так: mov AX, DS mov DS, AX 3. В регистр CS пересылать ничего нельзя, т.к. он автоматически заполняется при выполнении некоторых команд.
Дата добавления: 2014-01-06; Просмотров: 906; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |