计算机系统基础笔记(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在编译时会尝试使用这个指令翻译条件分支
◼ 仅当保证逻辑安全的时候使用
- 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.处理器状态(x86-64,部分的) 当前程序的执行信息 ◼ 临时数据 ◼ 运行时栈的位置(栈顶) ◼ 当前代码控制点的位置(即将要执行的指令地址) ◼ 最近一次指令执…...
使用RedissonClient的管道模式批量查询key
1.场景 遇到了一个场景,在客户给我们推送的数据中,咋1分钟左右,会有相同车辆vehicle 和时间 gpstime一样的数据,这类数据呢,我们认为是重复数据,需要过滤的 把相同 vehicle 和 gpstime 作为key存入到redis中…...

UR机器人通信汇总
文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口(502端口)3.2 Dashboard端口(29999端口)3.3 上位机编程端口(30001/30002/30003端口)3.3.1 URS…...
AI学习指南机器学习篇-使用ID3算法构建决策树
AI学习指南机器学习篇-使用ID3算法构建决策树 介绍ID3算法 ID3(Iterative Dichotomiser 3)是一种用于构建决策树的经典机器学习算法。它是由Ross Quinlan于1986年提出的,是一种基于信息论的算法,用于从一组特征中选择最佳特征来…...

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

高质量 HarmonyOS 权限管控流程
高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中,往往会涉及到敏感数据和硬件资源的调动和访问,而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解,才可以在应用开发中提高效率和避免踩坑。 权限管控了…...
java里面封装https请求工具类2
其他写法 https://blog.csdn.net/weixin_44372802/article/details/132620809?spm1001.2014.3001.5501 encodeJson 是请求参数的密文格式(大公司都是要对请求参数加密的) ResponseBean 是自己或者对方定义的返回内容参数 public ResponseBean sendByEnc…...
前端面试题日常练-day59 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. 在PHP中,以下哪个符号用于比较两个值的相等性? a) b) c) d) ! 2. PHP中的预定义变量$_POST用于获取什么类型的数据? a) 用户的输入数据 b) 浏览器发送的请…...

计算机小问题(4)--关闭联想电脑的小组件
打开联想软件管家,关闭即可 (今天弄了好久才找到,记录一下)...

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

【设计模式】JAVA Design Patterns——State(状态模式)
🔍目的 允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。 🔍解释 真实世界例子 当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的…...

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

【RISC-V】站在巨人的肩膀上——看开源芯片、软件生态、与先进计算/人工智能/安全的结合
目录 会议议程前言开源处理器芯片的机遇与挑战,孙凝晖,中国工程院院士RISC-V原生基础软件栈,武延军,中国科学院软件研究所RISC-V推动新型架构创新,孟建熠,浙江大学 专题一:开源芯片开源高性能 R…...

test 判断字符串不为空
#!/bin/bash read -p "请输入参数:" name test -z $name if [ $? -eq 1 ]; then echo "入参:$name" else echo "入参为null" fi...

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

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

[经验] 场效应管是如何发挥作用的 #知识分享#学习方法#职场发展
场效应管是如何发挥作用的 在现代电子技术领域,场效应管(MOSFET)是一种重要的半导体元器件。它的作用非常广泛,例如在集成电路中扮演着关键的角色。在本文中,我们将详细探讨场效应管的作用及其在实际应用中的意义。 简…...

数据挖掘--分类
数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析:基本概念和方法 基本概念 决策树归纳 决策树:决策树是一…...
数据结构篇其六-串
数据结构—串 前置说明 由于学习Java面向对象语言走火入魔,试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法 故此篇,亦可称: 面向对象的C语言程序设计 用C语言实现串这种数据结构,并将它应用到…...

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

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...