1 Циклы и ветвления на языке Ассемблера. Макропрограммирование
1 Циклы и ветвления на языке Ассемблера. Макропрограммирование Архитектура компьютера. Модуль 2. Тема 4.
2 План Реализация переходов на языке Ассемблера Циклы на языке Ассемблера. Программирование процедур на Ассемблере Работа со стеком Понятие о макропрограммировании
3 1. Реализация переходов на языке Ассемблера близкий переход: меняется только значение регистра IP, дальний (межсегментный) переход: меняются значения обоих регистров (CS,IP)
4 Команды безусловного перехода jmp op1
5 Для указания близкого относительного перехода в команде обычно записывается метка команды, на которую необходимо выполнить переход jmp L;
6 L: add bx,bx ; <─┐ . . . │ . . . │ i8 или i16 (со знаком !) . . . │ jmp L <─┘ ; L = i8 или i16
7 Команды условного перехода j<мнемоника перехода> i8; IP := (IP + i8)mod 216 Анализируются: регистр CX; один флаг; два флага (например, SF = OF ); три флага (например, (SF=OF) and (ZF=0) ). Мнемоника перехода (это от одной до трёх букв) связана со значением анализируемых флагов (или регистра CX), либо со способом формирования этих флагов
8 формирование флагов: cmp op1,op2 При сравнении знаковых целых чисел первый операнд может быть больше (greater) или меньше (less) второго операнда. При сравнении же беззнаковых чисел первый операнд выше (above) или ниже (below) второго
9
10 Пример. Пусть X, Y, Z – переменные размером слово. Требуется записать в Z максимальное из чисел X, Y. Решение для чисел со знаком: MOV AX, X CMP AX, Y JGE M MOV AX, Y M: MOV Z, AX
11 2. Циклы на Ассемблере loop L; используется неявный операнд – регистр CX mov CX,N jcxz L1 L: . . . ; тело цикла – . . . ; оператор S loop L L1: . . .
12 Mov AX, 1 ; AX:=0! Mov CL, N Mov CH, 0 ; CX:=N как слово JCXZ F1 Mov SI, 1 ; i:=1 F: Mul SI ;(DX,AX):=AX*i Inc SI ; i:=i+1 Loop F F1: Пример. Пусть N – байтовая переменная со значением от 0 до 8. Надо в регистр AX записать факториал этого числа. Отметим, что 8!< 216.
13 Команды loopz L loope L выполняются по схеме Dec(CX); if (CX<>0) and (ZF=1) then goto L; Команды loopnz L loopne L Выполняются по схеме Dec(CX); if (CX<>0) and (ZF=0) then goto L;
14 3. Программирование процедур на Ассемблере Процедура – это участок программы, который начинается директивой <имя процедуры> proc и заканчивается директивой <имя процедуры> endp
15 Вызов процедуры обычно производится командой call, а возврат из процедуры – командой ret.
16 Соглашения о связях между процедурой и основной программой Фактические параметры перед вызовом процедуры или функции записываются в стек. Если в процедуре или функции необходимы локальные переменные, то место им отводится в стеке. Функция возвращает своё значение в регистрах al, ax или в паре регистров
17 … Summa proc ; соглашение о связях: bx – адрес первого элемента ; cx=количество элементов, ax – ответ (сумма) sub ax,ax; сумма:=0 L: add ax,[bx] add bx,2 loop L ret Summa endp start: mov ax,@data mov ds,ax ; здесь команды для ввода массивов X и У mov bx, offset X; адрес начала X mov cx,100; число элементов в X call Summa mov Sum,ax; сумма массива X mov bx, offset Y; адрес начала Y mov cx,200; число элементов в Y call Summa add Sum,ax; сумма массивов X и Y …
18 4. Работа со стеком Стек - аппаратная реализация абстрактной структуры данных стек Стек – это хранилище, работа с которым ведется по следующему правилу: элемент, записанный в стек последним, считывается из него первым.
19
20 push op1 где op1 может иметь форматы r16, m16, CS,DS,SS,ES, записывает в стек слово, определяемое своим операндом.
21 pop op1 где op1 может иметь форматы r16, m16, SS, DS, ES, читает из стека слово и записывает его в место памяти, определяемое своим операндом.
22 pushf записывает в стек регистр флагов FLAGS, popf читает из стека слово и записывает его в регистр флагов FLAGS.
ak_modul2_tema4_11-12.ppt
- Количество слайдов: 22