Другие языки программирования и технологии

Составьте программу на ассемблере.

Составьте программу для поиска в массиве чисел и выделения в отдельный массив чисел, содержащих в старших разрядах код 9999.
Если я правильно понимаю условие, то требуется выбрать числа, начинающиеся с 9999, независимо от их разрядности и знака.
Из предложенных компиляторов выбираю FASM.

format PE console
entry N84675508
include 'win32a.inc'
stack 200h

section '.data' data readable writeable
Prompt1 db 'Введите размер массива: ',0
Prompt2 db 'Введите элементы массива: ',13,10,0
Result1 db 10,'Сформированный массив: ',13,10,0
Result2 db 'Нет элементов, начинающихся с 9999',0
Format1 db '%i',0
Format2 db '%5u: ',0
Format3 db '%16i',0
ExitPrompt db 13,10,10,'Для завершения работы нажмите любую клавишу... ',0

rept 2 counter
  {
    Len#counter rd 1
    Array#counter rd 1
  }

section '.code' code readable executable
N84675508:
    cinvoke printf,Prompt1
    cinvoke scanf,Format1,Len1
    mov eax,[Len1]
    shl eax,3
    invoke VirtualAlloc,NULL,eax,MEM_COMMIT,PAGE_READWRITE
    mov [Array1],eax
    mov edi,eax
    xor eax,eax
    mov [Len2],eax
    cinvoke printf,Prompt2
    mov ecx,[Len1]
InLoop:
    mov edx,[Len1]
    sub edx,ecx
    inc edx
    push ecx
    cinvoke printf,Format2,edx
    cinvoke scanf,Format1,edi
    add edi,4
    pop ecx
    loop InLoop
    mov [Array2],edi

    mov esi,[Array1]
    mov ecx,[Len1]
    mov ebx,10
MainLoop:
    lodsd
    push eax
    cdq
    xor eax,edx
    sub eax,edx
    call AllocHi
    cmp eax,9999h
    pop eax
    jne Skip
    stosd
    inc dword [Len2]
Skip:
    loop MainLoop

    mov ecx,[Len2]
    test ecx,ecx
    jz Empty
    cinvoke printf,Result1
    mov ecx,[Len2]
OutLoop:
    lodsd
    push ecx
    cinvoke printf,Format3,eax
    pop ecx
    loop OutLoop
    jmp Exit

Empty:
    cinvoke printf,Result2

Exit:
    cinvoke printf,ExitPrompt
WaitKey:
    invoke kbhit
    test eax,eax
    jz WaitKey
    invoke VirtualFree,[Array1],NULL,MEM_RELEASE
    invoke ExitProcess,NULL

proc AllocHi
    test eax,eax
    jz Quit
    xor edx,edx
    div ebx
    push edx
    call AllocHi
    pop edx
    test eax,0000F000h
    jnz Quit
    shl eax,4
    or eax,edx
Quit:
    ret
endp

section '.idata' import data readable
library kernel32,'kernel32.dll', msvcrt, 'msvcrt.dll'
include 'api/kernel32.inc'
import msvcrt, kbhit,'_kbhit', printf,'printf', scanf,'scanf'



P.S. Корректность вводимых чисел, ошибки ввода/вывода и выделения/освобождения памяти не контролируются (слишком мало символов даётся для ответа).
Аскар Апчикенов
Аскар Апчикенов
51 590
Лучший ответ
не не не =) не люблю я ввод и вывод в асме делать =)))
Тимур Кутлин
Тимур Кутлин
9 289