This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP-EXP432E401Y:组装代码问题

Guru**** 2386610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1065756/msp-exp432e401y-assembly-code-questions

器件型号:MSP-EXP432E401Y

我刚刚开始使用 ARM 汇编代码、很难找到 一些简单问题的答案。

1.是否有一条命令用于将32位地址加载到寄存器中?  现在、我将使用以下4条命令将0x4000C018加载到寄存器 R1 (例如)中、似乎必须有一种更简单的方法。

 MOV R1、#0x4000;R1:0x00004000 // UART
 LSL R1,#16;R1:0x40000000
添加 R1、#0xC000;R1:0x4000C000
添加 R1、#0x18;R1:0x4000C018

2.是否有方法加载 标签的地址? 例如、我希望能够将以下字符串的地址加载到寄存器中:

字符串:.byte 0x31、0x32、0x33、0x34

3.我所阅读的一些文档显示我可以使用 EQU 命令创建标签;

两个:equ 2.

但是、当我尝试以这种方式在 CCS 中创建标签时、它会抛出"非法助记符"错误。  是否有方法在 CCS 中创建标签?

4.如果我能找到一个列出所有合法 ARM 汇编命令的列表,那也会很好。  我 在任何地方都找不到一个。

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    MSP432和汇编语言上没有太多文档。   下面是另一个帖子、可能会提供一些额外的指导。

    有关汇编 器的帮助、请参阅适用于 MSP432的 ASM 汇编语言工具指南

    有关 ARM 指令集的详细信息、您需要参阅 Web 上提供的 ARM 文档。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复、但我找不到我要查找的信息(之前发布的大多数链接已失效)。

    我最想得到答案的问题是第2题。  如果我定义字符串:

    字符串:  .byte  0x31、0x32、0x33、0x34

    然后尝试将该字符串的地址加载到寄存器中:

     MOV R1、字符串

    我得到一个汇编错误"无效操作数"。  必须有一种方法将"字符串"的地址加载到寄存器中、但我无法找到如何在我搜索过的文献中的任何位置加载它。

    感谢能回答此问题的所有人。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    是的、遗憾的是、旧帖子中的许多链接不再受支持、因为不建议在新设计中使用 MSP432。  让我看看我们的软件团队中的某个人是否可以帮助回答问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    我们的软件团队通过了此链接、 该链接可能对 Q1有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    我已经听过你几天了,所以我假设你的问题已经得到了解答。
    如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dennis:

    您发送的链接对回答问题1非常有帮助。  感谢你的参与。

    我现在遇到的问题是得到问题 Q2的答案: 如果我定义字符串:

    字符串:  .byte  0x31、0x32、0x33、0x34

    然后尝试将该字符串的地址加载到寄存器中、其中包含:

    MOV R1、字符串

    我得到一个汇编错误、无效操作数。 如果使用此命令:

    LDR R1、字符串

    我将字符串本身加载到 R1中、而不是其地址。  必须有一种方法将"字符串"的地址加载到寄存器中、但我无法找到如何在我搜索过的文献中的任何位置加载它。

    感谢您提供的任何帮助。  我非常渴望得到这个问题的答案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我怀疑您可以找到类似“LDR R1,=string”的位置。

    在过去的20年里、我不编写太多的汇编语言、据我所知、Cortex 至少有两种汇编语言(ARM 和 GCC)。 当我需要提醒时、我通常会编写一个 C 片段并查看其构建列表(通常为.lst 文件)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    使用"LDR R1、=字符串"是不幸运的。  汇编器抛出三个错误:表达式中的错误项、非法符号和意外的尾随操作数。

    编写一个 C 片段并查看构建列表是个好主意、尽管我想不到任何需要加载具有标签地址的寄存器的 C 代码。  是否有任何关于 C 代码片段的建议会满足该要求?

    感谢您的回答。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    printf(“blah blah”)可以做到这一点。

    否则,char *str=“blah bla”;printf(str);

    我这里没有任何材料,所以我无法试验。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是反汇编命令:

    char *str="blah"
     ADR r0、#0x90
     STR r0、[R13、#0x1c]
    printf(str);
     LDR r0、[R13、#0x1c]
     bl printf

    C 编译器似乎知道字符串的位置(在 PC + 0x90处)、并创建了一个汇编命令、该命令将地址直接加载到 r0中、但汇编命令本身从未使用过标签。

    这让我不明白为什么这会变成这样一个困难的问题。 似乎任何汇编器都知道任何标记代码或字符串的位置、并且它应该具有一个明显的命令、允许我们将该标签的地址加载到寄存器中。

    BTW、我只是使用反汇编器来查看汇编代码、因为我无法找到.lst 文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1065756/msp-exp432e401y-assembly-code-questions/3954423 #3954423"]它让我难以理解为什么这会成为一个如此困难的问题。 似乎任何汇编器都知道任何标记代码或字符串的位置、并且它应该具有一个明显的命令、允许我们将该标记的地址加载到寄存器中。

    问题在于 Cortex-M Thumb 指令为32位或16位宽、一条指令无法对32位常量进行编码。 有关   一些背景信息、请参阅如何在 Arm 架构的汇编语言中加载常量以及分支和调用序列。

    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1065756/msp-exp432e401y-assembly-code-questions/3954014 #3954014"]使用"LDR R1、=string"时运气不好

    这是一个 GNU 汇编器伪指令、它可以将字符串的地址存储在字面量池中、并生成与 PC 相关的指令、以将常量从字面量池加载到寄存器中。

    TI 汇编器不支持该 伪指令。

    找到 Compiler/RM42L432:LDR 伪指令替换 为 TI ARM 汇编器的宏、该宏应允许 GNU LDR 伪指令替换。 我没有尝试自己使用宏。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    切斯特:谢谢,谢谢。 我在您提供的链接中找到的 movw 命令实现了这一技巧、现在我的代码更清晰了。

    我仍在尝试找到一种为单字节值创建标签的方法。  一些文献说我可以使用

    两个: equ 2.

    要将字节2与标签2相关联、但当我在 CCS 汇编器中尝试此操作时、我会遇到错误。  在 CCS 汇编器中为单字节值创建标签是否有其他方法?