draft3 0 18 мая, 2017 Опубликовано 18 мая, 2017 · Жалоба Нигде не найду как на ассемблере объявить переменную в среде IAR. А также где брать подключаемые хедер файлы для портов. Может у кого есть простая рабочая программка на асме под stm8 в среде IAR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 18 мая, 2017 Опубликовано 18 мая, 2017 · Жалоба это ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 18 мая, 2017 Опубликовано 18 мая, 2017 · Жалоба Я делал вот так: module i2c section .near_func.text:CODE:NOROOT(0) extern ?b0 public i2c_readbyte public i2c_readword public i2c_writebyte PA_ODR define 0x5000 PA_IDR define 0x5001 set_sda macro bset PA_ODR, #2 endm clear_sda macro bres PA_ODR, #2 endm set_scl macro bset PA_ODR, #1 endm clear_scl macro bres PA_ODR, #1 endm write_bit macro sll A bccm PA_ODR, #2 set_scl nop nop nop clear_scl endm read_bit macro set_scl nop ld A, #4 and A, L:PA_IDR clear_scl add A, #255 rlcw X nop nop endm start macro clear_sda clear_scl endm stop macro clear_sda set_scl set_sda endm write_byte: write_bit write_bit write_bit write_bit write_bit write_bit write_bit write_bit set_sda nop nop set_scl nop nop nop clear_scl ret read_byte: set_sda read_bit read_bit read_bit read_bit read_bit read_bit read_bit read_bit clear_sda set_scl nop clear_scl ret read_byte_nack: set_sda read_bit read_bit read_bit read_bit read_bit read_bit read_bit read_bit set_sda set_scl nop clear_scl ret i2c_readbyte: push A start ld A, #0xC0 call write_byte pop A call write_byte stop nop nop nop start ld A, #0xC1 call write_byte call read_byte_nack stop rrwa X, A ret i2c_readword: push A start ld A, #0xC0 call write_byte pop A call write_byte stop nop nop nop start ld A, #0xC1 call write_byte call read_byte call read_byte_nack stop ret i2c_writebyte: push A start ld A, #0xC0 call write_byte pop A call write_byte ld A, ?b0 call write_byte stop ret end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
draft3 0 8 июня, 2017 Опубликовано 8 июня, 2017 · Жалоба Я читал "IAR Assembler Reference Guide" пытался брать те куски кода которые там приводились но все никак не получается... особенно непонятно как правильно пользоваться директивой SECTION. Я так понимаю что нужно обьявить секцию для переменных сначала? Так значение переменной не меняется: #include "iostm8.h" MODULE asmmain PUBLIC __iar_program_start PUBLIC main EXTERN CSTACK$$Limit SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках? __iar_program_start: a1 DC16 0 //двухбайтная переменная инициализируется значением 0 a2 DC16 9 //двухбайтная переменная инициализируется значением 9 LDW X, #0x000600 ; Set stackpointer LDW SP, X main: LD A,#5//загружаю в А число 5 LD a1,A// загружаю в переменную a1 значение из А END Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 8 июня, 2017 Опубликовано 8 июня, 2017 · Жалоба Я читал "IAR Assembler Reference Guide" пытался брать те куски кода которые там приводились но все никак не получается... особенно непонятно как правильно пользоваться директивой SECTION. Я так понимаю что нужно обьявить секцию для переменных сначала? Так значение переменной не меняется: #include "iostm8.h" MODULE asmmain PUBLIC __iar_program_start PUBLIC main EXTERN CSTACK$$Limit SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках? __iar_program_start: a1 DC16 0 //двухбайтная переменная инициализируется значением 0 a2 DC16 9 //двухбайтная переменная инициализируется значением 9 LDW X, #0x000600; Set stackpointer LDW SP, X main: LD A,#5//загружаю в А число 5 LD a1,A// загружаю в переменную a1 значение из А END По моему у Вас всё перепутано. Вот фрагмент кода, ассемблер редко приходится использовать: //-------------------------------------------ПЕРЕМЕННЫЕ--------------------------------------------- SECTION `.noinit`:DATA:NOROOT(2) DATA D_NUM DS16 1 ; Серийный номер D_DAT DS16 1 ; Дата выпуска dummy DS16 2 //-------------------------------------------КОНСТАНТЫ---------------------------------------------- SECTION `.rodata`:CONST:NOROOT(2) DATA ;--------------------------------------------------------------------------------------------------- sys_param: DC16 0, 9999, 1234, 0x90 + T_DEC + F_EXT + F_WRT DC8 ' Регистр команд ' Синтаксис скорее определяется используемой средой, чем платформой. В секции, предназначенной для размещения кода, невозможно разместить переменные. А различия в объявлении должны быть понятны из примера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
draft3 0 9 июня, 2017 Опубликовано 9 июня, 2017 · Жалоба Так компилируется: #include "iostm8.h" MODULE asmmain PUBLIC __iar_program_start PUBLIC main EXTERN CSTACK$$Limit //-------------------------------------------ПЕРЕМЕННЫЕ--------------------------------------------- SECTION `.noinit`:DATA:NOROOT(2) DATA//это зачем? работает и без нее. D_NUM DC8 1 ; Серийный номер D_DAT DC8 1 ; Дата выпуска dummy DC8 2 SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках? __iar_program_start: LDW X, #0x000600 ; Set stackpointer LDW SP, X main: LD A,#5//загружаю в А число 5 //LD D_NUM,A// загружаю в переменную a1 значение из А END Но если раскомментировать "//LD D_NUM,A// загружаю в переменную a1 значение из А" то пишет ошибку: Error[Lc036]: no block or place matches the pattern "rw data section .noinit in asmmain.o" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 9 июня, 2017 Опубликовано 9 июня, 2017 (изменено) · Жалоба Так компилируется: DATA//это зачем? работает и без нее. D_NUM DC8 1 ; Серийный номер D_DAT DC8 1 ; Дата выпуска dummy DC8 2 Это от единообразия IAR-a: у Кортексов-М, если не сказать заветное слово "DATA", то в заказанных константах младший бит будет установлен в единицу. Изменено 9 июня, 2017 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 12 июня, 2017 Опубликовано 12 июня, 2017 (изменено) · Жалоба Error[Lc036]: no block or place matches the pattern "rw data section .noinit in asmmain.o" Это же был просто пример. У меня в файле *.icf объявлена секция ".noinit", в которой и размещаются эти переменные. У Вас видимо этой секции нет. Размещайте переменные в существующей секции. По поводу ключевых слов DATA и CODE - я всегда явно указываю, что размещаю: данные (переменные или константы в зависимости от секции) или код программы. Возможно где то это и не обязательно, но и вроде как не мешает. Изменено 12 июня, 2017 пользователем amiller Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба Но если раскомментировать "//LD D_NUM,A// загружаю в переменную a1 значение из А" то пишет ошибку: Возьмите любой си-шный исходник, найдите в свойствах проекта галку "генерировать asm-файлы", скомпилите и изучите результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 14 июня, 2017 Опубликовано 14 июня, 2017 · Жалоба Возьмите любой си-шный исходник, найдите в свойствах проекта галку "генерировать asm-файлы", скомпилите и изучите результат. Я так делал себе "шаблон" для функции на ASM. Как альтернатива - в каталоге, где установлен IAR, поискать файлы с расширением ASM (для конкретного процессора) Там может быть каталог \tutor\ - приведены примеры проектов с ASM а также исходники функций (на ASM), содержащихся в библиотеках C, например ldiv (по крайней мере для IAR/MSP430 ОНО есть). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 15 июня, 2017 Опубликовано 15 июня, 2017 · Жалоба Как альтернатива - в каталоге, где установлен IAR, поискать файлы с расширением ASM (для конкретного процессора) ... и ничего не найти так как файлы ассемблера в IAR по дефолту имеют расширение .s Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться