Выяснить, верно ли, что количество тех чисел ci, которые меньше 20, равно пяти - Turbo Pascal
Формулировка задачи:
Даны натуральное число n и целые числа с1 , с2, ..., сn . Выяснить, верно ли, что количество тех чисел ci , которые меньше 20, равно пяти. Помогите пожалуйста, очень прошу)
Решение задачи: «Выяснить, верно ли, что количество тех чисел ci, которые меньше 20, равно пяти»
textual
Листинг программы
const N = 5;
type __dword = cardinal;
type __int32 = integer;
type __list_t = array[1..N] of __int32;
var list: __list_t = ( 1 , 2 , 3 , 4 , 5 );
function __asm_tr( list: __dword; count: __dword ): __int32;
asm
pushf
push EDX
push ECX
mov EDX , list
mov ECX , count
push EBX
xor EBX , EBX
jmp @lbForCnd;
@lbForContinue:
mov EAX , [EDX + ECX * 4 - 4]
cmp EAX , 20
JL @lbSetInc
jmp @lbNoSetInc
@lbSetInc:
inc EBX
@lbNoSetInc:
dec ECX
@lbForCnd:
test ECX , ECX
jne @lbForContinue
cmp EBX , 5
jz @lbSetTrue
xor EAX , EAX
jmp @lbSetBreak
@lbSetTrue:
mov EAX , 1
@lbSetBreak:
pop EBX
pop ECX
pop EDX
popf
end;
begin
if ( __asm_tr( Cardinal(@list) , N ) = 0 ) then
writeln(' false ')
else
writeln(' true ');
end.
Объяснение кода листинга программы
- Переменная
Nимеет значение 5. - Создается тип данных
__dword, который представляет собой целое число без знака, и тип данных__int32, который представляет собой целое число со знаком. - Создается тип данных
__list_t, который представляет собой массив из 5 элементов типа__int32. - Создается переменная
listсо значением (1, 2, 3, 4, 5). - Определяется функция
__asm_tr, которая принимает два аргумента: список (list) и количество (count). Функция использует ассемблерные команды для проверки, равное ли количество чисел в списке 5. - В функции
__asm_trиспользуется ассемблерная запись, которая включает в себя следующие действия:pushf- сохранить флаги в стекpush EDX- поместить значение регистра EDX в стекpush ECX- поместить значение регистра ECX в стекmov EDX, list- поместить значение списка в регистр EDXmov ECX, count- поместить значение количества в регистр ECXpush EBX- поместить значение регистра EBX в стекxor EBX, EBX- вычесть из EBX единицуjmp @lbForCnd- перейти к условному операторуjmp, если флаги не содержат значения, указывающего на ошибку@lbForContinue:- это метка, к которой будет выполнен переход, если условиеjneне выполнитсяtest ECX, ECX- проверить, равно ли значение регистра ECX нулюjne @lbForContinue- если значение регистра ECX не равно нулю, то выполнить переход к меткеlbForContinuedec ECX- уменьшить значение регистра ECX на единицуcmp EBX, 5- сравнить значение регистра EBX с 5jz @lbSetTrue- если значение регистра EBX равно 5, то выполнить переход к меткеlbSetTruexor EAX, EAX- вычесть из EAX единицуjmp @lbSetBreak- перейти к меткеlbSetBreak@lbSetTrue: mov EAX, 1- установить значение EAX в 1@lbSetBreak:- это метка, к которой будет выполнен переход, если условиеjneвыполнится
- В функции
mainвызывается функция__asm_trс аргументамиCardinal(@list)иN. Результат функции сравнивается со значениемtrueилиfalse. - Если результат функции
__asm_trравен 0, то выводится строкаfalse, иначе выводится строкаtrue.