Программирование на Ассеблере

3 курс 2 семестр
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Программирование на Ассеблере

Сообщение Артём Мамзиков »

Архив 200 руб
Содержимое архива
Содержимое архива
Содержимое архива
По номеру в журнале
Можно в программе DOSBOX

Готовый Вариант № 10
Задание на контрольную работу ЗЭВ-31у
Дисциплина «Программирование на ассемблере»
10. Перехватив прерывание от таймера вывести на экран последовательность степеней числа 3. Вывод прекратить, когда числа выйдут за пределы 16-разрядной сетки.

В приведенном ниже листинге обработчик прерываний расположен в конце программы, после главной процедуры main. Взаимное расположение процедур не имеет ни малейшего значения; с таким же успехом обработчик можно было поместить в начале программы. Не имеет также значения, выделен ли обработчик в отдельную процедуру или просто начинается с метки.
Для того, чтобы прикладной обработчик получал управление в результате прерываний, его адрес следует поместить в соответствующий вектор прерывания. При этом исходное содержимое вектора будет затерто, и если прерывания будут поступать и после завершения программы, возникнет весьма неприятная ситуация, когда управление будет передаваться по адресу, по которому в памяти может располагаться что угодно. Поэтому стандартной методикой является сохранение в памяти исходного содержимого вектора и восстановление этого содержимого перед завершением программы.
Хотя и чтение, и заполнение вектора прерываний можно выполнить с помощью простых команд mov, однако предпочтительнее использовать специально предусмотренные для этого функции DOS. Для чтения вектора используется функция с номером 35h. В регистр AL помещается номер вектора. Функция возвращает исходное содержимое вектора в парс регистров ES:BX (легко догадаться, что в ES сегментный адрес, а в ВХ смещение). Для хранения исходного содержимого вектора в сегменте данных предусмотрена двухсловная ячейка old_08. В младшем слове этой ячейки (с фактическим адресом old_08) будет хранится смещение, в старшем (с фактическим адресом old_08+2) - сегментный адрес. Для того, чтобы обратиться к словам, составляющим эту ячейку, приходится использовать описатель word ptr, который как бы заставляет транслятор на время забыть о начальном объявлении ячейки и позволяет рассматривать ее, как два отдельных слова.

code segment
assume CS:code,DS:data
;Главная процедура
main proc
mov AX,data ; Инициализация сегментного
mov DS,AX ; регистра DS
;Сохраним исходный вектор
mov AH,35h ; Функция получения вектора
mov AL,08h ; Номер вектора
int 21h
mov word ptr old_08,BX ; Смещение исходного обработчика
mov word ptr old_08+2,ES ; Сегмент исходного обработчика
;Установим наш обработчик
mov AH,25h ;Функция заполнения вектора
mov AL,08h ; Номер вектора
mov DX,offset my_08 ; Смещение нашего обработчика
push DS ; Сохраним DS=data
push CS ; Перепишем CS в DS
pop DS ; через стек. DS:DX->new_08
... ; Продолжение основной программы (здесь тело любой программы в которую встроен обработчик)
int 21h
pop DS ; Восстановим DS=data
; Перед завершением программы восстановим исходный вектор
Ids DX ,old_08 ; Заполним DS:DX из old_08
mov AH,25h ; Функция заполнения вектора
move AL,08h ; Номер вектора
int 21h
mov AX,4C00h ;Функция завершения программы
int 21h
main endp
;Процедура обработчика прерываний от таймера
my_08 proc
push AX ;Сохраним исходное значение AX
mov ax,3
a1: mul 3
JC a2
push ax ;Cохраним число
push -1 ;Сохраним признак конца числа
mov cx,10 ;Делим на 10
l: mov dx,0 ;Очистим регистр dx (xor dx,dx - оптимальнее)
div cx ;Делим
push dx ;Сохраним цифру
cmp ax,0 ;Остался 0? (оптимальнее or ax,ax)
jne l ;нет -> продолжим
mov ah,2h
l2: pop dx ;Восстановим цифру
cmp dx,-1 ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex}
je ex
add dl,'0' ;Преобразуем число в цифру
int 21h ;Выведем цифру на экран
jmp l2 ;И продолжим
ex: mov ax,4c00h ;Выход
int 21h

