汇编程序的C代码

时间:2017-10-25 17:00:35

标签: assembly msp430

我已经学习了一段时间,而且我刚开始学习汇编程序。

我有这个问题:当按下开关s1和s2时,更改上面的代码以打开LED 1和LED 2(否则关闭两个LED)(4标记)

以下是代码:

            ; CONFIGURE PORTS FOR INPUT AND OUTPUT
            bis.b   #0x01,&P1DIR          ; set P1.0 as output
            bic.b   #0x40,&P2DIR          ; set P2.6 as input
            bis.b   #0x40,&P2REN          ; enable pullup for P2.6
            bis.b   #0x40,&P2OUT          ; enable pullup for P2.6

sw_check:   bit.b   #0x40,&P2IN           ; check if switch is pressed

            jnz     led_off               ; if so jump to led_off

            ; else
            bis.b   #0x01,&P1OUT          ; turn on LED 1
            jmp continue

led_off:    bic.b   #0x01,&P1OUT          ; turn off LED 1

continue:   jmp sw_check

            nop

我知道如何用C语言来解决这个问题,但是在汇编语言中,我不太确定。如果你看这一行:

sw_check:   bit.b #0x40,&P2IN             ; check if switch is pressed

要检查是否在C中按下了sw1和sw2,我只想放置if(P2IN& BIT6 + BIT7)。在汇编程序中编写它的等效方法是什么?

1 个答案:

答案 0 :(得分:2)

这看起来像msp430代码,但这真的不相关,直到你进入最终实现。似乎是斗争与此无关。

在C /伪代码中,如果你想测试一下你和它然后比较相等

if((0x40&P1IN)==0) then
if((0x40&P1IN)!=0) then

如果你想测试两位,那么第一个显而易见的方法是

if(((0x40&P1IN)!=0)&&((0x80&P1IN)!=0)) then

(这有竞争条件,我们在不同时间对P1IN进行采样,因此这不是一个好的解决方案)

但是我们知道这只意味着我们想要同时设置位0x40和0x80,所以我们想知道我们是否在这两位上看到0xC0 我们可以

if((P1IN&0xC0)==0xC0) then

现在它成为指令集依赖,你必须小心你不想要比赛条件的时间,所以你必须做几个步骤

A = P1IN&0xC0;
if(A==0xC0) then

将其翻译成指令集。除了为了娱乐或教育目的而极度减少之外,指令集将具有AND指令,您可能必须首先从P1IN地址加载/读取/移动到寄存器或存储器中然后隔离感兴趣的位然后比较特定的测试,包括on,on,one,特别是另一个特别关闭等等。

当然" off" " on"可以是零或一个取决于,可以让开关在按下时将输入拉高,使其作为一个读取,或者可以让它在按下时将开关拉低,使其读为一个,因此按下可能为零,如果就是这里的情况让它更简单

if(P1IN&0xC0)==0) then.

会检查是否"按下"