当前位置: 首页 > news >正文

计算机系统基础笔记(12)——控制

前言

在持续输出ing

一、条件码

1.处理器状态(x86-64,部分的)

  • 当前程序的执行信息
    ◼ 临时数据
    ◼ 运行时栈的位置(栈顶)
    ◼ 当前代码控制点的位置(即将要执行的指令地址)
    ◼ 最近一次指令执行的状态
    在这里插入图片描述

2.条件码(隐式设置)

  • 简单的位寄存器
    条件码(隐式设置)
    CF 进位标志(无符号数)
    SF 符号标志(有符号数)
    ZF 零标志
    OF 溢出标志(有符号数)
  • 通过算术运算可以隐式设置条件码(可以把它看做是运算的副作用)
    ◼ 例如: addq Src,Dest ↔ t = a+b
    ◼ CF 被置位,如果运算时出现了超出最高位的进位(无符号数运算溢出)
    ◼ ZF 被置位,如果 t ==0
    ◼ SF 被置位,如果 t<0 (看做是有符号数)
    ◼ OF 被置位,如果有符号数运算出现了溢出
    (a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)

3.条件码(显式设置:比较指令)

  • 通过比较指令可以显式设置条件码
    Explicit Setting by Compare Instruction
  • cmpq Src2, Src1
  • cmpq b,a 这条指令和a-b的作用类似,但不需要将结果写入目标寄存器
    ◼ CF 被置位,如果运算时出现了超出最高位的借位(用于无符号数比较)
    ◼ ZF 被置位,如果 a == b
    ◼ SF 被置位,如果 (a-b) < 0 (看做是有符号数)
    ◼ OF 被置位,如果有符号数运算出现了溢出
    (a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)

3.条件码(显式设置:测试指令)

  • 通过测试指令也可以显式设置条件码
  • testq Src2, Src1
    ◼ testq b,a 这条指令和a&b的作用类似,但不需要将结果写入目标寄存器
    ◼ 根据 Src1&Src2 的结果设置条件码
    ◼ 用于对一个操作数的某几个位进行掩码检测
    ◼ ZF 被置位,当 a&b == 0
    ◼ SF 被置位,如果 (a&b) < 0

4.读取条件码

  • SetX指令
    ◼ 根据条件码表达式将目标寄存器的最后一个字节修改为0或1
    ◼ 不会影响目标寄存器最高7个字节的值在这里插入图片描述

5.x86-64 各寄存器中最后一个字节的名称

在这里插入图片描述

6.读取条件码

  • 在x86-64指令集中,32位操作指令 会将目标寄存器的高32位清0
    在这里插入图片描述

二、条件分支

1.跳转

  • jX指令
    ◼根据条件码跳转到代码的其他位置执行
    在这里插入图片描述
    在这里插入图片描述
    这是机器指令与汇编代码的对应
    在这里插入图片描述
  • 生成汇编代码

gcc –Og -S –fno-if-conversion control.c

2.使用goto语句等价表示

  • 语言允许使用goto语句
    ◼ 跳转至标签所在位置的语句继续执行
    在这里插入图片描述
    在这里插入图片描述

3.条件表达式的翻译(使用分支)

  • 为Then和Else表达式创建独立的代码块
  • 根据条件选择合适的一个代码块并执行
    -
    在这里插入图片描述

在这里插入图片描述

4. 使用条件数据移动指令

  • 条件数据移动指令
    ◼ 指令的功能:if (Test) Dest Src
    ◼ 1995年后的x86处理器开始支持
    • GCC在编译时会尝试使用这个指令翻译条件分支
      ◼ 仅当保证逻辑安全的时候使用
  • 为什么使用条件数据移动指令?
    ◼ 分支会破坏流水线的指令流,影像处理器性能
    ◼ 条件数据移动指令不需要改变控制流
    在这里插入图片描述

在这里插入图片描述

5.流水线

  • 最多可以有三条指令同时执行
    在这里插入图片描述

在这里插入图片描述


下面是例子
这是C代码
在这里插入图片描述
这是寄存器存储的值
在这里插入图片描述
在这里插入图片描述

6.不能使用条件数据移动指令的情况

  • 大量的计算
    ◼ 条件数据移动指令会将所有的结果提前计算出来
    ◼ 只有计算都非常简单的时候,使用条件数据移动指令才会有意义
    在这里插入图片描述

  • 存在风险的计算
    ◼ 可能导致程序出错
    在这里插入图片描述

  • 有副作用的计算
    在这里插入图片描述

三、循环

1.Do-While循环

  • 计算x编码中“1” 的个数
  • 使用条件分支决定继续或退出循环
    C代码
    在这里插入图片描述
    goto版本
    在这里插入图片描述
    翻译后
    汇编为
    在这里插入图片描述

寄存器里的值为
在这里插入图片描述

