gpt4 book ai didi

objdump - 了解 RiscV objdump

转载 作者:行者123 更新时间:2023-12-04 16:44:35 38 4
gpt4 key购买 nike

我正在检查使用以下命令编译的 C 文件的 objdump:

riscv64-unknown-elf-gcc -O0 -o maxmul.o maxmul.c
riscv64-unknown-elf-objdump -d maxmul.o > maxmul.dump

奇怪的是(或不是)地址似乎不是在 32 位字上对齐,而是在 16 位边界上对齐。

谁能解释一下为什么?

谢谢。

objdump 摘录:
00000000000101da <main>:
101da: 7155 addi sp,sp,-208
101dc: e586 sd ra,200(sp)
101de: e1a2 sd s0,192(sp)
101e0: 0980 addi s0,sp,208
...

C代码:
int main()
{

int first[3][3], second[3][3], multiply[3][3];
int golden[3][3];
int sum;

first[0][0] = 1; first[0][1] = 2; first[0][2] = 3;
first[1][0] = 4; first[1][1] = 5; first[1][2] = 6;
first[2][0] = 7; first[2][1] = 8; first[2][2] = 9;

second[0][0] = 9; second[0][1] = 8; second[0][2] = -7;
second[1][0] = -6; second[1][1] = 5; second[1][2] = 4;
second[2][0] = 3; second[2][1] = 2; second[2][2] = -1;

golden[0][0] = 6; golden[0][1] = 24; golden[0][2] = -2;
golden[1][0] = 24; golden[1][1] = 69; golden[1][2] = -14;
golden[2][0] = 42; golden[2][1] = 1140; golden[2][2] = -26;

int i, ii, iii;
for (i = 0; i < 3; i++) {
for (ii = 0; ii < 3; ii++) {
for (iii = 0; iii < 3; iii++) {
//printf("first[%d][%d] * second[%d][%d] \n", i, iii, iii, ii);
//printf("%d * %d (%d,%d)\n", first[i][ii], second[ii][i], i, ii);
sum += first[i][iii] * second[iii][ii];
}
//printf("sum = %d\n", sum);
multiply[i][ii] = sum;
sum = 0;
}
}

int c, d;
int err;
for ( c = 0; c < 3; c++) {
for ( d = 0; d < 3; d++) {
//printf("%d\t", multiply[c][d]);
if (multiply[c][d] != golden[c][d]) {
fail(golden[c][d], multiply[c][d]);
err++;
}
}

//printf("\n");
}
if (err == 0) {
pass();
}
return 0;
}

最佳答案

我怀疑您的 gcc 默认使用压缩指令格式编译,其中指令可以是 16b 和 32b 混合 - 在这种情况下,16b 指令是 16b 对齐的,如您在反汇编代码中看到的那样。

Objdump 提供地址、编码和助记符;您的情况下的编码始终为 16b,这意味着编译器在可能的情况下选择了 16b 指令。

通过启用详细模式( -verbose ),您可以看到,默认情况下, -march=rv64imafdc-mabi=lp64d .默认的目标 ISA 是压缩的,目标 ABI 需要双浮点扩展。

通过设置 -march=rv64imafd并让 ABI 不变,gcc 使用只有 32b 的指令成功编译,因为不再启用​​压缩 ISA。
指令的地址总是 32b 对齐。

关于objdump - 了解 RiscV objdump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225939/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com