Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

solowey
Статус: Специалист
Рейтинг: 401
∙ повысить рейтинг »
cain52
Статус: 3-й класс
Рейтинг: 1
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1757
Дата выхода:16.03.2020, 22:45
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:83 / 25
Вопросов / ответов:1 / 1

Консультация # 197963: Здравствуйте! У меня возникли сложности с таким вопросом:не совпадает результат расчетов com файла, и того же файла но запущеного через debug ...

Консультация # 197963:

Здравствуйте! У меня возникли сложности с таким вопросом:не совпадает результат расчетов com файла, и того же файла но запущеного через debug

Дата отправки: 11.03.2020, 22:25
Вопрос задал: m1dvet (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Старший модератор):

Здравствуйте, m1dvet!

Ошибка характерная для всех новичков в ассемблере.
smile
- Установка начального значения регистров.

Изменяем Ваш код, добавляем контроль регистра с вводимым числом:

Код (Assembler) :: выделить код
ORG 100h
	MOV	AH, 09h
	MOV	DX, TXT1
	INT	21h
	MOV	BX, 3E8h
	CALL	WRITE_DEC
	MUL	BX
	ADD	BP, AX
	mov	ax,bp
	call	outnum
	MOV	BX, 64h
	CALL	WRITE_DEC
	MUL	BX
	ADD	BP, AX
	MOV	BX, 0Ah
	CALL	WRITE_DEC
	MUL	BX
	ADD	BP, AX
	CALL	WRITE_DEC
	ADD	BP, AX
	MOV	AH, 09h
	MOV	DX, TXT2
	INT	21h
	MOV	BX, 3E8h
	CALL	WRITE_DEC
	MUL	BX
	ADD	DI, AX
	mov	ax,di
	call	outnum
	MOV	BX, 64h
	CALL	WRITE_DEC
	MUL	BX
	ADD	DI, AX
	MOV	BX, 0Ah
	CALL	WRITE_DEC
	MUL	BX
	ADD	DI, AX
	CALL	WRITE_DEC
	ADD	DI, AX
	MOV	AX, BP
	MOV	BX, DI
	MOV	CX, 0000h
	MOV	DX, 0000h
	DIV	BX
	MOV	BX, DX
	PUSH	BX
	PUSH	AX
	MOV	AH, 09h
	MOV	DX, TXT3
	INT	21h
	POP	AX
	CALL	T_DEC
	MOV	AH, 09h
	MOV	DX, TXT4
	INT	21h
	POP	BX
	MOV	AX, BX
	CALL	T_DEC
	NOP
xor	ax,ax
int	16h
	INT	20h
WRITE_DEC:
NEW:	MOV	AH, 08h; ФУНКЦИЯ ВВОДА СИМВОЛА C'ЭХА'
	INT	21h; ВSВОД СИМВОЛА
	MOV	DL, AL
	CMP	AL, 30h; ДЛЯ УСТАНОВКИ ФЛАГА, СРАВНИВАЕМ 30 И AL
	JB	FLAG_ON; ЕСЛИ МЕНЬШЕ, ФЛАГ УСТАНОВЛЕН (CF=1), ТО ПЕРЕХОДИМ К МЕТКЕ FLAG_ON
	CMP	AL, 39h; СРАВНИВАЕМ 39 И AL
	JA	FLAG_ON; ЕСЛИ AL > 39 ФЛАГ УСТАНОВЛЕН (CF=1), ТО ПЕРЕХОДИМ К МЕТКЕ FLAG_ON
	CLC
	JMP	A1
FLAG_ON:STC; УСТАНАВЛИВАЕМ ФЛАГ (CF=1)
A1:	JC	NEW; ЕСЛИ ФЛАГ УСТАНОВЛЕН, ТО ПЕРЕХОД К МЕТКЕ NEW
	MOV	AH, 02h; ВЫВОД DL
	INT	21h; НА ЭКРАН
	SUB	AL, 30h; ИЗ СОДЕРЖИМОГО AL ОТНИМАЕМ 30h
	XOR	AH,AH
	RET
T_DEC:
	MOV	CX,0000h; ОБНУЛЯЕМ CX
	MOV	BX,0Ah; ДЕЛИТЕЛЬ - 10
ZERO_DX:MOV	DX,0000h; ОБНУЛЯЕМ DX (ДЛЯ ОСТАТКА)
	DIV	BX; ДЕЛЕНИЕ: ЧАСТНОЕ В AX, ОСТАТОК В DX
	PUSH	DX; ЗАПИСЬ ОСТАТКА В СТЕК ДЛЯ ПОСЛЕДУЮЩЕГО ВЫВОДА
	INC	CX; УВЕЛИЧИТЬ СЧЕТЧИК НА 1
	OR	AX,AX; ПРОВЕРКА НА 0
	JNZ	ZERO_DX; ЕСЛИ НЕ 0, ПОВТОРЯЕМ ДЕЛЕНИЕ
FROM_STEK:
	POP	DX; ИЗВЛЕКАЕМ ОСТАТОК
	ADD	DL, 30h; ПОЛУЧАЕМ ASCII-символ
	MOV	AH, 02h; ВЫВОД СИМВОЛА
	INT	21h; НА ЭКРАН
	DEC	CX; УМЕНЬШАЕМ СЧЕТЧИК НА 1
	OR	CX, CX; СРАВНИВАЕМ С 0
	JNZ	FROM_STEK; ЕСЛИ НЕ 0, ИЗВЛЕКАЕМ СЛЕДУЮЩИЙ ОСТАТОК
	RET; ВОЗВРАТ ИЗ ПРОЦЕДУРЫ
outnum: pusha
	xor	cx,cx
	mov	bx,10
@@01:	xor	dx,dx
	div	bx
	push	dx
	inc	cx
	or	ax,ax
	jnz	@@01
	mov	al,'('
	int	29h
@@02:	pop	ax
	or	al,'0'
	int	29h
	loop	@@02
	mov	al,')'
	int	29h
	popa
	ret
TXT1	 DB 'xxxx / yyyy:=$'
TXT2	 DB ' / $'
TXT3	 DB ' ax= $'
TXT4	 DB 13,10,' dx = $'

Получаем картинку(в скобках значение регистра):

smile

Теперь - почему, это происходит. Пишем такой код:
Код (Assembler) :: выделить код
org	100h
	call	@@00
	mov	ah,9
	mov	dx,dbMess
	int	21h
@@00:	pusha
	mov	cx,8
	mov	si,dwName
	cld
@@01:	lodsw
	int	29h
	mov	al,ah
	int	29h
	lodsw
	int	29h
	mov	al,ah
	int	29h
	pop	ax
	push	cx
	mov	cx,4
@@02:	ror	ax,4
	push	ax
	and	ax,0fh
	cmp	al,10
	jb	@@03
	add	al,7
@@03:	add	al,'0'
	int	29h
	pop	ax
	loop	@@02
	pop	cx
	loop	@@01
	ret
dbMess	db	10,13,'after interupt',10,13,'$'
dwName	dw	' D','I=',' S','I=',' B','P=',' S','P=',' B','X=',' D','X=',' C','X=',' A','X='


И смотрим результат:

По результатам видно
  • Ось не чистит регистры перед запуском программы;
  • Любой, повторяю ЛЮБОЙ отладчик чистит РОН'ы(регистры общего назначения), кроме SP;
  • Прерывания - изменяют некоторые РОН'ы.

Смотрите, анализируйте - выводы делайте сами.

Ваша программа лечится так:
Код (Assembler) :: выделить код
MOV	BX, 3E8h
	CALL	WRITE_DEC
	MUL	BX
	ADD	BP, AX


Еще добавлю, у каждого регистра есть свое назначение - использование ВР, в качестве рабочего регистра - не рекомендуется, т.к. в будущем Вы будете использовать его, к примеру для доступа к параметрам передаными в подпрограмму. Отвыкайте от не целевого использования этого регистра.

Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 13.03.2020, 23:31
Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное