Из массива удалить все нулевые элементы, кроме первого нулевого элемента - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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