ARM 汇编 if(data & 0x01) rGPGDAT &= ~(0x1<<7);
ARM assembly if(data & 0x01) rGPGDAT &= ~(0x1<<7);
现在正在研究如何用汇编语言控制ARM GPIO。
所以我正在尝试将 C 源代码更改为汇编语言。
但是写这部分有点吃力
if(data & 0x01) rGPGDAT &= ~(0x1<<7);
if(data & 0x02) rGPGDAT &= ~(0x1<<6);
if(data & 0x03) rGPGDAT &= ~(0x1<<5);
if(data & 0x04) rGPGDAT &= ~(0x1<<4);
我觉得应该用TST。我不知道如何处理"if"
你应该可以在没有分支的情况下做到这一点:
mov r1, <your data> ; change this accordingly
mov r2, <rGPGDAT> ; change this accordingly
tst r1,#1
andne r2,#$FF -1
tst r1,#2
andne r2,#$FF -2
tst r1,#4
andne r2,#$FF -4
tst r1,#8
andne r2,#$FF -8
关键是指令,您可以在其中定义要执行的指令的条件(在本例中 Z=0)
如果该位在 r1 中设置,则 tst
清除零标志,并且
andne
将清除 r2
中的位
(不确定这里是否需要 andNE 或 andEQ。还有一个循环会更优雅但是:我不在家 atm,所以我不能写 propper 代码)
现在正在研究如何用汇编语言控制ARM GPIO。 所以我正在尝试将 C 源代码更改为汇编语言。
但是写这部分有点吃力
if(data & 0x01) rGPGDAT &= ~(0x1<<7);
if(data & 0x02) rGPGDAT &= ~(0x1<<6);
if(data & 0x03) rGPGDAT &= ~(0x1<<5);
if(data & 0x04) rGPGDAT &= ~(0x1<<4);
我觉得应该用TST。我不知道如何处理"if"
你应该可以在没有分支的情况下做到这一点:
mov r1, <your data> ; change this accordingly
mov r2, <rGPGDAT> ; change this accordingly
tst r1,#1
andne r2,#$FF -1
tst r1,#2
andne r2,#$FF -2
tst r1,#4
andne r2,#$FF -4
tst r1,#8
andne r2,#$FF -8
关键是指令,您可以在其中定义要执行的指令的条件(在本例中 Z=0)
如果该位在 r1 中设置,则 tst
清除零标志,并且
andne
将清除 r2
(不确定这里是否需要 andNE 或 andEQ。还有一个循环会更优雅但是:我不在家 atm,所以我不能写 propper 代码)