Assembly 臂组件如果(数据&;0x01)rGPGDAT&;=~(0x1<;<;7);

Assembly 臂组件如果(数据&;0x01)rGPGDAT&;=~(0x1<;<;7);,assembly,arm,gpio,Assembly,Arm,Gpio,现在我正在研究如何用汇编语言控制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 &= ~(0

现在我正在研究如何用汇编语言控制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);

if(data&0x01)rGPGDAT&=~(0x1您应该能够在没有分支的情况下执行此操作:

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
mov r1,;相应地更改此值
mov r2;相应地更改此值
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
键是指令,您可以在其中为要执行的指令定义contion(在本例中Z=0) 如果该位设置在r1中,
tst
清除零标志,并且
andne
将清除r2中的位


(不确定这里是否需要andNE或andEQ。同样,循环会更优雅,但:我不在家,所以我无法编写propper代码)

是的,
tst
确实适合于按位比较。但是,如果您不知道如何实现一般的条件代码,那么可能值得先学习汇编教程。另外,对于相对简单的代码序列,查看在-O1编译的C代码的反汇编通常是非常有用的(-O0往往会发出如此多的冗余负载/存储/移动,很难看到树的实木)。通常,您会设置一些标志(这里tst是一个好主意),然后在错误条件上分支,或者分支到真实条件。如果全尺寸arm指令(而不是拇指)条件执行在这里很好,请查看BIC。您确定您的“如果”是否正确?
if(data&0x01)
if(data&0x02)
if(data&0x04)
在我看来像是正确的位测试,但
if(data&0x03)
可能是错的?!你为什么要归档?或者这只是一个输入错误?在ARM中,你通常可以通过将条件直接添加到操作码中来避免分支。例如,如果零标志为0@Tommylee2k原来是0x01,0x02,0x04,0x08谢谢你的帮助。我想我需要学习更多关于tst和insturcti的知识ons设置。提示:
bic
将比
更整洁(这正是它存在的目的!);ne确实是正确的条件,因为您希望比较结果为非零。