Лекции по курсу "Проектирование ассемблеров, компоновщиков, макропроцессоров
6. Организация работы памяти
Физическая память, к которой процессор имеет доступ по шине адреса, называется оперативной памятью (или оперативным запоминающим устройством — ОЗУ). На самом нижнем уровне память компьютера можно рассматривать как массив битов. У бита два устойчивых состояния - 0 и 1. Но адресовать каждый бит сложно, так как их очень много. А вот байты адресуются, поэтому каждый байт имеет уникальный адрес, называемый физическим. Байт (BYTE) в командах обозначается суффиксом B (db, byte ptr). Он состоит из восьми бит. Выделяют также слово. Это последовательность из двух байтов, расположенная по чётному адресу. Слово (WORD)в командах обозначается суффиксом W (dw, word ptr). Таким образом, все слова имеют чётные адреса и не перекрывают друг друга. Слово записывается в память побайтово. Слово в памяти располагается младшим байтом вперед. Например, при записи слова 0x01F5 произойдёт следующее: сначала запишется байт 0xF5, а затем - байт 0x01. Поэтому, если записать слово в ОП, а потом считать его как пару байт, то эти байты нужно будет переставить местами. Верно и обратное: если по адресу 0x2A00 (к примеру) записать байт 0xAA, a следом за ним записать байт 0xBB, а затем считать с адреса 0x2A00 слово в регистр AX (к примеру), то значением регистра AX будет 0xBBAA. Сделать это можно следующими командами:
TASM TASM C/C++ ;эксперимент 1.1 cseg segment assume cs:cseg ;точка входа entry_point: ;сохранили push bx ;сохранили
push ax ;разместим байты в стеке mov bx, BBAAh ;0xAA в стек push bl ;0xBB в стек push bh ;на вершине стека 0xBB ;далее лежит 0xAA ;т.о. дамп стека таков: ; BB AA [ax] [bx]. . . ;считаем слово (2 байта) ;0xAABB в ax pop ax ;восстановили pop ax ;восстановили pop bx ;4Сh – выход mov ah,4Сh ;вызов выхода int 21h cseg ends end entry_point;эксперимент 1.2 cseg segment assume cs:cseg ;точка входа entry_point: jmp start val db ‘XX’ start: ; ‘k’и‘O’ mov ax, 6B4Fh ;адрес в bx lea bx, val ;в память mov [bx], ax ;6 – код функции печати mov ah, 6 ;1-й байт mov dl,[bx] ;печатать dl int 21h ;2-й байт mov dl,[bx+1] ;печатать dl int 21h ;4Сh–код выхода mov ah, 4Сh ;выход int 21h cseg ends end entry_point ;должны получить Ok ;эксперимент 1.3 #include //char – 1 байт //short – 2 байта main(){
char buf[2]; short * pSh; pSh = &buf; *pSh = 0x8081; //0x80 = = 'А' //0x81 = = 'Б' //выводим байты printf("%c%c\n", buf[0],buf[1]); } /* вывод: БА т.к. [0]-0x81,[1]-0x80 а если судить по последо-
вательности кодов, то
должно быть: АБ */
Слово в памяти:
Двойное слово (DOUBLE WORD) - это последовательность из двух слов. В командах двойное слово обозначается суффиксом D (dd, dword ptr). Двойное слово начинается с адресов кратных четырем. Они также не перекрывают друг друга. Запись байтов двойного слова, как и в случае со словом, производится от младшего байта к старшему (если запись производить из 4-байтовых регистров, eax, ebx, …).
Четверное слово (QUARTER WORD) - это последовательность из четырёх слов. В командах обозначается суффиксом Q (dq, qword ptr). Четверное слово адресуется с адресов кратных восьми. Они также не перекрывают друг друга.
Параграф – это последовательность из 16 байтов, или 8 слов, или 4 двойных слов. Параграф начинается с адресов кратных шестнадцати. Параграфы не перекрывают друг друга.
Адресное пространство – это максимальное количество байтов в ОП.
m - разрядность адреса
В I8086 m=20. Процессор I8086 мог адресовать 1 Мб памяти. 220 - 1 = 210 x 210 = 1024 x 1024 - 1 = 1 (Мегабайт адресов: 0 ... 1 048 575). При этом возникла проблема: разрядность адресов 20, а разрядность регистров 16 (они накрывают 216 байт = 64 Кб). Проблема была решена с помощью механизма сегментации.
Ввели сегмент, порцию информации размером 64 Кб. Сегменты начинаются с параграфа (с адресов, кратных 16-ти) и перекрывают друг друга. Каждый сегмент содержит 4096 параграфов, и значит, что в нём лежат начала 4095-ти других сегментов. Для каждого байта данных можно определить канонический сегмент. Им будет тот сегмент, адрес начала которого находится на минимальном смещении от адреса этого байта. Аналогично канонический сегмент определяется для слова и двойного слова. Также можно сказать так: сегмент, начинающийся с параграфа, которому принадлежит данный байт (слово, двойное слово), является для него каноническим.
Физический адрес – адрес любого байта в адресном пространстве. Разрядность 20. Эффективный адрес – адрес байта внутри сегмента. Разрядность 16. Адрес сегмента – номер некоторого параграфа. Разрядность 16. Сегментные регистры хранят адреса сегментов, на рисунке выше приведены их возможные значения.
Причины использования языка ассемблер
Причины неиспользования языка ассемблер
Синтаксис ассемблера
Системное программное обеспечение и структура ЭВМ
Программная модель процессора Intel 8086
Организация работы памяти
Операнды
Адресация операндов
Формат машинных команд
Команды переходов
Типы ассемблеров. Функции ассемблера
Ассемблер по схеме 1А / ОП
Ассемблер по схеме 1А / МД
Двухпросмотровый ассемблер
Многопросмотровый ассемблер
Загрузчик
Структура объектных файлов. Основные понятия
Идентификация модуля и атрибуты
Концепция привязки
Объектный файл. Последовательность записей
Объектный файл. Формат записей
Формат записей THEADR и LHEADR
Формат записи LNAMES
Формат записи SEGDEF
Формат записи GRPDEF
Формат записи PUBDEF
Формат записи COMDEF
Формат записи LOCSYM
Формат записи EXTDEF
Формат записи LINNUM
Формат записи LEDATA
Формат записи LIDATA
Формат записи FIXUPP
Формат записи MODEND
Формат записи комментариев