pop ax ;Восстановим число
Loop a1
a2: mov AL,20h ;Разблокировка прерываний
out 20h,AL ;в контроллере прерываний
pop AX ;Восстановим AX
iret ;Возврат в прерванную программу
my_08 endp
code ends
data segment
old_08 db 0 ;Ячейка для хранения исходного вектора
data ends
stk segment stack
db 256 dup(U)
stk ends
end main
Последний раз редактировалось Артём Мамзиков Ср апр 03, 2019 20:02, всего редактировалось 1 раз. количество слов: 227
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Программирование на Ассеблере

Сообщение Артём Мамзиков »

Лабораторная работа №1
Исследование организации вычислительных машин с регистровой архитектурой.

1.1. Цель работы
Практическое ознакомление с видами адресации операндов и форматами представления данных микропроцессоров семейства х86 (представителями регистровой архитектуры). Овладение навыками работы с пакетом TASM, ознакомление с логическими и арифметическими командами, работа со стеком.

1.2. Теоретические сведения
История развития процессоров Intel семейства х86 началась с микро-процессора (мп) i8086, который своей 20-разрядной адресной шиной охватывает пространство в 1 Мб. Большинство регистров i8086 были 16-разрядными. Формирование 20-разрядного физического адреса с помощью 16-разрядных регистров происходило следующим образом (рис. 1.1) – процессор аппаратно сдвигал содержимое одного из четырех сегментных регистров cs, ds, es или ss, а затем суммировал это значение с эффективным адресом (EA- effective address).
В реальном режиме адресации возможно различное расположение кода данных и программ в сегментах. TASM поддерживает следующие основные модели памяти: tiny, small, medium, compact, large. Программа, которую требуется оттранслировать и скомпоновать, набирается в любом текстовом редакторе и состоит из следующих частей: заголовка, макроопределений, данных, тела и заключения. Заголовок имеет обычно следующий вид:
%TITLE ‘Необязательный – описывает назначение программы'
IDEAL; определяет режим ассемблирования
MODEL small; задает модель памяти
STACK 256; определяет размер стека в 256 байт.

Цепочечные команды позволяют производить действия над блоками
памяти, представляющими собой последовательности элементов следующего размера:
1) 8 бит, то есть байт;
2) 16 бит, то есть слово;
3) 32 бита, то есть двойное слово.
Поддержка строк, имеющих размер элементов 32 бита, появилась в
процессорах i80386. Строковые команды делятся на три группы:
1) команды пересылки строк;
2) команды проверки строк;
3) команды префикса повторения.

Использование команды пересылок
В любом текстовом редакторе набрать следующую программу и сохранить ее с расширением .asm (номера строк набирать не надо).
Программа 3.1 mov.asm
1: %TITLE ‘Использование команды mov'
2: MASM
3: MODEL small
4: .STACK 256
5: .DATA
6: exCode DB 0
7: var DB 99 ; однобайтовая переменная
8: .CODE
9: Start:
10: mov ax, @data ; установка в DS
11: mov ds, ax ;адреса сегмента данных
12: mov ax, 1 ; переслать конкретные данные
13: mov bx, 2 ; в регистры
14: mov cx, 3
15: mov dx, 4
16: mov ah, var ;загрузить значение var в ah
17: mov si, offset var1 ;загрузить адрес var в si
18: Exit:
19: mov ah, 04Ch ;функция DOS:выход из программы
20: mov al, exCod ;возврат значения кода ошибки
21: int 21h ;вызов DOS. Останов программы
22: END Start ;конец программы/ точка входа

