Лекции.ИНФО


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

 

Пример:Проанализировать массив данных из 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; Просмотров: 131;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная