Страница 1 из 1

Asm [AVR Studio] математические операции в процессе компила

Добавлено: Вт авг 07, 2012 11:35:01
kras
Задаю выражение:

Код: Выделить всё

.equ K_div = 10^6/(880*2^(27/12))
Правила другие какие-то. Подскажите, как сделать умножение, а может еще что поменять? Где почитать об этом? Как видно, это MATLAB'овский синтаксис.

2. Как сделать массив таких значений? То есть можно ли скомпилить один раз массив, и больше не генерировать его мк?

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Вт авг 07, 2012 12:34:41
kras
Кстати, понял, какие правила, вроде там и нету возведения в степень, хотя если есть - поделитесь секретом. А вот я не понимаю, как создать массив:(

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Вт авг 07, 2012 12:40:05
korsaj
Его не мк генерирует а компилятор (выполняет матиматические вычисления и результат присваивает константе K_div).

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Вт авг 07, 2012 13:54:18
kras
А мне так и надо. Ну пока начал делать по-другому, и пока понравилось так. Все числа на MATLAB посчитал, ок, в конце программы создал массив. Команда lmp позволяет обратиться к элементам этого массива, теперь следующий вопрос: как вычислить адрес некоторой метки? Мне из массива нужен ненулевой элемент. Моя попытка:

Код: Выделить всё

; выше в Z хранится смещение, но в итоге сейчас я решил сделать для простоты Z = 0000h
subi ZH, Low(-(key1<<1))
sbci ZL, High(-(key1<<1))

Не то выдает. key1 - метка начала байтового массива.

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Вт авг 07, 2012 14:28:54
akl
Плохо понимаю в этих "кыржиках",

Код: Выделить всё

subi ZH, Low(-(key1<<1))
sbci ZL, High(-(key1<<1))
но ZH и ZL поменял бы местами

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Вт авг 07, 2012 15:06:35
kras
поменял, но 1 в старшем регистре, а не 0, сейчас еще подумаю, почему. А самую простую программу написал! То есть теперь эта проблема. А как можно еще в AVR Studio задавать значения сигналов, идущих на входы PORTB?

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Вт авг 07, 2012 16:58:25
akl
Знающий объяснил мне назначение этих "кыржиков". Я бы сделал, примерно, так

Код: Выделить всё

 .include "m8adef.inc"
.device ATmega8a
	;.equ key1 = 0
	.def key1_H=R22
	.def key1_L=R23
Reset:
	LDI	ZH,HIGH(TAB*2)
	LDI	ZL,LOW(TAB*2)

;	SUBI ZL, Low(-key1) ; такая конструкция, в принципе, бесполезна,
;	SBCI ZH, High(-key1); т.к. эти команды работают с константами
	ADD	ZL,key1_L
	ADC	ZH,key1_H
	LPM
; в R0 считывается значение массива 	
	RJMP	RESET

;	subi ZL, Low(-(key1<<1)) ;???????????? Тогда уж проще 	LDI	ZH,HIGH(key1*2)
;	sbci ZH, High(-(key1<<1)) ;??????????                   	LDI	ZL,LOW(key1*2)
	.ORG	$300
TAB:
	.DB	$77,$66,$55,$44

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Чт авг 09, 2012 13:03:56
BOB51
обращение к памяти программ пословное...
вот простейший пример массива:
znak7.txt
(2.12 КБ) 283 скачивания
может чего пряснится :tea:

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Чт авг 09, 2012 16:41:25
vitalik_1984
kras писал(а):Задаю выражение:

Код: Выделить всё

.equ K_div = 10^6/(880*2^(27/12))
Смысл делать такое выражение, если можно тупо на калькуляторе посчитать?
В этом случае все равно придется всю формулу заново лопатить.
Вот если пару чисел на Дефайненые константы заменить - то совсем другое дело.Типа этого:

Код: Выделить всё

.equ X = 880
.equ Y = 6
.equ K_div = 10^Y/(X*2^(27/12))

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Чт авг 09, 2012 17:44:01
Kavka
kras писал(а):Задаю выражение:

Код: Выделить всё

.equ K_div = 10^6/(880*2^(27/12))
Если не ошибаюсь, то 4я студия не понимает дробные степени в режиме ассемблера.

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Чт авг 09, 2012 20:11:54
BOB51
не стоит забывать, что все вычислительные заморочки в исходнике считает компилятор при трансляции а вот чего будет делать устройство при исполнении программы... :cry:

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Чт авг 09, 2012 21:07:21
vitalik_1984
Точно точно, нужно результат привести еще к нужному виду, если это целое, то в целое превратить наверное,( правда как это на асме делается не представляю.)
А то получится дробь, а вы то не будете в программе своей учитывать и голову будете ломать в чем же дело.

Вообще есть в асме такая фича как 8000UL или тому подобное?

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Чт авг 09, 2012 21:40:48
Jack_A
vitalik_1984 писал(а): Вообще есть в асме такая фича как 8000UL или тому подобное?
Переведи ! 8000 Вольт ?

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Чт авг 09, 2012 22:00:46
BOB51
это про такое что-ли?

"Функции

Определены следующие функции:
LOW(выражение) возвращает младший байт выражения
HIGH(выражение) возвращает второй байт выражения
BYTE2(выражение) то же что и функция HIGH
BYTE3(выражение) возвращает третий байт выражения
BYTE4(выражение) возвращает четвёртый байт выражения
LWRD(выражение) возвращает биты 0-15 выражения
HWRD(выражение) возвращает биты 16-31 выражения
PAGE(выражение) возвращает биты 16-21 выражения
EXP2(выражение) возвращает 2 в степени (выражение)
LOG2(выражение) возвращает целую часть log2(выражение)"
или в оригинальном helpе:
Functions
The following functions are defined:
LOW(expression) returns the low byte of an expression
HIGH(expression) returns the second byte of an expression
BYTE2(expression) is the same function as HIGH
BYTE3(expression) returns the third byte of an expression
BYTE4(expression) returns the fourth byte of an expression
LWRD(expression) returns bits 0-15 of an expression
HWRD(expression) returns bits 16-31 of an expression
PAGE(expression) returns bits 16-21 of an expression
EXP2(expression) returns 2 to the power of expression
LOG2(expression) returns the integer part of log2(expression)
The following functions are only defined in AVRASM2:
INT(expression) Truncates a floating point expression to integer (ie discards fractional part)
FRAC(expression) Extracts fractional part of a floating point expression (ie discards integer part).
Q7(expression) Converts a fractional floating point expression to a form suitable for the FMUL/FMULS/FMULSU instructions. (sign + 7-bit fraction)
Q15(expression) Converts a fractional floating point expression to a form suitable for the FMUL/FMULS/FMULSU instructions. (sign +15-bit fraction)
ABS() Returns the absolute value of a constant expression.
DEFINED(symbol) Returns true if symbol is previously defined using .equ/.set/.def directives. Normally used in conjunction with .if directives (.if defined(foo)), but may be used in any context. It differs from other functions in that parentheses around its argument are not required, and that it only makes sense to use a single symbol as argument.
STRLEN(string) returns the length of a string c+onstant, in bytes.

:)

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Пт авг 10, 2012 05:44:50
vitalik_1984
Jack_A писал(а): Переведи ! 8000 Вольт ?
каких вольт то? мы про компилятор говорим.
unsigned long
BOB51 , почти, только как сказать компилятору на сколько байт константу создавать?

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Пт авг 10, 2012 08:40:12
avreal
А никак.
Промежуточные вычсиления асм-компилятор делает в фиксированной разрядности (нужно смотреть документацию, в данном случае, я думаю, 32 бита).
И все константы автоматически в этой разрядности без необходимости указывать суффиксом.

Re: Asm [AVR Studio] математические операции в процессе комп

Добавлено: Пт авг 10, 2012 09:56:29
BOB51
:)))
константу создаем мы сами, а остальное лишь для того, чтоб компилятор знал как чего обозвать и куда сунуть...
либо так:
.equ name = 0x55aa55
.set name2 = 0x70ff
либо так:
.cseg
signedw: .dw 0xf243
longconst: .dw 0x5589, 0x6699
а как воспринимать данные под меткой - выбирай сам - компилятор или выполнит то, что ему укажут или выдаст ошибку переполнения, если превышены возможности его вычислительных способностей по крайней мере, 4-х байтовые слова он понимает :)