计算机组成原理之指令

引言

关于riscv操作数

32个寄存器 | X0~X31|快速定位数据。在riscv中,只对寄存器中的数据执行算术运算

2^61个存储字 | 只能被数据传输指令访问。riscv体系采用的是字节寻址。

一个寄存器是8bytes,64位(double word)

每次取的最小单位是一个byte

注意:当函数参数大于8个的时候,会占用内存。本来是都在寄存器的

riscv汇编语言

程序一定是加载到内存中执行的。

(如图) file

计算机硬件的操作

riscv体系中,寄存器大小64位,成组的64位频繁,被命名为双字。32位组成字。

存储器操作数

处理器只能在寄存器中保留少量数据,但内存可以存储大量数据。因此,数据结构(数组和结构体)保存在内存中。

riscv是小端字节序的。比如说0x12345678。存储是高位地址是12.最低位存储的是78。

网络字节序统一用的是大端序列。

数据传输指令:在内存和寄存器之间传输数据的命令

载入指令:将数据从内存复制到寄存器的数据传输命令

例题:将 A [12] = h + A[8]转换为汇编代码。A的基址存储在X22,h存储在X9

代码为:

ld X9 , 64(X22) //Temporary reg X9 gets A[8] add X9 , X21 ,X9 //Temporary reg X9 gets A[8] + h sd X9, 96(X22) //stores h + A[8] back into A[12]

常数或立即数操作数

将常数4加到寄存器X22的两种方式:

ld X9 , AddrConstant4(x3)      //X9 = constant4
add x22 , x22 ,x9              //x22 = x22 +4
//第二种
addi x22, x22, 4

第二种的addi指令可以避免加载指令,速度更加快。在许多体系中,字的起始地址必须是4的倍数,双字是8的倍数。

计算机中的指令表示

按照“简单源于规整的设计原则,Rsicv指令都是32位长。四位的对齐效率很高!

Riscv字段

opcode(操作码):指令的基本操作,这个是它的惯用名称

rd :目的操作数寄存器,用来存档操作结果

funct3 :一个另外的操作码字段

rs1 :第一个源操作数寄存器

rs2 :第二个源操作数寄存器

funct7 :一个另外的操作码字段

R型

用于寄存器,减少访问内存的开销 file

funct7与funct3是用来细化解析的

I型

用于常数的算术指令 file

S型

用于存储访问,将寄存器中的数据写入内存 file

汇编语言到机器语言

例:A[30] = h + A[30] + 1;(A的基址在x10,h存放于X21)

ld x9 , 240(x10)     //Temporary reg x9 gets A[30]
add x9, x9 ,x21      //Temporary reg x9 gets h + A[30]
addi x9, x9 ,1       //Temporary reg x9 gets h + A[30] + 1
sd x9, 240(x10)       //store h + A[30] + 1 back into A[30]

file

关于指令的判断

file

逻辑操作

file

移位指令使用I格式,由于移位不会大于63,immediate字段使用低6位就可以。 file funct6用来当做操作码字段。

用于决策的指令

例:if(i ==j) f = g + h; else f = g - h;

汇编:

bne (branch not equal)x22, x23, Else
add x19, x20, x21
beq x0, x0,Exit(遇到此指令必定跳过)
Else : sub x19, x20, x21
Exit

循环

例: while(save[i]) == k) i+=1;

loop: sli x10, x22 ,3     //Temp reg x10 = i * 8
add x10 ,x10, x25         //x10 = address of save[i]
ld x9, 0(x10)             //Temp reg x9 = save[i]
bne x9 ,x24 ,Exit
addo x22 ,x22, 1
beq x0, x0,loop
Exit

计算机硬件对过程的支撑

在执行程序过程时候,必须遵循六个步骤

将参数放到可以访问的位置

将控制转交给过程

获取所需的存储资源

将结果放在调用程序可以访问到的位置

将控制返回到初始点,因为过程可以从程序的多个点调用

Rsicv软件在为过程分配寄存器的时候遵循原则:

x10~x17:八个参数寄存器,用于传递参数或返回值

x1:一个返回地址的寄存器,用于返回到起始点

除了将这些寄存器分配之外,Riscv编程语言还包含一个仅用于过程的指令:跳转-链接指令。

jal x1,ProcedureAddress //jump to ProcedureAddress and write return address to x1 上述代码中x1中这个链接称为返回地址。返回地址是必须要的,因为同一过程可能在程序的不同部分被调用。 为了支持这种情况下面的过程返回,使用间接跳转jalr x0, (x1)