После создания исходного файла с расширением *.asm, следует выполнить его трансляцию, набрав в командной строке любого менеджера файлов (FAR, NC и т.д.) следующую строку:
tasm /zi mov.asm , , ,
После успешной трансляции создается объектный файл mov.obj. Если файл с расширением *.obj не получен, то это говорит о том, что в исходном файле с расширением *.asm были ошибки. Локализовать их можно, либо посмотрев файл листинга (.lst), либо нажав Ctrl^0. Применение ключа /zi разрешает транслятору сохранить связь символических имен в программе и их смещений в сегменте кода. После получения объектного файла mov.obj следует выполнить его компоновку, набрав в командной строке любого менеджера файлов (FAR, NC и т.д.) следующую строку:
tlink/v mov.obj
После успешной компоновки создается исполняемый файл mov.exe. Ключ /v указывает компоновщику на необходимость отладочной ин-формации в исполняемом файле. После получения исполняемого файла следует запустить его в отладчике, набрав в командной строке любого менеджера файлов следующую строку:
td mov.exe
Перейдя в главное меню (верхняя строка) нажав клавишу F10 выбрать в нем пункт View (обзор) и подпункт CPU (центральный процессор). В этом случае в отладчике раскроется окно в котором будет отображаться исходный текст программы и двоичные коды команд; содержимое регистров процессора и состояние его регистра флагов; состояние стека и области данных программы.
Выполнить программу mov.exe в шаговом режиме. Выполнение про-граммы в пошаговом режиме осуществляется путем нажатия на клавиши F7 или F8 (различия между ними заключаются в том, что при нажатии на F7 будет осуществляться заход в процедуры, а на F8 – нет). Регистры, содержимое которых изменяется на данном шаге, подсвечиваются белым цветом.

Описать в сегменте данных инициализированные области памяти
размером байт, слово, двойное слово, инициализированную каким-то одним значением область памяти размером 10 байт, неинициализиро-ванную область памяти размером в 5 байт, слово и двойное слово, в правой части которых в директивах резервирования и инициализации стоит имя области памяти, используемое ранее для инициализации двойного слова, строчку ASCII символов (конец строки обозначается знаком $). Оттранслировав и скомпоновав программу, посмотрите в отладчике, как будут представлены, описанные данные. С помощью функции 09h прерывания int 21h выведите строчку ASCII символов на экран. Для вывода на экран можно использовать следующую последовательность команд:
mov ah, 09h
mov dx, offset message
int 21h.





Использование арифметических и логических команд, команд управления и пересылок
Составить программу, которая бы обеспечивала выполнение следующих действий:
1) Трижды бы складывала между собой значения операндов.
Этот фрагмент оформить в виде подпрограммы.

MASM
MODEL SMALL
.STACK 256
.DATA
op_2 dw 20h
.CODE
Start:
mov ax,@data
mov ds,ax

mov ax,4Eh
mov bx,67h

call Additional
call Additional
call Additional


Exit:
mov ax, 4c00h
int 21h
Additional PROC
add cx,ax
add cx, bx
add cx, op_2
ret
ENDP
END Start

Использование арифметических и логических команд, команд управления и пересылок
Составить программу, которая бы обеспечивала выполнение следующих действий:
2) Вычитала бы из полученной в пункте 1 суммы значение операн-да_3.
MASM
MODEL SMALL
.STACK 256
.DATA
op_2 dw 20h
.CODE
Start:
mov ax,@data
mov ds,ax

mov ax,4Eh
mov bx,67h

call Additional
call Additional
call Additional


Exit:
mov ax, 7с00h
int 21h
Additional PROC
add cx,ax
add cx, bx
add cx, op_2
ret
ENDP
END Start

Использование арифметических и логических команд, команд управления и пересылок
Составить программу, которая бы обеспечивала выполнение следующих действий:
3) Умножала бы полученный результат в пункте 2 на значение сум-мы, полученное в пункте 1.

MASM
MODEL SMALL
.STACK 256
.DATA
op_2 dw 20h
.CODE
Start:
mov ax,@data
mov ds,ax

mov ax,4Eh
mov bx,67h

call Additional
call Additional
call Additional


