Вычисление суммы отрицательных, произведения положительных и количества нулевых значений в одномерном массиве - Assembler

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

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

Написать программу вычисления суммы отрицательных, произведения положительных и количества нулевых значений в одномерном массиве.
Нужно соединить.
org 100h
start:
  lea si,[anum]
  mov cx,qanum
  xor bx,bx
  mrp:lodsw
      cwd
      and dx,ax
      add bx,dx
  loop mrp
  ret
  anum  dw -1,-1024,3,4,-5,1,1,3,5,6,1,4,3,-70,6,-900,4,-8000,5,6
  qanum = ($-anum)/2
.model small
.stack
.data
       ; mas dw 4, -23, 1, 30, -79, -248, 160
        mas db -4, -2, 1, 110, 2, -4, 10
        viv db 6 dup (' '), 10, 13, '$'
.code
    mov ax, @data
    mov ds, ax
    ; O4istka ekrana
    mov ah, 6
    mov al, 0
    mov bh, 7
    mov cx, 0
    mov dx, 184Fh
    int 10h
    ; Razmeshenie kursora
    mov ah, 2
    mov bh, 0
    mov dh, 0
    mov dl, 0
    int 10h
    ; Summa
    xor ax, ax
    xor di, di
    mov cx, 7 ; cx = 4islo el-tov massiva
cycle_sum:
    cmp mas[di], -100
    jl next
    cmp mas[di], 100
    jg next
    add al, mas[di] ; esli massiv db, to zdesi al, esli dw - to ax
next:
    add di, 1  ; db - 1, dw - 2
    loop cycle_sum
    ; Vivod summi
    xor dx, dx
    mov si, 10
    mov di, 5
    push ax
    cmp ax, 0
    jg M
    neg ax
M:
    div si
    add dl, 30h
    mov viv[di], dl
    xor dx, dx
    dec di
    cmp ax, 0
    jne M
    pop ax
    cmp ax, 0
    jg Vivod
    mov viv[di], '-'
Vivod:
    mov ah, 9
    lea dx, viv
    int 21h
    ; Proizvedenie
    xor ax, ax
    xor di, di
    mov cx, 7
cycle_pr:
    cmp mas[di], 0
    jl next1
    cmp ax, 0
    jne M1
    mov al, mas[di]
    jmp next1
M1:
    mul mas[di]
next1:
    add di, 1
    loop cycle_pr
    ; Vivod proizvedenia
    xor dx, dx
    mov si, 10
    mov di, 5
    push ax
    cmp ax, 0
    jg M2
    neg ax
M2:
    div si
    add dl, 30h
    mov viv[di], dl
    xor dx, dx
    dec di
    cmp ax, 0
    jne M2
    pop ax
    cmp ax, 0
    jg Vivod2
    mov viv[di], '-'
Vivod2:
    mov ah, 9
    lea dx, viv
    int 21h
    mov ah, 0
    int 16h
    mov ah, 4ch
    int 21h
end

Решение задачи: «Вычисление суммы отрицательных, произведения положительных и количества нулевых значений в одномерном массиве»

textual
Листинг программы
ORG 100h
JMP start
 
mess0  DB  13,10,'ARRAY INFO ==============='
       DB  13,10,'**************************'
       DB  13,10,'Negative SUMM: -$'
mess1  DB  13,10,'Positive MULT: $'
mess2  DB  13,10,'   Count ZERO: $'
 
array  DW  -1,-1024,3,4,-5,1,0,1,5,6,1,4,3,-70,6,-900,4,-8000,5,0
size   =   $ - array
 
start:
;============ ПОИСК И СУММИРОВАНИЕ ОТРИЦАТЕЛЬНЫХ =============//
;============ С ПОДСЧЁТОМ КОЛИЧЕСТВА НУЛЕЙ ===================//
   MOV   SI,array        ; адрес массива
   MOV   CX,size/2       ; его размер
   XOR   BX,BX           ; ВХ будет сумма отриц.элементов
   XOR   DX,DX           ; DX = счётчик нулей
@@:                      ;
   LODSW                 ; берём элемент массива
   OR    AX,AX           ;
   JNS   positive        ; прыг, если число положительное
   NEG   AX              ; иначе - инверсия(+1)
   ADD   BX,AX           ; и сумма с ВХ
positive:                ;
   JNZ   noZero          ; прыг, если это не нуль
   INC   DX              ; счётчик нулей(+1)
noZero:                  ;
   LOOP  @b              ; сл.элемент массива
 
next1:                   ; отработали! =======================//
   PUSH  DX BX           ; запоминаем BX:DX
   MOV   DX,mess0        ;
   CALL  MESSAGE         ;
   POP   AX              ; АХ = BX (для вывода на экран)
   MOV   BX,10           ; ВХ = система счисления
   CALL  HEX2ASC         ; выводим сумму отриц.элементов на экран
   MOV   DX,mess2        ;
   CALL  MESSAGE         ;
   POP   AX              ; АХ = DX
   MOV   BX,10           ;
   CALL  HEX2ASC         ; выводим счётчик нулей на экран
 
;============ ВЫЧИСЛЕНИЕ ПРОИЗВЕДЕНИЯ ПОЛОЖИТЕЛЬНЫХ ==========//
   MOV   SI,array        ;
   MOV   CX,size/2       ;
   MOV   EBX,1           ; стартовый множитель (32 бит)
   XOR   EAX,EAX         ; множимое тоже 32 бит
@1:                      ;
   LODSW                 ; берём элемент массива
   TEST  AX,AX           ;
   JNS   ok              ; фильтр положительных элементов
   LOOP  @1              ;
   JMP   next2           ;
ok:                      ; наш клиент!
   OR    AX,AX           ; положительное может быть нулём
   JZ    fuckZero        ; факинг его.. (умножать на 0 нельзя)
   MUL   EBX             ; EAX * EBX
   XCHG  EAX,EBX         ; EBX = текущий результ
   XOR   EAX,EAX         ; в старшем слове(EAX) может быть мусор
fuckZero:                ;
   LOOP  @1              ; сл.элемент с массива...
   PUSH  EBX             ; запомним выхлоп функции!
 
next2:                   ;
   MOV   DX,mess1        ;
   CALL  MESSAGE         ; выводим результат на экран
   POP   EAX             ;
   MOV   EBX,10          ; в 10-тичной системе счисления
   CALL  HEX2ASC         ;
 
exit:                    ;
   XOR   AX,AX           ;
   INT   16h             ;
   INT   20h             ;
 
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
MESSAGE:                 ; функция вывода сообщений ==========//
   MOV   AH,9            ;
   INT   21h             ;
RET                      ;
 
HEX2ASC:                 ; вывод чисел с АХ на экран =========//
   XOR   ECX,ECX         ;
isDiv:                   ;
   XOR   EDX,EDX         ;
   DIV   EBX             ;
   PUSH  EDX             ;
   INC   ECX             ;
   OR    EAX,EAX         ;
   JNZ   isDiv           ;
isOut:                   ;
   POP   EAX             ;
   CMP   AL,9            ;
   JLE   noHex           ;
   ADD   AL,7            ;
noHex:                   ;
   ADD   AL,30h          ;
   INT   29h             ;
   LOOP  isOut           ;
RET                      ;

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

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