EXERSISE (Ассемблер - упражнения), страница 4
Описание файла
Файл "EXERSISE" внутри архива находится в папке "Ассемблер - упражнения". Текстовый-файл из архива "Ассемблер - упражнения", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 4 страницы текстового-файла онлайн
7.1 abs dd ?
pair dd ?
Значение переменной abs трактуется как 20-разрядный абсолютный адрес не-
которой ячейки памяти, а значение переменной pair - как адрес этой же
ячейки, но заданный в виде адресной пары сегмент:смещение (seg:ofs), при-
чем в силу "перевернутого" представления двойных слов в памяти часть ofs
находится в первом слове этой переменной, а часть seg - во втором.
Не используя команды умножения и деления, решить следующие задачи:
а) преобразовать абсолютный адрес abs в адресную пару pair;
б) преобразовать адресную пару pair в абсолютный адрес abs;
в) нормализовать адресную пару pair, т.е. преобразовать ее к виду,
где смещение ofs не превосходит 15 (0fh); например, пару 4567h:1112h надо
привести к виду 4678h:2h.
7.2 Пусть es=4208h, bx=0fff0h и offset x=28ah. Вычислить абсолютный
адрес второго операнда каждой из следующих команд.
а) mov ax,es:15h
б) cmp bx,es:x
в) add cx,es:[bx]
г) xor dx,es:x[bx+15h]
7.3 Пусть cs=1111h, ds=2222h, ss=3333h, bx=8000h, bp=8000h, si=9003h.
Определить, какой сегментный регистр подразумевается по умолчанию в каж-
дой из следующих команд, и вычислить абсолютный адрес первого операнда
этих команд.
а) sub [bx],cl
б) mov [bp+2],dx
в) jmp word ptr [bx+si]
г) jmp word ptr [bp+si-4]
7.4 Пусть переменная d описана в сегменте d1, переменная e - в сег-
менте e1, а переменная s - в сегменте s1. Для последнего операнда каждой
из следующих команд определить, какой из префиксов (ds:, es: или ss:) вы-
берет ассемблер при трансляции этого операнда, и определить, сохранит ли
ассемблер этот префикс при формировании соответствующей машинной команды.
assume ds:d1, es:e1, ss:s1
mov ax,d
mov ax,e
mov ax,s
add ax,d[bx]
add ax,e[si]
add ax,s[bx+di]
cmp ax,d[bp]
cmp ax,e[bp+2]
cmp ax,s[bp+di]
inc byte ptr [di]
inc word ptr [si+bp-1]
7.5 c segment
assume cs:c
x dw 1
beg: mov ax,y
add ax,x
...
y dw 2
c ends
При трансляции команды mov ассемблер зафиксирует ошибку, тогда как транс-
ляция команды add пройдет без ошибки. В чем разница между этими двумя
случаями? Как исправить ошибку в команде mov?
7.6 include io.asm
s segment stack
db 128 dup(?)
s ends
d1 segment
x dw 20000 dup(?)
d1 ends
d2 segment
y dw 20000 dup(?)
d2 ends
c segment
assume ... ;директива уточняется в условии задачи
beg: ... ;ввод массивов x и y
...
(*)
outint ax ;вывод ответа
finish
c ends
end beg
Вставьте в эту программу вместо (*) команды, которые проверяют на равенс-
тво массивы x и y и записывают ответ (1 - равны, 0 - не равны) в регистр
ax. Предполагается, что до этих команд значения сегментных регистров не
определены и что в этой программе задана следующая директива assume (дру-
гих таких директив нет, новые не вводить):
а) assume cs:c, ds:d1, es:d2
б) assume cs:c, ds:d1
в) assume cs:c
7.7 Пусть в сегменте a описан массив x, в сегменте b - массив y, а в
сегменте c - массив z, причем каждый из этих массивов состоит из 45000
знаковых чисел-байтов. Выписать фрагмент программы, в котором все отрица-
тельные элементы массива x переносятся в начало массива y, а все осталь-
ные элементы - в начало массива z, в предположении, что до этого фрагмен-
та указана директива assume, в которой сегменту a поставлен в соответст-
вие регистр ds, и что этот регистр уже установлен на начало сегмента a.
7.8 Требуется записать в регистр ax слово памяти из ячейки с абсолют-
ным адресом 20a75h. Определить, какие из следующих групп команд правильно
решают эту задачу:
а) mov bx,20a75h б) mov bx,20a7h в) mov es,20a7h
mov ax,[bx] mov ax,[bx+5] mov ax,es:5
г) mov ax,20a7h д) mov ax,20a7h е) mov ax,20a7h
mov es,ax mov ds,ax mov ds,ax
mov ax,es:5 mov ax,5 mov bx,5
mov ax,[bx]
7.9 Выписать фрагмент программы, в котором определяется, сколько ну-
левых байтов среди 300 байтов, начинающихся с абсолютного адреса 3fff8h,
и ответ записывается в регистр ax.
7.10 Описать полную программу для решения следующей задачи.
а) Ввести непустой текст из любых символов (кроме точки), за которым
следует точка, и вывести этот текст, удалив из него лишние пробелы (из
подряд идущих пробелов оставить только один).
б) Ввести текст из 50 символов и определить, симметричен ли он. В ка-
честве ответа вывести "симметричен" или "не симметричен".
в) Ввести текст из 100 (любых) символов и для каждой большой латинс-
кой буквы определить, сколько раз она входит в этот текст.
г) Ввести 45 различных знаковых чисел и найти сумму чисел между мак-
симальным и минимальных из этих чисел.
д) Ввести дату, заданную в формате
<десятичное число>/<номер месяца римскими цифрами>
(например: 5/xii, 12/iv), и вывести ее в формате
<десятичное число> <название месяца>
(например: 5 декабря, 12 апреля).
Глава 8. СТЕК.
Сегмент стека, регистры ss и sp. Стековые команды (push, pop, pushf,
popf). Приемы работы со стеком. Регистр bp и доступ к элементам стека.
УПРАЖНЕНИЯ.
8.1 x и y - переменные размером в двойное слова. Выписать команды,
которые пересылают значение x в y через стек, т.е. выполняют присваивание
y:=x.
8.2 Определить, какие значения будут находиться в байте с адресом
ss:sp и в байте с адресом ss:(sp+1) после выполнения команд
mov ax,0102h
push ax
8.3 Если на сегмент стека отведено 200 байтов и текущее значение ре-
гистра sp равно 150, то сколько сейчас слов записано в стеке?
8.4 Под сегмент стека отведено 256 байтов. Выписать группу команд,
записывающих в стек содержимое регистра dx, но только если стек не полон
(при полном стеке передать управление на метку err1), и группу команд,
считывающих в регистр dx слово из вершины стека, но только если стек не
пуст (при пустом стеке передать управление на метку err2).
8.5 Выписать фрагмент программы, в котором вводится вводится последо-
вательность ненулевых чисел, заканчивающаяся нулем, и эти числа выводятся
в обратном порядке, но только если среди них нет отрицательных чисел (в
противном случае ничего не выводить). Исходное значение регистра sp долж-
но быть сохранено.
8.6 В стек записано 40 слов. Определить, сколько из них нулевых, и
записать ответ в регистр al.
8.7 В стек записано 49 байтов. Определить, есть ли среди них хотя бы
два одинаковых. Ответ 1 (есть) или 0 записать в регистр al.
8.8 Пусть под сегмент стека отведено 200 слов и пусть в сегменте дан-
ных описан массив x из 200 слов. Скопировать в начало этого массива теку-
щее содержимое стека ("верхнее" слово стека должно быть записано в на-
чальный элемент массива), заполнив нулями оставшуюся часть массива. Зна-
чения регистров sp и bp должны быть сохранены.
8.9 Под сегмент стека отведено 30 слов. Скопировать текущее содержи-
мое стека в область памяти, начинающуюся с абсолютного адреса 3b128h.
Значения регистров ds, es, ss, sp и bp должны быть сохранены.
8.10 В стек записано 14 слов, каждое из которых - это адрес (смеще-
ние) некоторого байта в сегменте данных. Обнулить все эти байты.
8.11 Выписать программу для решения следующей задачи.
а) Для ввода задана последовательность символов, представляющая собой
(без ошибок) формулу следующего вида:
<формула> ::= <цифра> | (<формула> <знак> <формула>)
<знак> ::= + | -
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9