Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Поправил цикл расчёта. Только зачем в нем кратность трём? Это было написано в комментариях.
Код:
; Подпрограмма суммирования слов с нечетными значениями в чётных столбцах.
nata segment 'code'
org 256
assume cs:nata, ds:nata, ss:nata, es:nata
begin: jmp main
;------------Для ввода ---------------------
Buf db 7,0,7 DUP(?)
datev dw 0
mnoj dw ?
N dw 3 ; количество строк
M dw 4 ; количество столбцов
bait_v_stoke dw ? ; количество байт в одной строке
N_M dw ? ; количество элементов в массиве
ps db 10,13,'$',0
;------------Для вывода ---------------------
date dw ?
;---------------------------------
X dw 12 DUP(?) ; Резервируем память под массив
Sum dw 0 ; сумма элементов
svX db 10,13,'Enter elements X',10,13,'$'
svXXX db 10,13,'Array X:',10,13,'$'
ssum db 10,13,'Sum of items with odd values in even columns',10,13,'$'
;---------------------------------
main proc near
; ! Необходимо однозначно настраивать сегментные регистры.
mov ax, cs ; т.к. у вас программа из одного сегмента
mov ds, ax ; значит записываем во все сегментные регистры
mov es, ax ; одно и тоже значение
cld ; настройка работы строковых операций
; ******* 1 – Считаем количество элементов в массиве ? N_M *****
mov ax, N
imul M
mov N_M, ax ; нашли количество элементов в массиве
; считаем сколько байт памяти занимает одна строка ?bait_v_stoke
mov ax, M
add ax, ax
mov bait_v_stoke, ax ; количество байт в одной строке
; ******** 2 – Заполняем массив X ****************
mov cx, N_M ; количество элементов в массиве
lea di, X ; адрес первого элемента
@z1:
push cx
; выводим строку-подсказку
mov ah, 09
lea dx, svX ; 10,13,'Enter elements X',10,13,'$'
int 21h
; получаем один элемент
call vvod
; записываем его в массив
stosw
pop cx
loop @z1
; ******* 3 – Вывод массива X *****************
; Выводим строку МАССИВ X
mov ah, 09
lea dx, svXXX ; 10,13,'Array X:',10,13,'$'
int 21h
; Выводим массив X построчно
mov cx, N ; внешний цикл – по количеству строк
mov bx, 0 ; сколько байт до начала строки пропустить
; ------ внешний цикл по строкам ------------------------------------
@next_row:
push cx
mov cx, M ; M - количество элементов строки
lea si, X[bx]
; ---- внутренний цикл по элементам строки --------------
@next_elem:
lodsw
; вывод одного элемента строки
mov date, ax
push cx bx ; сохраняем в стеке нужные регистры
call vivod
pop bx cx
loop @next_elem
; ---- конец внутреннего цикла по элементам строки -----
add bx, bait_v_stoke ; переход к след. строке
mov ah, 09 ; перевод строки
lea dx, ps ; 10,13,'$'
int 21h
pop cx
loop @next_row
; ------ конец внешнего цикла по строкам --------------
; ******** Конец вывода массива X *********************
;***** 4 – Вызов процедуры подсчета суммы ***************
call raschet_odd
; ***** 5 – Вывод значения суммы ************************
mov ah, 09
lea dx, ssum ; 10,13,'Sum of items with odd values in even columns',10,13,'$'
int 21h
mov ax, sum
mov date, ax
call vivod
mov ah, 09 ; перевод строки
lea dx, ps ; 10,13,'$'
int 21h
; Ожидание нажатия на клавишу
mov ah, 08
int 21h
mov ax, 4C00h
int 33
main endp
raschet_odd proc near
push bx bp si di
mov bp, N_M
xor si, si ; начинаем с 0-го столбца
mov Sum, 0 ; инициализируем сумму нулем
add bp, bp
@top:
cmp si, M ; если просмотрели все столбцы, то выходим из подпрограммы
je @exit
xor bx, bx ; начинаем с 0-й строки
@next_col:
mov ax, X[bx][si] ; загружаем слово
test al, 1 ; проверяем нечетность слова
jz @next_word ; если слово четное, переходим к следующему
; Не понял зачем вообще это нужно.
; add bx, bait_v_stoke ; переходим к следующей строке
; cmp bx, bp ; если просмотрели все строки, то переходим к следующему столбцу
; jc @next_col
; jmp @exit_inner_loop
; mov di, ax ; проверяем деление на 3
; mov dx, 0
; mov cx, 3
; div cx
; cmp dx, 0 ; если не делится на 3, переходим к следующему слову
; jne @next_word
add Sum, di ; добавляем значение слова к сумме
@next_word:
add bx, bait_v_stoke ; переходим к следующей строке
cmp bx, bp ; если просмотрели все строки, то переходим к следующему столбцу
jne @next_col
@exit_inner_loop:
add si, 2 ; переходим к следующему четному столбцу
jmp @top
@exit:
pop di si bp bx
ret
raschet_odd endp
vvod proc near
push bp bx si
mov bp, 0
; ввод числа в виде символов
mov ah, 0ah
lea dx, buf
int 21h
; получаем количество введенных символов
lea si, buf+2
mov bx, 10 ; 1
mov cl, byte ptr buf+1 ; сколько символов(цифр)
mov ch, 0
cmp byte ptr [si], '-'
jne @m1000
inc si
@m1000:
; берем одну цифру
lodsb
sub al, 30h
cbw
xchg ax, bp
mul bx ; ax=bp*10; цифра*10^
add bp, ax
loop @m1000
cmp byte ptr Buf[2], '-'
jne @m1001
neg bp
@m1001:
mov ah, 09
lea dx, ps
int 21h
mov ax, bp
pop si bx bp
ret
vvod endp
vivod proc near
cmp date, 0
jns @unsigned
neg date
mov ah, 2
mov dl, '-'
int 33
@unsigned:
mov bp, sp
mov ax, date
mov bx, 10
@vivod_split:
cwd
div bx
add dl, '0'
push dx
test ax, ax
jnz @vivod_split
mov ah, 2
@vivod_print:
pop dx
int 33
cmp sp, bp
jc @vivod_print
mov dl, ' '
int 21h
ret
vivod endp
;***************************************************************
nata ends
end begin
Последний раз редактировалось macomics; 13.04.2023 в 11:14.
|