Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Директивы условного ассемблирования. Условие в Ассемблере



 

Пример: Проанализировать массив данных из 16 элементов. Подсчитать и вывести на экран количество элементов, которые по значению находятся в середине диапазона от 32 до 128.

Текст программы:

.686; директива определения типа микропроцессора
.model flat, stdcall; задание линейной модели памяти
option casemap: none; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc
include \masm32\include\msvcrt.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib

.data; директива определения данные
_c dd 40
sum dd 0
op1 dd 32; пределы
op2 dd 128; пределы
frmt db " %d", 0
buf db 30 dup(? )
stdout DWORD?
stdin DWORD?
cRead dd?
temp dd?
mas1 dd 41 dup(0)

st1 db " Vvesty masiv: "
st2 db " Вывод количества элементов в пределах (32, 128) массива! С", 0
st3 db 10 dup(0)
ifmt db " количество = %d", 0

.code; директива начала кода программы
_start:
lea esi, mas1; загрузка адреса начала массива
mov ecx, _c
m1:
mov ebx, ecx
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, eax
invoke WriteConsoleA, stdout, ADDR st1, 14, NULL, NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20
ADDR cRead, NULL; чтения числа как символ
invoke crt_atoi, ADDR buf; преобразовать символ в число
mov [esi], eax
add esi, 4
mov ecx, ebx
loop m1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx, _c
lea esi, mas1; загрузка адреса начала массива
mov eax [esi]; загрузка числа
m3:
.IF(eax> op1)& & (eax< op2); сложное условие
inc sum
add esi, 4; расчет адреса нового числа
mov eax[esi]
loop m3

.ELSE; иначе
add esi, 4; расчет адреса нового числа
mov eax[esi]
loop m3; перейти, если ecx не равно 0

.ENDIF; окончание директивы высокого уровня

mov ebx, sum

invoke wsprintf \
ADDR st3 \
ADDR ifmt \
ebx
invoke MessageBox \
NULL \
addr st3 \
addr st2 \
MB_OK
invoke ExitProcess, 0
ret
end _start; конец программы

Результат работы программы:



Макросы в Ассемблере. Примеры задач

 

Пример: Написать программу с использованием макросов для вычисления одного из выражений без предыдущего математического упрощения операций:
2x – 3 + 8(2x –3);

Текст программы:

.686; директива определения типа микропроцессора
.model flat, stdcall; задание линейной модели памяти
; но соглашения ОС Windows
option casemap: none; отличие малых и больших букв
includelib \masm32\lib\kernel32.lib
ExitProcess proto: dword; прототип API-функції
mSubB macro x, b; макрос с именем mSubB
mov al, x
shl al, 1; занос переменной а
sub al, b; вычитание а – b
mov res1, al;; сохранение результата в памяти
endm; окончание макроса
.data; директива определения данные
x db 6; сохранение в амбарчике памяти, размером в байт операнда 6
b db 3
res1 db 0; резервирование памяти для результата res1
res2 dw 0; резервирование памяти для результата res2
.code; директива начала программы
_start: ; метка начала программы с именем _start
xor eax, eax
xor ebx, ebx
mSubB [x][b]; вызов макроса
mov al, 8
mov bl, res1
mul bl
mov bl, al
mSubB [x][b]; вызов макроса
mov al, res1; занос с расширением разрядности
add bx, ax
mov res2, bx; сохранение остаточного результата
invoke ExitProcess, 0; возвращение управления ОС Windows
end _start; директива окончания программы с именем _start

Результат работы программы:


Dll на ассемблере. Динамические библиотеки (Dll-файли)

 

Пример: Написать программу на ассемблер. Задан массив А из N = 40 элементов. Навести алгоритм и программу определения количества элементов массива А, которые удовлетворяют условию L > = Ai > = M, где L = 6 и M = 22.


Текст программы
файл 1.asm


.386
.model flat, stdcall
option casemap: none; отличие строчных и прописных букв

includelib\masm32\lib\kernel32.lib

ExitProcess proto: DWORD
Mas_sum proto: DWORD, : DWORD, : DWORD; прототип процедуры
.code
Mas_sum proc arg1: DWORD, arg2: DWORD, masiv: DWORD

mov ebx, 0
mov eax, masiv
cmp eax, arg1
jnc m1
jmp _end
m1:
cmp eax, arg2
jc m2
jmp _end
m2:
inc ebx
_end:

ret; возвращение управления ОС
Mas_sum endp; окончание процедуры с именем Mas_sum
end; окончание программы с именем start

end start; директива окончания программы с именем start

Файл 1dll.asm


.386
.model flat, stdcall
option casemap: none; отличие строчных и прописных букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc
include \masm32\include\msvcrt.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib

includelib 1.lib
ExitProcess proto: DWORD
Mas_sum proto: DWORD, : DWORD, : DWORD; прототип процедуры

.data; директива определения данные
_c dd 40
sum dd 0
op1 dd 6; запись в 32-разрядную память op1
op2 dd 22; минимальных предел
frmt db " %d", 0
buf db 30 dup(? )
stdout DWORD?
stdin DWORD?
cRead dd?
temp dd?
mas1 dd 40 dup(0)

st1 db " Vvesty masiv: "
st2 db " Вывод количества элементов в пределах (6, 22) массива! А, 0
st3 db 10 dup(0)
ifmt db " количество = %d", 0
.code; директива начала кода программы

_start:
lea esi, mas1; загрузка адреса начала массива
mov ecx, _c
m1:
mov ebx, ecx
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, eax
invoke WriteConsoleA, stdout, ADDR st1, 14, NULL, NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20
ADDR cRead, NULL; чтения числа как символ
invoke crt_atoi, ADDR buf; преобразовать символ в число
mov [esi], eax
add esi, 4
mov ecx, ebx
loop m1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx, _c
lea esi, mas1; загрузка адреса начала массива
mov eax [esi]; загрузка числа
m3:
invoke Mas_sum, op1, op2, eax
add sum, ebx
add esi, 4; расчет адреса нового числа
mov eax[esi]
loop m3

mov ebx, sum

invoke wsprintf \
ADDR st3 \
ADDR ifmt \
ebx
invoke MessageBox \
NULL \
addr st3 \
addr st2 \
MB_OK
invoke ExitProcess, 0
ret
end _start; конец программы

Результат работы программы:

Ассемблер сопроцессор. Примеры задач

 

Пример 1: Вычислить 6 значений функции: Yn = 4x/(x + 5) (х изменяется от 3 с шагом 1, 25). Результат округлить к целому, разместить в памяти и вывести на экран.


1.1 Текст программы


.386; директива определения типа микропроцессора
.model flat, stdcall; задание линейной модели памяти
option casemap: none; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib

.data; директива определения данные

_x dd 3; сохранение в 32-разрядном амбарчике памяти переменной х
_y dd 0; резервирование 32-х разрядов памяти для переменной в
tmp1 dd? ; резервирование 32-х разрядов памяти для переменной tmp1
tmp2 dd? ; резервирование 32-х разрядов памяти для переменной tmp2
hod dd 1.25
krok dd 5
_umnoj dd 4; умножение на 4
probel dd 09h; для вывода на экран
res dd 0
ifmt db " Yn = %d", 0
st1 db " Yn = 4x/(x + 5) ", 0
st2 dd 10 dup(? ), 0
st3 dd 10 dup(? ), 0

.code; директива начала кода программы
_start: ; директива начала кода программы
lea edi, st2
lea esi, st3
xor eax, eax; обнуление регистров
xor ebx, ebx
xor ecx, ecx
xor edx, edx
finit; инициирующее сопроцессора
mov ecx, 6
fild _x
m1:
fld st(0)
fiadd krok
fld st(1)
fimul _umnoj
fmul st(0), st(1)
fistp dword ptr [edi]
fistp dword ptr [esi]
fadd hod

add edi, 4

loop m1

lea edi, st2
mov eax[edi+20]

invoke wsprintf \
ADDR st2 \
ADDR ifmt \
eax
invoke MessageBox \
NULL \
addr st2 \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; зак? нчення программы


1.2 Результат работы программы


 

 

Пример 2 : Определить номер (х) элемента функции: xn = + 5, при котором сумма элементов превысит 12 000. Результат разместить в памяти и вывести соответствующие сообщения.


2.1 Текст программы


.386; директива определения типа микропроцессора
.model flat, stdcall; задание линейной модели памяти
option casemap: none; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib

.data; директива определения данные

_x dd 0; сохранение переменной х
_y dd 0; резервирование 32-х разрядов памяти для переменной в
tmp1 dd? ; резервирование 32-х разрядов памяти для переменной tmp1
tmp2 dd? ; резервирование 32-х разрядов памяти для переменной tmp2
hod dd 1
krok dd 3
plus dd 5
mem dw?
_MASK equ 0C00h
limit dd 12000
ifmt db " № = %d", 0
st1 db " Вывод номера елемента", 0
st2 dd 10 dup(? ), 0
st3 dd 10 dup(? ), 0

.code; директива начала кода программы
_start: ; директива начала кода программы
lea edi, st2
lea esi, st3
xor eax, eax; обнуление регистров
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov edx, limit
finit; инициализация сопроцессора
fstcw mem
OR mem, _MASK
fldcw mem
mov ecx, 6
m1:
inc _x
fild _x
fild krok
fyl2x
fld st(0)
frndint
fsub st(1), st(0)
frndint
f2xm1
fiadd hod
fldz
fadd st(0), st(2)
f2xm1
fiadd hod
fmul st(0), st(1)
fiadd plus
fistp dword ptr [edi]
fistp dword ptr [esi]
fistp dword ptr [esi]
mov eax[edi]
add ebx, eax
add edi, 4
add esi, 4
cmp edx, ebx
jns m1

mov eax, _x

invoke wsprintf \
ADDR st2 \
ADDR ifmt \
eax
invoke MessageBox \
NULL \
addr st2 \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; зак? нчення программы


2.2 Результат работы программы


 

Пример 3: Вычислить 4 значения функции: Y = 3 * log2(x2+1), x изменяется от 0, 2 с шагом 0, 3.


3.1 Текст программы


.386; директива определения типа микропроцессора
.model flat, stdcall; задание линейной модели памяти
option casemap: none; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib

.data; директива определения данные

_x dd 0.2; сохранение в 32-разрядном амбарчике памяти переменной х
_y dd 0; резервирование 32-х разрядов памяти для переменной в
tmp1 dd? ; резервирование 32-х разрядов памяти для переменной tmp1
tmp2 dd? ; резервирование 32-х разрядов памяти для переменной tmp2
hod dd 0.3
umnoj dd 3
const dd 4
mem dw?
_MASK equ 0C00h
ifmt db " Y = %d", 0
st1 db " Вывод функции", 0
st2 dd 10 dup(? ), 0
st3 dd 10 dup(? ), 0

.code; директива начала кода программы
_start: ; директива начала кода программы
lea edi, st2
lea esi, st3
xor eax, eax; обнуление регистров
xor ebx, ebx
xor ecx, ecx
xor edx, edx
finit; инициализания сопроцессора
fstcw mem
OR mem, _MASK
fldcw mem
mov ecx, 4

fld _x
fld _x
m1:
fild umnoj
fld st(1)
fmulp st(2), st(0)
fyl2x
fld hod
fadd st(2), st(0)

fistp dword ptr [edi]
dec const
jz m2
fistp dword ptr [esi]
fld st(0)
mov eax[esi]
add edi, 4
add esi, 4
loop m1
m2:

 

invoke FpuFLtoA, 0, 10, ADDR st2, SRC1_FPU or SRC2_DIMM
invoke MessageBox, NULL, addr st2, addr st1, MB_OK
invoke ExitProcess, NULL; возвращение управления ОС Windows
; но освобождение ресурсов

end _start; директива окончания программы с именем start

Результат работы программы



Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-03-22; Просмотров: 1495; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.027 с.)
Главная | Случайная страница | Обратная связь