Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM_lectures.doc
Скачиваний:
27
Добавлен:
28.04.2019
Размер:
992.77 Кб
Скачать

Сегментная память

Программный код, данные и стек можно, например, распределить следующим образом:

В общем случае любой МП (в том числе и 8086) выполняет следующие шаги:

1).Выборка следующей команды по адресу и РС;

2).Загрузка в регистр команды и дешифрация с одновременным инкриментом РС для адресации следующей команды;

3).Выполнение команды, а в случае перехода загрузка в РС адреса перехода;

4). Повторение шагов 1-3.

Однако в МП 808 имеются некоторые отличия и совмещения нескольких операций.

Адрес следующей команды равен (IP)+(CS)16.

Регистр команды представлен 6-байтной очередью FIFO, которая непрерывно заполняется, когда системная шина не требуется для других операций. Такое «опережение» значительно повышает производительность МП, так как к моменту завершения текущей команды, следующая чаще всего уже находится в конвейере. В случае перехода очередь сбрасывается и не дает экономии времени, но в среднем это происходит нечасто.

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

Рассмотрим заполнение ковейера последовательно: 1-байтная команда, 2-байтная команда и 3-байтная команда. Предположим, что эта последовательность начинается по четному адресу:

Загрузка

3-я выборка

3-я команда

2-я выборка

2-я команда

1-я выборка

1-я команда

Очередь команд (конвейер)

Эта же последовательность, но начинается с нечетного адреса:

Загрузка

4-я выборка

не начинается до освобождения в очереди слова

3-я команда

3-я выборка

2-я выборка

2-я команда

1-я выборка

1-я команда

Очередь

Последний байт не передается, пока в очереди не образуется пустого слова.

1

code_seg segment

org 100h

start:

mov AH, 2h

mov DL, 2Ah

int 21h

int 20h

code_seg ends

end start

2

code_seg segment

assume cs:code_seg, ds:code_seg, ss:code_seg

org 100h

start:

jmp begin

mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’

begin:

mov AH, 9h

lea DX, mes

int 21h

int 20h

code_seg ends

end start

3

code_seg segment

assume cs:code_seg, ds:code_seg, ss:code_seg

org 100h

start:

jmp begin

mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’

begin:

mov Ah, 9h ; Функция DOS для вывода строки символов

; $ - ограничитель строки

lea DX, mes

int 21h ; print string

;

mov BL, 0Fh

mov AH, 02

mov DL, BL

add DL, 30h

cmp DL, 3Ah

jl print

add DL, 07h

print:

int 21h

int 0h

code_seg ends

end start

4

code_seg segment

assume cs:code_seg, ds:code_seg, ss:code_seg

org 100h

start:

jmp begin

mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’

begin:

mov Ah, 9h ; Функция DOS для вывода строки символов

; $ - ограничитель строки

lea DX, mes

int 21h ; print string

;

mov BL, 0AFh

mov AH, 02

mov DL, BL

call print_hex

mov DL, BL

call print_hex

int 20h

print_hex:

and DL, 0Fh

add DL, 30h

cmp DL, 3Ah

jl print

add DL, 07h

print:

int 21h

code_seg ends

end start

5

code_seg segment

assume cs:code_seg, ds:code_seg, ss:code_seg

org 100h

start:

jmp begin

mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’

begin:

mov Ah, 9h ; Функция DOS для вывода строки символов

; $ - ограничитель строки

lea DX, mes

int 21h ; print string

;

mov BL, 0Fh

mov AH, 02

mov DL, BL

add DL, 30h

cmp DL, 3Ah

jl print

add DL, 07h

print:

int 21h

int 20h

code_seg ends

end start

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]