Заменить минимальный положительный элемент массива нулем - Assembler

Узнай цену своей работы

Формулировка задачи:

Заменить минимальный положительный элемент массива нулем. написала программу, но мне надо её решить, используя массив. подскажите, пожалуйста
include "D:\fasm\fasmw\INCLUDE\win32ax.inc"
.data
r db "%d",0
r1 db "%d",0
r2 db "%d",0
r3 db "%d",0
caption db "Результат",0
tr db 100 DUP(?)
m dd 10, 1, 17, 39
 
.code
main:
 mov ebx, 0
 mov edx, [m+ebx]
 add ebx, 4
 mov eax, [m+ebx]
 cmp edx, eax
 jge m1
 
 add ebx, 4
 mov eax, [m+ebx]
 cmp edx, eax
 jge m2
 
 add ebx, 4
 mov eax, [m+ebx]
 cmp edx, eax
 jge m3
 jmp l1
 
m1:nop
 add ebx, 4
 mov edx, [m+ebx]
 cmp eax, edx
 jge m2
 
 add ebx, 4
 mov edx, [m+ebx]
 cmp eax, edx
 jge m3
 jmp l2
 
m2:nop
 add ebx, 4
 mov edx, [m+ebx]
 cmp eax, edx
 jge m3
 jmp l3
 
m3:nop
mov ebx,0
mov eax, [m+ebx]
add ebx,4
mov ebp, [m+ebx]
add ebx,4
mov esi, [m+ebx]
    invoke wsprintfA,  addr tr, addr r,eax
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r1,ebp
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r2,esi
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r3, 0
    invoke MessageBoxA, 0, addr tr, addr caption,0
    jmp l4
 
l3:nop
mov ebx,0
mov eax, [m+ebx]
add ebx,4
mov edi, [m+ebx]
add ebx,8
mov esi, [m+ebx]
    invoke wsprintfA,  addr tr, addr r,eax
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r1,edi
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r2,0
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r3,esi
    invoke MessageBoxA, 0, addr tr, addr caption,0
    jmp l4
 
l2:nop
mov ebx,0
mov eax, [m+ebx]
add ebx,8
mov edi, [m+ebx]
add ebx,4
mov esi, [m+ebx]
    invoke wsprintfA,  addr tr, addr r,eax
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r1,0
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r2,edi
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r3,esi
    invoke MessageBoxA, 0, addr tr, addr caption,0
    jmp l4
l1:nop
mov ebx,4
mov ebp, [m+ebx]
add ebx,4
mov edi, [m+ebx]
add ebx,4
mov esi, [m+ebx]
    invoke wsprintfA,  addr tr, addr r,0
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r1,ebp
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r2,edi
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    invoke wsprintfA,  addr tr, addr r3,esi
    invoke MessageBoxA, 0, addr tr, addr caption,0
 
    l4:nop
    invoke ExitProcess,0
.end main

Решение задачи: «Заменить минимальный положительный элемент массива нулем»

textual
Листинг программы
;FASM
format PE console 4.0
 
include 'win32a.inc'
 
    mov esi, arr
    mov ecx, arr_sz
    push    esi
    push    ecx
    push    esi
    push    ecx
@@: lodsw
    movsx   eax, ax
    push    ecx
    cinvoke printf, fm, eax
    pop ecx
    loop    @B
    pop ecx
    pop esi
    mov bx, -1
    mov edi, dummy
 
@l: lodsw
    bt  ax,0Fh
    jc  @F
    cmp bx, ax
    jbe @F
    mov bx, ax  
    mov edi, esi
@@: loop    @l
    mov word [edi-2],0
    movzx   ebx,bx
    pop ecx
    pop esi
@@: lodsw
    movsx   eax, ax
    push    ecx
    cinvoke printf, fm, eax
    pop ecx
    loop    @B
 
    invoke  _getch
gtfo:   invoke  exit,0
arr dw  101,34,11,-24,12,54,16,9,12,-19,72,-14,121,61,22,39
arr_sz  =   ($-arr)/2
fm  db  '%3d, ',0
nl  db  0Dh,0Ah,0
 data import
 
 library msvcrt,'MSVCRT.DLL'
 
 import msvcrt,\
    printf,'printf',\
    exit,'exit',\
    _getch,'_getch'
end data

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

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