jalr x0, (x1) 是一种 RISC-V 指令,用于无条件跳转到 x1 寄存器中存储的地址,并将下一条指令的地址存储在 x0 寄存器中。这是一种间接跳转,因为它不是直接跳转到一个特定的地址,而是跳转到一个存储在寄存器中的地址。这个指令的机器码是 0x00008067。

使用更多的寄存器

假如对一个过程,要使用超过8个参数寄存器。必须要采用寄存器换出到存储器当中

换出寄存器的理想数据结构一种后进先出的stack)队列。栈需要一个指向栈中最新分配地址的指针,以指示下一个过程应该放置换出寄存器的位置或寄存器旧值的存放位置。

在RISC-V中,栈指针(stack pointer)是寄存器x2,也称为Sp。栈指针按照每个被保存或恢复的寄存器按双字进行调整。栈应用非常广泛,因而传送数据到栈或从栈传输数据都具有专业术语:将数据放入栈中称为压栈,从栈中移除数据称为弹栈

栈例子:

file file 图示结构: file


寄存器用途

  • x0: the constant value 0

  • x1: return address

  • x2: stack pointer

  • x3: global pointer

  • x4: thread pointer

  • x5 - x7, x28 - x31: temporaries

  • x8: frame pointer

  • x9,x18 - x27: saved registers

  • x10 - x11: function arguments/results

  • x12 - x17: function arguments

递归例子

file file

内存模型

file

大立即数编址与寻址

RISC-V指令系统包括指令 load upper immediate(取立即数高位,lui),用于将20位常数加载到寄存器的第31位到第 12位。将第31位的值复制填充到最左边 32位,最右边的 12 位用0填充。例如,这条指令允许使用两条指令创建 32位常量。lui 使用新的指令格U型,因为其他格式不能支持如此大的常量。

分支寻址

file SB格式(可表示-4096 - 4096的分支地址)

寻址模式的总结

file 在PC寻址的时候:Targetaddress = PC + immediate * 2

翻译并启动程序

过程:

C程序-->预处理(#开头的全部处理掉)-->编译(变为汇编语言) -->汇编(变为机器语言)-->链接(目标文件链接为整体)

图示: file 动态链接器:

动态链接器是操作系统的一部分,用于在执行可执行文件时(在“运行时”),将可执行文件所需的共享库从持久存储复制到 RAM 中,并填充跳转表和重定位指针。具体的操作系统和可执行文件格式决定了动态链接器的功能和实现方式。动态链接器通常被称为在编译可执行文件时执行的过程,而动态链接器是操作系统的一个特殊部分,它将外部共享库加载到正在运行的进程中,然后动态地将这些共享库绑定到正在运行的进程中。这种方法也称为动态链接或后期链接。1

但是java不是编译成目标计算机的汇编语言,而是首先编译成易于解释的指令(Java字节码) file

感谢您阅读本文,希望对您有帮助。

本文作者:Cr不是铬 QQ:2195821921,欢迎交流讨论。

转载请注明出处:Chapter2 指令:计算机的语言

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124269.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S用户管理体系介绍

1 K8S账户体系介绍 在k8s中,有两类用户,service account和user,我们可以通过创建role或clusterrole,再将账户和role或clusterrole进行绑定来给账号赋予权限,实现权限控制,两类账户的作用如下。 server ac…

webpack的简单使用

什么是webpack(去官网看详细的API) 本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项…

谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段

本心、输入输出、结果 文章目录 谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段前言谷歌 DeepMind 发布 AGI 分级框架发展 AGI 必须遵循6个基本原则什么是AGI图灵测试详解六大原则AGI 的五大发展过程阶段原文参考弘扬爱国精神谷歌提出 AGI 完整路线图:目前 Cha…

SpringBoot整合定时任务遇到的多实例问题

唠嗑部分 是这样,前几日完善了定时任务的日志记录,今日切换了服务器,多部署了一个节点,使用nginx负载均衡,但是查看日志却发现了如下情况 那糟糕了,传说中的多实例问题出现了,今天我们就来聊聊…

浙大计算机学院2024届推免直博生名单

名单: 分析: 浙大计算机学院共录取推免直博生158人,其中计算机科学与技术专业73人,人工智能专业7人,软件工程专业21人,网络空间安全专业19人,电子信息专业31人,设计专业7人 欢迎关…

图文解析 Nacos 配置中心的实现

目录 一、什么是 Nacos 二、配置中心的架构 三、Nacos 使用示例 (一)官方代码示例 (二)Properties 解读 (三)配置项的层级设计 (四)获取配置 (五)注册…

Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]

一、什么是快速排序算法 快速排序的基本思想是选择一个基准元素(通常选择最后一个元素)将数组分割为两部分,一部分小于基准元素,一部分大于基准元素。 然后递归地对两部分进行排序,直到整个数组有序。这个过程通过 par…

如何从存档服务器上完全删除PDM用户

当创建新用户时使用“PDM 登录”类型(如下图),PDM用户名和密码会存储于存档服务器的注册表中。 存档服务器的注册表位置如下: HKEY_LOCAL_MACHINE\SOFTWARE\SolidWorks\Applications\PDMWorks Enterprise\ArchiveServer\ConisioU…

响应式艺术作品展示前端html网站模板源码

响应式艺术作品展示网站模板是一款适合各种艺术作品在线展示的响应式网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。 转载自 https://www.qnziyw.cn/wysc/qdmb/23778.html

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发003:架构搭建-需求分析及TCP通信方式的实现

文章目录 1 项目总体架构2 项目需求2.1 服务器职责2.2 消息的格式和定义 3 基于Tcp连接的通信方式3.1 通道层实现GameChannel类3.1.1 TcpChannel类3.1.2 Tcp工厂类3.1.3 创建主函数,添加Tcp的监听套接字3.1.4 代码测试 3.2 协议层与消息类3.2.1 消息的定义3.2.2 消息…

详解JS的四种异步解决方案:回调函数、Promise、Generator、async/await

同步&异步的概念 在讲这四种异步方案之前,我们先来明确一下同步和异步的概念: 所谓同步(synchronization),简单来说,就是顺序执行,指的是同一时间只能做一件事情,只有目前正在执行的事情做完之后&am…

Redis实战 | 使用Redis 的有序集合(Sorted Set)实现排行榜功能,和Spring Boot集成

专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https:/…

Android 扩大View可点击区域范围

有时候会遇到这种需求:本身控件显示在很小的范围内,但是要求扩大可点击的区域。根据官方文档https://developer.android.com/develop/ui/views/touch-and-input/gestures/viewgroup?hlzh-cn#delegate可以得知通过 TouchDelegate 类,让父视图…

rabbitMq创建交换机,以及路由键绑定队列教程

创建交换机: 创建队列: 创建路由,绑定到交换机:

手把手教你:LLama2原始权重转HF模型

LLama2是meta最新开源的语言大模型,训练数据集2万亿token,上下文长度由llama的2048扩展到4096,可以理解和生成更长的文本,包括7B、13B和70B三个模型,在各种基准集的测试上表现突出,该模型可用于研究和商业用…

AI 绘画 | Stable Diffusion 涂鸦功能与局部重绘

在 StableDiffusion图生图的面板里,除了图生图(img2img)选卡外,还有局部重绘(Inpaint),涂鸦(Sketch),涂鸦重绘(Inpaint Sketch),上传重绘蒙版(Inpaint Uplaod)、批量处理&#xff08…

学习伦敦银交易经验的好方法:亏损

要掌握伦敦银交易的技巧,除了看书学习以外,实践的经验也是很重要的,而这些实践的经验中,从亏损中学习会让经验会更加立体和深刻。下面我们就来讨论一下亏损这个学习伦敦银交易技巧的方法。 首先我们需要了解,不论是伦敦…

Android codec2 视频框架 之应用

文章目录 应用流程外部主动获取输入和输出buffer外部设置回调 内部流程 应用流程 外部主动获取输入和输出buffer 解码的调用流程,以android原生的一个bin来说明 android 原生代码位置: frameworks/av/cmds/stagefright/codec.cpp frameworks/av/cmds/st…

变压器试验VR虚拟仿真操作培训提升受训者技能水平

VR电气设备安装模拟仿真实训系统是一种利用虚拟现实技术来模拟电气设备安装过程的培训系统。它能够为学员提供一个真实、安全、高效的学习环境,帮助他们更好地掌握电气设备的安装技能。 华锐视点采用VR虚拟现实技术、MR混合现实技术、虚拟仿真技术、三维建模技术、人…

网络安全之CSRF漏洞原理和实战,以及CSRF漏洞防护方法

一、引言 总体来说CSRF属于一种欺骗行为,是一种针对网站的恶意利用,尽管听起来像跨站脚本(XSS),但是与XSS非常不同,并且攻击方式几乎向佐。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任…