Создание программы интеллектуального преобразователя сигнала
Изучение этапов интеллектуализации средств измерений на основе цифровой микропроцессорной техники. Обзор возможностей языка Ассемблера для системного программирования средств измерений. Анализ формирования входного сигнала и записи его в массив Simple.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 11.01.2012 |
Размер файла | 1,6 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
Введение
1. Основы языка Ассемблера
2. Программы
3. Отличие программирование на языке Assembler в системе Windows и DOS
Заключение
Список литературы
Введение
1.Осреднение данных
2.Фиксация временного ряда
3.Комплексирование измерительных устройств
4.Выявление жизненно важных показателей (надежность показания приборов, опасность производства)
5.Системы измерений на правилах, интеллектуальные системы счисления
Схема системы управления уровнем жидкости в баке
Система правил
Целью данной курсовой работы является создание программы на языке ассемблера, интеллектуального преобразователя сигнала, основанного на следующей системе правил:
1. Если «высокий» уровень сигнала на входе, то «высокий» на выходе.
2. Если «средний» уровень сигнала на входе, то средний» на выходе.
3. Если «низкий» уровень сигнала на входе, то «низкий» на выходе.
1. Основы языка Ассемблера
Размещение данных
Команды языка ассемблера состоят (в простейшем случае ) из мнемокода команды с последующими операндами. Комментарий от команды отделяется ;.
Пример.
CLC ;мнемокод без операнда (сброс флага переноса)
INC AX ; мнемокод с одним операндом (увеличение на 1)
MOV AX, BX ;мнемокод с двумя операндами
Операнд может быть регистром, переменной, ячейкой памяти или непосредственным значением.
Директивы размещения данных
Переменная является символическим именем для определенного места в памяти, где размещены данные. Смещение переменной - это расстояние от начала сегмента до места размещения данных.
Имена переменных автоматически связываются со смещением.
Директивы размещения данных служат для заполнения памяти.
Команда пересылки данных MOV копирует данные из одного операнда в другой, поэтому такие команды называются пересылкой данных.
Используются следующие формы команды MOV
MOV reg, reg
MOV mem, reg
MOV mem, immed
MOV reg, immed
где:
reg - любой регистр,
mem - указатель на место памяти
immed -непосредственное значение
В команде MOV нельзя использовать два операнда памяти. Для этого применяются регистры:
Пример. Перенести данные из переменной памяти var1 в переменную var2
MOV AX, var1
MOV var2,AX.
Размеры обоих операндов должны быть одинаковыми. Например, 16-разрядный регистр может быть послан только в 16-разрядный блок памяти.
Примеры команды MOV со всеми типами операндов:
.386
.model flat,stdcall
.DATA
count DB 10
total DW 4125h
bigVal DD 12345678H
.code
start:
MOV AL, BL ; 8-ми разрядный регистр в регистр.
MOV BL,count ; 8-ми разрядный блок памяти в регистр.
MOV count, 26 ; 8 разрядов непосредственно в память.
MOV BL, 1 ; 8 разрядов непосредственно в регистр..
MOV DX, CX ; 16-ми разрядный регистр в регистр
MOV BX, 8FE2h ; 16 разрядов непосредственно в регистр
MOV total, 1000h ; 16 разрядов непосредственно в память
MOV EAX, EBX ; 32-ми разрядный регистр в регистр
MOV EDX, bigval ; 32-ми разрядный блок памяти в регистр
ret
end start
Арифметика
Набор команд процессора 8086 включает команды для выполнения целочисленных арифметических операций с 8-разрядными и 16-разрядными операндами. Для арифметических операций с вещественными числами используется специальное программное обеспечение или дополнительная микросхема сопроцессора 8087. Процессор 80386 может выполнять целочисленные операции с 32-разрядными целыми числами. Процессор Intel 486 содержит встроенный блок сопроцессора для вычислений с вещественными числами, что сделано и во всех последующих моделях процессоров.
Команды INC и DEC
Команда инкремента INC и декремента DEC добавляет или вычитает единицу из какого-либо одного операнда.
INC операнд
DEC операнд
Операнд может быть регистром или операндом памяти
INC AL ; Инкремент 8-раэрядного регистра.
DEC BX ; Декремент 16-разрядного регистра.
INC EAX ; Инкремент 32-разрядного регистра.
INC membyte ; Инкремент операнда памяти.
DEC memword ; Декремент операнда памяти
Команда ADD
Команда add складывает операнд-отправитель и операнд-получатель одинакового размера. Команда имеет следующий синтаксис.
ADD операнд-получатель, операнд-отправитель
Исходный операнд-отправитель не изменяется в процессе выполнения команды, а целевому операнду-получателю присваивается значение суммы. Размеры операндов должны быть одинаковыми, и только один операнд может быть операндом памяти. ADD CL,AL ; Суммирует два 8-разрядных регистра.
ADD EAX,EDX ; Суммирует 32-разрядные регистры.
ADD BX,1000h ; Суммирует непосредственное значение с 16-разрядным регистром.
ADD varl,AX ; Суммирует 16-разрядный регистр с операндом в памяти.
ADD DX,varl ; Суммирует 16-разрядный операнд в памяти с регистром.
ADD varl,10 ; Суммирует непосредственную величину с операндом в памяти.
ADD DWORD PTR memVal, ECX
Оператор DWORD PTR определяет 32-разрядный операнд в памяти.
С помощью команды ADD складываются операнды только одинакового размера.
Команда SUB
Команда вычитания sub вычитает операнд-отправитель из операнда-получателя. Синтаксис этой команды следующий:
SUB операнд-получатель, операнд-отправитель
Размеры обоих операндов должны быть одинаковыми, и только один операнд может быть операндом памяти. В процессоре исходный операнд сначала инвертируется, а затем складывается с целевым операндом. Например, 4-1 будет выполняться как 4 + (-1). Вспомните, что двоичное дополнение используется для отрицательных чисел, поэтому -1 будет представлено как 11111111.
Пример вычитания.
00000100( 4 )
+11111111( -1 )
00000011( 3 )
Деление
Инструкции процессора div <операнд>. div выполняет несколько различных операций деления. Все зависит от типа аргумента инструкции div, то есть делителя. Если аргументом служит байт, как, например, в инструкции div bl, то процессор поделит число в регистре ах на bl и запишет частное от деления в регистр al, а остаток -- в регистр ah.
Если аргумент команды div-- слово (например, div bx), то процессор поделит число, старшие биты которого хранит регистр dx, а младшие -- ах. После деления частное окажется в регистре ах, а остаток -- в регистре dx.
И наконец, если делитель -- двойное слово, как в инструкции div ebx, то процессор считает, что делимое хранится в двух двойных словах. Старшие биты делимого он возьмет из edx, младшие -- из еах, а после деления частное окажется в еах, а остаток -- в edx.
Умножение
Инструкции процессора mul <операнд>.mul выполняет несколько различных операций умножения. Все зависит от типа операнда инструкции mul. Если операнд байт, как, например, в инструкции mul bl, то процессор умножит число операнд на аl и запишет результат в регистр aх.
Если аргумент команды-- слово (например, mul bx), то процессор умножит операнд на ах, а результат поместит в регистр еаx.
И наконец, если операнд -- двойное слово, как в инструкции mul ebx, то процессор поместит результат в edx:eax. Старшие биты в edx, а младшие -- из еах.
Логические операции (if)
IF , .ELSE , .ENDIF встретив эти директивы, ассемблер превратит их в команды процессора - cmp, jnz, jmp. Эти директивы часто встречаются во многих исходных текстах и в целом не нарушают однозначного соответствия между исходным текстом на ассемблере и последовательностью инструкций процессора
Условия в директиве . IF :
!=не равно
>больше
>=больше или равно
<меньше
<=меньше или равно
Оператор цикла (loop)
При выполнении инструкции loop процессор уменьшает на единицу регистр сх и проверяет, не равен ли он нулю. Если сх = 0, выполняется следующая после lоор инструкция. Если нет -- процессор переходит к указанной метке.
Пример:
; Сохранение чисел от 1 до 20 в памяти.
.386
.model flat, stdcall
option casemap:none
BSIZE equ 20 ; константа равная 20, число повторений цикла
.data ; раздел данных
Simple dw BSIZE dup(?) ; резервирование 11 чисел размером байт помеченных меткой
.code ; раздел кодов
start: ; начало программы
mov ecx,BSIZE ; переместить в регистр есх значение константы bsize для организации цикла
mov bx, 1 ; переместить в массив simple с индексом edi (смещение) очередное значение bl
mov edi, 0 ; переместить в память с нулевым смещением и с дополнительным смещением edi содержимое bl
nxt: ;метка для организации цикла на которую переходит программа, если содержимое ecx не равно 0
mov simple[edi],bx ; переместить в память с нулевым смещением и с дополнительным смещением edi содержимое bx
inc bx
add edi, 2 ;переход к следующему числу
loop nxt; конец цикла
ret
end start; конец программы
2. Программы
Формирование входного сигнала и запись его в массив SIMPLE
Прототип программы в VBA(Excel):
Private Sub CommandButton1_Click()
Dim SIMPLE(11), i As Integer
SIMPLE(1) = 0
Cells(1, 1) = SIMPLE(1)
For i = 2 To 11
SIMPLE(i) = SIMPLE(i - 1) + 1
Cells(i, 1) = SIMPLE(i)
Next i
End Sub
Программа в Asembler:
.386; использование системы команд процессора не ниже 386
.model flat, stdcall; вызов библиотеки памяти
option casemap: none ;различение заглавных и прописных букв
BSIZE equ 11; константа с именем bsize равная 11
.data; раздел данных
simple db BSIZE dup(?); резервирование в памяти 11 чисел размером в байт, пометив меткой simple
r dw 0; резервирование данных размером слово с пометкой r (можно использовать в смысле переменная)
.code; раздел кодов
start: ; начало программы
mov ecx, BSIZE; переносим bsize в регистр ecx равной const для организации цикла(цикл организуется при помощи loop)
mov al, 0; переносим 0 в al
mov edi, 0; переносим 0 в edi
nxt: ;метка для организации цикла на которую переходит программа, если содержимое ecx не равно 0
mov simple [edi], al; помещаем в simple очередное число аргумента
inc al; увеличить значение в al на 1
inc edi; увеличить значение в edi на 1
loop nxt; конец цикла
ret; возврат управления из процедуры вызывающей программе
end start; конец программы
После прогона программы:
Формирование сигнала H1 (column1)
Прототип программы в VBA(Excel):
Private Sub CommandButton1_Click()
Dim SIMPLE(11), i, column1(11) As Integer
SIMPLE(1) = 0
Cells(1, 1) = SIMPLE(1)
column1(1) = 10
Cells(1, 2) = column1(1)
For i = 2 To 11
SIMPLE(i) = SIMPLE(i - 1) + 1
Cells(i, 1) = SIMPLE(i)
If SIMPLE(i) < 5 Then
column1(i) = 10 - 2 * SIMPLE(i)
Else
column1(i) = 0
End If
Cells(i, 2) = column1(i)
Next i
End Sub
Программа в Asembler:
.386; использование системы команд не ниже 386
.model flat, stdcall; вызов библиотеки памяти
option casemap: none; различение заглавных и прописных букв
BSIZE equ 11; константа с именем bsize равная 11
.data; раздел данных
simple db BSIZE dup(?); резервирование в памяти 11 чисел размером в байт, пометив меткой simple
column1 db BSIZE dup(?); резервирование 11 чисел размером байт с меткой column1(необходимо использовать дополнительное смещение)
.code; раздел кодов
start: ;начало программы
mov ecx, BSIZE; переносим bsize в регистр ecx равной const для организации цикла(цикл организуется при помощи loop)
mov bl, 0; переносим 0 в bl
mov edi, 0; переносим 0 в edi
mov column1, 10; переносим 10 в column1
nxt: ;метка для организации цикла на которую переходит программа, если содержимое ecx не равно 0
mov al, 2; переносим 2 в al
mov bh, 10; переносим 10 в bh
mov simple [edi], bl; помещаем в simple очередное число аргумента(x)
.IF bl<5; если bl меньше 5
mul bl; умножение регистра al на операнд bl
sub bh, al; вычитание al из bl
mov column1[edi],bh; переносим bh в массив column1
.ELSE; иначе
mov column1[edi], 0; переносим 0 в массив column1
.endIF; конец если
inc bl; увеличить значение в bl на 1
inc edi; увеличить значение в edi на 1
loop nxt; конец цикла
ret; возврат управления из процедуры вызывающей программе
end start; конец программы
После прогона программы:
Формирование сигнала H2 (column2)
Прототип программы в VBA(Excel):
Private Sub CommandButton1_Click()
Dim SIMPLE(11), i, column1(11), column2(11) As Integer
SIMPLE(1) = 0
Cells(1, 1) = SIMPLE(1)
column1(1) = 10
column2(1) = 0
Cells(1, 2) = column1(1)
Cells(1, 3) = column2(1)
For i = 2 To 11
SIMPLE(i) = SIMPLE(i - 1) + 1
Cells(i, 1) = SIMPLE(i)
If SIMPLE(i) < 5 Then
column1(i) = 10 - 2 * SIMPLE(i)
column2(i) = 2 * SIMPLE(i)
Else
column1(i) = 0
column2(i) = 20 - 2 * SIMPLE(i)
End If
Cells(i, 2) = column1(i)
Cells(i, 3) = column2(i)
Next i
End Sub
Программа в Asembler:
.386; использование системы команд процессора не ниже 386
.model flat, stdcall; вызов библиотеки памяти
option casemap: none; различение заглавных и прописных букв
BSIZE equ 11; константа с именем bsize равная 11
.data; раздел данных, деректив данных
simple db BSIZE dup(?); резервирование в памяти 11 чисел размером в байт, пометив меткой simple
column1 db BSIZE dup(?); резервирование 11 чисел размером байт с меткой column1
column2 db BSIZE dup(?); резервирование 11 чисел размером байт с меткой column2
.code; раздел кодов
start: ; начало программы
mov ecx, BSIZE; в регистре esx заносится const = 11 для участия в цикле
mov bl, 0; переносим 0 bl
mov edi, 0; переносим 0 в edi
mov column1, 10; переносим 10 в column1
mov column2, 0; переносим 0 в column2
mov ah, 10; переносим 10 в ah
nxt: ;метка цикла
mov al, 2; переносим 2 в al
mov bh, 10; переносим 10 в bh
mov simple [edi], bl; переносим bl в simple
.IF bl<5; если bl меньше 5
mul bl;умножение, операция одноместная
sub bh, al; вычитание al из bh
mov column1[edi],bh; переносим bh в массив column1
mov column2[edi], al; переносим al в массив column2
.ELSE; иначе
mov column1[edi], 0; переносим 0 в массив column1
mov bh, 20; переносим 20 в bh
mul bl; умножение, операция одноместная
sub bh, al; вычитание al из bh
mov column2[edi], bh; переносим bh в массив column2
.endIF; конец если
inc bl; увеличить значение в bl на 1
inc edi; увеличить значение в edi на 1
loop nxt; конец цикла
ret; возврат управления из процедуры вызывающей программе
end start; конец программы
После прогона программы:
Формирование сигнала H3 (column3)
Прототип программы в VBA(Excel):
Private Sub CommandButton1_Click()
Dim SIMPLE(11), i, column1(11), column2(11), column3(11) As Integer
SIMPLE(1) = 0
Cells(1, 1) = SIMPLE(1)
column1(1) = 10
column2(1) = 0
column3(1) = 0
Cells(1, 2) = column1(1)
Cells(1, 3) = column2(1)
Cells(1, 4) = column3(1)
For i = 2 To 11
SIMPLE(i) = SIMPLE(i - 1) + 1
Cells(i, 1) = SIMPLE(i)
If SIMPLE(i) < 5 Then
column1(i) = 10 - 2 * SIMPLE(i)
column2(i) = 2 * SIMPLE(i)
column3(i) = 0
Else
column1(i) = 0
column2(i) = 20 - 2 * SIMPLE(i)
column3(i) = 2 * SIMPLE(i) - 10
End If
Cells(i, 2) = column1(i)
Cells(i, 3) = column2(i)
Cells(i, 4) = column3(i)
Next i
End Sub
Программа в Asembler:
.386; использование системы команд процессора не ниже 386
.model flat, stdcall; вызов библиотеки памяти
option casemap: none; различение заглавных и прописных букв
BSIZE equ 11; константа с именем bsize равная 11
.data; раздел данных, деректив данных
simple db BSIZE dup(?); резервирование в памяти 11 чисел размером в байт, пометив меткой simple
column1 db BSIZE dup(?); резервирование 11 чисел размером байт с меткой column1
column2 db BSIZE dup(?); резервирование 11 чисел размером байт с меткой column2
column3 db BSIZE dup(?); резервирование 11 чисел размером байт с меткой column3
.code; раздел кодов
start: ;начало программы
mov ecx, BSIZE; переносим bsize в регистр ecx равной const для организации цикла(цикл организуется при помощи loop)
mov bl, 0; переносим 0 в bl
mov edi, 0; переносим 0 в edi
mov column1, 10; переносим 10 в column1
mov column2, 0; переносим 0 в column2
mov column3, 0; переносим 0 в column3
mov ah, 10; переносим 10 в ah
nxt: ; метка для организации цикла на которую переходит программа, если содержимое ecx не равно 0
mov al, 2; переносим 2 в al
mov bh, 10; переносим 10 в bh
mov simple [edi], bl; переносим bl в simple
.IF bl<5 ; если bl меньше 5
mul bl; умножение; операция одноместная
sub bh, al; вычитание al из bh
mov column1[edi],bh; переносим bh в column1
mov column2[edi], al; переносим al в column2
mov column3[edi], 0; переносим 0 в column3
.ELSE; иначе
mov column1[edi], 0; переносим 0 в массив column1
mov bh, 20; переносим 20 в bh
mul bl; умножение; операция одноместная
sub bh, al; вычитание al из bh
mov column2[edi], bh; переносим bh в массив column2
mov bh, 10; переносим 10 в bh
sub al, bh; вычитание bh из al
mov column3[edi], al; переносим al в массив column3
.endIF; конец если
inc bl; увеличить значение в bl на 1
inc edi; увеличить значение в edi на 1
loop nxt; конец цикла
ret; возврат управления из процедуры вызывающей программе
end start; конец программы
После прогона программы:
Формирование выходного сигнала (column4)
Прототип программы в VBA(Excel):
Private Sub CommandButton1_Click()
Dim SIMPLE(11), i, column1(11), column2(11), column3(11), column4(11) As Integer
SIMPLE(1) = 0
Cells(1, 1) = SIMPLE(1)
column1(1) = 10
column2(1) = 0
column3(1) = 0
column4(1) = 5
Cells(1, 2) = column1(1)
Cells(1, 3) = column2(1)
Cells(1, 4) = column3(1)
Cells(1, 5) = column4(1)
For i = 2 To 11
SIMPLE(i) = SIMPLE(i - 1) + 1
Cells(i, 1) = SIMPLE(i)
If SIMPLE(i) < 5 Then
column1(i) = 10 - 2 * SIMPLE(i)
column2(i) = 2 * SIMPLE(i)
column3(i) = 0
Else
column1(i) = 0
column2(i) = 20 - 2 * SIMPLE(i)
column3(i) = 2 * SIMPLE(i) - 10
End If
column4(i) = ((column1(i) * 5) + (column2(i) * 15) + (column3(i) * 25)) / (column1(i) + column2(i) + column3(i))
Cells(i, 2) = column1(i)
Cells(i, 3) = column2(i)
Cells(i, 4) = column3(i)
Cells(i, 5) = column4(i)
Next i
End Sub
Программа в Asembler:
.386; использование системы команд процессора не ниже 386
.model flat, stdcall; вызов библиотеки памяти
option casemap: none; различение заглавных и прописных букв
BSIZE equ 11; константа с именем bsize равная 11
.data; раздел данных
simple db BSIZE dup(?); резервирование в памяти 11 чисел размером в байт, пометив меткой simple
column1 db BSIZE dup(?);резервирование 11 чисел размером байт с меткой column1
column2 db BSIZE dup(?);резервирование 11 чисел размером байт с меткой column2
column3 db BSIZE dup(?);резервирование 11 чисел размером байт с меткой column3
column4 db BSIZE dup(?);резервирование 11 чисел размером байт с меткой column4
.code; раздел кодов
start: ; начало программы
mov ecx, BSIZE; переносим bsize в регистр ecx равной const для организации цикла(цикл организуется при помощи loop)
mov bl, 0; переносим 0 в bl
mov edi, 0; переносим 0 в edi
mov column1, 10; переносим 10 в column1
mov column2, 0; переносим 0 в column2
mov column3, 0; переносим 0 в column3
mov column4, 5; переносим 5 в column4
mov ah, 10; переносим 10 в ah
nxt1: ; метка цикла 1
mov al, 2; переносим 2 в al
mov bh, 10; переносим 10 в bh
mov simple [edi], bl; переносим bl в simple
.IF bl<5; если bl меньше 5
mul bl; умножение; операция одноместная
sub bh, al; вычитание al из bh
mov column1[edi],bh; переносим bh в массив column1
mov column2[edi], al; переносим al в массив column2
mov column3[edi], 0; переносим 0 в массив column3
.ELSE; иначе
mov column1[edi], 0; переносим 0 в массив column1
mov bh, 20; переносим 20 в bh
mul bl; умножение; операция одноместная
sub bh, al; вычитание al из bh
mov column2[edi], bh; переносим bh в массив column2
mov bh, 10; переносим 10 в bh
sub al, bh; вычитание bh из al
mov column3[edi], al; переносим al в массив column3
.endIF; конец если
inc bl; увеличить значение в bl на 1
inc edi; увеличить значение в edi на 1
loop nxt1; конец цикла 1
mov ecx, BSIZE; переносим bsize в регистр ecx равной const для организации цикла(цикл организуется при помощи loop)
mov bl, 0; переносим 0 в bl
mov edi, 0; переносим 0 в edi
nxt2: ; метка цикла 2
mov bl, column1[edi]; переносим массив column1 в bl
mov al, 5; переносим 5 в al
mul bl; умножение; операция одноместная
mov bh, al; переносим al в bh
mov bl, column2[edi]; переносим массив column2 в bl
mov al, 15; переносим 15 в al
mul bl; умножение; операция одноместная
add bh, al; сложение al в bh
mov bl, column3[edi]; переносим массив column3 в bl
mov al, 25; переносим 25 в al
mul bl; умножение; операция одноместная
add bh, al; сложение al в bh
mov bl, column1[edi]; переносим массив column1 в bl
mov dl, column2[edi]; переносим массив column2 в dl
add bl, dl; сложение dl в bl
mov dl, column3[edi]; переносим массив column3 в dl
add bl, dl; сложение dl в bl
mov al, bh; переносим bh в al
div bl; делитель
mov column4[edi], al; переносим al в массив column4
inc edi; увеличить значение в edi на 1
loop nxt2; конец цикла 2
ret; возврат управления из процедуры вызывающей программе
end start; конец программы
После прогона программы:
микропроцессорный программирование ассемблер цифровой
3. Отличие программирование на языке Assembler в системе Windows и DOS
Пример программы в системе DOS с комментариями:
Сравнение входного сигнала и заданного (тестирующего по маске)
.8086
.model small ; модель памяти - маленькая
.stack 200 ; стек размером 200 байт
.data; раздел данных
hello1 db 'Input - 1011, testMaska - 1011. Rezult is - YES',0dh,0ah,"$"
hello2 db 'Input - 1011, testMaska - 1011. Rezult is - NO',0dh,0ah,"$"
InTest db 1011b ; ввод
testMaska db 1011b ; маска теста
rezult db 0 ; результат сравнения - если 0, тогда вход и маска различны
.code; раздел кодов
start: ; начало программы
mov dx,@stack; указываем начальный адрес стека
mov ss,dx; перевод в сегмент стека
mov dx,@data; указываем начальный адрес данных
mov ds,dx ; указываем начальный адрес в сегменте данных
mov bl,InTest
sub bl,testMaska
jnz exit1; переход на метку exit1, если результат сравнения не равен 0
mov rezult,1; присваиваем переменной результ значение 1
mov dx, offset hello1; в dx помещаем константу для вывода на экран
mov ah,09
int 21h ; прерывание программы по константе 09 - вывод на экран строки начало которой в dx
jmp exit2 ;безусловный переход на метку exit2
exit1: ; метка для перехода, если результат сравнения не равен 0
mov dx, offset hello2 ;метка смещения сообщения хело2 в dx
mov ah,09 ; константа прерывания вывода на экран
int 21h
exit2: ; метка для перехода, если результат сравнения равен 1
mov ah,4ch ; помещения в ah константы прерывания - конец программы
int 21h
end start
Компиляция программы осуществляется с использованием командного файла DMAKE.bat, пример которой приведен ниже:
ml /c %1.asm
link16 %1.obj,%1.exe,,,,
В данной программе используются аналоги двух команд ml и link, первая из которых создает объектный файл с расширением .obj, имя которой берется из командной строки (инструкция %1.asm). Командой link16 объединяется объектный файл и создается исполнимый файл с расширением .exe, параметры указанные запятыми приняты по умолчанию.
Пошаговый просмотр exe - файла, с использование отладчика afdpro.exe
Отладчик Afdpro разработан немецким программистом специально для системы DOS и имеет значительно большие возможности по сравнению с ollydbg.exe, предназначенный для системы windows. Exe файлы созданные для системы DOS в ollydbg.exe пошагово не могут быть просмотрены. Преимуществом Afdpro является возможность просматривать и корректировать разработанную программу в диалоговом режиме переключением окон редактирования. После выполнения команды mo o no можно переключаться с отладчика на окно far для просмотра результата работы программы. Ниже показано окно afdpro.
Для работы с отладчиком используются клавиши согласно панели управления - нижняя строка с подсказкой.
F1 - пошаговый просмотр программы;
F2 - пошаговый просмотр с заходом в процедуры;
F3 - перезапуск программы;
F4 - окно помощи;
F5 - сброс;
F7 - верхняя панель;
F8 - нижняя панель;
F9 - левая панель;
Для выхода из отладчика используется команда quit, которая записывается в командном окне, после приглашения CMD>.
Просмотр скомпилированной программы DOS1.
После компиляции программы результат ее работы можно просмотреть в оболочке far (обе панели погашены), для чего необходимо выполнить команду DOS1.exe
Для упрощения просмотра программы в отладчике все сообщения из исходного кода следует убрать, как это показано ниже:
.8086
.model small; модель памяти - маленькая
.stack 200 ; стек размером 200 байт
.data
InTest db 1011b; ввод
testMaska db 1011b; маска теста
rezult db 0; результат сравнения - если 0, тогда вход и маска различны
.code
start:
mov dx,@stack; указываем начальный адрес стека
mov ss,dx; перевод в сегмент стека
mov dx,@data; указываем начальный адрес данных
mov ds,dx ; указываем начальный адрес в сегменте данных
mov bl,InTest
sub bl,testMaska
jnz exit1; переход на метку exit1, если результат сравнения не равен 0
mov rezult,1; присваиваем переменной результ значение 1
exit1: ; метка для перехода, если результат сравнения не равен 0
mov ah,4ch ; помещения в ah константы прерывания - конец программы
int 21h
end start
Пошаговый просмотр программы в отладчике
Через несколько шагов программы по распределению сегментов в памяти на указанном (подсвеченном) шаге в регистр bl переносится отмеченное значение имеющее смещение 000E - 0Bh.
На следующем шаге из содержимого регистра bl вычитается значение со смещением 000F - 0Bh.
Так как значения равны, результат вычитания будет равен 0, о чем свидетельствует регистр флагов, показано на следующем рисунке:
Следующей командой (подсвеченной) выполняется переход по адресу 0019 командой JNZ - переход, если нет 0 (jump no zero).
Командой mov [0010], 01 в ячейку результата заносится 1.
Заключение
1. В работе рассмотрены этапы интеллектуализации средств измерений, на основе цифровой микропроцессорной техники. Рассмотрены современные микропроцессорные устройства ,на основе системы правил (системы нечеткого логического вывода).
2. Рассмотрены возможности языка Ассемблера для программирования (системного) средств измерений.
3. Написана и отлажена программа по интеллектуальному преобразователю, на базе 3 правил.
4. Рассмотрены основные отличия программирования в системе Windows и DOS.
5. Рассмотрены элементы и оболочки программирования на языке Ассемблера для микропроцессора.
Список литературы
1. Финогенов К.Г. Основы языка Ассемблера. - М.: Радио и связь,2000.
2. Юров В. Assembler. Специальный справочник. - СПб.: Питер, 2001.
3. Юров В. Assembler. Практикум. - СПб.: Питер, 2001.
4. Юров В., Хорошенко В. Assembler - Учебный курс.- СПб.: Питер, 2000.
Размещено на Allbest.ru
Подобные документы
Разработка программного обеспечения на языке C. Определение сигнала на выходе цепи, формирование его передаточной характеристики. Расчет длительности переднего фронта входного и выходного сигнала. Выбор структуры, отладка и тестирование программы.
курсовая работа [83,0 K], добавлен 26.09.2014Исследование программ, позволяющих обработать результаты наземных и спутниковых наблюдений. Анализ создания цифровой модели местности в программе GeoniCS. Изучение интерфейсов, основных функций и возможностей программ для постобработки полевых измерений.
курсовая работа [4,3 M], добавлен 15.04.2012Создание математической модели расчета показателей в отчете метрологического отдела по учету средств измерений компании. Разработка базы данных информации, пользовательского интерфейса. Техническое обеспечение автоматизированной информационной системы.
дипломная работа [3,7 M], добавлен 14.01.2018Описание архитектуры процессора TMS320C25. Моделирование фильтра в модуле FDATool программной среды Matlab. Алгоритм нерекурсивной фильтрации сигнала. Расчет массива отсчетов входного сигнала. Моделирование фильтра при различных частотах входного сигнала.
курсовая работа [119,2 K], добавлен 14.06.2015Изучение основных этапов программирования на ассемблере, который является символическим представлением машинного языка, то есть каждой машинной команде соответствует команда ассемблера. Реализация алгоритма выполнения программы для просмотра bmp файлов.
курсовая работа [248,0 K], добавлен 25.12.2012Приведение выходного сигнала к аналитическому вид. Программа расчёта характеристик выходного сигнала электрической цепи. Таблица идентификаторов и описаний пользовательских подпрограмм. Построение графиков по массивам входного и выходного сигналов.
контрольная работа [594,2 K], добавлен 28.09.2012Порядок и методика моделирования входного сигнала, общие принципы представления сигналов математическими моделями. Взаимосвязь математических моделей с компьютерными, их место и значение на современном этапе. Пакеты для моделирования различных процессов.
реферат [1,1 M], добавлен 19.04.2009Разработка программы, позволяющей регистрировать значения измерений, оценивать процесс и предлагать варианты приемки на основе результатов измерений. Использование метода пошаговой проверки процентной части от общего количества поступившей продукции.
курсовая работа [1014,4 K], добавлен 20.10.2009Разработка многопоточного приложения, выполняющего обмен данными между двумя процессами и анализ содержимого служебной области системного диска. Описание логической структуры программы, создание программы-инсталлятора, методика и результаты испытаний.
курсовая работа [4,3 M], добавлен 27.03.2011Изучение литературы по использованию гипертекста и мультимедиа в образовании. Анализ структуры и содержания образовательных программных средств. Обзор создания пособия на основе языка программирования Delphi с использованием гипертекстовых технологий.
дипломная работа [703,2 K], добавлен 10.03.2012