您尚未登录。

楼主 #1 2018-09-26 15:09:42

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,348
积分: 9202

神奇的x0寄存器 ---- 说说RISC-V的x0寄存器(转)

原文: https://blog.csdn.net/zoomdy/article/details/79343785

RISC-V有32个通用寄存器,其中第1个寄存器x0硬编码为0,即读出来总是0,写进去总是被丢弃。x0为RISC-V指令集的简化可贡献不少啊。

搞过Linux的都知道Linux有两个特殊的设备:/dev/zero/dev/null。从/dev/zero可以源源不断地读到0,往/dev/null写的任何内容都被丢弃。如果要创建一个需要填0的文件,就从/dev/zero拷贝,如果要丢弃一些输出,就把输出重定向到/dev/null。

RISC-V的x0寄存器就相当于是硬件版的/dev/zero和/dev/null的组合体。从x0读出来的总是0,往x0写进去的总是被丢弃。所以这x0提供了两种功能,一是提供常量0,在软件编程中0可以说是最常用的常量了;二是提供一个可以丢弃结果的场所。有了这个x0,很多本来需要单独指令的操作只要更普通的指令加上x0就可以实现了。

比如nop空指令,RISC-V没有提供nop指令噢,RISC-V用addi x0, x0, 0来实现空指令的,这条addi使用x0作为目标寄存器,x0是会丢弃结果的,所以这条指令不会对程序状态产生任何影响,和空指令是完全等价的。这就不需要单独的空指令了。

比如neg取负数指令,RISC-V用sub rd, x0, rs来实现,x0 - rs 等价于 0 - rs 等价于 -rs,有了x0,就可以用更普通的减法指令来实现取负数指令。

比如j跳转指令,RISC-V没有单独的j跳转指令,只有jal跳转链接指令,跳转之前总是要把下一条指令的地址拷贝到寄存器,但是如果用x0作为jal的操作寄存器,即把下一条指令的地址拷贝到x0,那么效果就等价于j跳转指令了,因为写入x0的任何值都是会被丢弃的呀。

比如beqz等于零跳转指令等等一系列和0比较的跳转指令,程序中和0比较是相当常见的操作了,RISC-V中和0比较的指令就是普通的比较跳转指令,无非是用了x0寄存器做指令的操作数罢了。

其它还有很多这样的指令,用普通的指令加上x0做操作数,就实现了那些没有x0寄存器的处理器需要单独指令或者需要组合两条指令才能实现的操作。更多这样的指令可以参考《The RISC-V Instruction Set Manual Volume I: User-Level ISA》Chapter 20 RISC-V Assembly Programmer’s Handbook ,这个Handbook中定义了大量的伪指令,大部分伪指令都使用了x0作为操作数。





离线

楼主 #2 2018-09-26 15:16:02

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,348
积分: 9202

Re: 神奇的x0寄存器 ---- 说说RISC-V的x0寄存器(转)

使用 Linux 朋友经常会用到 dd 命令, 同时带上这两个设备 /dev/null /dev/zero, 用于测试flash, u盘读写速度速度

比如测试 U盘写速度(文件大小/时间):

dd if=/dev/zero of=/mnt/flash/zero.bin

测试 U盘读速度(文件大小/时间):

dd if=/mnt/flash/zero.bin of=/dev/null


RISC-V架构中的X0寄存器与 Unix 哲学中的 /dev/null, /dev/zero 有异曲同工之妙!





离线

#3 2018-09-27 09:04:22

bunny
会员
注册时间: 2020-05-23
已发帖子: 154
积分: 154

Re: 神奇的x0寄存器 ---- 说说RISC-V的x0寄存器(转)

晕哥玩得好潮啊

离线

#4 2018-09-28 14:15:11

行风
会员
注册时间: 2018-09-28
已发帖子: 6
积分: 6

Re: 神奇的x0寄存器 ---- 说说RISC-V的x0寄存器(转)

我记的MIPS 架构的 寄存器0 就是这样的。

离线

楼主 #5 2018-09-28 15:00:46

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,348
积分: 9202

Re: 神奇的x0寄存器 ---- 说说RISC-V的x0寄存器(转)

行风 说:

我记的MIPS 架构的 寄存器0 就是这样的。

https://blog.csdn.net/Lrrent/article/details/51172766
果然是从 MIPS 抄过来的, 因为是原创,少见多怪了.





离线

#6 2021-05-14 13:25:09

armstrong
会员
注册时间: 2019-04-10
已发帖子: 287
积分: 196.5

Re: 神奇的x0寄存器 ---- 说说RISC-V的x0寄存器(转)

既然这么好,可x0寄存器能在内存寻址空间访问吗?它能作为数据源提供给DMA硬件,实现无需CPU搬运的memclr吗?

最近编辑记录 armstrong (2021-05-14 13:27:04)

离线

#7 2021-06-22 03:14:40

whnoerrrii
会员
注册时间: 2021-06-22
已发帖子: 2
积分: 1

Re: 神奇的x0寄存器 ---- 说说RISC-V的x0寄存器(转)

晕哥 说:
行风 说:

我记的MIPS 架构的 寄存器0 就是这样的。

https://blog.csdn.net/Lrrent/article/details/51172766
果然是从 MIPS 抄过来的, 因为是原创,少见多怪了.

MIPS和RV的爹好像是一个人。不能算抄23333

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn