Вычисление суммы отрицательных, произведения положительных и количества нулевых значений в одномерном массиве - 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 ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д