Страница 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)
; - введение комментариев в текст программы. В программе существуют: (слайд №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 < операнд назначения>, < операнд источника> Особенности применения:
Индексные регистры: (слайд №12)
Страница 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|