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.

[参考译文] 编译器/MSP430F5335:需要将汇编代码放置在特定的存储器位置

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/652804/compiler-msp430f5335-need-to-place-assembly-code-at-specific-memory-location

器件型号:MSP430F5335

工具/软件:TI C/C++编译器

如何将一些汇编代码放置在闪存中的确切存储器位置?  我需要在精确的记忆液中使用以下代码、特别是0x9B54

__DIUu:.asmfunc stack_usage(RETADDRSZ)
__remu:
CLR.WR14;初始化余数
MOV.WR12、R15;为 MOV.W
#1、R12复制被除数;绕

组1步、同时保持商 div_loop:RLA.W R15;移入 RLC
14.W;RLC R14被除数
如果当前余数>除数、则减去
JNCSET_商 位
sub.WR13、R14
SET_商 位:
RLC.W R12;设置商位(进位)、广播循环位
JNCdiv_loop
RET
.endasmfunc 

我之所以需要它、是因为我把引导加载程序弄乱了、它使用此函数。  因此、如果我升级固件、系统将失败、除非它在确切位置具有此功能。

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

    stackoverflow.com/.../defining-location-of-an-array-in-msp430-assembly
    www.ti.com/.../slau131q.pdf
    www.ti.com/.../slaa140.pdf

    《汇编用户指南》(SLAU131)的第2.4.6节介绍了子段的创建。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我确实查看了这些资源、我非常了解所有这些资源。 我知道如何制作段、但它不能保证将例程放置在段的开头、并且会生成非常混乱的链接器指令。 在 C++中有

    #pragma LOCATION (hex_address)

    这不需要对链接器指令进行任何更改。 是否有方法可以执行类似于汇编例程的操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    据我所知、没有类似的例程、但我对汇编语言不是很熟悉。

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

    已删除帖子的内容、因为尝试使用.set 汇编指令时出错

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

    [引用用户="Silver Diamond 技术]在 C++中有

    #pragma LOCATION (hex_address)

    这不需要对链接器指令进行任何更改。 是否有方法可以执行类似于汇编例程的操作?我为函数使用了 C++源文件中的#pragma 位置、并选择了保存汇编列表的选项。 汇编列表显示:

    a)该函数放置在名为".TI.bound: "。

    b)编译器生成 了一个.bound 汇编器指令、指示链接器将函数放置在#pragma 位置指定的地址。

    例如、C++源文件中的以下内容:

    #pragma 位置(0x95e4);
    void test (void)
    {
    
    } 

    显示了汇编列表中的以下内容:

    ".TI.bound:_Z4testv"、38372、0
    ;C:\ti\ccs740\ccsv7\tools\compiler\ti-cgt-smsp430_16.9.6.f9\bin\opt430.exe C:\\users\\MR_HAL~~1\\AppTemp\\Temp\\\{4DF91111\v\Z7469B\ENTI-ECC711bound\Z4ECC401b.ECC401be.tus\Z7BE-Q1be.tus\ENDCMEQ1be.tus\CC7401bound_EQ1b.EQ1\ENDCMEQ740\END1\END1b\Z740\ENDCMEQ740\END1\END1DA\END1EQ7B\END4DA\END1
    
    
    

    《MSP430汇编语言工具 v17.9.0.STS 用户指南 》规定了 C/C++编译器在内部使用的.bound 指令、并且不应在自己的汇编语言源文件中使用.bound 指令。

    在使用 TI v16.9.6.LTS 的快速测试中、当在.asm 源文件中使用以下内容时、链接器确实会尊重该指令、并将 __DIUu 和 __remu 函数放置在请求的地址0x9b54处 (基于检查链接器映射文件和 MSP430十六进制实用程序的输出):

    .sect ".TI.bound:__divu"
    __divu:.asmfunc stack_usage (RETADDRSZ)
    __remu:
    .bound ".TI.bound:__divu"、0x9B54、0
    CLR.W ;初始化其余部分
    MOV.W R12、R15 ;复制要转移的股息
    MOV.W #1、R12 ;1遍历循环,同时保持商
    div_loop:
    RLA.W R15 ;将股息转换为余数
    RLC.W R14
    CMP.W R13、R14 ;如果当前余数>除数,则减去
    Jnc set_商 位
    sub.W R13、R14
    SET_商 位:
    RLC.W R12 ;设置商位(进位中)、Adv 循环位
    Jnc div_loop
    可重置
    endasmfunc 

    但是、由于《MSP430汇编语言工具 v17.9.0.STS 用户指南》指出.bound 仅供内部 C/C++编译器使用、因此您不应依赖它的使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您、这是一种明智的方法。 会尝试使用它运行...