【汇编】pushf popf

两个指令的作用分别是将16位标志寄存器压入栈、从栈中取出,但是貌似没人做实验验证。
这里做个实验加深理解,顺便总结下几个标志寄存器的作用。


一、结构

8086CPU的flag寄存器的结构如下:

OF:判断运算结果是否溢出
CF:判断运算过程中是否产生进位/借位
ZF:判断结果是否为0
PF:所有二进制位中1的个数是否为偶数
SF:判断结果是否为负数
DF:方向标志(控制si、di的递增,递减)

首先查看flag寄存器的初始情况。
指令:pushf
在这里插入图片描述
此时flag=3202H,将其转为二进制则为:
0011 0010 0000 0010b
对比下图,可以发现目前学的6个标志位默认位为0。
在这里插入图片描述

二、实验

改变指令:

mov ax,1
sub ax,1
pushf

在这里插入图片描述

此时flag寄存器=3246H,二进制表示为:
0011 0010 0100 0110b
第6位=1,也就是ZF=1,代表运算结果为0。
注意到第3位从原来的0变为了1,这一位是PF,PF=1代表二进制中1的个数位偶数。
继续改变指令:

mov al,127
add al,1
pushf

根据所学知识,此时8位寄存器al发生了正溢出,OF应该置为1。我们查看结果。
在这里插入图片描述
flag=3A92H,其二进制表示为:
0011 1010 1001 0010b
OF处于flag中的第12位,此时OF=1。和我们的猜想一致。
注意到,这里的第8位SF置为了1,但是实际结果为正数而非负数。这是因为在溢出的情况下,逻辑上结果的正负不代表真正的结果。假设寄存器为16位寄存器ax,实际上SF应该对0080H进行判断,而非80H。
在这里插入图片描述

继续改变指令:

mov al,-1
add al,-128
pushf

此时运算结果超出了8位寄存器可表示的最大范围,产生了借位,并且负溢出了,所以OF和CF应该都为1。

在这里插入图片描述
flag=3A03H,其二进制表示为
0011 1010 0000 0011b
第1位的CF,第12位的OF都置为了1,与猜想结果一致。
注意到,此时SF置为了0,与实际正负不一致。若进行的是16位的运算,运算结果为FF7FH,即-1256+716+15=-129。
在这里插入图片描述
flag=3283H,OF=0(未溢出),CF=1(产生借位),SF=1(最高位为负数)。

三、总结

1、pushf、popf分别将16位标志寄存器入栈、从栈中取出。
2、当OF=0,未产生溢出时,SF正确表示。
3、当OF=1,产生溢出时,SF表示的正负与实际结果相反。可推导公式:SF=SF’⊕OF。SF’为逻辑上的正负表示,SF为实际的正负表示。

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

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

相关文章

MySQL 删除ibdata1时怎么恢复

标题:MySQL InnoDB数据恢复,丢失ibdata1时怎么安全恢复 废话在前: 恭喜你,当你看到这篇文章的时候,说明有可能 你心里已经有一万匹🐎在奔腾了。千万不要乱删除ibdata1,有些博客无脑抓取、复制…

20240115在ubuntu20.04.6下给GTX1080M显卡安装驱动程序和CUDA

20240115在ubuntu20.04.6下给GTX1080M显卡安装驱动程序和CUDA 2024/1/15 18:05 百度搜索:ubuntu gtx1080m cuda https://blog.csdn.net/wb4916/article/details/129462103 20230311给Ubuntu18.04下的GTX1080M安装驱动 https://www.cnblogs.com/djiankuo/p/5886605.h…

Python爬虫学习笔记(一)---Python入门

一、pycharm的安装及使用二、python的基础使用1、字符串连接2、单双引号转义3、换行4、三引号跨行字符串5、命名规则6、注释7、 优先级not>and>or8、列表(list)9、字典(dictionary)10、元组(tuple)11…

机器人导纳控制实现框架

Safe, Stable and Intuitive Control for Physical Human-Robot Interaction - 知乎关于文章《Safe, Stable and Intuitive Control for Physical Human-Robot Interactio》的简记。 Safe, Stable and Intuitive Control for Physical Human-Robot Interaction目的根据力导数作…

LLVM 环境配置

这里选择下载源码, 然后编译的安装方式。 下载地址 (在这里可以找到多版本, 多平台的LLVM下载资源) # 解压源码 sudo tar xvf llvm-project-17.0.6.src.tar.xz # 新建安装目录 sudo mkdir -p /usr/local/llvm # 新建编译目录 sudo mkdir -p llvm-project-17.0.6.src/build #…

c++学习笔记-STL案例-机房预约系统5-学生模块

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统4-管理员模块”,本文主要设计学生模块,从学生登录和注销、申请预约、显示预约、取消预约四个功能进行分析和实现。 目录 8 学生模块 8.1 学生登录和注销 8.1.1 构造函数 8.1.2 学生子菜单 8.1.3 菜…

gitlab 部署项目新分支

公司代码管理平台新切换到gitlab下,上线发版流程随之变更 1新建分支,开发完成,提交新分支 2.去gitlab平台上找到Merge requests 3 点击右上角的New merge request select source branch 选择新建的分支 点击 compare branches and contin…

Vulnhub靶机:driftingblues 7

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:driftingblues7(10.0.2.23) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entr…

鸿蒙应用开发-仿微信消息对话列表

功能介绍: 仿微信消息对话列表,显示发送文本和接收文本,参考文档创建列表。 知识点: 熟悉对List控件的使用。熟悉对Text控制定义,如修改边框等。手动控制列表的跳转。动态添加列表数据。使用构造函数初始化数据。 …

mysql常见的需求,对于关键字的使用

如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能 如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能,也可以根据实际需求自定义一个函数。这种技术在一些需要对数据进…

【翻译】在Qt Designer中创建主窗口(Main Windows)

原文地址:https://doc.qt.io/qt-6/designer-creating-mainwindows.html Qt Designer 可用于为不同用途创建用户界面,并为每个用户界面提供不同类型的模板。主窗口模板用于创建具有菜单栏、工具栏和停靠窗口部件的应用程序窗口。 通过打开文件菜单并选择…

【新】Unity Meta Quest MR 开发(一):Passthrough 透视配置

文章目录 📕教程说明📕配置透视的串流调试功能📕第一步:设置 OVRManager📕第二步:添加 OVRPassthroughLayer 脚本📕第三步:在场景中添加虚拟物体📕第四步:设置…