Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Asembler za PIC
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=888
Страница 1 от 2

Автор:  SurchO [ Нед Юли 24, 2005 3:29 pm ]
Заглавие:  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

Автор:  bateAz [ Нед Юли 24, 2005 4:01 pm ]
Заглавие: 

Нормално :lol:

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

Автор:  Wise [ Пон Юли 25, 2005 4:10 pm ]
Заглавие: 

Хм - много странен асемблер бе хора.
Да не си говорите за С някакво?? Или съм много изостанал :oops:

Автор:  ToHu [ Сря Юли 27, 2005 6:26 pm ]
Заглавие: 

И на мен това ми е чудно, новия мплаб да не разбира от if и > :)

Автор:  Dimitar [ Сря Юли 27, 2005 6:42 pm ]
Заглавие: 

Това май е някакъв вид макро-асемблер, и във старите MPLab-и го имаше ама никога несъм го ползвал.

Автор:  SurchO [ Сря Юли 27, 2005 11:48 pm ]
Заглавие: 

Ами условието си го изпълнява коректно но след това не мога да накарам променливата да си промени стойността. В самият хелп на МПЛАБ я има описана като диеректива а и в доста готови програми сам я виждал да я ползват :?

Автор:  ДедоБоре [ Сря Юли 27, 2005 11:57 pm ]
Заглавие: 

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

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

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

Автор:  SurchO [ Чет Юли 28, 2005 12:14 am ]
Заглавие: 

е хубаво че C e по-удобен от асемблер и го разбират повече хора. До въпроса с i+=1 или i++ на мен ми е все едно кое ще ползвам като и двете не работят в случая. И в края някой ще даде ли отговор как се прави това а не да ме пита защо ми е и защо не го направя на друг програмен език. 8O

Автор:  Predator_MF [ Чет Юли 28, 2005 1:01 am ]
Заглавие: 

Аве братчед, нали това ти обяснява 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 и какъв компилатор ползваш :?: Съвсем нормално е да получиш неясен отговор при некоректен въпрос.

Автор:  HCL [ Чет Юли 28, 2005 1:40 am ]
Заглавие: 

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

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

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

Автор:  SurchO [ Пет Юли 29, 2005 4:06 pm ]
Заглавие: 

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



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


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

Автор:  Predator_MF [ Пет Юли 29, 2005 4:20 pm ]
Заглавие: 

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.


Автор:  SurchO [ Нед Юли 31, 2005 8:01 pm ]
Заглавие: 

Егати ужаса.............
i=0
while i< 4
nop
nop
i += 1
endw
написано така цикъла се повтаря 4 пъти а написано така...
i=0
while i< 4
nop
i += 1
endw

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

Автор:  Predator_MF [ Нед Юли 31, 2005 8:13 pm ]
Заглавие: 

Ти обаче или не четеш кво ти пиша или не разбираш.... Предишния ми пост пише:
Цитат:
if - Begin Conditionally Assembled Code Block

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

Автор:  SurchO [ Нед Юли 31, 2005 8:28 pm ]
Заглавие: 

това с IF го схванах но не ми побира плиткиа акъл защо например в цикъла с While ако условието е вярно и има 2 или повече инструкции в него той работи коректно ако е само една не се изпълнява ?

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/