Перемещение из массива - Assembler
Формулировка задачи:
Задание звучит так:
В 1-мерном массиве из 30 элементов выделить числа, имеющие четное количество разрядов и переместить их в структуру данных «запись».
В общем массив, сделал, даже отсортировал его, но вот как сделать остальное, как разрядность определить, и перенести в эту... "запись" - я не знаю. Подскажите, как должен код выглядеть, с учётом моего кода. Заранее благодарю!
.386 .model flat, stdcall option casemap:none include c:\ollydbg\include\windows.inc include c:\ollydbg\include\user32.inc include c:\ollydbg\include\kernel32.inc include c:\ollydbg\include\fpu.inc includelib c:\ollydbg\lib\user32.lib includelib c:\ollydbg\lib\kernel32.lib includelib c:\ollydbg\lib\fpu.lib BSIZE equ 8 .data m dd 90,20,30,101,102,130,141,162,27,86,201,110,120,100,140,190,220,310,103,111,230,148,167,25,83,281,4108, 22,134,149 stdout dd ? cWritten dd ? buf db BSIZE dup (?) fmt db "%d",13,10,0 fmt2 db "count=%d" count dd 0 chng dd ? .code start: invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax mov edi, 0 mov ecx, 0 .REPEAT push ecx mov eax,m[edi] invoke wsprintf, ADDR buf, ADDR fmt,eax invoke WriteConsoleA, stdout, ADDR buf,\ BSIZE, ADDR cWritten, NULL add edi,4 pop ecx inc ecx .UNTIL ecx == 15 mov edi, 0 mov esi, 0 .REPEAT mov esi, 56 .WHILE esi>edi mov eax, m[esi] .IF eax<m[esi-4] mov chng, eax mov eax, m[esi-4] mov m[esi], eax mov eax, chng mov m[esi-4], eax inc count .ENDIF sub esi, 4 .ENDW add edi,4 .UNTIL edi == 56 mov edi, 0 mov ecx, 0 .REPEAT push ecx mov eax,m[edi] invoke wsprintf, ADDR buf, ADDR fmt,eax invoke WriteConsoleA, stdout, ADDR buf,\ BSIZE, ADDR cWritten, NULL add edi,4 pop ecx inc ecx .UNTIL ecx == 15 invoke wsprintf, ADDR buf, ADDR fmt2,count invoke WriteConsoleA, stdout, ADDR buf,\ BSIZE, ADDR cWritten, NULL invoke ExitProcess, 0 end start
Решение задачи: «Перемещение из массива»
textual
Листинг программы
.386 .model flat, stdcall option casemap:none include d:\masm32\include\windows.inc include d:\masm32\include\user32.inc include d:\masm32\include\kernel32.inc include d:\masm32\include\fpu.inc include d:\masm32\include\msvcrt.inc include d:\masm32\include\masm32.inc includelib d:\masm32\lib\msvcrt.lib includelib d:\masm32\lib\user32.lib includelib d:\masm32\lib\kernel32.lib includelib d:\masm32\lib\fpu.lib includelib d:\masm32\lib\masm32.lib .data m dd 30 DUP(?) fmt db '%d',13,10,0 fmt2 db 'count=%d' count dd 0 _msg db 'Elements with even ',22h,'ones',22h,' bit count',0Dh,0Ah,0 m_sz = ($ - m)/4 _m dd m_sz dup(0) .code start: mov ecx, m_sz lea edi, m @@: invoke nrandom, eax stosd loop @b lea esi, m lea edi, _m invoke crt_puts, ADDR _msg mov ecx, m_sz; ?????? ??????? @l: lodsd ; EAX = m[ESI++] push ecx ; ???? ????????? push eax mov cx, 32 ; ???? xor ebx, ebx; ??????? ?????-"????????" @@: rcl eax, 1 ; ???????? EAX ?????, ???? CY = ???????? ???? EAX adc ebx, 0 ; ?????????? ???? CY ? ???????? loop @b ; ???? ?? 32 ???? pop eax bt ebx, 0 ; ????????? ?? ????????, ???? ????????, ???? CY = 1 jc @f ; ???? ???-?? ?????-"????????" ????????, ?? ????????? stosd ; [EDI++] = EAX invoke crt_printf, ADDR fmt, eax @@: pop ecx loop @l .REPEAT mov esi, 56 .WHILE esi>edi mov eax, m[esi] .IF eax<m[esi-4] mov edx, eax mov eax, m[esi-4] mov m[esi], eax mov eax, edx mov m[esi-4], eax inc [count] .ENDIF sub esi, 4 .ENDW add edi,4 .UNTIL edi == 56 mov ecx, m_sz lea esi, m @@: lodsd push ecx invoke crt_printf, ADDR fmt, eax pop ecx loop @b invoke crt_printf, ADDR fmt2, [count] invoke crt_exit, 0 end start
Объяснение кода листинга программы
Код выполняет следующие действия:
- Инициализация переменных и массива.
- Заполнение массива случайными числами с помощью функции nrandom.
- Перемещение элементов массива с помощью цикла.
- Вывод сообщения с количеством элементов массива.
- Вывод отсортированного массива.
- Вывод сообщения о количестве элементов отсортированного массива.
- Завершение работы программы. Список переменных и их значений:
- m - массив, инициализированный нулевыми значениями.
- fmt - строка, содержащая формат вывода.
- count - переменная для подсчета количества элементов.
- _msg - строка, содержащая сообщение для вывода.
- m_sz - переменная, содержащая размер массива.
- _m - массив, используемый для временного хранения элементов при перемещении.
- esi, edi - индексы для обхода массива.
- eax - временная переменная для хранения значений элементов массива.
- ebx - временная переменная, используемая в операции битовой операции.
- edx - временная переменная для хранения значений элементов массива.
- ecx - переменная для хранения значения размера массива.
- fmt2 - строка, содержащая формат вывода для сообщения о количестве элементов. В комментариях к коду указаны некоторые непонятные места, которые требуют дополнительного анализа и понимания работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д