Другие языки программирования и технологии
Составьте программу на ассемблере.
Составьте программу для поиска в массиве чисел и выделения в отдельный массив чисел, содержащих в старших разрядах код 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. Корректность вводимых чисел, ошибки ввода/вывода и выделения/освобождения памяти не контролируются (слишком мало символов даётся для ответа).
Из предложенных компиляторов выбираю 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. Корректность вводимых чисел, ошибки ввода/вывода и выделения/освобождения памяти не контролируются (слишком мало символов даётся для ответа).
не не не =) не люблю я ввод и вывод в асме делать =)))
Похожие вопросы
- Нужно составить программу на ассемблере
- Составьте программу сложения на ассемблере.
- помогите написать программы в ассемблере
- Нужна помощь с программой на ассемблере - комментирование каждой строки
- Приведите пожалуйста пример программы на ассемблере, использующая API функцию GlobalMemoryStatus. Заранее спасибо.
- Помогите написать программу на ассемблере, завтра экзамен а я в нём совсем не шарю.
- Помогите написать небольшую программу на ассемблере (TASM). Подробности внутри.
- программа на ассемблере, не пойму в чем ошибка и как исправить
- Помогите с программой на Ассемблере
- Нужно написать программа на ассемблере для функции СигнумХ . Как правильно это сделать?