gpt4 book ai didi

c - 开发板ARM汇编

转载 作者:行者123 更新时间:2023-12-04 20:59:15 25 4
gpt4 key购买 nike

我目前正在摆弄一个附有应用程序板的 LPC 2378。风扇上有几个组件,其中 2 个是风扇和加热器。

如果端口 4 的位 6 和位 7 连接到风扇(电机 Controller ),则以下代码将打开风扇:

  FanOn
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
LDR R5, =FIO4PIN ; Address of FIO4PIN
LDR r0, [r5] ; Read current Port4
ORR r0, r0, #0x80
STR r0, [r5] ; Output
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC

如何重写此代码块以打开连接到端口 4 的位 5 的加热器(将位设置为 1 将打开它,将其设置为 0 将关闭它)。

回答问题后编辑:

;==============================================================================
; Turn Heater On
;==============================================================================
heaterOn
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
LDR R5, =FIO4PIN ; Address of FIO4PIN
LDR r0, [r5] ; Read current Port4
ORR r0, r0, #0x20
STR r0, [r5] ; Output
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC
;==============================================================================
; Turn The Heater Off
;==============================================================================
heaterOff
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
LDR R5, =FIO4PIN ; Address of FIO4PIN
LDR r0, [r5] ; Read current Port4
AND r0, r0, #0xDF
STR r0, [r5] ; Output
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC

最佳答案

据我对代码的理解,风扇仅连接到位 7(如果位从 0 开始计数)。

以下行负责打开风扇位:

ORR r0, r0, #0x80

您将“掩码”中所有为 1 的位都设置为 1。由于掩码是 0x80,即二进制的 1000 0000,它只会变成在第 7 位上。

现在,如果您需要打开加热器而不是风扇,并且必须设置第 5 位而不是第 7 位(在同一端口上),您只需更改该行中的掩码。新掩码应该是 0010 0000 二进制,即十六进制的 0x20,所以新代码应该是:

ORR r0, r0, #0x20

此外,如果您稍后想关闭加热器,您只需取消设置第 5 位,通过使用除第 5 位以外所有位置都为 1 的掩码进行与运算。如果按位和的助记符是 BIC,该行将是:

BIC r0, r0, 0xDF

现在,我已经几个月没有做任何汇编了,但如果我没记错的话,你给出的代码片段实际上是一个子程序。你可以从你的主要功能调用它,比如 callFanOn 地址。而且,对我来说,似乎子程序在某种程度上很好,它保留了它使用的所有寄存器,例如它将它们插入第一行的堆栈并在最后恢复它们。

因此,要重新使用代码,您可以只编写一个新的子程序来打开加热器,如果需要,可以编写一个用于关闭每件东西的子程序,并且只更改每个子程序的标签/子程序名称,例如FanOff, HeaterOn...

由于它们都保留了所有寄存器,因此您可以按顺序使用它们而不必担心。

关于c - 开发板ARM汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com