|
|
  |
ASM: приказали долго жить?, Сколько еще продержится |
|
|
|
Jun 20 2006, 06:56
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 2-05-06
Из: Санкт-Петербург
Пользователь №: 16 707

|
Попробовал asm, ничего, не страшный совсем  Счас играю с видеовыводом на МК. Среди реализаций есть полностью на Си, однако помогает знать что генерит компилятор.
|
|
|
|
|
Jun 20 2006, 07:49
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Сергей Борщ @ Jun 20 2006, 09:56)  ... сделайте RJMP на +0x400 слов (переход из таблицы векторов Boot-области в Application). Согласно описанию AVR Instruction Set в качестве аргумента RJMP берет смещение в словах. Однако "втюхать" это смещение ассемблеру от IAR "в лоб" невозможно. Асм от WinAVR такое тоже есть отказался. В Вашем случае предполагается "сворачивание" адреса через 0. В EWAWR_AssemblerReference сказано: Цитата In the options -v2, -v3, and -v4, jumps do not wrap. и ещё: Цитата -v3 ≤ 128 Kbytes code. RJMP wraparound is not possible, that is RJMP and RCALL cannot reach the entire address space.
|
|
|
|
|
Jun 20 2006, 08:37
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(IgorKossak @ Jun 20 2006, 10:49)  Цитата(Сергей Борщ @ Jun 20 2006, 09:56)  ... сделайте RJMP на +0x400 слов (переход из таблицы векторов Boot-области в Application). Согласно описанию AVR Instruction Set в качестве аргумента RJMP берет смещение в словах. Однако "втюхать" это смещение ассемблеру от IAR "в лоб" невозможно. Асм от WinAVR такое тоже есть отказался.
В Вашем случае предполагается "сворачивание" адреса через 0. Это следствие. Я прошу сделать RJMP вперед на 0x400 слов. Syntax: Operands: RJMP k -2K <k <2K 16-bit Opcode: 1100 kkkk kkkk kkkk так вот я хочу получить после ассемблирования 16-битный opcode 1100 0100 0000 0000 Цитата(IgorKossak @ Jun 20 2006, 10:49)  В EWAWR_AssemblerReference сказано: Цитата In the options -v2, -v3, and -v4, jumps do not wrap. и ещё: Цитата -v3 ≤ 128 Kbytes code. RJMP wraparound is not possible, that is RJMP and RCALL cannot reach the entire address space. Я не прошу (для меги-8) компилятор догадаться что для перехода с адреса 0x1802 в адрес 0x0002 нужно использовать wrap, я об этом уже догадался за него. Я хочу получить вполне легитимный опкод 0xC400. Исходно вопрос стоял: Цитата Первый раз слышу, чтобы компилятор мешал при компиляции ассемблерного кода. Может примерчик. Вот я и привожу пример: согласно описанию системы команд RJMP k, k может быть +-2К, а ассемблер не дает мне подставить это самое k. Решение есть, но через одно место.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 20 2006, 09:03
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 23-10-05
Пользователь №: 10 016

|
Это понятно, разработчики компиляторов тоже люди, и тоже допускают ошибки. Но как это связано с самим ассемблером? Я уже молчу тогда что вытворяют иногда компиляторы си, особенно с высоким уровнем оптимизации кода.
|
|
|
|
|
Jun 20 2006, 11:43
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(_Bill @ Jun 20 2006, 10:29)  ...Ассемблер - это для души... Апсолютно верно... с уважением (круглый)
|
|
|
|
|
Jun 20 2006, 15:29
|
Участник

Группа: Новичок
Сообщений: 38
Регистрация: 12-09-05
Пользователь №: 8 464

