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.

[参考译文] MSP432E401Y:汇编指令 SMLAxy (及其他一些)给出了错误的结果

Guru**** 2535150 points
Other Parts Discussed in Thread: MSP-EXP432E401Y, MSP432E401Y

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1253600/msp432e401y-assembly-instruction-smlaxy-and-some-others-gives-wrong-result

器件型号:MSP432E401Y
主题中讨论的其他器件:MSP-EXP432E401Y

大家好、TI 支持团队。

我在使用 MSP432E401Y (Cortex-M4F -内核)时遇到问题。 我使用评估板 MSP-EXP432E401Y 版本1.0。

我在 Code Composer Studio 12.3.0中用汇编代码编写代码。

某些说明操作不正确。 请帮我找到我的错误。

让我们以指令 SMLAxy 为例。  该指令说明  (来自 ARM DUI0473J、p. 10-479):SMLAxy 将  Rn  和 Rm 选定一半的16位有符号整数 相乘、将32位结果添加到  Ra 中的32位值、并将结果放置在 Rd 中。

我是这样理解的。 例如、如果我们使用 SMLATT、则有:

Rd:= Top_Halfword{Rn}* Top_Halfword{RM}+ Ra

首先、看看没有溢出的示例。 我的代码:

 

MOV R1、 #0x1244

MOVT R1、 #0x0229

MOV R2、 #0x3769

MOVT R2, #0x0455

MOV R0、 #0000

MOVT R0、 #0001

SMLATT   R3、R1、R2、R0;执行指令 R3 = 0x000A5B9D 后

 

将结果与我自己的计算进行比较:

RD <= R3

rn <= r1:= 0x02291244

RM <= R2:= 0x04553769

Ra <= R0:= 0x00010000

RD = THW[Rn]* THW[RM]+ Ra = 0x0229 * 0x0455 + 0x00010000 = 0x00095B9D + 0x00010000 = 0x000A5B9D、结果匹配。

 

但是、如果我们采用其他操作数、就会得到有趣的结果:

MOV R0、            #0x0001

MOVT R0、            #0xAAAA

MOV R1、            #0x000A

MOVT R1、            #0xAAAA

MOV R2、            #0x0001

MOVT R2,            #0x0060

SMLATT    R3、R1、R0、R2;执行后、我们的 R3 =#0x1CD238E5

 

与我的计算进行比较:

RD = THW[Rn]* THW[RM]+ Ra = 0xAAAA * 0xAAAA + 0x00600001 = 0x71C638E4 + 0x00600001 = 0x722638E5、结果不匹配。

结果的下半字匹配、但结果的上半字不匹配。 我不知道这个结果来自哪里。

 

MOV R0、            #0x0001

MOVT R0、       #0xAAAA

MOV R1、            #0x000A

MOVT R1、       #0xAAAA

MOV R2,            #0 ;我只想检查乘法

SMLATT    R3、R1、R0、R2;   执行指令 R3 =#0x1C7238E4后

 

与我的计算进行比较:

RD = THW[Rn]* THW[RM]+ Ra = 0xAAAA * 0xAAAA + 0 = 0x71C638E4、结果不匹配。

 

我在其他指令也面临这个问题:SMLAD,SMLAL,SMLALxy,SMLALD,SMLAWx, SMLSLD 中。 我提供了适用于所有指令的示例。

我想,在所有这些说明中,我不理解一点。 请解释一下、这些说明中的乘法是如何作用的。 非常感谢您的帮助。

此致。

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

    您好!

     抱歉、我不了解这些特定的 Arm 装配说明、因此 无法提供相关指导。  请访问 Arm 支持论坛获取指导。 对于 MCU 特定问题、您可以打开新话题、我们将会为您提供帮助。 我不在办公室,直到8月3日。

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

    您好 Charles。

    感谢您的回答。 我将与 ARM 支持联系、并向他们提出我的问题。

    此致。

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

    再次向 Charles 问好。


    最近、我在 ARM 论坛上收到了对我的请求的回复。 以下链接:

    community.arm.com/.../181685

    我认为它会对您和其他用户有所帮助。

    此致。