Do-While循环通用的翻译方式

  • C代码
    在这里插入图片描述

  • Goto

  • 先执行 如果满足条件继续循环
    在这里插入图片描述

2.while循环

While循环通用的翻译方式(1)

  • “跳转到中间”翻译方法
  • 使用 –Og 编译优化选
    C代码
    在这里插入图片描述
    可以看到下面汇编代码里面执行到最后
    如果满足条件那么就跳转到中间
    与 do-while 循环相比,循环开始
    前先跳转至循环条件检测的位置
    (注意第一行 gototest!!!)

在这里插入图片描述

While循环通用的翻译方式(2)

dowhile法
在这里插入图片描述
先翻译成dowhile
在这里插入图片描述

再依据dowhile的版本翻译Goto版本
在这里插入图片描述

3.for循环

for循环的通用翻译方式

“For” Loop → While Loop → Goto
在这里插入图片描述
while
在这里插入图片描述
dowhile
在这里插入图片描述
goto
在这里插入图片描述

四、switch语句

会考的
以下面的switch语句为例在这里插入图片描述
我们可以看到

  • 多个case (5 & 6)共用同一语句块
  • Case2贯穿
  • Case4缺失(case值不连续)

1.跳转表

  • 用作switch语句翻译的一个表
  • switch语句的通用翻译如下
    在这里插入图片描述
    注意这个goto 语句 后面接的是跳转表
    在这里插入图片描述

1.跳转表的结构

  • 基地址是 .L4
  • 每个跳转目标需要8个字节(指向目标语句块的地址)
    在这里插入图片描述

在这里插入图片描述

  • 这是跳转表里跳转目标对应的语句块
    在这里插入图片描述

2.直接跳转

  • jmp .L8
    直接跳转至.L8标签所指向地址的指令

3.间接跳转

  • jmp *.L4(,%rdi,8)
    • 跳转表起始地址.L4(跟那个存储器寻址可以类比一下)
    • 缩放因子必须是8的整倍数(每个地址是8个字节)
    • 从地址 .L4 + x*8 处获得跳转目标的位置
      • 仅限于 0 ≤ x ≤ 6的情况

4.分析跳转表(例子分析)

给一段switch语句
在这里插入图片描述
汇编代码为

在这里插入图片描述
跳转表如下
在这里插入图片描述

  • 跳转表与switch语句对应关系如图在这里插入图片描述
(1)正常情况 x==1

在这里插入图片描述
对应的汇编代码以及寄存器的值对应如下图
在这里插入图片描述
在这里插入图片描述

(2)代码块贯穿 x= =2 x= =3(无break)

对应C代码应该为在这里插入图片描述
汇编代码为(可以看到执行完case2就执行case3里面的代码 w+=z)在这里插入图片描述

在这里插入图片描述

(3)缺省 x= =5 x= =6(共用一个代码块)

在这里插入图片描述

汇编代码也是共用一块
在这里插入图片描述
在这里插入图片描述

(4)没有从0开始的情况

在这里插入图片描述
汇编代码还是会处理成从0开始
在这里插入图片描述

(5)稀疏的switch语句

在这里插入图片描述

  • 将翻译为二分查找的语句 O(log n)
  • 而不是退化为 if-elseif-elseif-else O(n)
    在这里插入图片描述

相关文章:

计算机系统基础笔记(12)——控制

前言 在持续输出ing 一、条件码 1.处理器状态&#xff08;x86-64&#xff0c;部分的&#xff09; 当前程序的执行信息 ◼ 临时数据 ◼ 运行时栈的位置&#xff08;栈顶&#xff09; ◼ 当前代码控制点的位置&#xff08;即将要执行的指令地址&#xff09; ◼ 最近一次指令执…...

使用RedissonClient的管道模式批量查询key

1.场景 遇到了一个场景&#xff0c;在客户给我们推送的数据中&#xff0c;咋1分钟左右&#xff0c;会有相同车辆vehicle 和时间 gpstime一样的数据&#xff0c;这类数据呢&#xff0c;我们认为是重复数据&#xff0c;需要过滤的 把相同 vehicle 和 gpstime 作为key存入到redis中…...

UR机器人通信汇总

文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口&#xff08;502端口&#xff09;3.2 Dashboard端口&#xff08;29999端口&#xff09;3.3 上位机编程端口&#xff08;30001/30002/30003端口&#xff09;3.3.1 URS…...

AI学习指南机器学习篇-使用ID3算法构建决策树

AI学习指南机器学习篇-使用ID3算法构建决策树 介绍ID3算法 ID3&#xff08;Iterative Dichotomiser 3&#xff09;是一种用于构建决策树的经典机器学习算法。它是由Ross Quinlan于1986年提出的&#xff0c;是一种基于信息论的算法&#xff0c;用于从一组特征中选择最佳特征来…...

React实战(一)初始化项目、配置router、redux、axios