|
Цитата(Сергей Борщ @ Jun 20 2006, 11:37)  Цитата(IgorKossak @ Jun 20 2006, 10:49)  Цитата(Сергей Борщ @ Jun 20 2006, 09:56)  ... сделайте RJMP на +0x400 слов (переход из таблицы векторов Boot-области в Application). Согласно описанию AVR Instruction Set в качестве аргумента RJMP берет смещение в словах. Однако "втюхать" это смещение ассемблеру от IAR "в лоб" невозможно. Асм от WinAVR такое тоже есть отказался.
В Вашем случае предполагается "сворачивание" адреса через 0. Это следствие. Я прошу сделать RJMP вперед на 0x400 слов. Syntax: Operands: RJMP k -2K <k <2K 16-bit Opcode: 1100 kkkk kkkk kkkk так вот я хочу получить после ассемблирования 16-битный opcode 1100 0100 0000 0000 Цитата(IgorKossak @ Jun 20 2006, 10:49)  В EWAWR_AssemblerReference сказано: Цитата In the options -v2, -v3, and -v4, jumps do not wrap. и ещё: Цитата -v3 ≤ 128 Kbytes code. RJMP wraparound is not possible, that is RJMP and RCALL cannot reach the entire address space. Я не прошу (для меги-8) компилятор догадаться что для перехода с адреса 0x1802 в адрес 0x0002 нужно использовать wrap, я об этом уже догадался за него. Я хочу получить вполне легитимный опкод 0xC400. Исходно вопрос стоял: Цитата Первый раз слышу, чтобы компилятор мешал при компиляции ассемблерного кода. Может примерчик. Вот я и привожу пример: согласно описанию системы команд RJMP k, k может быть +-2К, а ассемблер не дает мне подставить это самое k. Решение есть, но через одно место. Все там нормально рулит +/-2k нужно понимать +/-2047 (байт) = +/-1023 (слов)
|
|
|
|
|
Jun 20 2006, 16:00
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(OlegIvanov @ Jun 20 2006, 18:29)  Все там нормально рулит +/-2k нужно понимать +/-2047 (байт) = +/-1023 (слов) 1) Relative jump to an address within PC - 2K +1 and PC + 2K (words) Таки +- 2К слов. 2) речь не о превышении разрядной сетки, а о невозможности указания значения операнда "в лоб" Код RJMP 0x400 Error[400]: Absolute operand is not possible here Решение есть, но оно "через задницу": Код COMMON DRIVER_VECTORS:CODE:ROOT(1) ORG INT0_vect RJMP SFE(DRIVER_VECTORS) - SFB(DRIVER_VECTORS) - 0x024; Redirect to application section ORG INT1_vect RJMP SFE(DRIVER_VECTORS) - SFB(DRIVER_VECTORS) - 0x022; Redirect to application section ORG TIMER2_COMP_vect RJMP SFE(DRIVER_VECTORS) - SFB(DRIVER_VECTORS) - 0x020; Redirect to application section ORG TIMER2_OVF_vect RJMP SFE(DRIVER_VECTORS) - SFB(DRIVER_VECTORS) - 0x01E; Redirect to application section ORG TIMER1_CAPT_vect И все эти извращения компилируются в одинаковые опкоды C400
Сообщение отредактировал Сергей Борщ - Jun 20 2006, 16:02
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 20 2006, 21:09
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Сергей Борщ @ Jun 20 2006, 11:37)  Это следствие. Я прошу сделать RJMP вперед на 0x400 слов. Syntax: Operands: RJMP k -2K <k <2K 16-bit Opcode: 1100 kkkk kkkk kkkk так вот я хочу получить после ассемблирования 16-битный opcode 1100 0100 0000 0000 Простите, может я не понял вопроса, а что вариант RJMP PC+$400 не катит? Вообще такие вещи, я так не делаю. Предлагаю вариант. ComExe: ldi Zl, low(TabCom) ; Загрузить адрес ldi Zh, high(TabCom) ; таблицы комманд в Z add Zl, wl ; прибавить смещение adc Zh, Yh ; скорректировать (Yh=0) ijmp ; и перейти на выполнение комманды ..... ; Набор основных комманд rjmp a0 ; a(0) rjmp Ok2 ; b(0-1) (для совместимости) rjmp Ok2 ; с(0-1) (для совместимости) rjmp d0 ; d rjmp e0 ; e(0-1) ..... ; *** Установить соединение (A0) *** a0: cpi wh, 1 brsh errC rjmp ata ; перейти на установление соединения ; *** Набор номера *** d0: rcall swup ; Поднять трубку ld wl, Y andi wl, $df .....
|
|
|
|
|
Jun 21 2006, 03:27
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(defunct @ Jun 21 2006, 02:54)  Цитата(white.wind @ Jun 20 2006, 09:56)  Попробовал asm, ничего, не страшный совсем  Счас играю с видеовыводом на МК. Среди реализаций есть полностью на Си, однако помогает знать что генерит компилятор. Он не просто не страшный совсем, я бы сказал AVR-ASM самый удачный и простой в использовании среди всех других ассемблеров MK. Очень спорный тезис. Меня так после асма 51-го AVR'овский просто ломал. Немного лучше стало, когда слепил кучу макросов, чтобы уменьшить объем писанины. Когда перешел на С (а это оказалось оченно правильным, т.к. С код на AVR ложится очень неплохо), то началась просто другая жизнь. Хотя асм AVR'овский не забывал - частенько инспектировал кодогенерацию по листингам. На сегодня могу сказать, что и асм MSP430 куда как удобнее и приятнее, чем AVR'овский. Цитата(defunct @ Jun 21 2006, 02:54)  Писать программы (без математики с плавающей точкой) на Avr-ASM не сложнее чем на C. Опять не соглашусь - сложнее, дольше и получается громоздкий (по сравненю с С) и запутанный код, в котором через пару месяцев и автору с ходу не разобраться. Из всех асмов, которые приходилось видеть, самым похожим на С является ассемблер для Blackfin'а. AVR'у в этом смысле до Blackfin'а далеко.  Цитата(defunct @ Jun 21 2006, 02:54)  Порой даже проще (вчастности обработку прерываний проще и качественнее делать на asm). Качественнее в смысле быстродействия и размера кода - да. Проще - нет.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 21 2006, 06:03
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112

