gpt4 book ai didi

c - 未知 IA32 汇编语言指令

转载 作者:行者123 更新时间:2023-11-30 19:21:25 26 4
gpt4 key购买 nike

我在互联网上搜索了一段时间,并发现了一个奇怪的问题。使用 C 编译器,我将以下内容转换为 汇编 to 稍后转换为 Y86:

    #include <stdio.h>

int main(void)
{
int j,k,i;

for (i=0; i <5; i++) {
j = i*2;
k = j+1;
}
}

转换后,我得到以下.s文件:

    .file   "Lab5_1.c"
.section ".text"
.align 4
.global main
.type main, #function
.proc 04

main:
save %sp, -112, %sp
st %g0, [%fp-4]
ba,pt %xcc, .LL2
nop

.LL3:
ld [%fp-4], %g1
add %g1, %g1, %g1
st %g1, [%fp-8]
ld [%fp-8], %g1
add %g1, 1, %g1
st %g1, [%fp-12]
ld [%fp-4], %g1
add %g1, 1, %g1
st %g1, [%fp-4]

.LL2:
ld [%fp-4], %g1
cmp %g1, 4
ble %icc, .LL3
nop
mov %g1, %i0
return %i7+8
nop
.size main, .-main
.ident "GCC: (GNU) 4.8.0"

我的问题是关于说明本身。我发现许多网站都有与此类似的说明,例如 movl 表示 movcmpl 表示 cmp 。但有些我无法将其他命令如 st、ba、pt 或 ld 转换为 Y86。

对这些说明有任何了解吗?会不会是编译器的问题?作为引用,我使用 Unix 和命令 gcc -S "filename.c"

最佳答案

stld 指令显然是存储到内存和从内存加载。从表面上看,ba是某种描述的分支指令。

事实上,根据生成的指令和一些快速研究,看起来您可能正在 SPARC 架构上运行。 ld/st 对、basave 都是该架构上的指令。

save指令实际上是调用函数时处理寄存器保存和恢复的SPARC方式(in/local/out方法)。

那个“有点困惑”的 ba 指令实际上是 SPARC 版本 9 中引入的分支预测版本,ba,pt %xcc, .LL2 表示始终分支(基于条件代码(显然是我之前不知道的“总是”一词的一些定义)。

相反的指令ba,pn表示预测该分支将被采用。

分支后面出现 nop 指令与 SPARC 执行延迟分支有关 - 分支后面的指令实际上在分支发生之前执行。这与它管道指令的方式有关,并且可能被认为是任何其他(不那么奇怪的)架构上的错误:-)

所有这些因素结合在一起很好地保证了您在 SPARC 上运行,因此我会查找相应的操作码,以找出如何最好地将其转换为 Y86。

当然,另一种选择是生成 x86 指令。这可以通过在 SPARC 上使用交叉编译器或简单地在 x86 机器上进行编译(假设您有可用的机器)来实现。

关于c - 未知 IA32 汇编语言指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20062608/

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