dlinyj: (Default)
Покуда одни при каждом удобном случае мажут хабр грязью, я с большим удовольствием на нём выуживаю полезные для меня статьи, в частности:
Как защититься от переполнения стека (на Cortex M)?

Я, к сожалению, не такой лютый погромист всяких STM32 и прочих 32-х битных МК. Но таки срыв стека ловил, как раз когда переписывал предзагрузчик на одном весёлом MIPS-процессоре. Там я работал вообще на вольных хлебах, в том смысле, что весь стек инициализировался линкерным скриптом, в котором я тогда воообще не волок и брал готовый (сейчас не сильно больше волоку). В общем, суть была такова, что при вложении функции больше трёх - у меня ребутился проц. Понял я это не сразу, а путём экспериментов. В результате я тогда написал свой менеджер памяти, благо переменных было не очень много, но очень много данных и память (32 метра) была вся в моём распоряжении.

Так вот, ещё тогда я задумался, что стек - это больное и узкое место. Даже если у сильных мира сего, на которых бегает линукс, бывает срыв стека, то что бывает с маленькими процами. А что говорить про всяких ардуинщиков, которые даже об этом не думают и уверен, что у них 90% проблем - это срыв стека.

Так вот, исходя из статьи выше, я внезапно открыл для себя замечательные опции компилятора gcc -fstack-usage и... Я немного прифигел. После компиляции с этой опцией, появляется тьма файлов *.su (soviet union stack usage). Заглядываем в них, и тут я немного фигею:

...
reader.c:260:5:run_mode	48	static
reader.c:276:5:get_data_from_reader	1088	static
reader.c:293:6:free_recive_buffer	1056	static
reader.c:300:10:get_raw_data	64	static
...


Открываем функцию free_recive_buffer. Данная функция - это грязный хак-затычка, которая высасывает всё что есть в буфере uart, перед началом работы, чтобы иметь чистый буфер. Исключительно удобна при всяких опытах.

void free_recive_buffer (void) {
	uint8_t free_data [MAX_DATA_SIZE] = {0};
	get_from_reader(free_data,MAX_DATA_SIZE,100);
}


Ничего особенного, но оказывается, что переменная free_data располагается на стеке (MAX_DATA_SIZE = 1024).

Вопрос к знатокам. Я понимаю, что система у меня толстая, стек большой (кстати, а как узнать его размер в линукс?), но ведь это не есть хорошо? А если, вот я укажу там не 1024 в дефайне, а какую-нить дичь, типа 100000000? В чём преимущество размещения на стеке, в чём недостаток?

Так же, накидайте мне ещё каких-нить полезных опций компилятора gcc?

UPD Размер стека в Linux https://stackoverflow.com/questions/2275550/change-stack-size-for-a-c-application-in-linux-during-compilation-with-gnu-com
dlinyj: (Default)
08.05.2007 23:17:28, [livejournal.com profile] di_halt
user32 нам вот задали по высшей математике написать рефер на тему "Математические выражения как аналог слов языка"
user32 я думаю, впринципе, с помощью асма можно передать всё что думаешь, чуствуешь, разница только в количестве текста
LitrKrovi угу
Nаtаshkа да ну вас
LitrKrovi ага даже любовью занимаца)))
user32 mov Natasha, ax
user32 mov chlen, ax
user32 push ax
user32 pop ax
user32 push ax
user32 pop ax
user32 push ax
user32 pop ax

08.05.2007 23:18:21, [livejournal.com profile] dlinyj
Аххххххххххаааахахахахахаххаахаххахаахахаахахахахаххахааххааааа

08.05.2007 23:18:22, [livejournal.com profile] di_halt
код ошибочный

08.05.2007 23:18:33, [livejournal.com profile] dlinyj
push r1
pop r1

08.05.2007 23:18:41, [livejournal.com profile] di_halt
не не в этом дело

08.05.2007 23:18:49, [livejournal.com profile] di_halt
он сам себя в член оттрахал

много пошлости, но истенным программерам посвящается )
dlinyj: (Default)
Тэээкс.. Доки, где доки? ДОКИ! И гугл молчит сука.... Доков нету... Хреново. Ах, тут каждый раз своя модель и нетрадиционный подход. Ну молодцы производители, как же я это буду перешивать? Ладно. Смотрим код. Ммм, так это команда у нас обрабатывает команду с порта "Уши". Мдя, сразу идёт команда логического деления - позитив/негатив. Интересненько. Выставляется флаг настроения. Так, тут просто. Теперь подойдём к процедурам анализа. Ё-маё, кто этот ассемблер придмалу? Ужас, и доков нету. Так. Блин, что за ересь? Какая разрядность данных? Все данные переменной длины? Ахренеть! Интересно как же они обрабатываются. Так, а команда работы с памятью есть? Их три? Взаимоисключающие? И куда мы попадаем, если хотим достать из той ячейки? Пиздец, ну и адрессация - чёрт ногу сломит. Проще в память не лезть... Вот откуда пошло понятие - девичья память, нихрена не найдёшь - вроде всё есть, да пока систему команд освоишь - лопнешь... Ух ты, интересный момент! Так, нука, выковыряли из памяти значение, через косвенную адресацию... Опа! А значение не то, но более нужное чем искали... Странно. Так, какие-то доки нагуглил. Читаю, ага... Сипец - это система команд называется женская интуиция. Мда... Видать этот проц нам не по зубам... Оставим до лучших времён.

По мотивам поста [livejournal.com profile] di_halt http://di-halt.livejournal.com/260294.html
dlinyj: (Default)
Открыл асм, начал писать. Господи, какой кайф. Как же я давно на тебе не кодил мой родимый. Главное задачка реальная появилась. Кстати, сделал себе инет побыстрее в 4 раза. Теперь счастливые 256 килобит неогранки, почти за те же деньги. Сходил в гости к провайдеру (ебеня ещё те, а главное каморочка мелкая).
dlinyj: (Default)
Аааааааааа! Я адско устал, ща просто усну на клаве! Но я нашёл для себя адску штуку - дизассемблер. Залез на диск Хакера, и решил поглядеть что же делают мои программы на паскале... Всё, теперь я потерян навсегда для этого мира...

З.ы. кстати, комрады посоветуйте хороший дизассемблер, чтобы инструкции пентиум про поддерживал и желательно имел трассировщик.

ARM...

Sep. 13th, 2006 09:54 am
dlinyj: (Default)
Да... [livejournal.com profile] di_halt всётаки проебал мне мозг. Раз нехватает секса с женщинами, компенсируем его сексом с процами. Я правда не видел все комманды, но это RISC - архитектура настоящих ебанутых отцов ассемблера! ЫЫЫЫ. Если я буду знать асм этого чуда... Гыггыгыгыы. Я разучусь говорить, буду только мычать, но асмом буду владеть в совершенстве, буду изъяснятся в машкодах :)
dlinyj: (Default)
Вот пишу прожку. Под AVR архитектуру, да на асме. Есть примеры под i8051 (при том достаточно кривые), и моя же прожка на асме (ну немного паскаля, каюсь, но в основном асм) под х86 архитектуру. Надо в уме это перекомпилировать и написать под AVR. Снова делаю перекодировку ассемблера :) Ассемблер трёх архитектур - это круто!
dlinyj: (Default)
Слил себе даташит на PIC16F628. Ёмазай! 35 команд! Что ещё человеку нужно для полного счастья. Я даже и не думал, что такое бывает в природе. Обязательно попробую это чудо! Ещё тут слышал про 4-х битные процессоры, это вообще наверное настолько извращенский секс, что даже самым лютым маньякам не снилось!
dlinyj: (Default)
Обожаю RISC архитектуру - столько геммороя на пустом месте :)
dlinyj: (Default)
В общем, да... [livejournal.com profile] serg2x2 был прав. У меня там был недочёт. Но так просто сложение с переносом делать нельзя, т.к. мы бит переноса портим в вычитании. Пришлось ставить оператор, обнуляющий этот флаг. В результате код, в котором был баг, будет таким:
	clc	;Очищаем флаг переноса! Очень важный момент
	push	r18
	ADD	ZL,R16
	ADC	ZH,R17;Складываем старший байт учитывая перенос.

Как оказалось флаг переноса мы подсираем в вычитании. Приходится его обнулять принудительно. Когда написал онным образом в дебагере код был прогнан с разными цифирями и всё работало на ура!
З.Ы. Просто асм на ночь - это жопа!
dlinyj: (Default)
Понадобилась мне задачка, на AVR, перевести 10 битное число, снимаемое с АЦП в десятичный формат, чтобы можно было его удобно вывести на дисплей или передать в компутер. Задача оказалось интересной и сложной. Оказалось, что у AVR напрочь отстутствуют команды деления. Не можем делить, но можем вычитать! Отлично. Но и это оказалось не камень преткновения, с 16 разрядным регистром всего несколько команд работает. Это сложение и вычитание с константой. Но и это не всё, сложение/вычитание производится с числом меньше либо равным 63! Мда, задачка достойная настоящего гуру. И я её победил, теребил кучу народу по асе, присылали коды, но не один меня не спас. Низкий поклон в ножки за оказаннаю помощь [livejournal.com profile] gxost в проверке и подсказке алгоритмов. А также проверке моего убогого, но в конце концов рабочего, кода. Для особо любопытных код можно глянуть под катом. //примечание для [livejournal.com profile] gxost - ошибка была в одном операторе, выделен жирным с каментом. Read more... )
Любопытно, что тот же код, без лишнего гемора на С будет несколько строк. Но мы не ищем лёгких путей. Надо мыслить, как мыслит машина!
dlinyj: (Default)
Я таки перенёс код с одного камня на другой. Вышла очень даже ничего. Правда пришлось RFM по обоим кристаллам. Так вот что вышло:
Код АТ89С51: 
DOW_CRC:	PUSH ACC         	;Save the Accumulator.
        PUSH B                  ;Save the B register.
        PUSH ACC                ;Save bits to be shifted.
        MOV  B,#8               ;Set to shift eight bits.
CRC_LOOP:       XRL  A,TEMP     ;Calculate DQIN xor CRCT0.
        RRC  A           	;Move it to the carry.
	MOV  A,TEMP             ;Get the last CRC value.
	JNC  ZERO        	;Skip if DQIN xor CRCT0 = 0.
	XRL  A,#18H      	;Update the CRC value.
ZERO:	RRC  A           	;Position the new CRC.
	MOV  TEMP,A      	;Store the new CRC.
	POP  ACC         	;Get the remaining bits.
	RR   A           	;Position next bit in LSB.
	PUSH ACC         	;Save the remaining bits.
	DJNZ B,CRC_LOOP  	;Repeat for eight bits.
	POP  ACC         	;Clean up the stack.
	POP  B           	;Restore the B register.
	POP  ACC         	;Restore the Accumulator.
	RET              	;Return.

Тот же код на AVR (пока на Tiny2313, хотя пишется под Tiny15):
DOW_CRC:	push	reg_TMP
		ldi		reg_count,8
CRC_LOOP:	eor		reg_TMP,reg_data
		ror		reg_TMP
		mov		reg_TMP,reg_data
		brcc	zero
		ldi		reg_TMP2,0x18
		eor		reg_TMP,reg_TMP2
ZERO:		ror		reg_TMP
		pop		reg_TMP
		mov		reg_TMP,r23
		lsr		reg_TMP
		push	reg_TMP
		DEC		reg_count
		BRNE	CRC_LOOP
		pop		reg_TMP
		pop		reg_count
		reti
dlinyj: (Default)
Помница ездил когда-то в своей молодости в коммандировки. И там бывало нечего делать, а комп есть. Ну погоняешь ты в контру на стареньком ноуте, запаривает очень быстро. И нашёл себе развлекаловку. Там стояла вынь98, и ещё был тогда ДОС. Я запускал милый сердцу DEBUG и писал минипрожки на асме. Моргал светодиодом с ЛПТ порта и т.п. Эх, были времена...
dlinyj: (Default)
Пишу прогу на бейсике, с асмовскими вставками. Вот изврат то, а!). У меня должно получиться так, что при изменение состояния порта должно выводиться в СОМ порт слово. Но блин... Так обидно... Слово выводиться ПРИ изменения состояния порта!!! Отладночкая программа тупо без перерыва гонит дамп: 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 0D 0A 41 21 И т.д. Т.е. ему срать на изменение порта. Коды асма взяты от моей проги часов... Но ничего не пашет... Обломно!
dlinyj: (Default)
Низкоуровневая Молитва.

Вызывающий нас, иже еси во фрейме стека
Да святятся параметры Твои
Да придет адресное пространство Твое
Да свершится ввод вывод Твой
Как в регистрах, так и в памяти
Дай нам сегодня кванты времени
И прости нам ошибки страниц наши
Как прощаем мы передающих неверные параметры
Не введи нас в безусловные переходы
Но вознеси нас из сегментных регистров
Ибо Твое есть Адресное Пространство, Регистры и Порты,
Jmp $
Ret



Копирайт [livejournal.com profile] di_halt с [livejournal.com profile] ru_radio_electr
dlinyj: (Default)
Асм рулит! Самый клёвый язык шкодинга! Самый приятный и гибкий. Есть только один недостаток у этого языка, только один. НЕПЕРЕНОСИМЫЙ КОД!!!!!!!!! :( Т.е. для каждого камушка надо учить свой АСМ... Для AVR, ADSP, ARM, x86, 8080, 8051, PIC и т.д. И т.п. :( Радует только, что они хоть чуть чуть похожи...

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 04:43 am
Powered by Dreamwidth Studios