Risc-V学习日记05

Risc-V学习日记05
Day11
//4-1到4-3的作业以我目前的能力没法解读
[label:][operation][comment]

[label:]{必须有:}
    {
_start: 		# Label
	li x6, 5	# pseudo-instruction[6,7相当于同一行]
	li x7, 4	# pseudo-instruction
	add x5, x6, x7	# instruction
	do_nothing	# Calling macro
stop:	j stop		# statement in one line

	.end		# End of file
    }
编译完后变成机器指令

operation 可以有以下多种类型:
{
    instruction(指令): 直接对应二进制机器指令的字符串
    pseudo-instruction(伪指令): 为了提高编写代码的效率,可以用一条伪指令指示汇编器产生多条实际的指令(instructions)。
        有点类似一个function定义一个函数?
    directive(指示/伪操作): , 通过类似指令的形式(以"."开头),通知汇编器如何控制代码的产生等,不对应具体的指令。
        {
            .macro do_nothing	# directive
	            nop		# pseudo-instruction
	            nop		# pseudo-instruction
            .endm			# directive
                .text		# directive
	            .global _start	# directive
        }
    macro:采用 .macro/.endm 自定义的宏
        {
            .macro do_nothing	# directive
	            nop		# pseudo-instruction
	            nop		# pseudo-instruction
        }

}

RISC-V 汇编指令操作对象
寄存器:
    32个通用寄存器,x0 ~ x31[RV32I]
        x0,zero特殊寄存器不能写读出来永远为0
        pc寄存器无法访问,用于保存当前执行指令的位置(指令指针)
    在 RISC-V 中,Hart 在执行算术逻辑运算时所操作的数据必须直接来自寄存器
        

内存:
    Hart 可以执行在寄存器和内存之间的数据读写操作;
    读写操作使用字节(Byte)为基本单位进行寻址;
        每个字节对应一个地址
    RV32 可以访问最多 2^32 个字节的内存空间。

RISC-V 汇编指令编码格式
    指令长度:ILEN1= 32 bits (RV32I) #32bit=4byte(字节)
    指令对齐:IALIGN = 32 bits (RV32I)
    32 个 bit 划分成不同的 "域(field)"
    funct3/funct7 和 opcode 一起决定最终的指令类型
        opcode域
            inst[1:0]=11#第一位和第零位一定是11
            //突然豁然开朗
            参考riscv-spec-20191213.pdf
            ADD:0110011,因为inst[1:0]=11,所以不看最后两位
                查表Chapter 24,page129
                inst[6:5]    
                    01
                        inst[4:2]
                            100
                                OP:operation 
    指令在内存中按照"小端序"排列
        小端序的概念:
            主机字节序 (HBO - Host Byte Order)
                字节序:单字节整数[一个字符8bit,是整数,没有排序问题]
            一个 多字节整数 在计算机内存中存储的字节顺序称为主机字节序(HBO- Host Byte Order,或者叫本地字节序);
                {
                    short,int,long多字节
                }
            不同类型 CPU 的 HBO 不同,这与 CPU 的设计有关。分为 大端序(Big-Endian) 和 小端序(Little-Endian)
                {
                    一定要确认内存读取顺序:大小端序
                    例子:
                    [十进制]287454020(贰亿捌仟柒佰肆拾伍万肆仟零贰拾){高位:贰亿,低位:贰拾}
                    [二进制] 00010001 00100010 00110011 01000100 {高位:00010001,低位:01000100}
                    [十六进制] 11 22 33 44 {高位:11,低位:44}
                    内存:
                    A+3 0x00
                    A+2 0x00
                    A+1 0x00
                    A   0x00
                    大端序:高位低地址
                        A+3 0x44
                        A+2 0x33
                        A+1 0x22
                        A   0x11
                    小端序:低位低地址
                        A+3 0x11
                        A+2 0x22
                        A+1 0x33
                        A   0x44
                }                
                大端序(Big-Endian)
                    大端(Big- Endian):数据的高位字节存放在内存的低地址
                小端序(Little-Endian)
                    小端(itle-Endian):数据的低位字节存放在内存的低地址
    
    "R-type":(Register),每条指令中有三个 fields,用于指定 3 个 寄存器参数
        rs2,rs1,rd[用于存放寄存器参数]
            rd(register destination)存放结果
            rs(register source)源数据
            一个寄存器占5个bit
    "I-type": (Immediate),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为 12 bits)。
    S-type: (Store),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为 12 bits,但 fields 的组织方式不同于 I-type)
    B-type: (Branch),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为 12 bits,但取值为 2 的倍数)。
    U-type: (Upper),每条指令含有一个寄存器参数再加上一个立即数参数(宽度为 20bits,用于表示一个立即数的高 20 位)
    J-type: (Jump),每条指令含有一个寄存器参数再加上一个立即数参数(宽度为 20bits)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值