Найти сумму первых К отрицательных элементов массива - Assembler

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

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

model small
.data    
                mas db -12, 2, 7, 3, -2, 0, 21, -9, 0, 16  ;исходный массив
                len dw $-mas    ;размер массива в байтах
     
.stack 256               
.code   
Show_ax PROC
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@show
        ret
Show_ax ENDP 
start:   
                 
            mov ax, @data    
            mov ds, ax   
                 
            lea bx, mas ;берём в bx адрес первого элемента
            mov cx, len ;счетчик цикла
            xor ax, ax   
cikl:   cikl:   mov ah, [bx]
        cmp ah, 0
        jns @Positive
        add al, ah
@Positive:
        inc bx  ;переходим к следующему элементу
        loop cikl    
                 
            cbw
        call Show_ax 
                 
            mov ax, 4c00h    
            int 21h  
     
end start
Пока она просто находить сумму всех отрицательных элементов массива А нужно ввести переменную K которая была бы как счетчик Если ввести К=2 то суммироваться будут только первые 2 отрицательных числа Кто может помочь

Решение задачи: «Найти сумму первых К отрицательных элементов массива»

textual
Листинг программы
;-- Преобразование строки по адресу SI в знаковое число (до первого неверного символа) -------------
; Результат: AX - число (в случае переполнения = 32767 или -32767), DL - завершающий символ
; Меняет AX, BX, DX, SI
StrToInt        proc
                xor     bx,bx           ; bx = 0 - пока предполагаем, что у числа знака нет
                xor     dx,dx           ; dx = 0 - результат, пока будет в dx
                cmp     byte ptr [si],'-'       ; сравниваем первый символ с минусом
                jne     @@nextchar      ; если это НЕ минус, то перепрыгиваем
                inc     bx              ; если минус, помечаем, что число отрицательное (bx = 1)
                inc     si              ; и увеличиваем указатель на 1 (переходим к следующему символу)
        @@nextchar:
                lodsb                   ; читаем символ в al из ds:[si], si=si+1
                sub     al,'0'          ; преобразуем al в цифру
                cmp     al,9            ; проверяем цифру
                ja      @@badch         ; прыгаем, если цифра не 0..9
                imul    dx,dx,10        ; умножаем dx на 10
                jo      @@overflow      ; переходим, если произошло переполнение
                cbw                     ; ah = 0
                add     dx,ax           ; добавляем ax к dx
                jno     @@nextchar      ; переходим, если НЕ произошло переполнение
        @@overflow:
                ; Произошло переполнение
                mov     dx,32767        ; dx = 32767
        @@badch:add     al,'0'          ; al = преобразуем обратно в символ (чтобы на выходе dl = завершающий символ)
                xchg    ax,dx           ; меняем местами dx и ax: ax = результат, dl = завершающий символ
                test    bx,bx           ; проверяем bx
                jz      @@exit          ; если bx = 0, знака нет, прыгаем
                neg     ax              ; иначе меняем знак
        @@exit: ret                     ; выходим из процедуры
StrToInt        endp

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

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