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

csapp笔记3.6节——控制(1)

本节解决了x86-64如何实现条件语句、循环语句和分支语句的问题

条件码

除了整数寄存器外,cpu还维护着一组单个位的条件码寄存器,用来描述最近的算数和逻辑运算的某些属性。可检测这些寄存器来执行条件分支指令。

CF(Carry Flag):进位标志。最近的算术或逻辑运算使得最高位产生了进位。可检查无符号数操作的溢出。

ZF(Zero Flag):零标志。最近的算术或逻辑运算结果为0。

SF(Sign Flag):符号标志。最近的算术或逻辑运算结果为负数。

OF(Overflow Flag):溢出标志。最近的算术或逻辑运算导致补码溢出——正溢出或负溢出。

这里指出,leaq不会改变任何条件码,因为是被用来进行地址计算的。对于逻辑操作,例如XOR,进位和溢出标志会设置为0。对于移位操作,进位标志将设置为最后一个被移出的位,溢出标志设为0。INC和DEC指令会设置溢出和零标志,但不会改变进位标志。

除了基本的算术和逻辑指令会设置条件码之外,还有两类指令(8,16,32,64位形式)会设置条件码。

CMP指令行为与SUB指令一致,只是不会改变目的寄存器。

TEST指令与AND指令一致,只是不会改变目的寄存器的值。

访问条件码

通常不会直接读取条件码。常用方法有三种:(1)根据条件码的某种组合,将一个字节设置为0或者1。(2)可以条件跳转到程序的某个其他的部分。(3)可以有条件的传输数据。

对于第一种情况,我们用SET这类指令设置某个字节为1或0。SET根据某些条件码的算术或逻辑组合,将寄存器的某个低位字节或某个一个字节的内存位置置为1或0。

下图是SET指令

需要注意SET指令在大小比较时有符号数和无符号数是不同的指令。

举个例子分析下

我们来分析setl(有符号小于)具体是在那几个条件码的何种组合下进行工作的

cmpq获得a - b,这里在运算时可能会有如下几种情况

(1)未溢出,这时OF(溢出标志位)为0,则a - b的结果小于0那么a < b,根据a - b的结果小于0,SF被设为1。

(2)溢出,OF = 1,cmpq的结果由两种情况:小于零,说明a - b > 0,只有这样才会使得a和b进行补码减法后负溢出;大于零,说明a - b < 0,只有这样才会使得a和b进行补码减法后正溢出。(等于零不会溢出)这就可以看出只有cmpq运算结果是正数才能说明a < b。于是SF = 0。

可以看出 OF和SF异或的结果是setl判断的标准,若异或结果为1,说明a < b,%al被设为1;否则为0。

SET指令会区分有符号值和无符号值,这在汇编语言中并不常见,大多数情况,有符号数和无符号数都使用一样的指令,因为许多算术运算对无符号数和补码都有一样的位级行为。部分情况需要使用不同的指令,例如,右移、除法、乘法。


http://www.kler.cn/a/530937.html

相关文章:

  • 【leetcode100】路径总和Ⅲ
  • ESP32-c3实现获取土壤湿度(ADC模拟量)
  • python算法和数据结构刷题[1]:数组、矩阵、字符串
  • 万字长文深入浅出负载均衡器
  • L1-006 连续因子*
  • vim交换文件的作用
  • 整形的存储形式和浮点型在计算机中的存储形式
  • 【Redis】安装配置Redis超详细教程 / Linux版
  • 集合通讯概览
  • 基于JMX实现消息队列监控
  • 动手学深度学习-3.2 线性回归的从0开始
  • 【数据结构-Trie树】力扣648. 单词替换
  • Kafka流式计算架构
  • Linux——进程间通信之SystemV共享内存
  • (回溯递归dfs 电话号码的字母组合 remake)leetcode 17
  • OpenCV4.8 开发实战系列专栏之 30 - OpenCV中的自定义滤波器
  • html中的列表元素
  • 全域旅游景区导览系统小程序独立部署
  • 使用冒泡排序模拟实现qsort函数
  • NeetCode刷题第20天(2025.2.1)
  • STM32 DMA+AD多通道
  • 音标-- 02-- 重音 音节 变音
  • 2024美团秋招硬件开发笔试真题及答案解析
  • Day33【AI思考】-分层递进式结构 对数学数系的 终极系统分类
  • C++:结构体和类
  • 刷题记录 动态规划-5: 62. 不同路径