我已经在互联网上搜索了一段时间,并提出了一个奇怪的问题。
使用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表示movcmpl表示cmp。但是有些我无法使其他命令(如st, ba, pt, or ld to convert to Y86.

这些说明有什么亮点吗?编译器可能有问题吗?
供参考,我正在使用Unix and command gcc -S "filename.c"

最佳答案

stld指令显然是存储到内存和从中加载的。对于事物的外观,ba是一些描述的分支指令。

实际上,根据所生成的指令和一些快速研究,您似乎可能正在运行SPARC体系结构。 ld/st对,basave都是关于该体系结构的指令。

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

而“稍微混乱”的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/

10-12 20:21