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.

[参考译文] MSP430FR5969:针对 ADDA 和 SUBA 指令的 CG (R3)寻址模式

Guru**** 2451240 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1489338/msp430fr5969-addressing-mode-of-cg-r3-for-adda-and-suba-instructions

器件型号:MSP430FR5969

工具与软件:

您好!

我目前使用的是 MSP430 (MSP430X)器件、遇到了一个关于如何 解释指令代码0x03EF (ADDA R3、R15)的问题。 具体而言、我的 C 代码为:

volatile unsigned int* p = START;
p += 1;

编译后、汇编输出会显示:

ADDA #2, R15

然而、对于这条指令、ELF 文件中的实际机器码是0x03EF、一些反汇编器会将其显示为 ADDA R3、R15

我知道 R2/R3用作 MSP430上的常数发生器寄存器、并且  AS 位中的某些寻址模式会使 R3代表立即值#2。  但是、我将尝试将其与 SLAU367 (MSP430x5xx/MSP430x6xx 系列用户指南)中的文档进行协调、特别是表4-2、其中列出了"间接  寄存器模式"以从 R3获取值#2、而第4.5.2.6和4.6.1章将0x0* E*机器代码指令描述为"寄存器模式"。 (Adda Rsrc Rdst)

我怀疑这是预期的行为、我可能只是忽略了相关文档。 如果这是 Adda (和 Suba)的例外情况、这是有意义的、因为在这些指令中从 R3获取零是毫无意义的。

如果可以提供说明这种特殊行为的指导或文档参考、我将不胜感激。

提前感谢您、

 

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

    我理解您对指令代码0x03EF 解释的困惑。 当反汇编输出与预期的汇编代码不匹配时、确实会有点棘手。

    首先、您认为 R2/R3是 MSP430上的常量发生器寄存器。 您观察到的特殊行为可能是由于指令编码和常数生成机制之间的交互造成的。

    在`ADDA`指令的情况下、机器代码`0x03EF`是反汇编器将其解释为`ADDA R3、R15`的编码。 但是、由于 R3可被用作一个常量生成器来表示某些寻址模式中的立即值#2、实际效果相当于`ADDA #2、R15`。

    关于 SLAU367中的文档、表4-2中的"间接寄存器模式"和第4.5.2.6和4.6.1章中的"寄存器模式"乍一看似乎存在矛盾。 但实际上、这些模式是根据指令编码和执行的不同方面来定义的。

    "间接寄存器模式"可能是指如何从更复杂的存储器中的寄存器检索值-访问场景、而"寄存器模式"更多地是关于在指令中直接使用寄存器的基本操作。

    至于你提到的`Adda`和`Só n UBA`的例外情况,这是完全正确的。 由于在这些指令中从 R3获得零毫无意义、因此硬件设计人员可能已经选择以特殊的方式使用 R3来表示像#2这样的直接值。

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

    我不得不说、这种行为没有记录。 参考 R3时、您从常数发生器获得的值取决于源地址模式位。 但 ADDA 指令没有这些位。 因此、我们不会记录发生的情况。

    有点像 PUSHX.A.

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

    我已经尝试过、但是 GCC 坚持使用有文档记载的立即模式编码。 强制执行(asm (".word 0x3ef");)后、反汇编器会将此显示为寄存器模式。  因此、常数发生器是一个秘密。

    我想知道如果您提到 R2、会发生什么神奇的事情?

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

    我在我的器件(MSP430FR5969 LaunchPad)上进行了进一步的实验。  

    总结:

    * Adda R3、R4为 R4乘以2
    * SUBA R3、R4将 R4减2
    * Adda R2、R4将 R4递增4
    * SUBA R2、R4将 R4减4。  //注释:修改了排印错误

    * MOVA R3、R4设置 R4为0
    * CMPA R3、#2复位 Z

    我认为这是 Adda 和 Suba 特有的行为。 对于在该指令上访问 R3、AS 位看起来为"10"。

    以下是完整的代码和输出。 (使用 MSP430-elf-GC 编译)

    #include <stdio.h>
    #include <msp430.h> 
    
    int main(void)
    {
    	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    	
    	register unsigned int *p;
    
    	// R4 = 8
    	// ADDA R3, R4
    	asm(
    	    "mova #8, r4\n\t"
    //	    ".word 0x03e4\n\t"
    	    "adda r3, r4\n\t"
    	    "mova r4, %0"
    	    : "=r"(p));
    
    	printf("p = 8; adda r3, p; p = %p\n", p);
    
    	// R4 = 8
    	// SUBA R3, R4
    	asm(
    	    "mova #8, r4\n\t"
    //	    ".word 0x03f4\n\t"
    	    "suba r3, r4\n\t"
    	    "mova r4, %0"
    	    : "=r"(p));
    
    	printf("p = 8; suba r3, p; p = %p\n", p);
    
    	// R4 = 8
    	// ADDA R2, R4
    	asm(
    	    "mova #8, r4\n\t"
    //	    ".word 0x02e4\n\t"
    	    "adda r2, r4\n\t"
    	    "mova r4, %0"
    	    : "=r"(p));
    	printf("p = 8; adda r2, p; p = %p\n", p);
    
    	// R4 = 8
    	// SUBA R2, R4
    	asm(
    	    "mova #8, r4\n\t"
    //	    ".word 0x02f4\n\t"
    	    "suba r2, r4\n\t"
    	    "mova r4, %0"
    	    : "=r"(p));
    	printf("p = 8; suba r2, p; p = %p\n", p);
    
    	// MOVA R3, p
    	asm(
    	    "mova r3, r4\n\t"
    	    "mova r4, %0"
    	    : "=r"(p));
    	printf("mova r3, p; p = %p\n", p);
    	
    	// CMPA R3, p
    	asm(
    	    "mova #2, r4\n\t"
    	    "cmpa r3, r4\n\t"
    	    "jeq .Leq\n\t"
    	    "mova #0, %0\n\t"
    	    "jmp .Lend\n\t"
    	    ".Leq:\n\t"
    	    "mova #1, %0\n\t"
    	    ".Lend:\n\t"
    	    : "=r"(p));
    	printf("cmpa r3, #2; Z = %d\n", p);
    
    	return 0;
    }
    

    p = 8; adda r3, p; p = 0xa
    p = 8; suba r3, p; p = 0x6
    p = 8; adda r2, p; p = 0xc
    p = 8; suba r2, p; p = 0x4
    mova r3, p; p = 0
    cmpa r3, #2; Z = 0
    

    004726:   140A                PUSHM.A #1,R10
    004728:   00B1 0008           SUBA    #0x00008,SP
     6      	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    00472c:   40B2 5A80 015C      MOV.W   #0x5a80,&Watchdog_Timer_WDTCTL
    12      	asm(
    004732:   0084 0008           MOVA    #0x00008,R4
    004736:   03E4                INCDA   R4
    004738:   04CC                MOVA    R4,R12
    19      	printf("p = 8; adda r3, p; p = %p\n", p);
    00473a:   0C71 0004           MOVA    R12,0x0004(SP)
    00473e:   1800 40F1 4400 0000 MOVX.A  #0x04400,0x00000(SP)
    004746:   008A 47CA           MOVA    #0x047ca,R10
    00474a:   134A                CALLA   R10
    23      	asm(
    00474c:   0084 0008           MOVA    #0x00008,R4
    004750:   03F4                DECDA   R4
    004752:   04CC                MOVA    R4,R12
    30      	printf("p = 8; suba r3, p; p = %p\n", p);
    004754:   0C71 0004           MOVA    R12,0x0004(SP)
    004758:   1800 40F1 441B 0000 MOVX.A  #0x0441b,0x00000(SP)
    004760:   134A                CALLA   R10
    34      	asm(
    004762:   0084 0008           MOVA    #0x00008,R4
    004766:   02E4                ADDA    SR,R4
    004768:   04CC                MOVA    R4,R12
    40      	printf("p = 8; adda r2, p; p = %p\n", p);
    00476a:   0C71 0004           MOVA    R12,0x0004(SP)
    00476e:   1800 40F1 4436 0000 MOVX.A  #0x04436,0x00000(SP)
    004776:   134A                CALLA   R10
    44      	asm(
    004778:   0084 0008           MOVA    #0x00008,R4
    00477c:   02F4                SUBA    SR,R4
    00477e:   04CC                MOVA    R4,R12
    50      	printf("p = 8; suba r2, p; p = %p\n", p);
    004780:   0C71 0004           MOVA    R12,0x0004(SP)
    004784:   1800 40F1 4451 0000 MOVX.A  #0x04451,0x00000(SP)
    00478c:   134A                CALLA   R10
    53      	asm(
    00478e:   03C4                CLRA    R4
    004790:   04CC                MOVA    R4,R12
    57      	printf("mova r3, p; p = %p\n", p);
    004792:   0C71 0004           MOVA    R12,0x0004(SP)
    004796:   1800 40F1 446C 0000 MOVX.A  #0x0446c,0x00000(SP)
    00479e:   134A                CALLA   R10
    60      	asm(
    0047a0:   0084 0002           MOVA    #0x00002,R4
    0047a4:   03D4                TSTA    R4
    0047a6:   2403                JEQ     (0x47ae)
    0047a8:   008C 0000           MOVA    #0x00000,R12
    0047ac:   3C02                JMP     (0x47b2)
    0047ae:   008C 0001           MOVA    #0x00001,R12
    70      	printf("cmpa r3, #2; Z = %d\n", p);
    0047b2:   0C71 0004           MOVA    R12,0x0004(SP)
    0047b6:   1800 40F1 4480 0000 MOVX.A  #0x04480,0x00000(SP)
    0047be:   134A                CALLA   R10
    73      }
    0047c0:   434C                CLR.B   R12
    0047c2:   00A1 0008           ADDA    #0x00008,SP
    0047c6:   160A                POPM.A  #1,R10
    0047c8:   0110                RETA    

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

    感谢您的评论。 这一点值得注意、因此我也使用了 R2进行了实验。 我将结果发布到该主题。

    ADDA R2、R4递增4。 情况与 R3相同。

    > asm (".word 0x3ef");

    这是一个很大的问题。 我从来没有 想到这个想法。

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

    感谢您的评论。  

    硬件设计人员可能选择以特殊方式使用 R3来表示立即值、如#2

    我可以针对这种行为从 TI 获得一份声明或文档吗?

    从我对  SLAU367文档的译码来看、 它可能会将 R15按表4-2中的任意数字递增。

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

    这并没有给这次讨论增添任何内容。 这涉及 CPUx 地址指令、它没有可供常数发生器使用的地址模式位。 TI 会以任何方式记录所指出的行为。

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

    同意。 设计人员提高机器代码密度的意图是 可以理解的。 我想看看官方的一些澄清。

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

    抱歉、所有与 MSP430相关的设计人员都留给了 TI。。 因此您无法获得任何正式声明。 所有我们可以参考的都是已发布的文档。  

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

    所有与 MSP430相关的设计人员都留在 TI。。

    噢...、令人伤心的消息。

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

    有。 抱歉、对于 MSP430、我们只是保持手动方式。 目前、我们只能提供一些有限的应用级别支持。