Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Программа 4. Сумма всех элементов массива

Главная > Язык ассемблера > Процедуры и функции в ассемблере | Объединение процедур, расположенных в разных модулях | Организация интерфейса с процедурой | Способы передачи аргументов в процедуру | Возврат результата из процедуры | Автор: xrnd | Рубрика: Учебный курс | 17-10-2010 | Распечатать запись | Создание локальных переменных | Пример процедуры с локальными переменными | Команды ENTER и LEAVE | Программа 1. Получение данных из командной строки |


Читайте также:
  1. I. Программа курса
  2. I. РАБОЧАЯ ПРОГРАММА
  3. III. Программа
  4. III. Программа и тестовые примеры
  5. III. Программа и тестовые примеры
  6. III. Программа и тестовые примеры
  7. III. Программа и тестовые примеры

Программа суммирует значения всех элементов массива. Интересна работой с массивами и реализацией цикла типа «for».

.486.model flat, stdcalloption casemap: none include /masm32/include/windows.incinclude /masm32/include/user32.incinclude /masm32/include/kernel32.inc includelib /masm32/lib/user32.libincludelib /masm32/lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32.data msg_title db "Title", 0A DB 1hx dd 0,1,2,3,4,5,6,7,8,9,10,11n dd 12 buffer db 128 dup(?)format db "%d",0.codestart:mov eax, 0mov ecx, nmov ebx, 0L: add eax, x[ebx]add ebx, type xdec ecxcmp ecx, 0jne L invoke wsprintf, addr buffer, addr format, eaxinvoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start

dec — уменьшение значения операнда в памяти или регистре на 1.

cmp — сравнение двух операндов, методом вычитания второго операнда из первого. По результатам вычисления устанавливаются флаги.

jne выполняет переход по указанной метке, если результат сравнения операндов был отрицательным, и операнды НЕ равны друг другу.

Лаба №1. Кодирует цифры другими символами, другие клавигши игнорирует. Выход - Esc

Свернуть исходник

Код:

.model tiny
.code
org 100h
begin:
jmp start
coded db 0c9h,0cbh,0bbh,0cch,0ceh,0b9h,0c8h,0cah,0bch,0d7h
start:
mov ah,01h
int 16h
jz start
xor ax,ax
int 16h
cmp al,1bh
je exit
cmp al,30h
jl start
cmp al,39h
jg start
push cs
pop ds
mov bx,offset coded
and al,0fh
xlatb
mov ah,0ah
xor bh,bh
mov cx,1
int 10h
jmp start
exit:
ret
end begin


Лаба №2 - передача параметров в процедуру через стэк и возврат ответа тем же путем..

Свернуть исходник

Код:

.model tiny
.code
org 100h
begin:
jmp start

_mul proc
push bp
mov bp,sp
mov ax,[bp+4]
mul word ptr [bp+6]
mov [bp+4],ax
mov [bp+6],dx
pop bp
ret
_mul endp

start:
mov dx,130h
push dx
push 100h
call _mul
pop ax
pop bx
ret
end begin

Простой пример обработки сообщения от мыши.
Для обработки сообщения от мыши в DOS`е нам потребуется прерывание 33h.


Инициализации мыши:

int 33h

Вход: ax =0000h
Выход: ax =0000h, если мышь или драйвер мыши не установлены.
ax =0ffffh, драйвер и мышь установлены.
Bx=число кнопок:
0002 или 0ffffh – две
0003 – три
0000 – другое количество


Показать курсор:

int 33h
Вход: ax=0001h

Спрятать курсор:

int 33h
Вход: ax=0002h


Установить обработчик событий:

int 33h
Вход: ax=000сh
es:dx = адрес обработчика
cx = условие вызова
бит 0: любое перемещение
бит 1: нажатие левой копки
бит 2: отпускание левой копки
бит 3: нажатие правой копки
бит 4: отпускание правой копки
бит 5: нажатие средней копки
бит 6: отпускание средней копки
cx = 0000h – отменить обработчик

Обработчик оформляется как дальняя процедура, на входе ax — содержит условие вызова, bx – состояние кнопок, cx и dx – x и y координаты курсора, si и di – счетчик последнего перемещения по горизонтали и вертикали, ds – сегмент данных драйвера мыши.

Делать будем com программу, используя TASM, параметры транслятора и компоновщика такие:


bin\tasm mouse.asm
bin\tlink /t /x mouse.obj

/t – создать файл типа.com

/x – не создавать файл карты(map)

.model tiny; код, данные и стек размещаются в одном сегменте, размером 64 кб
.code; основной сегмент кода
org 100h; счетчик для com
start:
mov ax,12h;установка видеорежима 640х480, 16 цветов
int 10h
mov ax,0000h;инициализация мыши
int 33h
mov ax,0ch; установка обработчика мыши
mov cx,0001h; любое перемещение
lea dx,handler_I; смещение обработчика
int 33h
;-----------------------------------------
mov ah,10h; ждем нажатие любой кнопки
int 16h
mov ax,000ch
mov cx,0000h; отменяем обработчик
int 33h
ret; конец программы
handler_I:; наш обработчик

; cx и dx – x и y координаты курсора, а для int 10h это номера строки и столбца
push cs
pop ds; в ds сегмент кода и данные программы
mov bh,0; номер видеостраницы
mov ah,0ch; вывести точку на экран
mov al,color_m; цвет точки
int 10h
retf; выход из процедуры
color_m db 0000010

end start

Здесь необходимо заметить, что в режиме 12h возвращаемые координаты совпадают с координатами пикселов. Если использовать режим 13h, то необходимо координату X разделить на 2. Программу можно оптимизировать, необходимо в обработчике мыши использовать прямую запись в видеопамять вместо прерывания 10h.


Дата добавления: 2015-07-16; просмотров: 61 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Программа 2. Сложение двух чисел| Массивы на Ассемблере

mybiblioteka.su - 2015-2024 год. (0.008 сек.)