(一)初始化项目 1.安装项目 npx create-react-app 项目名 编译报错&#xff1a; 解决办法&#xff1a;安装最新的babel-preset-react-app npm install babel-preset-react-applatest 2.配置项目 (1)配置文件目录 (2)使用craco配置webpack.config npm install craco/crac…...

高质量 HarmonyOS 权限管控流程

高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中&#xff0c;往往会涉及到敏感数据和硬件资源的调动和访问&#xff0c;而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解&#xff0c;才可以在应用开发中提高效率和避免踩坑。 权限管控了…...

java里面封装https请求工具类2

其他写法 https://blog.csdn.net/weixin_44372802/article/details/132620809?spm1001.2014.3001.5501 encodeJson 是请求参数的密文格式&#xff08;大公司都是要对请求参数加密的&#xff09; ResponseBean 是自己或者对方定义的返回内容参数 public ResponseBean sendByEnc…...

前端面试题日常练-day59 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. 在PHP中&#xff0c;以下哪个符号用于比较两个值的相等性&#xff1f; a) b) c) d) ! 2. PHP中的预定义变量$_POST用于获取什么类型的数据&#xff1f; a) 用户的输入数据 b) 浏览器发送的请…...

计算机小问题(4)--关闭联想电脑的小组件

打开联想软件管家&#xff0c;关闭即可 &#xff08;今天弄了好久才找到&#xff0c;记录一下&#xff09;...

mac无法读取windows分区怎么办 苹果硬盘怎么读取

对于Mac电脑用户但有Windows系统使用需求的&#xff0c;我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决&#xff0c;不过因为两个系统的磁盘格式不同&#xff0c;相应的也会产生一些问题&#xff0c;例如无法正常读取windows分区。下面本文就详细说明mac无法…...

【设计模式】JAVA Design Patterns——State(状态模式)

&#x1f50d;目的 允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。 &#x1f50d;解释 真实世界例子 当在长毛象的自然栖息地观察长毛象时&#xff0c;似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的…...

Docker搭建可道云

Docker搭建可道云&#xff08;存储&#xff09; 文章目录 Docker搭建可道云&#xff08;存储&#xff09;介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、搭建可道云私有云盘3.1、编写Dockerfile3.2、上传资源到指定目录3.3、查看目录下所有资源 四、构建镜像五、…...

【RISC-V】站在巨人的肩膀上——看开源芯片、软件生态、与先进计算/人工智能/安全的结合

目录 会议议程前言开源处理器芯片的机遇与挑战&#xff0c;孙凝晖&#xff0c;中国工程院院士RISC-V原生基础软件栈&#xff0c;武延军&#xff0c;中国科学院软件研究所RISC-V推动新型架构创新&#xff0c;孟建熠&#xff0c;浙江大学 专题一&#xff1a;开源芯片开源高性能 R…...

test 判断字符串不为空

#!/bin/bash read -p "请输入参数:" name test -z $name if [ $? -eq 1 ]; then echo "入参&#xff1a;$name" else echo "入参为null" fi...

Python数据分析I

目录 注&#xff1a;简单起见&#xff0c;下文中"df"均写为"表名"&#xff0c;"函数"均写为"HS"&#xff0c;"属性"均写为"SX"&#xff0c;"范围"均写为"FW"。 1.数据分析常用开源库 注释…...

Qt5/6使用SqlServer用户连接操作SqlServer数据库

网上下载SQLServer2022express版数据库,这里没啥可说的,随你喜欢,也可以下载Develop版本。安装完后,我们可以直接连接尝试, 不过一般来说,还是下载SQLServer管理工具来连接数据更加方便。 所以直接下载ssms, 我在用的时候,一开始只能用Windows身份登录。 所以首先,我…...

[经验] 场效应管是如何发挥作用的 #知识分享#学习方法#职场发展

场效应管是如何发挥作用的 在现代电子技术领域&#xff0c;场效应管&#xff08;MOSFET&#xff09;是一种重要的半导体元器件。它的作用非常广泛&#xff0c;例如在集成电路中扮演着关键的角色。在本文中&#xff0c;我们将详细探讨场效应管的作用及其在实际应用中的意义。 简…...

数据挖掘--分类

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性&#xff1a;基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析&#xff1a;基本概念和方法 基本概念 决策树归纳 决策树:决策树是一…...

数据结构篇其六-串

数据结构—串 前置说明 由于学习Java面向对象语言走火入魔&#xff0c;试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法 故此篇&#xff0c;亦可称: 面向对象的C语言程序设计 用C语言实现串这种数据结构&#xff0c;并将它应用到…...

队列和栈的实现

本节讲解的队列与栈&#xff0c;如果你对之前的线性和链式结构顺利掌握了&#xff0c;那么下边的队列和栈就小菜一碟了。因为我们会用前两节讲到的东西来实现队列和栈。 之所以放到一起讲是因为这两个东西很类似&#xff0c;队列是先进先出结构(FIFO, first in first out)&…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...