Отговори на тема  [ 17 мнения ]  Отиди на страница 1, 2  Следваща
Asembler za PIC 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 05, 2005 9:34 am
Мнения: 88
Мнение Asembler za PIC
Здравейте. Имам малък проблем с асемблера и немога да разбера защо се получава така.. Ето едно фрагментче

VARIABLE i=4
constant limit=5
.
.
re nop
if i < limit
i+=1
goto re
else
nop
endif
nop
и като резултат цикъла се "зацикля" до безубразие, тоест не извършва операцията i+=1 ?!?!?

някои може ли да ми обясни защо и как трябва да се напише синтаксиса за да го смята това i+=1

с уважение ..... SurchO


Нед Юли 24, 2005 3:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Нормално :lol:

Точно така се очаква да се държи. :wink: Трябва да е написано така :
If (tintiri-mintiri) {
bla-bla1;
bla-bla2;
} else .....


Нед Юли 24, 2005 4:01 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Дек 19, 2004 6:26 pm
Мнения: 1628
Местоположение: Сливен
Мнение 
Хм - много странен асемблер бе хора.
Да не си говорите за С някакво?? Или съм много изостанал :oops:


Пон Юли 25, 2005 4:10 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
И на мен това ми е чудно, новия мплаб да не разбира от if и > :)


Сря Юли 27, 2005 6:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Това май е някакъв вид макро-асемблер, и във старите MPLab-и го имаше ама никога несъм го ползвал.


Сря Юли 27, 2005 6:42 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 05, 2005 9:34 am
Мнения: 88
Мнение 
Ами условието си го изпълнява коректно но след това не мога да накарам променливата да си промени стойността. В самият хелп на МПЛАБ я има описана като диеректива а и в доста готови програми сам я виждал да я ползват :?


Сря Юли 27, 2005 11:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
е, ако е макро асемблер, тогава if-а трябва да е за условно асемблиране, а не за асемблиране на условия :roll: много тъпо е да пишеш макрос, който да се казва if :x пък и да се пише макрос >, <, =. но и конструкцията i+=1 е доста подозрителна. SurchO, интересно ми е, правиш ли разлика между инкрементиране, пред- и пос-инкрементиране? каква е разликата с i++ ?

и ако се иска удобство при писане (ако някой ви каже, че на асемблер се пише удобно, го ударете с ръководството за асемблерния език) защо не се ползва С?

първото крайъгълно правило в програмирането е написания код да е разбираем от друг програмист. това винаги помага кода да се разбира дори и от написалия го.


Сря Юли 27, 2005 11:57 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 05, 2005 9:34 am
Мнения: 88
Мнение 
е хубаво че C e по-удобен от асемблер и го разбират повече хора. До въпроса с i+=1 или i++ на мен ми е все едно кое ще ползвам като и двете не работят в случая. И в края някой ще даде ли отговор как се прави това а не да ме пита защо ми е и защо не го направя на друг програмен език. 8O


Чет Юли 28, 2005 12:14 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Аве братчед, нали това ти обяснява bateAz™...
Код:
IF <expression>
do something;
rest of the code;
         


При тоя горния код е нормално да се изпълни само do something при условие expression = True. Останалото в кода се изпълнява винаги. За да затвориш повече от една инструкция която да се изпълнява при условие expression = True трябва да изполваш къдрави скоби (поне така е правилото за писане на C):
Код:
IF <expression>
{do something;
do another thing;
}
rest of the code;

Това не ми прилича на условно компилиране, синтаксиса в MPASM е #IF... Затова когато се опитаме да ти помогнем, те питаме какво точно искаш да постигнеш и искаме да видим код. Няма да ти го откраднем нито да злоупотребяваме с него. А съветите за C на ДедоБоре© са съвсем уместни - Какъв по дяволите е тоя мелез между C и ASM. Първо - никъде не споменаваш за кой асемблер става въпрос...какво IDE и какъв компилатор ползваш :?: Съвсем нормално е да получиш неясен отговор при некоректен въпрос.


Последна промяна Predator_MF на Пет Юли 29, 2005 4:22 pm, променена общо 1 път



Чет Юли 28, 2005 1:01 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Цитат:
Ами условието си го изпълнява коректно но след това не мога да накарам променливата да си промени стойността.

Както си го написал кода, променливата си променя стойноста до 5 (едно завъртане на цикъла) и после програмата ти изглежда така
Код:
re nop
goto re

И както се сещаш това те вкарва в безкраен цикъл. Условието след if вече не е изпълнено и променливата не се променя повече :wink: , но това няма значение защото както писаха останалите goto-то се намира извън онсега на if-а. T.е за да вървят нещата слагай скобите.


Чет Юли 28, 2005 1:40 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 05, 2005 9:34 am
Мнения: 88
Мнение 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Точно така се очаква да се държи. Трябва да е написано така :
If (tintiri-mintiri) {
bla-bla1;
bla-bla2;
} else .....
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,



If (i<limit) {
i++
nop
} else


Error[108] F:\ASM.ASM 20 : Illegal character ({)


Пет Юли 29, 2005 4:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
MPASM Help написа:
if - Begin Conditionally Assembled Code Block
Syntax
Preferred:

if expr
Supported:

#if expr
.if expr
Description
Begin execution of a conditional assembly block. If expr evaluates to true, the code immediately following the if will assemble. Otherwise, subsequent code is skipped until an else directive or an endif directive is encountered.

An expression that evaluates to zero is considered logically FALSE. An expression that evaluates to any other value is considered logically TRUE. The if and while directives operate on the logical value of an expression. A relational TRUE expression is guaranteed to return a nonzero value, FALSE a value of zero.

if's may be nested up to 16 deep.

Usage
This directive is used in the following types of code: absolute or relocatable. For information on types of code, see Assembler Operation.

This directive is not an instruction, but used to control how code is assembled, not how it behaves at run-time. Use this directive for conditional assembly or to check for a condition, such as to generate an error message.



Пет Юли 29, 2005 4:20 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 05, 2005 9:34 am
Мнения: 88
Мнение 
Егати ужаса.............
i=0
while i< 4
nop
nop
i += 1
endw
написано така цикъла се повтаря 4 пъти а написано така...
i=0
while i< 4
nop
i += 1
endw

не се повтаря нито веднъж :?: :!: :arrow:


Нед Юли 31, 2005 8:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ти обаче или не четеш кво ти пиша или не разбираш.... Предишния ми пост пише:
Цитат:
if - Begin Conditionally Assembled Code Block

Преведено на наш мил език значи
Цитат:
If - започва УСЛОВНО АСЕМБЛИРАНЕ НА КОД
.
Ако това нищо не ти говори, ще ти го и обясня. При това асемблиране ако КОМПИЛАТОРА срещне условие "1" (т.е. ако i>=4) ще се асемблира всичко в тялото на фунцкията IF, в твоя случай първата инструкция след IF - nop!!!! Само че ти си дефинирал че и е равно на 4, тоест това условие никога няма да е вярно, i не е по-малко от 4. Тоест това което следва след IF-а никога няма да се компилира, все едно че не си го написал.


Нед Юли 31, 2005 8:13 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 05, 2005 9:34 am
Мнения: 88
Мнение 
това с IF го схванах но не ми побира плиткиа акъл защо например в цикъла с While ако условието е вярно и има 2 или повече инструкции в него той работи коректно ако е само една не се изпълнява ?


Нед Юли 31, 2005 8:28 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 17 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни