RiscV彙編介紹(2)-編譯過程

      elf文件全稱是Executable and Linkable Format,可執行連接格式,elf文件中除了機器碼以外,還有段加載地址,運行入口地址,數據段等。html

     elf文件格式主要有如下三種:ide

  • 可重定向文件:文件保存着代碼和適當的數據,用來和其它的目標文件一塊兒來建立一個可執行文件或者共享目標文件。
  • 可執行文件:文件保存着一個用來執行的文件。
  • 共享目標文件:即共享庫。

elf文件詳解:函數

http://www.javashuo.com/article/p-unwgtgag-z.html工具

https://blog.csdn.net/afterlake/article/details/53648912ui


咱們用riscv工具鏈獲得hello.c程序的彙編代碼以下,對於rv32和rv64 gcc,編譯出來的彙編是不同的。spa

riscv64-unknown-elf-gcc-8.3.0  hello.c -S -o hello.s

        .file   "hello.c"
         .option nopic
         .text
         .section        .rodata
         .align  3
 .LC0:
         .string "Hello World!"
         .text
         .align  1
         .globl  main
         .type   main, @function
 main:
         addi    sp,sp,-16
         sd      ra,8(sp)
         sd      s0,0(sp)
         addi    s0,sp,16
         lui     a5,%hi(.LC0)
         addi    a0,a5,%lo(.LC0)
         call    puts
         li      a5,0
         mv      a0,a5
         ld      ra,8(sp)
         ld      s0,0(sp)
         addi    sp,sp,16
         jr      ra
         .size   main, .-main
         .ident  "GCC: (GNU) 8.3.0"
 ~
riscv32-unknown-elf-gcc hello.c -S -o hello1.s

    .file    "hello.c"
     .option nopic
     .text
     .section    .rodata
     .align    2
 .LC0:
     .string    "Hello World!"
     .text
     .align    1
     .globl    main
     .type    main, @function
 main:
     addi    sp,sp,-16
     sw    ra,12(sp)
     sw    s0,8(sp)
     addi    s0,sp,16
     lui    a5,%hi(.LC0)
     addi    a0,a5,%lo(.LC0)
     call    puts
     li    a5,0
     mv    a0,a5
     lw    ra,12(sp)
     lw    s0,8(sp)
     addi    sp,sp,16
     jr    ra
     .size    main, .-main
     .ident    "GCC: (GNU) 8.3.0"




       RV32I 爲程序和數據分配內存。圖中的頂部是高地址,底部是低地址。在 RISC-V 軟件規範中,棧指針(sp)從 0xbffffff0 開始向下增加;程序代碼段從 0x00010000 開始,包括靜態連接庫;程序代碼段結束後是靜態數據區,在這個例子中假設從 0x10000000 開始;而後是動態數據區,由 C 語言中的alloc()函數分配,向上增加,其中包含動態連接庫。.net

image

    .file    "hello.c"
     .option nopic
     .text
     .section    .rodata
     .align    2 //4字節對齊
.LC0:
     .string    "Hello World!"
     .text
     .align    1
     .globl    main
     .type    main, @function
main:
     addi    sp,sp,-16 //sp=x2, 調整棧指針,分配棧棧
     sw    ra,12(sp) //保存函數返回地址,就是main函數的入口地址
     sw    s0,8(sp) //s0=x8,保存s0,幀指針
     addi    s0,sp,16 //s0=棧頂地址
     lui    a5,%hi(.LC0) //計算LC0的地址,a0,…a7保存函數參數地址
     addi    a0,a5,%lo(.LC0)
     call    puts //調用puts函數,輸出hello world
     li    a5,0 //讀取當即數,a5=0
     mv    a0,a5 //a0=0,恢復參數地址爲0
     lw    ra,12(sp) //恢復返回地址
     lw    s0,8(sp) //恢復s0,幀指針
     addi    sp,sp,16 //恢復sp
     jr    ra  // 跳轉到ra地址
     .size    main, .-main
     .ident    "GCC: (GNU) 8.3.0"
指針

相關文章
相關標籤/搜索