寄存器-汇编复习(2)

news2024/11/25 18:34:48

通过阅读本文小节内容,可以清楚的明白汇编承接的能力和机器语言,高级语言之间的表达关系。文中虽然讨论16位cpu,最新的64或以后的128理论都一样的,类推就好了。

继续将  通用寄存器-汇编复习(1)_luozhonghua2000的博客-CSDN博客  完结,内容:汇编指令,物理地址,16 位结构的 CPU,8086CPU 给出物理地址的方法的本质含义

汇编指令

通过汇编指令控制 CPU 进行工作,看一下表 中的几条指令 

 

 注意,为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高级语言描述这两种方式来描述一条汇编指令的含义。在写一条汇编指令或一个寄存器的名称时不区分大小写。如: mov ax,18 和 MOV AX,18 的含义相同: bx 和 BX 的含义相同。


接下来看一下 CPU 执行表中所列的程序段中的每条指令后,对寄存器中的数据进行的改变。

 

 

指令执行后 AX 中的数据为多少? 思考后看分析。分析:
程序段中的最后一条指令 add ax,bx,在执行前 ax 和 bx 中的数据都为 8226H,相加(换算器?)后所得的值为: 1044CH,但是 ax 为 16 位寄存器,只能存放 4 位十六进制的数据(为啥?请参考通用寄存器-汇编复习(1)_luozhonghua2000的博客-CSDN博客   8086CPU 的所有寄存器都是 16 位的),所以最高位的 1 不能在 ax 中保存(为什么呢?为什么是最高位去掉?栈顶?),ax 中的数据为: 044CH

指令执行后 AX 中的数据为多少? 思考后看分析
分析:

程序段中的最后一条指令 add al,93H,在执行前,al 中的数据为 C5H,相加后所得的值为:158H,但是 al 为 8 位寄存器,只能存放两位十六进制的数据,所以最高位的 1丢失,ax 中的数据为:0058H。(这里的丢失,指的是进位值不能在 8 位寄存器中保存,但是 CPU 并不真的丢弃这个进位值 ,后续回答)
注意,此时 al 是作为一个独立的 8 位寄存器来使用的,和 a 没有关系,CPU 在执行这条指令时认为 a 和 al 是两个不相关的寄存器。不要错误地认为,诸如 add al,93H 的指令产生的进位会存储在 a 中,add al,93H 进行的是 8 位运算。

如果执行 add ax,93H,低 8 位的进位会存储在 ah 中,CPU 在执行这条指令时认为只有一个 16 位寄存器 ax,进行的是 16 位运算。指 add ax,93H 执行后,ax 中的值为:0158H。此时,使用的寄存器是 16 位寄存器 ax,add ax,93H 相当于将 ax 中的 16 位数据00c5H 和另一个 16 位数据 0093H 相加,结果是 16 位的 0158H

在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:

 等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致。

练习:

物 理 地 址

 我们知道,CPU 访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址
CPU 通过地址总线送入存储器的,必须是一个内存单元的物理地址。在 CPU 向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的 CPU 可以有不同的形成物理地址的方式。我们现在讨论 8086CPU 是如何在内部形成内存单元的物理地址的。

16 位结构的 CPU

我们说 8086CPU 的上一代 CPU(8080、8085)等是 8 位机,而 8086 是 16 位机,也可以说 8086 是 16 位结构的 CPU。那么什么是 16 位结构的 CPU 呢?
概括地讲,16 位结构(16 位机、字长为 16 位等常见说法,与 16 位结构的含义相同)描述了一个 CPU 具有下面几方面的结构特性。

 8086 是 16 位结构的 CPU,这也就是说,在 8086 内部,能够一次性处理、传输、暂时存储的信息的最大长度是 16 位的。内存单元的地址在送上地址总线之前,必须在 CPU中处理、传输、暂时存放,对于 16 位 CPU,能一次性处理、传输、暂时存储 16 位的地址。

最新64位的cpu类推

8086CPU 给出物理地址的方法

