【问题标题】:ARM Assembly for development board开发板的ARM组装
【发布时间】:2012-05-15 08:31:52
【问题描述】:

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

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

  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   

【问题讨论】:

    标签: c assembly embedded arm


    【解决方案1】:

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

    以下行负责打开风扇位:

    ORR r0, r0, #0x80
    

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

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

    ORR r0, r0, #0x20
    

    此外,如果您想稍后关闭加热器,您可以通过仅取消设置位 5 来实现,方法是使用除位 5 之外的所有位置都为 1 的掩码进行与运算。如果位和的助记符是 @987654327 @,该行将是:

    BIC r0, r0, 0xDF
    

    现在,我已经好几个月没有进行任何汇编了,但如果我没记错的话,你给出的代码 sn-p 实际上是一个子程序。您可以使用call 之类的主要功能将其调用到FanOn 地址。而且,对我来说,子例程似乎很好,它保留了它使用的所有寄存器,例如它将它们推送到第一行的堆栈并在最后恢复它们。

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

    由于它们都保留了所有寄存器,因此您可以放心地顺序使用它们。

    【讨论】:

    • 我相信它是 BIC(尽管它可能是 AND),所以 BIC r0, r0, 0xDF?我不想看起来好像我偏离了原来的问题。由于是“如何重用代码”,如果风扇和加热器都依次关闭,我是否需要使用不同的寄存器?
    • @user1080390 我添加了对来自 cmets 的问题的答案。您应该将其编辑到问题中,扩展它,不会伤害任何人。我认为您不需要将答案程序代码放在问题中,但这只是我的主观意见:D
    【解决方案2】:

    ORR 指令开启一个位,#0x80 常量确定位(在这种情况下,只有位 7 开启)。要关闭该位,您将需要一个 AND 指令并计算适当的掩码(例如,要关闭位 7,您将使用常量 #0x7F 与)。位 5 的适当常量是 #0x20#0xDF

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多