Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Страница 5 «5 Пример программы»




Страница 5 «5 Пример программы»

Пример программы вывода массива строк.

 (слайд№7)

 

                  . MODEL SMALL; Модель памяти

                  . STACK 200h; Размер стека

                   LOCALS; Разрешение локальных переменных (@@имя)

                  ; Объявление данных

                  . DATA; Начало сегмента данных

; char *txt[]= {" Иванов И. И. ", " ОАО \" ПАРУС\" ",

;                    " Ведущий программист", NULL};

TXT           DW S1, S2, S3, 0

S1               DB 'Иванов И. И. ', 0

S2               DB 'ОАО " ПАРУС" ', 0

S3               DB 'Ведущий программист', 0

                  . CODE

BEGIN:     ; инициализация сегментного регистра DS

                   MOV AX, @DATA; @DATA закреплено за сегментным

                   MOV DS, AX

                  ; s = txt;

                   LEA SI, TXT; SI – указатель массива адресов строк

                  ; ПОКА не встретился нулевой указатель,

                  ; выводить строки текста

@@L:        ; while(*s! = NULL) {

                   CMP WORD PTR [SI], 0

                   JE @@R

                  ; puts(*s);

                   MOV DI, [SI]

                   CALL PUTS

                  ; s++; }

                   ADD SI, 2

                   JMP SHORT @@L

@@R:        ; return(0);

                   MOV AH, 4Ch

                   MOV AL, 0

                   INT 21h

; Макрос вывода символа на экран

PUTC         MACRO CHAR

IFNB         < CHAR>

                   MOV DL, CHAR

ENDIF

                   MOV AH, 2

                   INT 21h

                   ENDM

; Процедура вывода строки, адресуемой DI

PUTS         PROC NEAR

                   PUSH DX

                  ; Цикл посимвольного вывода строки

                  ; for(; (_DL = *_DI)! = ‘\0’; _DI++)

@@L:         MOV DL, [DI]

                   CMP DL, 0

                   JE @@E

                  ; putc(_DL);

                   PUTC

                   INC DI

                   JMP SHORT @@L

@@E:         PUTC 13; Переход

                   PUTC 10; на новую строку

@@R:         POP DX

                   RET

PUTS         ENDP

END BEGIN

 


Страница 6 «5 Пример программы»

«5. 1. Разбор программы примера»

Построчный разбор программы примера:

Модель памяти:

(слайд №8)

 

Модель Распределение объектов программы по сегментам Тип указателя на данные Тип указателя на функцию
tiny все в одном near near
small Код в одном. Данные и стек в другом. near near
medium Код в нескольких. Данные и стек в одном. near far
compact Код в одном. Данные и стек в нескольких. far near
large Код в нескольких. Данные и стек в нескольких. far far
huge “-“ huge far
flat как tiny, но все адреса 32-разрядные 32-разр. 32-разр.

 

; - введение комментариев в текст программы.

В программе существуют:

(слайд №9)

 

1. сегменты стека (. STACK размер), адресуется сегментным регистром SS;

2. сегмент данных (. DATA), адресуется сегментным регистром DS;

3. сегмент кода (. CODE), адресуется сегментным регистром CS.

 

Существует еще сегментный регистр ES – используется некоторыми операциями над строками.

 

Регистры общего назначения:

(слайд №10)

 

1. AX – является основным сумматором и применяется для всех операций ввода-вывода, некоторых операций над строками и некоторых арифметических операций; AX: AH AL;

2. BX – является базовым регистром; единственный регистр общего назначения, который может использоваться в качестве «индекса» для расширенной адресации; BX: BH BL;

3. CX – является счетчиком; необходим для управления числом повторений циклов и для операций сдвига влево и вправо, также используется для вычислений; CX: CH CL;

4. DX – является регистром данных; применяется для некоторых операций ввода-вывода и тех операций умножения и деления над большими числами, которые используют регистровую пару DX: AX.

 

Команда MOV:

(слайд №11)

 

       Это основная команда пересылки данных.

mov  < операнд назначения>, < операнд источника>

Особенности применения:

  1. нельзя осуществлять пересылку из одной области памяти в другую; если это необходимо, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения;
  2. нельзя загрузить в сегментный регистр значение непосредственно из памяти, поэтому для выполнения такой загрузки нужно использовать промежуточный объект (регистр общего назначения или стек);
  3. нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр, для выполнения подобной операции нужно также использовать регистры общего назначения.
  4. нельзя использовать сегментный регистр CS в качестве операнда назначения, т. к. пара CS: IP всегда содержит адрес команды, которая должна выполняться следующей

 

Индексные регистры:

(слайд №12)

 

  1. SI – является индексом источника и применяется для некоторых операций над строками, часто связан с регистром DS;
  2. DI – является индексом назначения и применяется также для строковых операций, часто связан с регистром ES.
  3.  


Страница 7 «5 Пример программы. »

                   «5. 2. Продолжение разбора программы примера»

Команда LEA:

(слайд №13)

 

       Производит загрузку эффективного адреса.

lea назначение, источник

Команда CMP:

(слайд №14)

 

       Выполняет вычитание операндов и устанавливает флаги.

CMP операнд 1, операнд 2

       Флаги устанавливаемые этой командой можно анализировать специальными командами условного перехода.

 

Флаговый регистр:

(слайд №15)

 

       9-ть из 16-ти бит этого регистра являются активными и определяют текущее состояние машины.

 

Номер бита: 15 14 13 12 11 10 9 8 7 6  5 4  3 2  1 0

Флаг:         * * * * O D I T S Z * A * P * C

CF (Carry Flag) - флаг переноса. Содержит значение " переносов" (0 или 1) из старшего разряда при арифметических операциях и некоторых операциях сдвига и циклического сдвига.

PF (Parity Flag) - флаг четности. Проверяет младшие восемь бит pезультатов операций над данными. Нечетное число бит приводит к установке этого флага в 0, а четное - в 1. Не следует путать флаг четности с битом контроля на четность.

AF (Auxiliary Carry Flag) - дополнительный флаг переноса. Устанавливается в 1, если арифметическая операция приводит к переносу четвертого справа бита (бит номер 3) в регистровой однобайтовой команде. Данный флаг имеет отношение к арифметическим операциям над символами кода ASCII и к десятичным упакованным полям.

ZF (Zero Flag) - флаг нуля. Устанавливается в качестве результата aрифметических команд и команд сравнения. Как это ни странно, ненулевой результат приводит к установке нулевого значения этого флага, а нулевой - к установке единичного значения. Кажущееся несоответствие является, однако, логически правильным, так как 0 обозначает " нет" (т. е. результат не равен нулю), а единица обозначаeт " да" (т. е. результат равен нулю). Команды условного перехода JE и JZ проверяют этот флаг.

SF (SIgn Flag) - знаковый флаг. Устанавливается в соответствии со знаком результата (старшего бита) после арифметических опеpаций: положительный результат устанавливает 0, а отрицательный - 1. Команды условного перехода JG и JL проверяют этот флаг.

TF (Trap Flag) - флаг пошагового выполнения. Этот флаг вам уже приходилось устанавливать, когда использовалась команда Т в отладчике DEBUG. Если этот флаг установлен в единичное cостояние, то процессор переходит в режим пошагового выполнения команд, т. е. в каждый момент выполняется одна команда под пользовательским управлением.

IF (Interrupt Flag) - флаг прерывания. При нулевом состоянии этого флага прерывания запрещены, при единичном - разрешены.

DF (DIrection Flag) - флаг направления. Используется в строковых операциях для определения направления передачи данных. При нулевом состоянии команда увеличивает содержимое регистров SI и DI, вызывая передачу данных слева направо, при нулевом - уменьшает содержимое этих регистров, вызывая передачу данных справа налево.

OF (Overflow Flag) - флаг переполнения. Фиксирует арифметическое переполнение, т. е. перенос вниз старшего (знакового) бита при знаковых арифметических операциях.

 


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...