Exit:
mov ax, 73e0h
int 21h
Additional PROC
add cx,ax
add cx, bx
add cx, op_2
ret
ENDP
END Start
Использование арифметических и логических команд, команд управления и пересылок
Составить программу, которая бы обеспечивала выполнение следующих действий:
4) Делила бы полученный результат в пункте 3 на сумму первого и второго операнда.

MASM
MODEL SMALL
.STACK 256
.DATA
op_2 dw 20h
.CODE
Start:
mov ax,@data
mov ds,ax

mov ax,4Eh
mov bx,67h

call Additional
call Additional
call Additional


Exit:
mov ax, 94c0h
int 21h
Additional PROC
add cx,ax
add cx, bx
add cx, op_2
ret
ENDP
END Start
количество слов: 407
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Программирование на Ассеблере

Сообщение Артём Мамзиков »

Пояснительная записка к лабораторной работе.

«Исследование организации вычислительных машин с регистровой архитектурой»

Цель работы:
Практическое ознакомление с видами адресации операндов и форматами представления данных микропроцессоров семейства х86 (представителями регистровой архитектуры). Овладение навыками работы с пакетом TASM, ознакомление с логическими и арифметическими командами, работа со стеком.

Ход работы:
Использование арифметических и логических команд, команд управления и пересылок
Составить программу, которая бы обеспечивала выполнение следующих действий:

Оп_1: 8A
Оп_2: АА (сх)
Оп_3: D4 (dx)
Номер бит: 0,1

1) Трижды бы складывала между собой значения операндов,
приведенных в таблице . Этот фрагмент оформить в виде подпрограммы.
2) Вычитала бы из полученной в пункте 1 суммы значение операнда_3.
3) Умножала бы полученный результат в пункте 2 на значение суммы,
полученное в пункте 1.
4) Делила бы полученный результат в пункте 3 на сумму первого и
второго операнда.

После выполнения первых четырех действий в программе следует проверить, установлены ли в полученном частном соответствующие биты в единицу и, если они установлены, выполнить следующие действия

5) Дан массив A из 10 однобайтовых чисел. Найти в нем минимальный
элемент массива.







Листинг:
MASM
MODEL small
.STACK 256
.DATA
mas_A db 14h, 80h, 0eah, 36h, 22h, 0d4h, 0a5h, 90h, 1ah, 0c8h ;Задаем массив из 10 однобайтовых чисел
op_1 dw 8ah
.CODE
Start:
mov ax, @data
mov ds, ax ;Перенос значения регистра ax в регистр ds


mov cx, 0AAH ;Перенос значения 0AAH в регистр cx
mov dx, 0D4H ;Перенос значения 0D4H в регистр dx

call Additional
call Additional
call Additional ;Тройное сложение операндов


mov ax,bx ;Перенос значения регистра dx в регистр ax

sub bx,dx ;Вычитание из значения регистра dx значения регистра bx

mul bx ;Умножение на значение регистра bx

add cx, op_1 ;Сумма значений регистра cx и op_1

div cx ;Деление на значение регистра сx
and al,3
cmp al,3 Проверка установлены ли биты с номерами 0 и 1 в 1
jnz Exit
mov cx,9

xor si,si ;Настройка индексов на начало элементов массива
mov al,mas_A[si] ;Занесение в регистр al элемента массива A
m1:
inc si
cmp al,mas_A[si] ;Команда сравнения регистра
jb m2
mov al,mas_A[si] ;Занесение в регистр al элемента массива A
m2:

loop m1 ;Цикл

Exit:
mov ax, 04C00h ;Функция DOS 4Сh: выход из программы
int 21h ;Вызов DOS. Остановка
Additional PROC
add bx,cx ;Сумма значений регистров bx и cx
add bx, dx ;Сумма значений регистров bx и dx
add bx, op_1 ;Сумма значений регистров bx и op_1
ret
ENDP
END Start ;Конец программы/точка входа
количество слов: 172
Ответить Вложения 1 Пред. темаСлед. тема

Вернуться в «Программирование на АССЕМБЛЕРЕ»