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.

[参考译文] TMS470PLF111砖型处理器代码、我在此函数的汇编中弄乱了什么?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1248428/tms470plf111-bricked-processor-code-what-did-i-mess-up-in-the-assembly-of-this-function

我尝试向旧代码添加一个现有的函数调用、它可以正常工作、然后我将要使用的寄存器更改为 r0、可能就是这样吗? 我还添加了 NOP 以替换较早的代码行、NOP 应  

忽略并执行以从堆栈弹出寄存器和程序计数器并返回? 我还修改了我所使用或所使用的数据、因此这三个因素之一使它成为砖头、它是自己的、我不需要新的电路板。  

下面是我要尝试编写的十六进制 C 代码。  

void fun_00017600()
字节*pbVar1;

pbVar1 = DAT_00017700;
DAT_00017700[0x35]=(* DAT_00017700 & 1)<< 1 | DAT_00017700[0x35]& 0xFD;//存储器位置的数据地址为0x800 0C25 =((数据位于位置8000bf0)& 1)<< 1 |数据位于位置0x800 0C25 &0xFD
pbVar1[0x31]= pbVar1[0x35]| 2;//data at location 0x8000 C21 = data at location 0x8000 C21| 0x2
返回0;

我看到我把这件事搞砸了,应该是31而不是35 ,但那不应该把它弄得砖头?  

下面是不良代码的反汇编:

 

                            *

                            *                          函数                    *

                            *

                            未定义的 funy_00017600 ()

                              假设 LRSET = 0x0

                              假定 TMode = 0x1

            未定义        r0:1           

                            Fun_00017600                                   XREF[1]:    fun_0000fc3e:0000fd54 (c)   

       00017600 B5 9f          push      { r0、r1、r2、r3、r4、 r7、lr }  ;使用寄存器 r0可能是一种不好的做法?

       00017602 49 3f          LDR       R1、[DAT_00017700 ]                              = 08000BF0h

       00017604 4F 3e          LDR       r7、[DAT_00017700 ]                              = 08000BF0h

       00017606 37 30          添加了      r7、#0x30

       00017608 e0 05          b         Lab_00017616

       

                            Lab_00017616                                   XREF[1]:00017608    (j)   

       00017616 23 02          MOVs      R3、#0x2

       00017618 79 7a          ldrb      r2,[r7,#0x5]=>DAT_08000c25

       0001761a 43 9A          双联      R2、R3

       0001761c 78 09          ldrb r1      、[r1、#0x0 ]=>DAT_08000bf0

       0001761e 00 4b          lsls      R3、R1、#0x1

       00017620 21 02          MOVs      R1、#0x2

       00017622 40 19个字符                R1、R3

       00017624 43 11          或      R1、R2

       00017626 71 79          strb      r1,[r7,#0x5 ]=>DAT_08000c25

       00017628 37 01          添加了      r7、#0x1

       0001762a 20 02          MOV      r0、#0x2

       0001762c 79 39          ldrb r1      ,[r7,#0x4]=>DAT_08000c25   ;应为0  

       0001762e 43 08          或      r0、R1

       00017630 70 38          strb      r0,[r7,#0x0 ]=>DAT_08000c21

       00017632 bf 00          nop                                ; NOP 应该是可以的,应该继续返回  

       00017634 BD 9f          POP       {r0、R1、R2、R3、R4、 R7,PC }

 

                            DAT_00017700                                   XREF[2]:    FON_00017600:00017602 (R),

                                                                                         Fun_00017600:00017604 (R)   

       00017700 08 00 0b f0   未定义  08000BF0h          ;从存储器加载4字节地址  

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

    您好!

     我不知道编写汇编代码的理由。  您为什么不让编译器负责代码生成。 我不知道你的代码有什么问题、我不支持编写汇编语言。 编译器优化打开后、与编写自定义汇编代码相比、我无法将生成不良且效率低下的代码形象化。 如果您必须使用汇编语言编写、我建议您查看编译器的反汇编输出并查看仍然可以改进的方面。   

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

    这是因为将已编译的代码插入现有的已编译代码非常困难、因为所有地址都关闭。 相反、如果我使用原始十六进制为指令添加补丁 、我可以控制存储器寻址和跳转。 我真不想用 C 语言工作、我更喜欢 ARM7。 是否有为 TMS470运行和测试 ARM7代码的编译器?  

    我的问题是、我可以将寄存器 r0用作通用寄存器、还是只将参数传递给函数调用?   

    此外、我是否可以将 Nop 用作填充剂、这不会导致它崩溃?

    否则它肯定会崩溃,因为我把偏移量弄乱并写入 RAM 中的一个区域,我不是期望的,也许那应该用于程序的其他部分,它被卡在一个无限循环的地方。   

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

    我真的不明白你在做什么。  但我可以评论汇编代码中的两个细节。

    我认为此函数遵循与 TI 支持的所有 Arm 编译器相同的寄存器惯例。  这意味着无需保留寄存器 r0-R3。  如果需要的话,由呼叫者来保留它们(这是我从未见过的在实践中)。  因此、您无需推入/弹出这些寄存器。

    至...

    return 0;

    ... 您需要在返回之前将值0加载到 r0中。  我没有看到任何执行该操作的说明。

    谢谢。此致、

    -乔治

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

    哦,好的,非常感谢提示,你摇滚! 我很抱歉,我是一个新手,只是一个新学生,学习!   

    即使不使用 r0寄存器、我是否也需要将 mov 0移入 r0? 我不认为现有代码会将零加载到 r0中、

    但除了向另一个函数传递参数外、它可能从未使用过 r0。 也许这就是它让自己变硬的原因、

    如果不将0移动到 r0、会发生什么情况?  

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

    如果对该函数的任何调用都不使用返回值、则 r0中的内容无关紧要。  但如果只有一个调用使用返回值、则必须在返回之前将 r0加载为0。

    谢谢。此致、

    -乔治