私が取り組んでいるプロジェクトの OR1K アセンブリを学んでいます。コンパイラのフロントエンドとバックエンドを提供するために使用されますclang
。このリンクLLVM
を見つけましたが、必要なものはほとんどすべて揃っていますが、見ているアセンブリにはシンボルが含まれています。私はこれらの「指示」が行うことを直感的に理解していますが、それらが何を意味するのかについて公式の説明を得たほうがよいでしょう.@hi
@lo
以下は、C とそのために生成された対応するアセンブリ コードです。私が話している組立ラインは、ほとんど底にあります。ここに彼らがどのように見えるかがあります
l.sw 0(r1), r11
l.movhi r3, hi(.L.str@hi)
l.jal printf
l.ori r3, r3, lo(.L.str@lo)
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(.L.str@hi)
l.jal printf
l.ori r3, r3, lo(.L.str@lo)
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
どんな助けでも大歓迎です。