Пример: Написать программу на ассемблер. Задан массив А из 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 ; конец программы
Результат работы программы:
http://life-prog.ru/view_zam.php?id=45&cat=3&page=2
|