Шпаргалка по "Программированию"
Автор: Илья • Октябрь 22, 2019 • Шпаргалка • 1,561 Слов (7 Страниц) • 380 Просмотры
1. Инициализация exe-программы CODESG SEGMENT PARA 'CODE' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKG PUSH DS ;Записать DS в стек SUB AX,AX ;Установить ноль в AX PUSH AX ;Записать ноль в стек MOV AX,DATASG ;Занести адрес MOV DS,AX ; DATASG в DS RET ;Возврат в DOS BEGIN ENDP CODESG ENDS END BEGIN | 2. Инициализация сегмента «data» Если СОМ-программа, то стэк, данные и код в одном сегменте. Если ЕХЕ-программа то используют регистры сегментов: CS (регистр сегмента кода), DS (регистр сегмента данных), SS (регистр сегмента стека), ES (регистр сегмента дополнительных данных). Непосредственно адрес в сегментный регистр передать невозможно. Поэтому адрес сперва передается в "обычный" регистр АХ, а потом из регистра АХ в сегментный регистр Без инициализации сегмента данных невозможно правильно обращаться к переменным, которые находятся в этом сегменте. Значение регистра изменяется только через другие регистры. Для указания сегмента данных используется регистр DS. То есть этот регистр должен указывать на начало данных в программе или на сегмент DATASEG. @data - это идентификатор DATASEG при компиляции и сборки приложения на место этого слова будет поставлено реальное смещение сегмента, в котором находятся данные. .286 ;директива - указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .MODEL Small ;действующая модель малая .STACK 100h ;установка размера стека .DATA ;начало сегмента данных программы .CODE ;начало сегмента кода Start: ; пролог mov ax,@data ;в регистре АХ сегмент данных mov ds,ax ;регистр DS стал равен АХ (т.е. = сегменту) ... ;эпилог mov ax,4C00h ;завершение программы int 21h ;выходим из программы END Start | 3. Вывод на экран надписи «enter» DOSSEG ;директива .MODEL SMALL ;действующая модель малая .STACK 100h ;установка размера стека .DATA ;начало сегмента данных программы Message DB 'enter',13,10,'$' .CODE ;начало сегмента кода mov ax,@Data ;в регистре АХ сегмент данных mov ds,ax ;регистр DS стал равен АХ (т.е. = сегменту) mov ah,9 ; функция DOS вывода строки mov dx,OFFSET Message ; ссылка на сообщение "enter" int 21h ; вывести "enter" на экран mov ah,4ch ; функция DOS завершения программы int 21h ; завершить программу END | 4. Считывание c клавиатуры .286 ;директива - указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .stack 100h ;установка размера стека .data ;начало сегмента данных программы Buffer db 60,?,60 dup (?) ; db (директива) .code ;начало сегмента кода start: mov ax,@data ;в регистре АХ сегмент данных mov ds,ax ;регистр DS стал равен АХ (т.е. = сегменту) mov ah,0Ah mov dx,offset buffer int 21h ;ввод строки с клавиатуры mov ah,4Ch ;завершение программы int 21h ;завершить программу end start |
5. Подготовка регистров к проведению цикла сравнения строк fam и tabs .286 директива- указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .data ;начало сегмента данных программы PASSWORD DB 'qwerty',0Dh ;строка для сравнения BUFFER_KLAV DB 50,?,50 DUP (?) ;буфер клавиатуры str1 db 'Введите пароль',13,10,'$' str2 db 13,10,'пароль неверный!$' str3 db 13,10,'пароль угадан!$' .code ;начало сегмента кода start: mov ax,@data mov ds,ax ;настроили сегметы данных mov es,ax mov ax,3 ;очистили экран int 10h mov ah,9 mov dx,offset str1 int 21h mov ah,0Ah mov dx,offset BUFFER_KLAV int 21h CLD ;просмотр строки в направлении возрастания адресов MOV CX,10 ;длина цепочки cmp cl,BUFFER_KLAV+1 JNZ M1; длина строк разная - на выход MOV SI,OFFSET PASSWORD ;в DS:SI адрес пароля MOV DI,offset BUFFER_KLAV+2 ;в ES:DI адрес буфера клавиатуры REPE CMPSB ;сравнивать, пока равны, если не конец JNZ M1 ; строки, то встретились разные элементы mov dx,offset str3;действия, если элементы строки совпали jmp m2 M1: ;действия, если элементы строки не совпали mov dx,offset str2 m2: mov ah,9 ; выводим на экран int 21h mov ah,0;ждем нажатия на клавиатуру int 16h mov ah,4Ch;завершаем программу int 21h end start | 6. Сравнение строк fam и tabs .286 ;директива - указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .data ;начало сегмента данных программы PASSWORD DB 'qwerty',0Dh ;строка для сравнения BUFFER_KLAV DB 50,?,50 DUP (?) ;буфер клавиатуры str1 db 'Введите пароль',13,10,'$' str2 db 13,10,'пароль неверный!$' str3 db 13,10,'пароль угадан!$' .code ;начало сегмента кода start: mov ax,@data mov ds,ax ;настроили сегметы данных mov es,ax mov ax,3 ;очистили экран int 10h mov ah,9 mov dx,offset str1 int 21h mov ah,0Ah mov dx,offset BUFFER_KLAV int 21h CLD ;просмотр строки в направлении возрастания адресов MOV CX,10 ;длина цепочки cmp cl,BUFFER_KLAV+1 JNZ M1; длина строк разная - на выход MOV SI,OFFSET PASSWORD ;в DS:SI адрес пароля MOV DI,offset BUFFER_KLAV+2 ;в ES:DI адрес буфера клавиатуры REPE CMPSB ;сравнивать, пока равны, если не конец JNZ M1 ; строки, то встретились разные элементы mov dx,offset str3;действия, если элементы строки совпали jmp m2 M1: ;действия, если элементы строки не совпали mov dx,offset str2 m2: mov ah,9 ; выводим на экран int 21h mov ah,0;ждем нажатия на клавиатуру int 16h mov ah,4Ch;завершаем программу int 21h end start | 7. Очистка экрана .286 ;директива- указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .code ;начало сегмента кода start: mov ax,@data mov ds,ax mov CH,0 mov CL,0 mov DH,25 mov DL,80 mov BH,07 mov AH,06 mov AL,0 int 10h end start | 8. Установка (текстового) курсора .286 ;директива- указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .code ;начало сегмента кода start: mov ax,3 int 10h ;установлен текстовый режим 80х25 mov ah,2 mov dx,0 int 10h ;курсор мигает в левом верхнем углу mov ah,0 ;нажимаем на любую клавишу int 16h mov ah,2 mov dx,0C28h int 10h ;курсор мигает в центре экрана mov ah,0 ;нажимаем на любую клавишу int 16h mov ah,2 mov dx,184Fh int 10h ;курсор мигает в правом нижнем углу mov ah,0 ;нажимаем на любую клавишу int 16h mov ah,4Ch ;программа завершается int 21h end start |
9. Вывод на экран содержимого младшего байта AX .286 ;директива- указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .data ;начало сегмента данных программы a db 'AL=000$' .code ;начало сегмента кода start: mov ax,@data mov ds,ax ;настроили сегмент данных mov ax,3 ;очистили экран int 10h mov ax,25AFh ;вставляем любое число and ax,0FFh ;избавляемся от содержимого старшей половины регистра aam ;переводим из 16-ричного вида в 10-чный add a+3,al shr ax,8 aam add a+5,ah add a+4,al mov dx,offset a mov ah,9; выводим на экран int 21h mov ah,0;ждем нажатия на клавиатуру int 16h mov ah,4Ch ;завершаем программу int 21h end start [pic 1] | 10. Определение позиции курсора .286 ;директива- указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .data ;начало сегмента данных программы sing db "Jingle bells, jingle bells",13,10 db "Jingle all the way",13,10 db "Oh, what fun it is to ride",13,10 db "In a one-horse open sleigh$"; первые строки новогодней песенки X db ?;место под Х координату курсора Y db ?;место под Y координату курсора str2 db 13,10,"X=",?,?," Y=",?,?,"$";строка с координатами курсора .code ;начало сегмента кода start: mov ax,@data mov ds,ax mov ax,3 int 10h;чистим экран mov ah,9 mov dx,offset sing int 21h;выводим песенку, курсор на 4 строке в 26 колонке при выводе отсчет с нуля mov ah,0 int 16h;ждем пока не нажмут на клавиатуру mov ah,3 int 10h;получаем координаты курсора mov X,dh mov Y,dl;сохраняем координаты mov al,X aam add ax,"00" mov str2+4,ah mov str2+5,al mov al,Y aam add ax,"00" mov str2+9,ah mov str2+10,al mov ah,9 mov dx,offset str2 int 21h;выводим координаты в 10-ричном виде mov ah,0 int 16h;ждем пока не нажмут на клавиатуру mov ah,4Ch int 21h;завершаем программу end start | 11. Подготовка к выводу на экран содержимого старшего байта AX .286 ;директива- указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .data ;начало сегмента данных программы a db 'AH=000$' .code ;начало сегмента кода start: mov ax,@data mov ds,ax ;настроили сегмент данных mov ax,3 ;очистили экран int 10h mov ax,0ABCDh ;вставляешь любое число shr ax,8 ;избавляемся от содержимого младшей половины регистра aam;переводим из 16-ричного вида в 10-чный add a+5,al shr ax,8 aam add a+3,ah add a+4,al mov dx,offset a mov ah,9 ; выводим на экран int 21h mov ah,0;ждем нажатия на клавиатуру int 16h mov ah,4Ch;завершаем программу int 21h end start | 12. Вывод на экран содержимого старшего байта AX .286 ;директива- указывает ассемблеру что в данной программе могут встречаться команды не только процессора 8086, но и 80286 .model small ;действующая модель малая .data ;начало сегмента данных программы a db 'AH=000$' .code ;начало сегмента кода start: mov ax,@data mov ds,ax ;настроили сегмент данных mov ax,3 ;очистили экран int 10h mov ax,25AFh ;вставляем любое число shr ax,8 ;избавляемся от содержимого младшей половины регистра aam ;переводим из 16-ричного вида в 10-чный add a+3,al shr ax,8 aam add a+5,ah add a+4,al mov dx,offset a mov ah,9 ;выводим на экран int 21h mov ah,0 ;ждем нажатия на клавиатуру int 16h mov ah,4Ch ;завершаем программу int 21h end start [pic 2] |
...