Страница 1 из 1

Опыты с 8051. Как так вышло?

Добавлено: Пн янв 31, 2022 21:55:12
Shuspano
Дело было вечером, делать было нечего. Сижу, и занимаюсь сами знаете чем. Озадаченный вопросом "а что будет если", в MCU8051IDE дизассемлировал маленький бессмысленный кусочек какого-то бинарного мусора, и пытаюсь отладить то что вышло. Удалил все вызовы и переходы в никуда, все MOVX, все что влияет на указатель стека, удалил или поменял все, на что ругается IDE. Осталось немного. При выполнении что-то там происходит, ставлю переход из конца в начало, и делаю вечный кайф:
Спойлер

Код: Выделить всё

	ORG	0h
lab0:	mov	A, @R0
	setb	C
	rlc	A
	mov	@R1, A
	mov	@R0, A
	mov	@R1, A
	mov	C, 0E7h
	rlc	A
	anl	3h, A
	rlc	A
	mov	@R1, A
	anl	C, 0F2h
	rr	A
	mov	@R1, #32h
	mov	R3, 77h
	rlc	A
	xchd	A, @R1
	rlc	A
	mov	R7, A
	xchd	A, @R1
	mov	R2, A
	xchd	A, @R1
	rlc	A
	mov	@R1, A
	ljmp	lab0
	END
Прошагиваю то что получилось, и через 2-3 цикла выполнения этого бреда, получаю ошибку:
Изображение
Комментирую указанную строку. После чего получаю такую-же ошибку в строке с другим номером. Делал дальше по всякому, получалось все одно и тоже Начинаю подозревать что чудит IDE, тем более что там такое иногда бывает, и решаю проверять в железе.Дописываю две подпрограммы - вывода аккумулятора в P1 со светодиодами, и задержку 400 мс, чтоб видно было:
Спойлер

Код: Выделить всё

ledport	equ	P1
temp	equ	0x20

	ORG	0h
lab0:	mov	A, @R0
	setb	C
	rlc	A
	mov	@R1, A
	mov	@R0, A
	mov	@R1, A
	mov	C, 0E7h
	rlc	A
	anl	3h, A
	rlc	A
	mov	@R1, A
	anl	C, 0F2h
	rr	A
	mov	@R1, #32h
	mov	R3, 77h
	rlc	A
	xchd	A, @R1
	rlc	A
	mov	R7, A
	xchd	A, @R1
	mov	R2, A
	xchd	A, @R1
	rlc	A
	mov	@R1, A
        mov	temp, A
	call	output
	call	delay
	ljmp	lab0

delay:	mov	30h, #002h
	mov	31h, #0c6h
	mov	32h, #0e7h
next:	djnz	32h, $ 
	djnz	31h, next
	djnz	30h, next
	ret

output:	push	ACC
	push	PSW
	mov	A, temp
	cpl	A
	mov	ledport, A
	pop	PSW
	pop	ACC
	ret
	END
Заливаю в МК, запускаю, через пару циклов программа встает... Да причем так встает, что МК виснет намертво, reset перестает работать. Понимаю, что я такого пока не видел.
Пытаюсь понять как это происходит, и не знаю что думать. IDE говорит что invalid opcode. Но как могут быть опкоды инвалидами, если их выдает транслятор, если они записывается во флэш, где не могут изменится в процессе работы. Инструкции в этой программе хоть и от балды натыканы, но они ведь правильные. Я что-то не знаю, не понимаю, или как это?

Re: Опыты с 8051. Как так вышло?

Добавлено: Вт фев 01, 2022 10:04:33
>TEHb<
Может там собачка по-умолчанию включена?

Re: Опыты с 8051. Как так вышло?

Добавлено: Ср фев 02, 2022 10:26:57
BOB51
КОТЯТКИ!
Не издевайтесь над подопытными мелкосхемами!
:music:
Первое, что резво в глаза бросается:
Нельзя абсолютно произвольно впихивать код в МК, не считаясь со структурой и организацией того МК.
1. Смотрим карту регистров РПД и положение указателя стека "по умолчанию" - без оного ни одна подпрограмма/прерывание никогда верно работать не будут!
(https://img.radiokot.ru/files/20529/2qo1qt1kgh.GIF)
И говорим спасибо авторам MCS51 за то, что хоть в область РСФ нет необходимости без надобности лазить за отключением неиспользуемых аппаратных модулей (как у некоторых АВРок и ПИКушек).
2. Практически всегда есть шанс "заглючить" МК до состояния полного отключения питания на 1-2 минуты для повторного перезапуска, ежли не учитывать что при подаче питания содержимое РПД неопределено, а сигнал RESET имеющееся до него содержимое РПД НЕ ИЗМЕНЯЕТ.
8)

Ежли уж под то мку иде, то скорее вот так будет компилироваться (полный проект с начальными настройками под МК):
mcu_tst.zip
(14.95 КБ) 106 скачиваний
и то...
все операции с @R0/@R1 нужно проверять на диапазон корректности (в тесте этого нету), чтоб запись не могла производиться выше адреса 0х40 - дабы содержимое стека не укошмарить.
8)

Re: Опыты с 8051. Как так вышло?

Добавлено: Пт фев 04, 2022 20:27:29
Shuspano
Хм... Гм... В общем, это плохая идея была у меня - декомпилировать что попало.
BOB51 писал(а):equ 0x20 в среде MCU 8051 IDE префикс 0х.... не допускается!
Еще как допускается, работает без проблем.
Насчет очистки РПД... Как -то я купил на алёэкспрессе сверхдешевые STC11F02. Выводы коцанные, сами царапанные, шились через один. Выглядели так, как будто их достали из мусорки. Так вот, если после включения прочитать любую прямоадресуемую ячейку RAM, то там будет случайное число. У других такого не припомню.

Re: Опыты с 8051. Как так вышло?

Добавлено: Сб фев 05, 2022 10:26:02
BOB51
Ежли б 0х... Работало без проблем, то любой их моих проектов под c51asm можно было бы без труда туда подключить.
8)
Собственно их за тех "нюансов" я и не стал использовать данную IDE...
:(
Относительно ОЗУ резидентной памяти данных - у всех семейств при аппаратном сбросе в процессе работы содержимое этой области не меняется.
Начальное содержимое также неопределённо.
С одной стороны - выход из "глубокой гибернации" по стандарту mcs51(через сигнал reset), в более поздних - сохранение данных при сбросе от собаки/ схем контроля питания да тот же выход из "глубокого сна".
8)

Re: Опыты с 8051. Как так вышло?

Добавлено: Вс фев 06, 2022 15:39:55
BOB51
Кстати мое отношение к удобству MCU IDE (Синтаксис ассемблера) достаточно субьективно.
Просто когда подобрал ключ к практически однотипному написанию исходников на ассемблере для трех компиляторов -
MCS51 (c51asm), AVR (AVRASM2 AVRstudio4.19) и mpasm (mplab studio8.92) дополнить "на скору руку" значительно отличающееся сложнее.
А там таки отличия имеются...
Разве что уж совсем "обстоятельства прижмут" - сама IDE весьма привлекательна и работоспособна от ХР до7ки/10ки.
Но то уж лучше сразу под SDCC грызть будет.
:beer: