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