【问题标题】:How to write ARMGNU assembly code to write C = A + B?如何写ARMGNU汇编代码写C = A + B?
【发布时间】:2020-10-02 01:31:59
【问题描述】:

这是我的 ARM 汇编列表文件。我想编写汇编代码来计算:C = A + B;当我“全力以赴”时,我收到以下错误:

错误:未定义的符号 r5 用作立即数

错误:未定义的符号 r6 用作立即数

我是汇编文件的新手,所以我有点迷路了。我应该在我的 .text 部分更改什么以消除错误。我还被告知“对三个内存访问使用单点可寻址性 (DS)。每个内存访问 应该使用使用标签计算的偏移量(没有硬编码的文字偏移值)。”

   SET_TARGET

  .text
  
  FUNCTION main,global

    push {r4,r5,r6,r7,lr}


      ldr  r4,=C //Store symbol C inside r4
      ldrb r5,=A //Store symbol C inside r4
      ldrh r6,=B //Store symbol C inside r4
      add  r4,r5 //Add A to C
      add  r4,r6 //Add B to C as well
    all_done: 

    pop {r4,r5,r6,r7,lr}
  
      bx lr

  ENDFUNC main

  .data

      .org 234
      .align 2,0xa5   

DS:    .word    0xbbbbbbbb

A:    .byte     123

      .align    1,0xa5
B:    .short    47587

      .align    2,0xa5
C:    .word     ~0
      .align    3,0xa5
      .word 0xeeeeeeee

  .end

【问题讨论】:

  • 能否请您使用以下信息补充您的问题:- 您正在使用的汇编软件(GNU AS、Keil 汇编器,...),- 您正在为其编写程序的 Arm CPU(Cortex -A, Cortex-M,...) ?
  • GNU 汇编器@Frant
  • 您当前的代码将添加地址。不确定=symbol 甚至可以与ldrb / ldrh 一起使用。另外,您确定您的汇编程序支持// 作为注释字符吗?通常是@。虽然// 确实可以在我的桌面上与来自GNU Binutils 2.34 的arm-none-eabi-as 一起使用。
  • 还要注意C = A+B 只接受加法。您正在实施C += A+B
  • 你能发布你用来汇编的命令吗(即你的makefile运行什么汇编命令)?

标签: assembly arm microprocessors


【解决方案1】:

gnu 汇编器:

so.s: Assembler messages:
so.s:1: Error: bad instruction `set_target'
so.s:5: Error: bad instruction `function main,global'
so.s:21: Error: bad instruction `endfunc main'

这些当然不是 gnu 汇编指令,它们看起来像 ARM/Kiel 类型的东西。

清理后看起来像这样

.text

.type main, %function
.globl main
main:

    push {r4,r5,r6,r7}

    ldr  r4,=C @ copy address of C to r4
    ldrb r5,=A @ copy address of A to r5
    ldrh r6,=B @ copy address of B to r6
    add  r4,r5 @ &C = &C + &A, r4 = address of C plus address of A
    add  r4,r6 @ &C = &C + &B, r4 = r4 plus address of B

    pop {r4,r5,r6,r7}

    bx lr

.data

      .align
A:    .byte     123

      .align
B:    .short    47587

      .align
C:    .word     ~0

对于 gnu 汇编器,但根据您的错误消息,您似乎没有使用 gnu 汇编器,而是使用了其他东西。汇编是特定于工具而不是目标的,因此您需要为您正在使用的汇编器(ARM、Kiel、gas 等)编写汇编语言。

对于那种汇编语言,你需要知道语法。您很可能不想将变量的地址加在一起,而是将它们的值加在一起。

你想从这个函数中返回任何东西吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2017-01-19
    • 2012-04-21
    • 2021-08-18
    • 2021-01-19
    相关资源
    最近更新 更多