Выяснить, верно ли, что количество тех чисел 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 не равно нулю, то выполнить переход к меткеlbForContinue
dec ECX
- уменьшить значение регистра ECX на единицуcmp EBX, 5
- сравнить значение регистра EBX с 5jz @lbSetTrue
- если значение регистра EBX равно 5, то выполнить переход к меткеlbSetTrue
xor 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д