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.
我尝试向旧代码添加一个现有的函数调用、它可以正常工作、然后我将要使用的寄存器更改为 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。
谢谢。此致、
-乔治