Проверить, превышает ли количество положительных чисел в массиве 5 или нет - Assembler/FASM

Узнай цену своей работы

Формулировка задачи:

Форумчане, помогите с программой на FASM'e. Даны целые числа a1,a2,...,a10. Выяснить, верно ли, что количество положительных чисел не превышает 5.

Решение задачи: «Проверить, превышает ли количество положительных чисел в массиве 5 или нет»

textual
Листинг программы
format PE console 4.0
entry start
 
include 'win32ax.inc'
 
section '.text' code readable executable
 
  start:
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     [hConsoleInput],        eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     [hConsoleOutput],       eax
 
        lea     esi,    [A]
        mov     ecx,    [N]
        xor     edi,    edi     ;счётчик положительных чисел
        mov     ebx,    1
        .for:
                lodsd
                xor     edx,    edx     ; eax>0 ? edx=1: edx=0
                cmp     eax,    0
                cmovg   edx,    ebx
                add     edi,    edx     ; edi += edx
        loop    .for
        mov     [Result],       edi
 
        cinvoke printf, aszFmt, [Result]
 
        cmp     [Result],       5
        jbe     .Yes
  .No:
        cinvoke printf, aszNo
        jmp     .exit
  .Yes:
        cinvoke printf, aszYes
 
  .exit:
        ;ожидание нажатия ENTER
        cinvoke printf, aszPressEnter
        invoke  ReadConsole, [hConsoleInput], Buffer,\
                100, BufLen, NULL
        invoke  ExitProcess, 0
 
section '.data' data readable writeable
        N               dd      10
        A               dd      6, -51, 87, 3, -90, -23, 60, 8, -36, -51
        aszFmt  db      'Count=%d', 0Dh, 0Ah, 0
        aszYes  db      'Yes', 0Dh, 0Ah, 0
        aszNo   db      'No', 0Dh, 0Ah, 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
section '.bss' readable writeable
        Result          dd      ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        hConsoleOutput  dd      ?
        hConsoleInput   dd      ?
section '.idata' import data readable writeable
 
        library kernel32,'KERNEL32.DLL',\
                user32,'USER32.DLL',\
                msvcrt, 'msvcrt.dll'
 
        include 'api\kernel32.inc'
        include 'api\user32.inc'
        import  msvcrt,\
                printf, 'printf'

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

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