计算机系统基础笔记(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)
    在这里插入图片描述

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

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

相关文章

【C++关键字】auto的使用(C++11)

auto的使用&#xff08;C11&#xff09; auto关键字auto的使用细则auto使用场景 随着程序的复杂化&#xff0c;程序中用到的类型也越来越复杂化&#xff0c;经常体现在&#xff1a; 1.类型难以拼写 2.含义不明确导致容易出错 在C语言阶段处理这类问题的方法&#xff0c;可以使…

拉格朗日乘子将不等式约束转化为等式约束例子

拉格朗日乘子将不等式约束转化为等式约束例子 在优化问题中,常常需要将不等式约束转化为等式约束。使用拉格朗日乘子法,可以通过引入松弛变量将不等式约束转换为等式约束,然后构造拉格朗日函数进行求解。 拉格朗日乘子法简介 拉格朗日乘子法是求解带约束优化问题的一种方…

【吊打面试官系列-Mysql面试题】BLOB 和 TEXT 有什么区别 ?

大家好&#xff0c;我是锋哥。今天分享关于 【BLOB 和 TEXT 有什么区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; BLOB 和 TEXT 有什么区别 &#xff1f; BLOB 是一个二进制对象&#xff0c;可以容纳可变数量的数据。TEXT 是一个不区分大小写的 BLOB。 1…

【调整堆】(C++ 代码实现 注释详解)

自定义结构体&#xff1a; #define sz 105 typedef struct node{int length;int l[sz]; }SqList; 调整堆的函数&#xff1a; HeapAdjust函数思路说明&#xff1a; //目标&#xff1a;将以s为根的子树调整为大根堆 //具体操作&#xff1a;将路径上比s大的都往上移动,s往下移…

gRPC(狂神说)

gRPC&#xff08;狂神说&#xff09; 视频地址&#xff1a;【狂神说】gRPC最新超详细版教程通俗易懂 | Go语言全栈教程_哔哩哔哩_bilibili 1、gRPC介绍 单体架构 一旦某个服务宕机&#xff0c;会引起整个应用不可用&#xff0c;隔离性差只能整体应用进行伸缩&#xff0c;浪…

【C++ STL】模拟实现 string

标题&#xff1a;【C :: STL】手撕 STL _string 水墨不写bug &#xff08;图片来源于网络&#xff09; C标准模板库&#xff08;STL&#xff09;中的string是一个可变长的字符序列&#xff0c;它提供了一系列操作字符串的方法和功能。 本篇文章&#xff0c;我们将模拟实现STL的…

ipables防火墙

一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层&#xff0c;针对 TCP/IP 数据包实施过滤和限制&#xff0c;属于典 型的包过滤防火墙&#xff08;或称为网络层防火墙&#xff09;。Linux 系统的防火墙体系基于内核编码实现&#xff0c; 具有非常稳定的性能和高效率&…

VB7/64位VB6开发工具office插件开发-twinbasic

全新的VB7&#xff0c;twinbasic&#xff0c;支持64位开发&#xff0c;支持EXCEL插件开发&#xff0c;老外连续3年闭关修练终成正果 官方最新版下载&#xff1a;https://github.com/twinbasic/twinbasic/releases 汉化工具用法&#xff1a;把工具和Lang_Tool目录复制到Twinbasi…

SAP PP学习笔记18 - MTO(Make-to-Order):按订单生产(受注生産) 的策略 20,50,74

前面几章讲了 MTS&#xff08;Make-to-Stock&#xff09;按库存生产的策略&#xff08;10&#xff0c;11&#xff0c;30&#xff0c;40&#xff0c;70&#xff09;。 SAP PP学习笔记14 - MTS&#xff08;Make-to-Stock) 按库存生产&#xff08;策略10&#xff09;&#xff0c;…

ChatTTS 开源文本转语音模型本地部署、API使用和搭建WebUI界面(建议收藏)

ChatTTS&#xff08;Chat Text To Speech&#xff09;是专为对话场景设计的文本生成语音(TTS)模型&#xff0c;特别适用于大型语言模型(LLM)助手的对话任务&#xff0c;以及诸如对话式音频和视频介绍等应用。它支持中文和英文&#xff0c;还可以穿插笑声、说话间的停顿、以及语…

计算机网络ppt和课后题总结(下)

常用端口总结 计算机网络中&#xff0c;端口是TCP/IP协议的一部分&#xff0c;用于标识运行在同一台计算机上的不同服务。端口号是一个16位的数字&#xff0c;范围从0到65535。通常&#xff0c;0到1023的端口被称为“熟知端口”或“系统端口”&#xff0c;它们被保留给一些标准…

基于百度接口的实时流式语音识别系统

目录 基于百度接口的实时流式语音识别系统 1. 简介 2. 需求分析 3. 系统架构 4. 模块设计 4.1 音频输入模块 4.2 WebSocket通信模块 4.3 音频处理模块 4.4 结果处理模块 5. 接口设计 5.1 WebSocket接口 5.2 音频输入接口 6. 流程图 程序说明文档 1. 安装依赖 2.…

RHEL8/Centos8 install for PXE

PXE介绍 PXE&#xff08;Preboot Execution Environment&#xff09;是预引导执行环境的缩写。它是由Intel设计的&#xff0c;允许客户端计算机通过网络从服务器上加载操作系统镜像。PXE通常用于大规模部署操作系统&#xff0c;例如在企业或学校环境中。 PXE工作流程如下&…

【复现】含能量路由器的交直流混合配电网潮流计算

目录 1 主要内容 2 理论及模型 3 程序结果 4 下载链接 1 主要内容 程序复现《含能量路由器的交直流混合配电网潮流计算》&#xff0c;主要是对算例4.1进行建模分析&#xff0c;理论和方法按照文献所述。能量路由器&#xff08;ER&#xff09;作为新兴的电力元器件&#xff…

Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

FuTalk设计周刊-Vol.040

&#x1f525;AI漫谈 热点捕手 1、零代码定制游戏NPC&#xff0c;百川智能发布角色大模型 百川智能此次推出了“角色创建平台搜索增强知识库”的定制化解决方案。通过这一方案&#xff0c;游戏厂商无需编写任何代码&#xff0c;只需通过简单的文字描述&#xff0c;便可以快速…

IT人的拖延——都是“分心”惹的祸?

典型表现 我们说到拖延的原因有很多&#xff0c;还有一个原因是因为“分心太多“造成的&#xff0c;分心太多的拖延大致上有以下表现&#xff1a; 无法集中注意力&#xff1a; 分心太多会导致我们无法集中注意力在当前的工作任务上&#xff0c;我们可能会经常性地走神或者在工…

Vue12-计算属性

一、姓名案例 1-1、插值语法实现 1、v-bind v-bind的问题&#xff1a; 所以&#xff1a;v-bind是单向绑定。 2、v-model 解决v-bind的问题。 3、输出全名 方式一&#xff1a; 方式二&#xff1a; 需求优化&#xff1a;全名中的姓氏&#xff0c;只取输入框中的前三位&#xf…

VSCode数据库插件

Visual Studio Code (VS Code) 是一个非常流行的源代码编辑器&#xff0c;它通过丰富的插件生态系统提供了大量的功能扩展。对于数据库操作&#xff0c;VS Code 提供了几种插件&#xff0c;其中“Database Client”系列插件是比较受欢迎的选择之一&#xff0c;它包括了对多种数…

使用C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…