0
我完全陌生的汇编语言,刚刚买了一个覆盆子pi。我知道我可以使用一个操作系统,并开始用python等编程,但我想深入了解一下。由于我的覆盆子pi没有到达,我无法测试asm代码。在课程OK03中,我看了解扩展解决方案(download),我试图自己理解它,但我遇到了这个问题:为什么gpioAddr在最后(再次)str'ed到pinFunc?我参加了main.s为例,第一次调用把我的意见:“烘烤Pi:OK03” - 不理解功能
pinNum .req r0
pinFunc .req r1
mov pinNum,#16
mov pinFunc,#1
bl SetGpioFunction
.unreq pinNum
.unreq pinFunc
的SetGpioFunction:
/* NEW
* SetGpioFunction sets the function of the GPIO register addressed by r0 to the
* low 3 bits of r1.
* C++ Signature: void SetGpioFunction(u32 gpioRegister, u32 function)
*/
.globl SetGpioFunction
SetGpioFunction:
pinNum .req r0
pinFunc .req r1
cmp pinNum,#53
cmpls pinFunc,#7
movhi pc,lr
push {lr}
mov r2,pinNum
.unreq pinNum
pinNum .req r2
bl GetGpioAddress
gpioAddr .req r0
functionLoop$:
cmp pinNum,#9
subhi pinNum,#10
addhi gpioAddr,#4
bhi functionLoop$
/* pinNum = 6
gpioAddr = 0x20200004
*/
add pinNum, pinNum,lsl #1
/*
pinNum = 18 (10010)
*/
lsl pinFunc,pinNum
/*
pinFunc = 1000000000000000000
*/
mask .req r3
mov mask,#7 /* r3 = 111 in binary */
/*
mask = 111
*/
lsl mask,pinNum /* r3 = 11100..00 where the 111 is in the same position as the function in r1 */
/*
mask = 111000000000000000000
*/
.unreq pinNum
mvn mask,mask /* r3 = 11..1100011..11 where the 000 is in the same poisiont as the function in r1 */
/*
mask = 11..11000111111111111111111
*/
oldFunc .req r2
ldr oldFunc,[gpioAddr] /* r2 = existing code */
/*
oldFunc = 0x12 + (gpioaddr)0x20200004 = 0x20200016
oldFunc = 100000001000000000000000010110
mask = 111111111000111111111111111111
*/
and oldFunc,mask /* r2 = existing code with bits for this pin all 0 */
/*
oldFunc = 100000001000000000000000010110
*/
.unreq mask
/*
pinFunc = 000000000001000000000000000000
oldFunc = 100000001000000000000000010110
*/
orr pinFunc,oldFunc /* r1 = existing code with correct bits set */
/*
pinFunc = 100000001001000000000000010110
pinFunc = 0x20240016
*/
.unreq oldFunc
str pinFunc,[gpioAddr]
/*
Why do we add gpioaddr again?
pinFunc = 0x40440016
*/
.unreq pinFunc
.unreq gpioAddr
pop {pc}
什么我收到错在这里?先谢谢你。
谢谢,这让我有点清醒 - 我只是假设我们正在写入pinFunc的东西,而不是我们正在存储pinFunc。 – Jan
这是一个规则的例外,通常左边的东西是右边的目的地和东西的来源,但是对于一个商店来说,它是从左到右,而不是从右到左。 –