我已经在互联网上搜索了一段时间,并提出了一个奇怪的问题。
使用C compiler
,我将以下内容转换为assembly
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
mov
和cmpl
cmp
。但有些我无法做出st, ba, pt, or ld to convert to Y86.
对这些说明有何看法?这可能是编译器的问题吗?
作为参考,我正在使用Unix and command gcc -S "filename.c"
答案 0 :(得分:1)
st
和ld
指令显然是存储到内存并从内存加载。对于事物的外观,ba
是一些描述的分支指令。
实际上,根据生成的指令和一些快速研究,看起来您可能正在运行SPARC架构。 ld/st
对,ba
和save
都是该架构的说明。
save
指令实际上是在调用函数时处理寄存器保存和恢复的SPARC方式(in / local / out方法)。
那个“稍微紊乱”的ba
指令实际上是SPARC版本9中引入的分支预测版本,ba,pt %xcc, .LL2
意味着分支总是(根据条件预测分支将被采用)代码(显然是我以前没有意识到的“总是”这个词的 new 定义。)
相反的指令ba,pn
意味着预测分支将不被采取。
分支后面的nop
指令的存在与SPARC延迟分支的事实有关 - 分支之后的指令实际上是在执行分支之前执行的。这与管道指令的方式有关,并且可能被认为是任何其他(不那么奇怪)架构的错误: - )
所有这些因素很好地保证了你在SPARC上的运行,所以我会查找操作码来确定如何最好地将它转换为Y86。
另一种选择当然是生成x86指令。这可能是通过在SPARC上使用交叉编译器或者只是在x86机器上编译它(假设你有一个可用)。