-1

我已经在互联网上搜索了一段时间,并提出了一个奇怪的问题。使用 a 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"

我的问题是关于说明本身。我发现的许多网站都有与这些类似的说明,例如movlformovcmplfor cmp。但有些我无法做出其他命令的正面或反面,例如st, ba, pt, or ld to convert to Y86.

这些说明有什么亮点吗?会不会是编译器的问题?作为参考,我正在使用Unix and command gcc -S "filename.c"

4

1 回答 1

1

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

事实上,根据生成的指令和一些快速研究,看起来您可能在 SPARC 架构上运行。这ld/st对,ba并且save都是关于该架构的指令。

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

而那个“稍微混乱”的ba指令实际上是 SPARC 版本 9 中引入的分支预测版本,ba,pt %xcc, .LL2意思是基于条件代码(显然是“总是”这个词的一些定义)我以前不知道)。

相反的指令ba,pn意味着预测不会采取分支。

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

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

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

于 2013-11-19T03:36:09.073 回答