8086CPU 有 20 位地址总线,可以传送 20 位地址,达到 1MB 寻址能力。8086CPU 又是 16 位结构,在内部一次性处理、传输、暂时存储的地址为 16 位。从 8086CPU 的内部结构来看,如果将地址从内部简单地发出,那么它只能送出 16 位的地址,表现出的寻址能力只有 64KB。
8086CPU 采用一种在内部用两个 16 位地址合成的方法来形成一个 20 位的物理地址8086CPU 相关部件的逻辑结构如图 1  所示。

 如图 1 所示,当 8086CPU 要读写内存时:

1)CPU 中的相关部件提供两个 16 位的地址,一个称为段地址,另一个称为偏移地址;
2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件:
3)地址加法器将两个 16 位地址合成为一个 20 位的物理地址:
4)地址加法器通过内部总线将 20 位物理地址送入输入输出控制电路:
5)输入输出控制电路将 20 位物理地址送上地址总线;
6)20 位物理地址被地址总线传送到存储器。 

地址加法器采用物理地址=段地址x16+偏移地址的方法用段地址和偏移地址合成物理地址。例如,8086CPU 要访问地址为 123C8H 的内存单元,此时,地址加法器的工作过程如图 2所示(图中数据皆为十六进制表示)。

 

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

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

相关文章

很多人打商标的主意,悄悄埋伏

很多人在打商标的主意,等着抢劫呢 等你的品牌结了果实,然后出手勒索 趣讲大白话:鬼子进村,打枪的不要 【趣讲信息科技183期】 **************************** 有些公司申请几千件商标 有公司一个月申请100件 春江水暖贼先知 有一条…

WSL2网络配置

WSL2越来越好用了,但是在windows下使用clash时,配置WSL2的网络很麻烦,通常使用设置环境变量export ALL_PROXY"http://127.0.0.1:8000"的方式有很大的弊端,例如pip和conda就不会走代理。 经过我亲身体验,最好…

基于小脑模型神经网络的轨迹跟踪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

模拟退火算法(附简单案例及详细matlab源码)

作者:非妃是公主 专栏:《智能优化算法》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录 专栏推荐序一、概论二、物理退火1. 加温…

MyBatis - CRUD 操作

文章目录 1.环境配置1.1 导入相关依赖1.2 基本配置1.3 数据模型 2.基于 XML 开发2.1 创建 Mapper 接口2.2 创建 XML 映射文件2.3 insert2.4 select2.5 delete2.6 update2.7 编写单元测试 3.基于注解开发3.1 常用注解3.2 创建 Mapper 接口 MyBatis 支持通过 XML 和注解两种方式来…

chatgpt赋能python:Python运行程序没反应怎么办?

Python运行程序没反应怎么办? Python作为一种高级编程语言,已经成为了很多开发者的首选语言。然而,在使用Python编写程序时,有时候会出现运行程序却没有任何反应的情况。这是什么原因导致的呢?本文将为大家介绍Python…

单例模式的饿/懒汉模式

目录 1. 什么是单例模式2. 饿汉模式2.1 饿汉模式概念2.2 饿汉模式代码 3. 懒汉模式3.1 懒汉模式概念3.2 单线程情况下的懒汉模式3.3 单例模式的写法(保证线程安全) 4. wait 和 sleep 的区别 1. 什么是单例模式 保证某个类在程序中只存在一份实例,而不会创建多个实例…

Apache Kafka - 跨集群数据镜像 MirrorMaker

文章目录 概述跨集群数据镜像的原理MirrorMaker配置小结 概述 在分布式系统中,数据镜像是一项重要的功能,它可以将数据从一个集群复制到另一个集群,以保证数据的高可用性和容错性。Apache Kafka是一个流处理平台,它提供了一种跨集…

程序设计综合实习(C语言):学生成绩单制作

一、目的 1.掌握结构体变量及数组的定义、赋值、初始化、输入、输出 2.结构体数组的操作。 二、实习环境 Visual Stdio 2022 三、实习内容、步骤与要求 1.定义一个结构体数组,存放10个学生的学号,姓名,三…

Linux 设备树文件手动编译的 shell 脚本

