Пример 6. Деление
Записать эквивалентную данному фрагменту на языке Си программу на языке ассемблера.
static int x, y; ... x /= -y; |
Решение:
Поскольку x и y объявлены как статические переменные, размещаем их в секции неинициализированных статических данных.
section .bss x dd 1 y dd 1 |
Реализация выражения, в котором происходит деление, состоит из загрузки значений переменных x и y на регистры, обращения знака, деления и выгрузки полученного результата обратно в память.
section .text mov eax, dword [х] ;Записываем в регистр eax значение ; переменной x. Поскольку в дальнейшем ; это значение будет выступать в ; качестве делимого, его необходимо ; разместить в паре регистров edx:eax ; Таким образом, 32-разрядное знаковое ; число будет расширено до 64 разрядов. ; верхние 32 разряда заполнятся знаковым ; битом. mov edx, eax ; Копируем значение переменной x в edx sar edx, 31 ;Сдвигаем число на 31 разряд – все ; заряды регистра будут заполнены ; знаковым битом, т.к. сдвиг ; арифметический, пара регистров edx:eax ; готова к знаковому делению. mov ecx, dword [y] ;Записываем в регистр ecx значение ; переменной y neg ecx ; Меняем знак числа, т.е. получаем ; значение (–y) idiv ecx ; делим mov dword [x], eax ; частное из регистра eax записываем в ; память, где размещена переменная x |
Пример 7. Присваивание различных типов
Реализовать присваивание b = a; (не более двух команд) при условии:
// a static unsigned char a; static unsigned int b; // b static char a; static short b; |
Решение:
; a movzx eax, byte [a] mov dword [b], eax ; b movsx eax, byte [a] mov word [b], eax |
Пример 8. Значение регистра
Какое значение будут иметь регистры TL0 и TH0 таймера/счетчика, работающего в режиме 2 счета внешних событий, после поступления на его счетный вход 6 импульсов, если их начальное состояние следующее: TL0 = 252; TH0= 252 ?
Решение:
TL0 = 254; TH0= 252
Пример 9.Физический адрес
По какому физическому адресу расположен дескриптор сегмента, если в его селекторе значение поля индекса равно 4, бит TI=0, а базовый адрес в регистре глобальной таблицы дескрипторов GDTR равен 00010000h?
Решение:
00010020h
Пример 10. Прерывания
Через какой промежуток времени таймер-счетчик T/C0 микроконтроллера МК-51, работающего на тактовой частоте 12 МГц в режиме, обеспечивающем 16-разрядный счет, выдаст сигнал запроса прерывания, если его начальное состояние следующее: TH0=FFh, TL0=F5h ?
Решение:
11 мкс
Пример 11. Внешние события
Какое значение будут иметь регистры TL0 и TH0 таймера/счетчика, работающего в режиме 2 счета внешних событий, после поступления на его счетный вход 10 импульсов, если их начальное состояние следующее: TL0 = 250; TH0= 250 ?
Решение:
TL0 = 254; TH0= 250
Пример 12. Логические последовательности
На адресные входы дешифратора а2,а1,а0 поступает код 100, а на входы разрешения 0Е3, ~0Е2,0Е3 код 101. Что будет на входах у7,у6,у5,…,у0? Ответ привести в виде последовательности 1 и 0, начиная со старшего и кончая младшим разрядами выходного кода.
Решение:
Разрешающие входы объединены по «И», последовательно для разрешения выходов на входы 0Е должны поступать активные значения логических уровней, что выполняется в приведенном примере (0Е1=1, ~0Е2=0,0Е3=1). В соответствии с определением работы дешифратора активным станет тот выход, номер которого равен десятичному или 1*2²+0*2¹+0*2º=4(DEC). Поэтому активным станет 4-ый выход. Из рисунка видно, что выходы дешифратора прямые, следовательно на четвертом выходе появится 1, а на остальных-0 и ответом будет последовательность:00010000.
