Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2023, 11:12   #11
macomics
Участник клуба
 
Регистрация: 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
Изображения
Тип файла: png Screenshot_20230413_111427.png (10.5 Кб, 9 просмотров)

Последний раз редактировалось macomics; 13.04.2023 в 11:14.
macomics вне форума Ответить с цитированием
Старый 13.04.2023, 12:10   #12
YaLubluMamu
Пользователь
 
Регистрация: 22.10.2022
Сообщений: 37
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Только зачем в нем кратность трём?
Это в задании написано: Подпрограмма суммирования слов, делящихся на 3, в четных столбцах.
Еще раз спасибо

Последний раз редактировалось YaLubluMamu; 13.04.2023 в 12:35.
YaLubluMamu вне форума Ответить с цитированием
Старый 13.04.2023, 13:14   #13
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда условие стало не верным. В комментарии сверху написано про
Код:
; Подпрограмма суммирования слов с нечетными значениями в чётных столбцах.
Тогда надо вернуть условие
Код:
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
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметические операции nikita-92 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.04.2013 00:08
Арифметические операции. Saintpatrick38 Помощь студентам 2 05.04.2013 09:04
Арифметические операции swillrocker Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 02.10.2012 21:31
Арифметические действия над матрицами и транспонирование Axel1981 Помощь студентам 14 12.06.2010 20:20