Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Рассмотрим еще один пример программного кода. Необходимо подсчитать, сколько раз встречается в массиве целых чисел определенное число. Исходный текст программного кода приведен в листинге 2.24.
Листинг 2.24. Фрагмент программы подсчета количества вхождений целого числа в массив
.data
conTitle DB "Counting of separate int in array", 0
mesl DB "Array: ", 0
len_mesl EQU $-mesl
mes2 DB Odh, Oah, "Number = ", 0
len_mes2 EQU $-mes2
mes3 DB Odh, Oah, "Found times = ", 0
len mes3 EQU $-mes3
charBuf DB ", 0
len charBuf DD $-charBuf
iarray DD • -9, 3, -5, 2,
larray EQU ($-iarray)/4
lpFmt DB "%d", 0
cnt DD 0
num DD • -5
readBuf DB
lenReadBuf DD 1
hStdln DD 0
hStdOut DD 0
chrsRead DD 0
chrsWritten DD 0
STD_INP_HNDL DD • -10
STD OUTP HNDL DD • -11
.code
start:
call AiiocConsoie
test EAX, EAX
j z ex
push offset conTitle
call SetConsoleTitleA
test EAX, EAX
j z ex
call getout_hndl
call getinp_hndl
push EBX
mov EBX, offset mesl
mov ECX, len_mesl
call write_con
pop EBX
mov ESI, offset iarray
mov ECX, larray
show_next:
push ESI
push ЕСХ
push DWORD PTR [ESI]
push offset lpFmt
push offset charBuf
call wsprintf
add ESP, 12
push EBX
mov EBX, offset charBuf
mov ECX, len_charBuf
call write_con
pop EBX
call clear_buf
pop ECX
pop ESI
add ESI, 4
loop show_next
push EBX
mov EBX, offset mes2
mov ECX, len_mes2
call write_con
pop EBX
push DWORD PTR num
push offset lpFmt
push offset charBuf
call wsprintf
add ESP, 12
push EBX
mov EBX, offset charBuf
mov ECX, len_charBuf
call write_con
pop EBX
; подсчитать, сколько раз встречается элемент в массиве
mov DWORD PTR cnt, О
lea ESI, iarray
mov ECX, larray
f init
; загрузка исходного числа в вершину стека сопроцессора
fild DWORD PTR num
next_cmp:
ficom DWORD PTR [ESI]
fstsw AX
sahf
jne skip
; если значение в вершине стека равно элементу массива,
; увеличить содержимое счетчика
inc cnt
skip:
add ESI, 4
loop next_cmp
; преобразовать результат подсчета в строку
push DWORD PTR cnt
push offset lpFmt
push offset charBuf
call wsprintf
add ESP, 12
push EBX
mov EBX, offset mes3
mov ECX, len_mes3
call write_con
pop EBX
push EBX
mov EBX, offset charBuf
mov ECX, len_charBuf
call write_con
pop EBX
call clear buf


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru