Приклад: Написати програму на асемблер. Задано масив 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
start end ; директива закінчення програми з ім'ям 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 \masm32lib\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 ; кінець програми
Результат роботи програми: