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.

[参考译文] CCS/LAUNCCHXL-F2.8377万S:C中汇编器函数参数

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/572400/ccs-launchxl-f28377s-parameter-of-assembler-function-in-c

部件号:LAUNCHXL-F2.8377万S

工具/软件:Code Composer Studio

您好,

我正在尝试运行汇编器功能C

...
extern unsigned int asmfunc( int Vref, int Vadc, int b0);

void main(void)
{
	test = asmfunc( 4,5,8);}...


SPRU514L (第145/203页)第7.3 章1 5:
您可以看到int Vref被放置在Al寄存器中,Vadc被放置在AH寄存器中。 此零件工作正常。
但是b0放在堆栈中。

如何获取b0值的访问权限?

SPRU430F在第85/551页上,我尝试了不同的堆栈寻址模式
	.global _asmfunc

_asmfunc:
;Al = 4
; AH = 5
	附加附件,*-SP[1] 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Jonas:
    B0将位于*-SP[3]。 调用函数将首先放置栈参数,然后在调用asmfunc()之前将返回程序计数器(RPC)放置在*-SP[2]。 要验证b0是否位于*-SP[3],您可以首先进入反汇编窗口中的汇编功能,从寄存器视图中找出SP是什么,然后在内存浏览器中检查该地址前面的单词。

    例如,如果在进入汇编函数时发现SP = 0x8003,则打开mem浏览器窗口,查看值8是否为0x8000。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Vishal,
    感谢您的回答。 我解决了此示例的问题(b0放在XAR4寄存器中,但我与另一个寄存器有相同的问题。
    我希望你能帮我。


    C代码:

    extern unsigned int asmfunc( int vref,int vadc,int b0,int a1,int c1, int d);

    Void主(void)

    测试= asmfunc (4,5,8200,2, 40);
    }


    装配代码:

    .global _asmfunc

    _asmfunc:
    ;Al = 4
    ; AH = 5
    ;XAR4 = 8
    ;XAR5 =200





    变量C1,d放置在何处?

    如何添加例如Vref+b0? ;Vref被置于Al中
    添加AL,???

    如下所示:
    添加AL,*-SP[3] ;哪个号码正确,为什么?

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

    仍然存在此问题。 有人能帮帮我吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请访问 www.ti.com/.../litabsmultiplefilelist.tsp

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

    您好,Jonas:

    很抱歉耽误你的时间,我之前没有看到你对我的帖子的回复。

    从编译器指南(SPR514,第7.3 .1节)中,  

    (e)其余16位参数按Al,AH,XAR4,XAR5的顺序排列(如果可用)。
    4.未放置在寄存器中的任何剩余参数将按相反顺序推入堆栈。 即
    放置在堆栈上的最左侧参数将最后推入堆栈。 所有32位参数均为
    与堆栈上的偶数地址对齐。

     

    因此,D1和C1应该已放置在堆栈上,如图所示

     

    ;;|_______ |<-堆栈指针(SP)
    ;;|_______ |<- C1 (SP-1)
    ;;|_______ |<- D1 (SP-2)
    ;;|_______ |<-返回呼叫功能的PC (SP-4)

     

    How can I add for example vref+b0? ;Vref被置于AL

    添加AL,@AR4;添加Vref (Al)和b0 (XAR4的下半部分)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ADD AL,@AR4会覆盖原始Vref值,因此,如果您需要Vref进行其他计算,则应在添加之前将AL保存到堆栈或另一个ARN寄存器
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的快速响应。
    最初的问题是如何调整堆栈

    如何添加例如Vref+C1?
    如下所示:
    添加AL,*–SP[1]???

    在我的示例中,这不起作用

    非常感谢,

    Jonas
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您访问存档的研讨会,F2.8335万->学员指南->附录E,您将找到使用SP,AL的说明示例。 这加上汇编程序用户指南应该会有所帮助。 对不起,自从我使用C2000组件以来已经有几年了...

    processors.wiki.ti.com/.../C2000_Archived_Workshops

    希望这能有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为我的堆栈放置错误-调用函数的返回PC应该是堆栈上最后一件事,然后再将执行移动到汇编函数

    ;;|_______ |<-堆栈指针(SP)
    ;;|_______ |<-返回呼叫功能的PC (SP-2)
    ;;|_______ |<- C1 (SP-3)
    ;;|_______ |<- D1 (SP-4)

    "添加AX,loc16—添加AX值"

    loc16可以通过堆栈寻址,即*-SP[n]。 检查您的帖子示例中的值C1或2是否位于内存浏览器中的SP-3?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我要非常感谢你们两位。
    Vishal您以上的描述是正确的。 这是可行的。
    车间表也非常有用。

    请注意,

    Jonas