前言 前面通过 Makefile 实现手动编译 Linux 设备树 dts 源文件及其 设备树依赖 dtsi、.h 头文件,如何写成一个 shell 脚本,直接编译呢? 其实就是 把 Makefile 重新编写为 shell 脚本即可 编译设备树 shell 脚本 脚本内容如下&#xff1a…

【六一 iKun】Happy LiuYi, iKuns

六一了,放松下。 Python iKun from turtle import * screensize(1000,1000) speed(6)#把衣服画出来,从右肩膀开始#领子 penup() goto(-141,-179) pensize(3) fillcolor("black") pencolor("black") begin_fill() pendown() left(1)…

【Python实战】Python采集高校信息

前言 大家好,我们今天来爬取某站的高校名单,把其高校名单,成员和内容数获取下来,不过,我们发现这个网站比我们平时多了一个验证,下面看看我是怎么解决的。 环境使用 python 3.9pycharm模块使用 requests模块介绍 requests requests是一个很实用的Python HTTP客户端…

【线性dp必学四道题】线性dp四道经典例题【最长上升子序列】、【最长公共子序列】、【最长公共上升子序列(maxv的由来)】【最长公共子串】

【最长上升子序列】、【最长公共子序列】、【最长公共上升子序列】 最长上升子序列f[i] 表示以i结尾的最长子序列 最长公共子序列f[i][j] 表示 a前i 和 b前j个 最长公共长度 最长公共上升子序列f[i][j]代表所有a[1 ~ i]和b[1 ~ j]中以b[j]结尾的公共上升子序列的集合 最长公共子…

Spring Boot如何实现分布式追踪和监控

Spring Boot如何实现分布式追踪和监控 在分布式系统中,由于服务数量的增加和服务之间的相互调用,会出现跨服务的请求链路较长,难以追踪问题和定位性能瓶颈等问题。因此,分布式追踪和监控变得越来越重要。本文将介绍如何使用 Spri…

怎样一元钱部署自己的AI网站

前段时间我开发了一个简洁的AI问答网站,好多朋友感兴趣,因此我将网站代码在github上开源,并编写此教程,帮助大家快速部署自己的AI网站,会编程的朋友们也可在此基础上定制开发。 前提条件:有自己的ChatGPT账…

AI实战营:开源计算机视觉神器OpenMMLab

目录 OpenMMLab概述 OpenMMLab各开源算法库详细介绍 OpenMMLab开源生态 OpenMMLab概述 部署框架:MMdeploy 算法框架:MMPretrain预训练多模态、MMDetection目标检测、MMDetection3D目标检测、MMRotate旋转目标检测、MMSegmentation语义分割、MMPose姿…

操作系统_进程

操作系统_进程 1 冯•诺依曼体系结构2 操作系统(Operator System)2.1 设计OS的目的2.2 OS的定位 3 进程3.1 什么是进程?3.2 查看进程3.3 通过fork创建进程使用 if 进行分流如何杀死一个进程 3.4 进程状态R - 运行状态S - 浅睡眠状态D - 磁盘休…

Java中关于ConditionObject的signal()方法的分析

代码块的展示 isHeldExclusively()这个仅持有锁资源的方法,在ReentrantLock中重写进行判断,要是没有持有锁资源那么会返回false,就会出现直接抛异常IllegalMonitorStateException(非法监视器状态异常)获取排在Conditi…

zookeeper相关,安装,认识......

目录 Zookeeper 1 第一章 Zookeeper简介... 1 1.1 Zookeeper概述和功能... 1 1.2 Zookeper安装... 1 1.3 Zookeper数据模型... 3 第二章 Zookeeper命令操作... 4 1.1 Zookeeper Client 4 1.2 Zookeeper JavaClient 6 第三章 集群角色... 28 Zookeeper 第一章 Zookeepe…

详解Servlet API

目录 前言 HttpServlet HttpServletRequest 代码实例 打印请求信息 通过URL中的queryString进行传递。 通过post请求的body,使用form表单传递 通过POST 请求中的 body 按照 JSON 的格式进行传递 HttpServletResponse 核心方法代码实例 设置状态码 自动刷…