2015-10-05 57 views
0

我正在学习OR1K程序集,这是我正在开发的一个项目。 clangLLVM用于为编译器提供前端和后端。我发现this link,它几乎是我需要的所有东西,然而我所看到的组件中有@hi@lo符号。我对这些“指示”有直观的理解,但最好能够正式解释它们的含义。哪里可以找到描述@hi和@lo“指令”的OR1K程序集

以下是C及其生成的相应汇编代码。 我在说的流水线几乎在底部。这里是他们如何看待

l.sw 0(r1), r11 
l.movhi r3, hi([email protected]) 
l.jal printf 
l.ori r3, r3, lo([email protected]) 

C代码

#include <stdio.h> 
#include <assert.h> 

int sum(int a, int b) { 
    return a + b; 
} 

int main(int argc, char** argv) { 
    printf("Hello World! %d\n", sum(argc, 1)); 
    return 0; 
} 

汇编代码

.text 
    .file "hello_world.ll" 
    .globl _Z3sumii 
    .align 4 
    .type _Z3sumii,@function 
_Z3sumii:        # @_Z3sumii 
    .cfi_startproc 
# BB#0:         # %entry 
    l.sw -4(r1), r2 
.Ltmp0: 
    .cfi_offset 2, -4 
    l.addi r2, r1, 0 
.Ltmp1: 
    .cfi_def_cfa_register 2 
    l.addi r1, r1, -12 
    l.sw -8(r2), r3 
    l.sw -12(r2), r4 
    l.lwz r3, -8(r2) 
    l.add r11, r3, r4 
    l.addi r1, r2, 0 
    l.jr r9 
    l.lwz r2, -4(r1) 
.Ltmp2: 
    .size _Z3sumii, .Ltmp2-_Z3sumii 
    .cfi_endproc 

    .globl main 
    .align 4 
    .type main,@function 
main:         # @main 
    .cfi_startproc 
# BB#0:         # %entry 
    l.sw -4(r1), r9 
.Ltmp3: 
    .cfi_offset 9, -4 
    l.sw -8(r1), r2 
.Ltmp4: 
    .cfi_offset 2, -8 
    l.addi r2, r1, 0 
.Ltmp5: 
    .cfi_def_cfa_register 2 
    l.addi r13, r1, -32 
    l.srli r13, r13, 3 
    l.slli r1, r13, 3 
    l.movhi r5, 0 
    l.sw 20(r1), r5 
    l.sw 16(r1), r3 
    l.sw 8(r1), r4 
    l.lwz r3, 16(r1) 
    l.jal _Z3sumii 
    l.addi r4, r0, 1 
    l.sw 0(r1), r11 
    l.movhi r3, hi([email protected]) 
    l.jal printf 
    l.ori r3, r3, lo([email protected]) 
    l.movhi r11, 0 
    l.addi r1, r2, 0 
    l.lwz r9, -4(r1) 
    l.jr r9 
    l.lwz r2, -8(r1) 
.Ltmp6: 
    .size main, .Ltmp6-main 
    .cfi_endproc 

    .type .L.str,@object   # @.str 
    .section .rodata.str1.1,"aMS",@progbits,1 
.L.str: 
    .asciz "Hello World! %d\n" 
    .size .L.str, 17 

任何帮助表示赞赏。

+0

大概记录在您的汇编程序的手册中。股票GNU binutils似乎不支持OR1K,所以我假设你有一些补丁版本。 – Jester

+0

我可能应该补充说我使用'clang/llvm'而不是gcc – flashburn

回答

2

与很多汇编语言一样,OpenRISC只能使用16位立即值。因此,要执行加载,它首先加载高16位,然后对低16位执行或操作。在psuedo-C中:

int32_t addr = &str; 
register r3; 
r3 = addr & 0xFFFF0000; /* load hi bits, note this is a 16 bit value */ 
r3 |= addr &0xFFFF; /* load the lo bits of addr, note again only a 16 bit value */ 

那么究竟是什么使用printf调用r3负载的任何一边?那么,OpenRISC有一个branch delay slot。所以printf的调用在或者指令后发生

相关问题