问题描述
我需要您的帮助,我不知道如何在汇编中编写if语句,对于ATmega328p,请帮助我!
解决方法
好,因此此处理器具有所谓的条件码。某些说明对其进行了设置,而其他说明则对其进行了阅读。通过使用加,减或比较指令设置条件代码,然后使用条件分支指令测试所需条件来完成条件分支。我们使用条件分支来完成if-then语句的控制流程。
基本思想是,在C条件为假的情况下,我们希望处理器跳过then部分。
常规C代码:
if ( i < 10 ) {
printf ("i < 10!"); // then part "fires" when i < 10 is true
}
执行上述if-then,但使用标签和条件分支(如汇编程序)的伪C代码:
if ( i >= 10 ) goto pastThen; # this is a conditional branch that skips the then part
# when i < 10 is false
# ! (i<10) or "(i<10) is false" is the same as i>=10
printf ("i < 10!");
pastThen:
我们可以通过编写一些程序集以将i
与10
进行比较来将其转换为程序集,这将设置条件代码,然后对标签使用“大于或等于”的分支,例如pastThen
。像这样(但这仍然是伪代码):
load r0,i
compare r0,#10
bge pastThen
... # code to call printf ("i < 10!");
pastThen:
使用条件分支(以及偶尔的无条件分支),我们可以创建while,for和repe循环,if-then语句和if-then-else循环-结构化编程的所有控制结构
一旦您知道这一点,您将能够更好地阅读汇编。您可以查看Godbolt.org,那里有可供尝试的编译器。因此,您可以使用C语言为编译器提供一个小函数,并查看其为您提供的语句和表达式生成什么样的代码。他们有一个Arduino Mega编译器,但我不知道它是否与您的芯片兼容,尽管它可以使您更好地了解具体的if语句。