Из массива удалить все нулевые элементы, кроме первого нулевого элемента - Assembler
Формулировка задачи:
Помогите сделать задание :
Из массива удалить все нулевые элементы, кроме первого нулевого элемента.
Все что у меня получилось, найти последний 0 эл.(нужен первый)
Удалять не знаю как ,поэтому хотел переписать все кроме 0 в новый массив ,но не знаю как и первый ноль туда
Код:
.686 .model FLAT,stdcall option casemap:none .XLIST include \masm32\include\masm32rt.inc ;include C:\RadASM\masm32\include\masm32rt.inc .LIST .data x dd 6,0,3,-76,-4,0,9,11,0,12 nx dd 10 titleString db 'Lab3',0 ; bufff db 20 dup (' ') ; Cr_Lf db 13,10,0 ; msg1 db ' ГЊГ*Г±Г±ГЁГў x ',0 msg2 db " Г°Г*çìåðîì = ",0 msg99 db "ГќГ«. Г¬Г*Г± = ",0 msg4 db " ïîçèöèÿ =",0 .data? y dd 7 dup (?) first_el dd ? poz_el dd ? .code start: call CreateConsole invoke StdOut,addr msg1 invoke StdOut,addr msg2 mov eax,nx call PrintNumber invoke StdOut,addr Cr_Lf lea ebx,x mov ecx,nx call PrintArray invoke StdOut,addr Cr_Lf ;=============================== mov ecx,nx mov esi,0 mov eax,x mov poz_el,0 c1: cmp x[esi],0 jnz m1 mov eax ,x[esi] mov poz_el,esi m1: add esi,4 loop c1 mov first_el,eax ; ---------------------------------------------- ; mov esi,poz_el ; mov eax,x[esi+4] ; c22: ; cmp eax,0 ; jg m22 ;------------------------------------------------ ; mov ecx,nx ; mov esi,0 ; mov edi,0 ;c99: ; mov eax,x[esi] ; cmp eax,0 ; jz m99 ; mov y[edi],eax ; add edi,4 ;m99: ; add esi,4 ; loop c99 ; mov ecx,nx ; mov esi,0 ;--------------------------------------- ;============================= ;vuvod rezyltatov ;invoke StdOut,addr msg3 ;pechat strok msg3, msg4 invoke StdOut,addr msg4 mov eax, poz_el call PrintNumber invoke StdOut,addr Cr_Lf invoke StdOut,addr msg99 mov eax ,first_el call PrintNumber invoke StdOut,addr Cr_Lf inkey ;ostanovka programmu exit ;vuxod PrintNumber proc push ecx ; push ebx invoke wsprintf, addr bufff, chr$("%4d"), eax; ; ; invoke StdOut, addr bufff; pop ebx; pop ecx ret PrintNumber endp PrintArray proc c4: mov eax,[ebx] call PrintNumber add ebx,4 loop c4 ret PrintArray endp CreateConsole proc invoke AllocConsole; invoke SetConsoleTitle,offset titleString; invoke SetConsoleOutputCP,1251; invoke SetConsoleCP,1251 ret CreateConsole endp end start
Решение задачи: «Из массива удалить все нулевые элементы, кроме первого нулевого элемента»
textual
Листинг программы
.386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\msvcrt.inc include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\msvcrt.lib .data arr dd ? arr_sz dd ? N dd ? arrsz db 'Enter array size:',0 arrelm db 'Enter array elements:',0 tpo db 'A[%d]=',0 tps db 'A[%d]=%d',0Dh,0Ah,0 tpi db '%d',0 res db 'Result:',0 .code start: invoke crt_printf, addr arrsz invoke crt_scanf, addr tpi, addr arr_sz mov eax, [arr_sz] sal eax, 2 ; array size * sizeof(long) invoke crt_malloc, eax or eax,eax jz gtfo ; malloc error mov [arr], eax invoke crt_puts, addr arrelm xor esi, esi mov edi, [arr] @@: invoke crt_printf, addr tpo, esi invoke crt_scanf, addr tpi, addr N mov eax, [N] stosd inc esi cmp esi,[arr_sz] jb @B ; find 1st 0 mov ecx, esi ;[arr_sz] mov edi, [arr] xor eax, eax repne scasd ; ecx - rest of elments, edi -> 1st non-zero element jcxz done mov esi, edi @l: mov eax, [esi] or eax, eax jnz @F dec [arr_sz] @@: or eax, eax jz @F stosd @@: add esi, 4 loop @l done: invoke crt_puts, addr res mov esi, [arr] xor edi, edi @@: lodsd invoke crt_printf, addr tps, edi, eax inc edi cmp edi, [arr_sz] jb @B pop eax invoke crt_free, [arr] invoke crt__getch gtfo: invoke crt_exit, 0 end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д