реклама на сайте
подробности

 
 
12 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> ASM: приказали долго жить?, Сколько еще продержится
white.wind
сообщение Jun 20 2006, 06:56
Сообщение #16


Участник
*

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



Попробовал asm, ничего, не страшный совсем smile.gif

Счас играю с видеовыводом на МК. Среди реализаций есть полностью на Си, однако помогает знать что генерит компилятор.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 20 2006, 07:49
Сообщение #17


Шаман
******

Группа: Модераторы
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2006, 08:37
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
vanner
сообщение Jun 20 2006, 09:03
Сообщение #19


Участник
*

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



Это понятно, разработчики компиляторов тоже люди, и тоже допускают ошибки. Но как это связано с самим ассемблером?
Я уже молчу тогда что вытворяют иногда компиляторы си, особенно с высоким уровнем оптимизации кода.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2006, 09:09
Сообщение #20


Гуру
******

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



Цитата(vanner @ Jun 20 2006, 12:03) *
Это понятно, разработчики компиляторов тоже люди, и тоже допускают ошибки. Но как это связано с самим ассемблером?
Да это не ошибка. Если на нужном адресе поставить метку и сделать RJMP на метку все будет отассемблировано как надо. С ассемблером это связано напрямую (именно с тем "компилятором" с языка ассемблера, каламбур :-)) ). Вот если бы мы писали сразу в кодах, тогда да - никаких ограничений, кроме времени жизни и психического здоровья разработчика.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Serj78
сообщение Jun 20 2006, 10:23
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



начинал на С, (cv) потом для тини12 пришлось поизучать асм, потом вернулся к си, уже с ассемблерными вставками- на 8мгц на си с тв сигналом работать было трудновато. smile.gif

Сообщение отредактировал Serj78 - Jun 20 2006, 10:25
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jun 20 2006, 11:43
Сообщение #22


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(_Bill @ Jun 20 2006, 10:29) *
...Ассемблер - это для души...



Апсолютно верно...

с уважением
(круглый)
Go to the top of the page
 
+Quote Post
OlegIvanov
сообщение Jun 20 2006, 15:29
Сообщение #23


Участник
*

Группа: Новичок
Сообщений: 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 (слов)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2006, 16:00
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 20 2006, 19:54
Сообщение #25


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(white.wind @ Jun 20 2006, 09:56) *
Попробовал asm, ничего, не страшный совсем smile.gif

Счас играю с видеовыводом на МК. Среди реализаций есть полностью на Си, однако помогает знать что генерит компилятор.

Он не просто не страшный совсем, я бы сказал AVR-ASM самый удачный и простой в использовании среди всех других ассемблеров MK. Писать программы (без математики с плавающей точкой) на Avr-ASM не сложнее чем на C. Порой даже проще (вчастности обработку прерываний проще и качественнее делать на asm).
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 20 2006, 21:09
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 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
.....
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 21 2006, 03:27
Сообщение #27


Adept
******

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



Цитата(defunct @ Jun 21 2006, 02:54) *
Цитата(white.wind @ Jun 20 2006, 09:56) *

Попробовал asm, ничего, не страшный совсем smile.gif

Счас играю с видеовыводом на МК. Среди реализаций есть полностью на Си, однако помогает знать что генерит компилятор.

Он не просто не страшный совсем, я бы сказал AVR-ASM самый удачный и простой в использовании среди всех других ассемблеров MK.

Очень спорный тезис. Меня так после асма 51-го AVR'овский просто ломал. Немного лучше стало, когда слепил кучу макросов, чтобы уменьшить объем писанины. Когда перешел на С (а это оказалось оченно правильным, т.к. С код на AVR ложится очень неплохо), то началась просто другая жизнь. Хотя асм AVR'овский не забывал - частенько инспектировал кодогенерацию по листингам. На сегодня могу сказать, что и асм MSP430 куда как удобнее и приятнее, чем AVR'овский.

Цитата(defunct @ Jun 21 2006, 02:54) *
Писать программы (без математики с плавающей точкой) на Avr-ASM не сложнее чем на C.

Опять не соглашусь - сложнее, дольше и получается громоздкий (по сравненю с С) и запутанный код, в котором через пару месяцев и автору с ходу не разобраться. Из всех асмов, которые приходилось видеть, самым похожим на С является ассемблер для Blackfin'а. AVR'у в этом смысле до Blackfin'а далеко. smile.gif

Цитата(defunct @ Jun 21 2006, 02:54) *
Порой даже проще (вчастности обработку прерываний проще и качественнее делать на asm).

Качественнее в смысле быстродействия и размера кода - да. Проще - нет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
forever failure
сообщение Jun 21 2006, 06:03
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Цитата(OlegIvanov @ Jun 20 2006, 05:28) *
коль долго еще возможно будет использовать ASM в разработках. Ваше мнение, господа?

Ответ - всегда, однозначно. При этом знать Ц и Ц++ тоже. Можно програмить на ЯВУ в основном, но асм знать - обязательно, особенно на МК.
Go to the top of the page
 
+Quote Post
CDT
сообщение Jun 21 2006, 13:19
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 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 никогда не прикажет долго жить, хотя бы по тому, что для создания компилятора С он тоже нужен.


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post
white.wind
сообщение Jun 21 2006, 13:43
Сообщение #30


Участник
*

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



Цитата(CDT @ Jun 21 2006, 17:19) *
..хотя бы по тому, что для создания компилятора С он тоже нужен.


Не обязательно, пару лет назад мы с ребятами баловались над созданием расширения C#. По началу все (парсер, генерация) писалось на самом C#, а потом расширение парсило и генерировало само себя biggrin.gif Вроде даже есть название такому подходу.
Go to the top of the page
 
+Quote Post

12 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01523 секунд с 7
ELECTRONIX ©2004-2016