Выяснить, верно ли, что количество тех чисел 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.

Объяснение кода листинга программы

  1. Переменная N имеет значение 5.
  2. Создается тип данных __dword, который представляет собой целое число без знака, и тип данных __int32, который представляет собой целое число со знаком.
  3. Создается тип данных __list_t, который представляет собой массив из 5 элементов типа __int32.
  4. Создается переменная list со значением (1, 2, 3, 4, 5).
  5. Определяется функция __asm_tr, которая принимает два аргумента: список (list) и количество (count). Функция использует ассемблерные команды для проверки, равное ли количество чисел в списке 5.
  6. В функции __asm_tr используется ассемблерная запись, которая включает в себя следующие действия:
    • pushf - сохранить флаги в стек
    • push EDX - поместить значение регистра EDX в стек
    • push ECX - поместить значение регистра ECX в стек
    • mov EDX, list - поместить значение списка в регистр EDX
    • mov ECX, count - поместить значение количества в регистр ECX
    • push 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 с 5
    • jz @lbSetTrue - если значение регистра EBX равно 5, то выполнить переход к метке lbSetTrue
    • xor EAX, EAX - вычесть из EAX единицу
    • jmp @lbSetBreak - перейти к метке lbSetBreak
    • @lbSetTrue: mov EAX, 1 - установить значение EAX в 1
    • @lbSetBreak: - это метка, к которой будет выполнен переход, если условие jne выполнится
  7. В функции main вызывается функция __asm_tr с аргументами Cardinal(@list) и N. Результат функции сравнивается со значением true или false.
  8. Если результат функции __asm_tr равен 0, то выводится строка false, иначе выводится строка true.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы