А знаете ли вы што: Ассемблер Arduino IDE

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

С удивлением недавно узнал, что оказывается, если создать файл с расширением .S (именно с большой S) и покласть его в директорию с .ino, то в этом файле можно невозбранно писать текст не на встроенном в Си ассемблере, а на "чистом", без всяких кавычек и прочей х-ни. 

Создайте какой нить простенький проект в Arduino IDE. Потом в любом текстовом редакторе наберите 

#include <avr\io.h>


.global MyAsmFunc
MyAsmFunc: 
	ldi		r24,lo8(str_01)		; пхаем в возвращаемые регистры 
	ldi		r25,hi8(str_01)		; адрес строки лежащей по метке str_01
	ret

; Эта строка валяеца в PROGMEM
str_01:
	.asciz "My unique string in PROGMEM"

и сохраните его как AsmTest.S в той же директории, что и файл проекта .ino

В самом проекте напишите 

/*
	Name:       AsmTest.ino
	Created:	23.01.2020 14:36:10
	Author:     DtS
*/
#include <Arduino.h>

// Функции из ассемблера не подвергаюца "маскарадингу" лжывого С++
// поэтому они мало того, что "extern", дак еще и "extern "C""
//
extern "C" {  
	extern __FlashStringHelper *MyAsmFunc(void); // функция должна возвратить указатель на строку в PROGMEM
}


void setup()
{
	Serial.begin(115200);
	delay(250);
	Serial.println(F("AsmTest started...\n"));

// спецификатор %s печатает строку из RAM, а %S - из PROGMEM
//	
	Serial.println(MyAsmFunc()); // печать строки из PROGMEM 
}

void loop()
{
}

 ничего никуда подключать не надо, компилятор как-то сам понимает, что AsmTest тоже надо транслировать.  

Запустите и посмотрите что получица.

Мне счас приходится ковыряться с AVR ассемблером, поэтому буду разбираться, если интересно, буду писать заметки. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Еще как интересно!

sadman41
Offline
Зарегистрирован: 19.10.2016

Наконец-то все любители ассемблера начнут писать на нём и перестанут мучать вопросами "А что на Си так долго/непонятно/тупо?"

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

С удивлением недавно узнал, что оказывается... бла-бла-бла

Дед! Ты ведь знаешь, что я любя? ;))))

"На четвертый день Зоркий Глаз обнаружил, что у камеры нет одной стены!"

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

wdrakula пишет:

"На четвертый день Зоркий Глаз обнаружил, что у камеры нет одной стены!"

Дак а я знаю. :)   Пока не припёрло, чота и не озадачивался. Но и писать в таком ключе 

(__extension__({                                 \
    __asm__ __volatile__                         \
    (                                            \
        "movw  r0, %3\n\t"                       \
        "sts %0, %1\n\t"                         \
        "spm\n\t"                                \
        "clr  r1\n\t"                            \
        :                                        \
        : "i" (_SFR_MEM_ADDR(__SPM_REG)),        \
          "r" ((uint8_t)(__BOOT_PAGE_FILL)),     \
          "z" ((uint16_t)(address)),             \
          "r" ((uint16_t)(data))                 \
        : "r0"                                   \
    );                                           \
})) 

где хрен чо поймешь мне несколько неконфортна. Да еще оптимизатор всё норовит выкинуть нахрен. 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ф нашем комиляторе (avr-gcc) макрос __extension__ определен как пустой. Ты по инерции пишешь супер переносимый код? ;)))) Или скопировал кусок из avr-libc ????

Брось этих глупостев!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

wdrakula пишет:

Или скопировал кусок из avr-libc ????

естес-сно скопировал первое что нашел, для примера. Такой "встроенный" ассемблер у мня ничего, кроме идиосинкразии не вызывает, чота.  :) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Наконец-то все любители ассемблера начнут писать на нём и перестанут мучать вопросами "А что на Си так долго/непонятно/тупо?"

это же надо щи читать, в какие регистры что можно пихать, а чего нельзя, так, что наврядли  )))

	        cli
		clr R30
		ldi R31,0x01
		ld R10,Z+; max L
		ld R11,Z+; max H
		ld R12,Z+; zero L
		ld R13,Z+; zero H
		ld R14,Z+; min L
		ld R15,Z+; min H

		cp R11,R13
		brcs PR_L10
		brne PR_L11
		cp R10,R12
		brcs PR_L10
	PR_L11:
		cp R13,R15
		brcs PR_L10
		brne PR_L14
		cp R12,R14
		brcs PR_L10
		brne PR_L14

	PR_L10:
		cp R15,R13
		brcs PR_L9
		brne PR_L13
		cp R14,R12
		brcs PR_L9
	PR_L13:
		cp R13,R11
		brcs PR_L9
		brne PR_L12
		cp R12,R14
		brcc PR_L12
		rjmp PR_L9
	PR_L12: