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

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

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

Листинг программы
  1. model small
  2. .data
  3. mas db -12, 2, 7, 3, -2, 0, 21, -9, 0, 16 ;исходный массив
  4. len dw $-mas ;размер массива в байтах
  5. .stack 256
  6. .code
  7. Show_ax PROC
  8. mov cx, 10
  9. xor di, di ; di - кол. цифр в числе
  10. ; если число в ax отрицательное, то
  11. ;1) напечатать '-'
  12. ;2) сделать ax положительным
  13. or ax, ax
  14. jns @@Conv
  15. push ax
  16. mov dx, '-'
  17. mov ah, 2 ; ah - функция вывода символа на экран
  18. int 21h
  19. pop ax
  20. neg ax
  21. @@Conv:
  22. xor dx, dx
  23. div cx ; dl = num mod 10
  24. add dl, '0' ; перевод в символьный формат
  25. inc di
  26. push dx ; складываем в стэк
  27. or ax, ax
  28. jnz @@conv
  29. ; выводим из стэка на экран
  30. @@Show:
  31. pop dx ; dl = очередной символ
  32. mov ah, 2 ; ah - функция вывода символа на экран
  33. int 21h
  34. dec di ; повторяем пока di<>0
  35. jnz @@show
  36. ret
  37. Show_ax ENDP
  38. start:
  39. mov ax, @data
  40. mov ds, ax
  41. lea bx, mas ;берём в bx адрес первого элемента
  42. mov cx, len ;счетчик цикла
  43. xor ax, ax
  44. cikl: cikl: mov ah, [bx]
  45. cmp ah, 0
  46. jns @Positive
  47. add al, ah
  48. @Positive:
  49. inc bx ;переходим к следующему элементу
  50. loop cikl
  51. cbw
  52. call Show_ax
  53. mov ax, 4c00h
  54. int 21h
  55. end start
Пока она просто находить сумму всех отрицательных элементов массива А нужно ввести переменную K которая была бы как счетчик Если ввести К=2 то суммироваться будут только первые 2 отрицательных числа Кто может помочь

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

textual
Листинг программы
  1. ;-- Преобразование строки по адресу SI в знаковое число (до первого неверного символа) -------------
  2. ; Результат: AX - число случае переполнения = 32767 или -32767), DL - завершающий символ
  3. ; Меняет AX, BX, DX, SI
  4. StrToInt        proc
  5.                 xor     bx,bx           ; bx = 0 - пока предполагаем, что у числа знака нет
  6.                 xor     dx,dx           ; dx = 0 - результат, пока будет в dx
  7.                 cmp     byte ptr [si],'-'       ; сравниваем первый символ с минусом
  8.                 jne     @@nextchar      ; если это НЕ минус, то перепрыгиваем
  9.                 inc     bx              ; если минус, помечаем, что число отрицательное (bx = 1)
  10.                 inc     si              ; и увеличиваем указатель на 1 (переходим к следующему символу)
  11.         @@nextchar:
  12.                 lodsb                   ; читаем символ в al из ds:[si], si=si+1
  13.                 sub     al,'0'          ; преобразуем al в цифру
  14.                 cmp     al,9            ; проверяем цифру
  15.                 ja      @@badch         ; прыгаем, если цифра не 0..9
  16.                 imul    dx,dx,10        ; умножаем dx на 10
  17.                 jo      @@overflow      ; переходим, если произошло переполнение
  18.                 cbw                     ; ah = 0
  19.                 add     dx,ax           ; добавляем ax к dx
  20.                 jno     @@nextchar      ; переходим, если НЕ произошло переполнение
  21.         @@overflow:
  22.                 ; Произошло переполнение
  23.                 mov     dx,32767        ; dx = 32767
  24.         @@badch:add     al,'0'          ; al = преобразуем обратно в символ (чтобы на выходе dl = завершающий символ)
  25.                 xchg    ax,dx           ; меняем местами dx и ax: ax = результат, dl = завершающий символ
  26.                 test    bx,bx           ; проверяем bx
  27.                 jz      @@exit          ; если bx = 0, знака нет, прыгаем
  28.                 neg     ax              ; иначе меняем знак
  29.         @@exit: ret                     ; выходим из процедуры
  30. StrToInt        endp

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


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

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

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы