计算机组成原理之指令

news2024/11/23 2:13:41

引言

关于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 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python高级语法----深入asyncio:构建异步应用

文章目录 异步I/O操作示例:异步网络请求异步任务管理示例:并发执行多个任务使用异步队列示例:生产者-消费者模式在现代软件开发中,异步编程已经成为提高应用性能和响应性的关键技术之一。Python的asyncio库为编写单线程并发代码提供了强大的支持。本文将深入探讨asyncio的三…

Hadoop原理,HDFS架构,MapReduce原理

Hadoop原理,HDFS架构,MapReduce原理 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql&#xff0c…

C++ vector 动态数组的指定元素删除

文本旨在对 C 的容器 vector 进行肤浅的分析。 文章目录 Ⅰ、vector 的指定元素删除代码结果与分析 Ⅱ、vector 在新增元素后再删除指定元素代码结果与分析 Ⅲ、vector 在特定条件下新增元素代码结果与分析 参考文献 Ⅰ、vector 的指定元素删除 代码 #include <iostream&g…

另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国

前不久&#xff0c;灰度在与 SEC 就关于 ETF 受理的诉讼案件中&#xff0c;以灰度胜诉告终。灰度的胜利&#xff0c;也被加密行业看做是加密 ETF 在北美地区阶段性的胜利&#xff0c; 该事件也带动了加密市场的新一轮复苏。 此前&#xff0c;Nason Smart Money 曾对加密市场在 …

深度学习 opencv python 公式识别(图像识别 机器视觉) 计算机竞赛

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

Spring Cloud LoadBalancer基础知识

LoadBalancer 概念常见的负载均衡策略使用随机选择的负载均衡策略创建随机选择负载均衡器配置 Nacos 权重负载均衡器创建 Nacos 负载均衡器配置 自定义负载均衡器(根据IP哈希策略选择)创建自定义负载均衡器封装自定义负载均衡器配置 缓存 概念 LoadBalancer(负载均衡器)是一种…

【Linux】文件重定向以及一切皆文件

文章目录 前言一、重定向二、系统调用dup2三、重定向的使用四、一切皆文件 前言 Linux进程默认情况下会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2&#xff0c; 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff…

2007-2022年上市公司工业机器人渗透度数据

2007-2022年上市公司工业机器人渗透度数据 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;股票代码、年份、工业机器人渗透度 3、计算方式&#xff1a;首先&#xff0c;计算行业层面的工业机器人渗透度指标&#xff1b;其次&#xff0c;构建企业层面的工业机器人渗透度…

渗透必备:Proxifier玩转代理

目录 0# 概述 1# Proxifier介绍 2# 操作过程 2.1 配置代理服务器 2.2 配置代理规则 3# Proxifier玩转代理 3.0 配置说明 3.1 通过Proxifier进行内网渗透 3.2 通过Proxifier将VM虚拟机代理 3.3 通过Proxifier进行小程序抓包 3.4 补充 4# 总结 0# 概述 在日常的渗透过…

PowerBI 一些基础功能(2)

1、表时间创建&#xff1a; 日期表2 ADDCOLUMNS( CALENDAR(date(2019,1,1),date(2019,12,31)), "年", YEAR ( [Date] ), "季度", ROUNDUP(MONTH([Date])/3,0), "月", MONTH([Date]), "周", weeknum([Date]), "年季度"…

软件测试|Monkey基本参数介绍

说到android移动端稳定性测试&#xff0c;大家通常会想到android系统自动Monkey小猴子&#xff0c;通过Monkey命令模拟用户触摸点击屏幕、滑动、系统按键等操作来对设备上的app进行压力测试&#xff0c;来测试应用的稳定性和健壮性。 下面就说说monkey常用参数的用法~~ 1、-h…

Python3简易接口自动化测试框架设计与实现

1、开发环境 操作系统&#xff1a;Ubuntu18开发工具&#xff1a;IDEAPyCharm插件Python版本&#xff1a;3.6 2、用到的模块 requests&#xff1a;用于发送请求xlrd&#xff1a;操作Excel&#xff0c;组织测试用例smtplib&#xff0c;email&#xff1a;发送测试报告logging&a…

基于 Python 的课程助教智能聊天机器人

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 课程助教是高校中一种常见的教学模式,其在学生理论知识的掌握与实践能力的提高方面起到关键性的作用,已经成为高校日常教育环节中不可或缺的一环。然而,传统的人力助教有若干关键问题亟待…

字节流操作

for i in range(100):ai.to_bytes(2,byteorderbig)print(i,a,end )if i%40:print() 字节流 a5678 先把5678转换为二进制就变成 0001_0110_0010_1110拆分两个字节&#xff0c;高字节在前&#xff0c;低字节在后 hig_byte 0001_0110 对应的16进制 0x16 little_byte 0010_11…

strtok函数详解:字符串【分割】的利器

目录 一&#xff0c;strtok函数简介 二&#xff0c;strtok函数的用法 三&#xff0c;strtok函数的注意事项 一&#xff0c;strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割&#xff0c;从而得到我们想要的子字符串。 &#x1f342;函数头文件&am…

H5网页漫画小说苹果cms模板源码/支持对接公众号/支持三级分销

H5网页漫画小说苹果cms模板源码&#xff0c;支持对接公众号、支持三级分销&#xff0c;评论、收藏、历史记录、三级分销。 独有的模板搜索功能&#xff0c;微信、qq防红&#xff0c;站外采集接口、记录阅读章节&#xff0c;SEO优化&#xff08;后台配置&#xff09;&#xff0…

【Kurbernetes资源管理】声明式资源管理+配置清单文件详解(附实例)

声明式 一、声明式资源管理方式1.1 简介1.2 基本语法1.3 子命令详解1.3.1 获取资源配置清单1.3.2 创建/更新资源补充&#xff1a;creat和apply的区别 1.3.3 删除资源----- delete1.3.4 编辑资源配置 -----edit1.3.5 获取资源的解释-----explain 二、资源清单格式详解2.1 yaml语…

17.复制字符串 ,包括\0

#include<stdio.h> #include <cstring>int main(){int len1,len2;char s1[44];char s2[33];scanf("%s",s1);scanf("%s",s2);len1strlen(s1)1;printf("先s1的字符长度为&#xff1a;%d\n",len1) ;strcpy(s1,s2) ;printf("复制字…

【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)

简介 :::warning 【 毕设项目源码推荐 javaweb 项目】 基于 springbootvue 的图书个性化推荐系统的设计与实现适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负…

el-form添加自定义校验规则校验el-input只能输入数字

0 效果 1 代码 {1,5}是用来限制小数点后几位的 addFormRules: {investAmount: [{ validator: checkInvestAmount, trigger: blur }], }, const checkInvestAmount (rule, value, callback) > {if (value ! && value ! null && value ! undefined) {if (/…