# Initialize ASM For RISC-V

.section .text.entry
.option norvc
.global _start .macro push_reg
addi sp, sp, -32*4
sw x1, 0 * 4(sp)
sw x2, 1 * 4(sp)
sw x3, 2 * 4(sp)
sw x4, 3 * 4(sp)
sw x5, 4 * 4(sp)
sw x6, 5 * 4(sp)
sw x7, 6 * 4(sp)
sw x8, 7 * 4(sp)
sw x9, 8 * 4(sp)
sw x10, 9 * 4(sp)
sw x11, 10 * 4(sp)
sw x12, 11 * 4(sp)
sw x13, 12 * 4(sp)
sw x14, 13 * 4(sp)
sw x15, 14 * 4(sp)
sw x16, 15 * 4(sp)
sw x17, 16 * 4(sp)
sw x18, 17 * 4(sp)
sw x19, 18 * 4(sp)
sw x20, 19 * 4(sp)
sw x21, 20 * 4(sp)
sw x22, 21 * 4(sp)
sw x23, 22 * 4(sp)
sw x24, 23 * 4(sp)
sw x25, 24 * 4(sp)
sw x26, 25 * 4(sp)
sw x27, 26 * 4(sp)
sw x28, 27 * 4(sp)
sw x29, 28 * 4(sp)
sw x30, 29 * 4(sp)
sw x31, 30 * 4(sp)
csrr t0, mepc
sw t0, 31 * 4(sp)
.endm .macro pop_reg
lw t0, 31 * 4(sp)
csrw mepc, t0
lw x1, 0 * 4(sp)
lw x2, 1 * 4(sp)
lw x3, 2 * 4(sp)
lw x4, 3 * 4(sp)
lw x5, 4 * 4(sp)
lw x6, 5 * 4(sp)
lw x7, 6 * 4(sp)
lw x8, 7 * 4(sp)
lw x9, 8 * 4(sp)
lw x10, 9 * 4(sp)
lw x11, 10 * 4(sp)
lw x12, 11 * 4(sp)
lw x13, 12 * 4(sp)
lw x14, 13 * 4(sp)
lw x15, 14 * 4(sp)
lw x16, 15 * 4(sp)
lw x17, 16 * 4(sp)
lw x18, 17 * 4(sp)
lw x19, 18 * 4(sp)
lw x20, 19 * 4(sp)
lw x21, 20 * 4(sp)
lw x22, 21 * 4(sp)
lw x23, 22 * 4(sp)
lw x24, 23 * 4(sp)
lw x25, 24 * 4(sp)
lw x26, 25 * 4(sp)
lw x27, 26 * 4(sp)
lw x28, 27 * 4(sp)
lw x29, 28 * 4(sp)
lw x30, 29 * 4(sp)
lw x31, 30 * 4(sp)
addi sp, sp, 32*4
.endm .option norvc _start:
j handle_reset trap_vector:
j RVDefaultHandler
j RVDefaultHandler // 1
j RVDefaultHandler // 2
j RVDefaultHandler // 3
j RVDefaultHandler // 4
j RVDefaultHandler // 5
j RVDefaultHandler // 6
j RVDefaultHandler // 7
j RVDefaultHandler // 8
j RVDefaultHandler // 9
j RVDefaultHandler // 10
j RVDefaultHandler // 11
j RVDefaultHandler // 12
j RVDefaultHandler // 13
j RVDefaultHandler // 14
j RVDefaultHandler // 15
j RVDefaultHandler // 16
j RVDefaultHandler // 17
j RVDefaultHandler // 18
j RVDefaultHandler // 19
j RVDefaultHandler // 20
j RVDefaultHandler // 21
j RVDefaultHandler // 22
j RVDefaultHandler // 23
j RVDefaultHandler // 24
j RVDefaultHandler // 25 RVDefaultHandler:
j RVDefaultHandler .section .text
.option norvc handle_reset:
la t0, trap_vector
addi t0, t0, 1
csrw mtvec, t0
csrwi mstatus, 0
csrwi mie, 0
la gp, _gp
la sp, __stack_top # clear bss section
clear_bss:
la t0, __bss_begin
la t1, __bss_end
li t2, 0x00000000 clear_bss_loop:
sw t2, (t0)
addi t0, t0, 4
blt t0, t1, clear_bss_loop jump_to_main:
j main OUTPUT_ARCH("riscv")
ENTRY(_start) MEMORY
{
RAM (rwx) : ORIGIN = 0x0, LENGTH = 8K
} STACK_SIZE = 2k;
HEAP_SIZE = 2k; SECTIONS
{
.text : ALIGN(4)
{
__start_addr = .;
KEEP(*(.text.entry))
. = ALIGN(4);
*(.text*)
. = ALIGN(4);
__text_end = .;
} > RAM .data :
{
__data_load = LOADADDR(.data);
__rodata_start = .;
*(.rodata*)
. = ALIGN(4);
__rodata_end = .;
__data_start = .;
*(.data*)
. = ALIGN(4);
__data_end = .;
} > RAM .sdata :
{
__sdata_load = LOADADDR(.sdata);
__sdata_start = .;
_gp = . + 0x100;
*(.srodata*)
*(.sdata*)
__sdata_end = .;
} > RAM .bss : ALIGN(4)
{
__bss_begin = .; *(.sbss*)
*(.scommon)
*(.bss*)
*(COMMON)
. = ALIGN(4);
__bss_end = .;
} > RAM
_end = .; .stack : ALIGN(4)
{
__stack_bottom = .;
. += STACK_SIZE;
__stack_top = .;
} > RAM .heap : ALIGN(4)
{
__heap_begin = .;
. += HEAP_SIZE;
__heap_end = .;
} > RAM
} #***********************************************************************************************
# File : Makefile
# Author : Lyu Yang
# Date :
# Description : Makefile for RISC-V
#*********************************************************************************************** TARGET = app_test CROSS_COMPILE = riscv64-unknown-elf- SRC_DIR = .
OBJ_DIR = obj
INC_DIR = -I ./
LIB_DIR = -L ./ CC = $(CROSS_COMPILE)gcc
CFLAGS = $(INC_DIR) -c -mabi=ilp32 -march=rv32i -Wall -O1 -std=c99 -gdwarf-2 -freorder-blocks-algorithm=simple -fno-schedule-insns -fno-aggressive-loop-optimizations -fno-builtin -Wstrict-prototypes -Wno-write-strings -fno-exceptions -fno-short-enums -Wundef -falign-functions=2 -fdata-sections -ffunction-sections -fno-common CXX = $(CROSS_COMPILE)g++
CXXFLAGS = $(INC_DIR) -c -mabi=ilp32 -march=rv32i -Wall -O1 -std=c99 -gdwarf-2 -freorder-blocks-algorithm=simple -fno-schedule-insns -fno-aggressive-loop-optimizations -fno-builtin -Wstrict-prototypes -Wno-write-strings -fno-exceptions -fno-short-enums -Wundef -falign-functions=2 -fdata-sections -ffunction-sections -fno-common AS = $(CROSS_COMPILE)gcc
ASFLAGS = -c -mabi=ilp32 -march=rv32i -x assembler-with-cpp -Wall -O1 -gdwarf-2 -fstack-protector -fno-common -fdata-sections -ffunction-sections LD = $(CROSS_COMPILE)gcc
LDFLAGS = $(LIB_DIR) -mabi=ilp32 -march=rv32i -nostartfiles -Triscv.lds -Wl,-Map,$(TARGET).map OBJCP = $(CROSS_COMPILE)objcopy
OBJCPFLAGS = -O binary -j .text -j .data -j .sdata AR = $(CROSS_COMPILE)ar
ARFLAGS = cr OBJDUMP = $(CROSS_COMPILE)objdump
OBJDUMPFLAG = --disassemble --syms --all-header SIZE = $(CROSS_COMPILE)size ASMS = $(wildcard $(SRC_DIR)/*.S)
SRCS = $(wildcard $(SRC_DIR)/*.c) OBJS += $(ASMS:$(SRC_DIR)/%.S=$(OBJ_DIR)/%.o)
OBJS += $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
DEPS += $(OBJS:%.o=%.d) # Make
all: $(TARGET).elf $(TARGET).bin $(TARGET).asm $(TARGET).mif
$(SIZE) $(TARGET).elf $(OBJ_DIR)/%.o: $(SRC_DIR)/%.S
@mkdir -p $(shell dirname $@)
@$(AS) $(ASFLAGS) $< -o $@
@echo AS $< $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(shell dirname $@)
@$(CC) $(CFLAGS) -MM -MT $@ -MF $(patsubst %.o, %.d, $@) $<
@$(CC) $(CFLAGS) $< -o $@
@echo CC $< -include $(DEPS) $(TARGET).elf: $(OBJS)
@$(LD) $(LDFLAGS) $^ -o $@ $(TARGET).asm: $(TARGET).elf
@$(OBJDUMP) $(OBJDUMPFLAG) $(TARGET).elf > $(TARGET).asm $(TARGET).bin: $(TARGET).elf
@$(OBJCP) $(OBJCPFLAGS) $< $@ $(TARGET).mif: $(TARGET).bin
@./bin2fpga/bin2fpga 4096 $< > $(TARGET).txt clean:
@rm -rf obj $(TARGET).elf $(TARGET).map $(TARGET).asm $(TARGET).bin debug:
$(CROSS_COMPILE)gdb $(TARGET).elf -x gdbinit.txt

  

用于RISC-V的Makefile示例的更多相关文章

  1. 用于OpenRISC的Makefile示例

    #* #*********************************************************************************************** ...

  2. makefile示例

    1. 生成.so动态库 示例一: SoVer = 10010110CfgVer = 10010110 BinName = fnights.soGameName = "\"fnigh ...

  3. gcc链接g++编译生成的静态库和动态库的makefile示例

    使用c++开发程序或者库时,将库提供给其他人使用. 然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同. 首先是静态库,以链接g++编译生成的libmylib.a为 ...

  4. 一个gulp用于开发与生产的示例

    gulp是一款流行的前端构建工具,可以帮我们完成许多工作:监听文件修改.刷新浏览器.编译Less/Scss.压缩代码.添加md5.合并文件等.gulp的配置和使用特别简单,学习gulp过程中顺便写了一 ...

  5. 简单makefile示例

    Makefile cmd: - g++ 相信在linux下编程的没有不知道makefile的,刚开始学习linux平台下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其 ...

  6. 一个用于每一天JavaScript示例-使用缓存计算(memoization)为了提高应用程序性能

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. 一个用于每一天JavaScript示例-SVG中间javaScript画廊

    <?xml version="1.0" standalone="no"? > <!DOCTYPE svg PUBLIC "-//W3 ...

  8. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  9. makefile基础(GNU)

    makefile的核心 targets : prerequisites ; commands...   //不分行的情况 targets : prerequisites                 ...

随机推荐

  1. .NET Core Startup启动类

    .NET Framework 早期架构 在.NET Core面世之前,也就是.NET Framework时代,我们的软件架架构有一些比较通用的架构.抛开我们的业务组件,在我们的系统中我们总会有一些基础 ...

  2. Netty回调与Channel执行流程分析

    在上一篇的基础上修改代码 1.TestHttpServerHandle  类 package com.example.firstexample; import io.netty.buffer.Byte ...

  3. java查看线程的堆栈信息

    通过使用jps 命令获取需要监控的进程的pid,然后使用jstack pid 命令查看线程的堆栈信息. 通过jstack 命令可以获取当前进程的所有线程信息. 每个线程堆中信息中,都可以查看到线程ID ...

  4. merge同时包含增、改、删

    我们都知道oracle merge可以用来增和改,很少用它来删除.但是有时候我们仍然需要该特性,以提高性能,典型的场景就是将业务库逻辑删除的记录同步到查询库的时候,做真正的物理删除,这个时候merge ...

  5. python离线包下载地址

    https://pypi.org/project/pdfconv/ https://pypi.org/search/?q=major&o=

  6. C# Newtonsoft.Json解析json字符串处理(最清晰易懂的方法)

    需求: 假设有如下json字符串: { ", "employees": [ { "firstName": "Bill", &quo ...

  7. springboot 整合mongodb

    Mongodb Mongodb是为快速开发互联网Web应用而构建的数据库系统,其数据模型和持久化策略就是为了构建高读/写吞吐量和高自动灾备伸缩性的系统. 在pom.xml中添加相关依赖 <!-- ...

  8. [LeetCode] 169. Majority Element 多数元素

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  9. [LeetCode] 326. Power of Three 3的次方数

    Given an integer, write a function to determine if it is a power of three. Follow up:Could you do it ...

  10. Python:self理解

    Python类 class Student: # 类变量,可以通过类.类变量(Student.classroom)或者实例.类变量(a.classroom)方式调用 classroom = '火箭班' ...