Выяснить, верно ли, что количество тех чисел 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д