|
Цитата(OlegIvanov @ Jun 20 2006, 05:28)  коль долго еще возможно будет использовать ASM в разработках. Ваше мнение, господа? Ответ - всегда, однозначно. При этом знать Ц и Ц++ тоже. Можно програмить на ЯВУ в основном, но асм знать - обязательно, особенно на МК.
|
|
|
|
|
Jun 21 2006, 13:19
|
Местный
  
Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044

|
Цитата Простите, может я не понял вопроса, а что вариант RJMP PC+$400 не катит? Это товарищ вредничает. Одной мнемоникой все переходы и вызовы (это относиться и к условным переходам): rjmp Lable rjmp 0x400 rjmp pc+0x400 rjmp pc-0x400 .equ JmpShift=Lable1-Lable2 rjmp pc+JmpShift rjmp pc-JmpShift Только относительные скачки на конкретно заданное число шагов (+0х400) применять очень не удобно, поскольку при вводе одной команды по средине надо все поправлять ручками, вычисляя на калькуляторе. Цитата Вообще такие вещи, я так не делаю. Предлагаю вариант. Правильный вариант, особенно если в программе есть некая переменная, которая соответствует текущему состоянию системы и используется как смещение в таблице rjmp'ов. Экономит код и время. Ругает народ AVR assembler. А в версии 2 очень не плохие макросы можно делать, передавая в них имена регистров и регистровых пар. Хочешь - систему команд перепиши, хочешь - собери библиотеку и одним движением настрой ее на свои регистры, память и процессор: -------------------------------------------------- .macro LDI2 ldi @0,low(@2) ldi @1,high(@2) .endm ---------------------------------------------------- .macro CPI2_2 cpi @1,high(@2) brne _quit cpi @0,low(@2) _quit: .endm --------------------------------------------------------- .macro ADD2_1 add @0,@2 brcc _ADD2 subi @1,-1 _ADD2: .endm И пишется быстрее, и читается нормально. ldi2 zl,zh, JmpTable add2_1 zl,zh,rStatus cpi2_2 zl,zh, JmpTableEnd brsh Error ijmp ASM никогда не прикажет долго жить, хотя бы по тому, что для создания компилятора С он тоже нужен.
--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
|
|
|
|
|
Jun 21 2006, 13:43
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 2-05-06
Из: Санкт-Петербург
Пользователь №: 16 707

|
Цитата(CDT @ Jun 21 2006, 17:19)  ..хотя бы по тому, что для создания компилятора С он тоже нужен. Не обязательно, пару лет назад мы с ребятами баловались над созданием расширения C#. По началу все (парсер, генерация) писалось на самом C#, а потом расширение парсило и генерировало само себя  Вроде даже есть название такому подходу.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|