【发布时间】:2020-07-02 11:31:31
【问题描述】:
最近的 gcc 有没有办法禁用协处理器指令:CDP、LDC、STC、MCR 和 MRC?
它们似乎被分组在一个名为 arm_coproc1_ok 的 autoconf 变量中。
我尝试设置选项 -march=armv4 和 -mfloat-abi=soft 但没有任何帮助。我的二进制文件总是包含说明。
不管是我的源代码还是libc(newlib),我都找copro指令。
这个c++代码源,
double Bbp::S(int j)
{
double s = 0.0; // Summation of Total, Left
double t; // Each term of right summation
int r; // Denominator
int k; // Loop index
double EPS = 1.0e-17; // Loop-exit accuration of the right summation
// Left Sum (0 ... d)
for (k = 0; k <= d; k++) {
r = 8 * k + j;
t = (double)compModExp(16, d - k, r);
t /= r;
s += t - (int)t;
s -= (int)s;
}
// Right sum (d + 1 ...)
while (1) {
r = 8 * k + j;
t = std::pow(16.0, (double)(d - k));
t /= (double)r;
if (t < EPS) break;
s += t;
s -= (int)s;
k ++;
}
return s;
}
...生成这个二进制文件(stc at 0x44c):
000001c0 <_ZN3Bbp1SEi>:
1c0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
1c4: e24dd034 sub sp, sp, #52 ; 0x34
1c8: e58d0004 str r0, [sp, #4]
1cc: e58d1000 str r1, [sp]
1d0: e3a02000 mov r2, #0
...
440: e49df004 pop {pc} ; (ldr pc, [sp], #4)
444: e1a00000 nop ; (mov r0, r0)
448: 4646d497 ; <UNDEFINED> instruction: 0x4646d497
44c: 3c670ef5 stclcc 14, cr0, [r7], #-980 ; 0xfffffc2c
与newlib的libc.a在0x080(mrc指令)相同的注释:
00000028 <etens>:
28: 4a926576 bmi fe499608 <enan+0xfe49565c>
2c: 153f804a ldrne r8, [pc, #-74]! ; ffffffea <enan+0xffffc03e>
30: 979ac94c ldrls ip, [sl, ip, asr #18]
...
5c: 75868175 strvc r8, [r6, #373] ; 0x175
60: 4d48c976 vstrmi.16 s25, [r8, #-236] ; 0xffffff14 ; <UNPREDICTABLE>
64: 58f89c66 ldmpl r8!, {r1, r2, r5, r6, sl, fp, ip, pc}^
68: 5c54bc50 mrrcpl 12, 5, fp, r4, cr0
6c: 91c6cc65 bicls ip, r6, r5, ror #24
70: a0aea60e adcge sl, lr, lr, lsl #12
74: 46a3e319 ssatmi lr, #4, r9, lsl #6
78: eab7851e b fede14f8 <enan+0xfeddd54c>
7c: 901b98fe ; <UNDEFINED> instruction: 0x901b98fe
80: de8dddbb mcrle 13, 4, sp, cr13, cr11, {5}
...显然还有其他。
谢谢。
【问题讨论】:
-
意思是当你为这些指令编写汇编语言代码时,工具仍然在汇编它们?或者您选择与项目链接的库恰好有这些独立于您使用这些限制构建的代码?
-
举例说明如何使用 gcc 编译的 C 代码获取 mrc/mcr。请提供一个最小的例子。
-
感谢您的回复。我修改了我的问题。
-
第一个反汇编器反汇编数据的不是stc指令。第二个中的 mcr 也是如此。只是一些池数据。
-
为了改变那些你需要改变程序中的数据值,使它们不像那些指令。
标签: gcc arm bare-metal