微机原理——汇编指令(上部)

news2025/1/18 3:50:22

文章目录

  • 一、8086/8088 16位微处理器内部结构
  • 二、汇编指令集
    • 指令概述
      • 1、指令
      • 2、指令的分类
      • 3、指令的组成
      • 4、指令的存放
    • 标志寄存器
      • 1、C标志——进位/借位标志
      • 2、A标志——辅助进位/辅助进位标志
      • 3、S标志——符号标志
      • 4、Z标志——零标志
      • 5、P标志——奇偶标志
      • 6、O标志——溢出标志
    • **操作数寻址方式
      • 1、操作数的分类
      • 2、立即寻址方式
      • 3、寄存器寻址
      • 4、存储器操作数寻址方式
        • 4.1直接寻址
        • 4.2寄存器间接寻址
        • 4.3基址寻址
        • 4.4变址寻址
        • 4.6 基址+变址寻址
      • 5、寻址方式总结
      • 6、寻址方式总结续:

前言:在开始之前,先了解一些寄存器、cpu内部结构等等。

一、8086/8088 16位微处理器内部结构

在这里插入图片描述
这里我们仅需了解它们的基本就够用了;

  • AX、BX、CX、DX:16位寄存器(一个内存单元是8位,即为一个字节),EAX,EBX,ECX,EDX:这些是32位寄存器,不是很常用。

  • 其中以‘H’结尾的,是高八位,而以‘L’结尾是低八位。这里大家可能不好理解,我举个列子,二进制数:1110 1100 1000 0000,前面八位即可用H结尾的寄存器表示,后八位也就不言而喻了。
    注意:有个规则,二进制数,从左到右,位制依次降低,即为左面高,右面低

  • SP:堆栈指针寄存器
    BP:基址指针寄存器
    DI:目地变址寄存器
    SI:源变址寄存器
    这四个寄存器,在后面的寻址方式会用到。

  • CS: (code section)代码段 ,用于存放代码段的段基址
    DS:(data section)数据段
    SS:堆栈段寄存器
    ES:附加段寄存器
    IP:指令指针寄存器,内存中存放的是下一条指令的地址。

二、汇编指令集

指令概述

1、指令

定义:指令位CPU基本的单位,每条指令执行一个特定的操作,可以理解为:指令通知CPU执行某种操作的“命令”。

2、指令的分类

  • 机器指令:二进制格式编码的序列(由0,1代码书写)
    注意: 硬件只能识别,存储,运行机器指令。

  • 符号指令:用字符串形式的序列(包含字符串形式的操作码以及操作数助记符)表示。

  • 这里的符号指令,将是我后面所会讲道德汇编指令。


我们来看几个实例:
在这里插入图片描述


3、指令的组成

格式:

标号:操作码助记符空格操作数助记符;注释

如:NEXT: ADD AX,BX ;AX+BX------>AX

  • 操作码:计算机要执行的操作,如加减乘除;
  • 操作数:执行操作过程中所要操作的数,如,执行加法的两个加数,很类似高级语言里面的变量,但这里,操作数有范围显示。
    **注:**多字节指令占用连续的内存单元,存放指令第一字节的内存单元地址,成为“指令地址”。

4、指令的存放

在这里插入图片描述
首先存放操作码,然后存放操作数,多字节操作数是连续存放的,顺序依据小端法规则,即:低位字节存放在低地址单元,高位字节存放在高地址单元

标志寄存器

说明一下:这些每一位数字用字母如何表示?
1 1 1 1 0 0 0 0
D7 D6 D5 D4 D3 D2 D1 D0
一 一对应

1、C标志——进位/借位标志

这里书上的表述过于复杂,我来简述一下;
如有两个八位二进制的数相加,当第八位上面的数大于1时候,就要进位,因为这里是二进制数,最高为1,当大于1时就要进位,那么此时C=1,没有进位C=0

2、A标志——辅助进位/辅助进位标志

判断 字、字节、双字加/减,D3产生进位/借位时,A=1,否则A=0

3、S标志——符号标志

用于判断最高位的数字是多少,当数运算后,若结果的最高位为1,则S=1,否则为0.

4、Z标志——零标志

运算结果全为0时,Z=1;反之,Z=0。

5、P标志——奇偶标志

运算结果低八位里面,若“1”的个数为偶数个,则P=1,否则为0;

6、O标志——溢出标志

我来教大家一个简便的方法,就看最高位,两个数运算时,第一个数最高位为1,第二个数最高位是1,最后运算出,结果的最高位为0,此时O=1;

还有一种情况就是第一个数最高位为0,第二个数最高位是0,最后运算出,结果的最高位为1,此时也O=1;
简记:110/001

**操作数寻址方式


(此单元非常非常非常之重要!!)


寻址方式:通俗的来讲,就是通知CPU本条指令的操作数在哪儿?或者说用什么方式才能得到操作数

1、操作数的分类

  • 操作数包含在指令中,这种操作数称为立即数
  • 操作数存放在cpu的某个寄存器里,这种操作数成为寄存器操作数
  • 操作数存放在存储器中,这种被称为存储器操作数
  • 操作数存放在I/O端口中,这种操作数称为I/O端口操作数。

前三两种较为常用。

注意
立即 寻址方式:获得立即数;
寄存器 寻址方式:获得寄存器操作数;
存储器 寻址方式 :获得内存操作数。

2、立即寻址方式

立即寻址方式,所提供的操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在代码段区域中,立即数可以是8、16、32位。

操作数是指令一部分,当去取这条指令时,也就获得了操作数。
在这里插入图片描述

3、寄存器寻址

操作数在CPU的某个寄存器中,符号指令中直接写出寄存器名称
如:
MOV AX,BX ;BX内容赋值给AX
INC SI ;SI+1---->(这里执行增量操作,每次加一的操作)
DEC DI ;这里做减量操作,每次做减一的行为

例子:MOV DX,AX
在这里插入图片描述

4、存储器操作数寻址方式

在本类里面,所有给出的地址都是偏移地址。

  • 在读写内存操作数之前,CPU必须知道相关存储单元的物理地址
  • 由于CPU对存储器采用分段管理,因此指令格式中只能写出存放操作数的内存单元的“逻辑地址”
  • 程序员的责任仅在于正确的书写逻辑地址表达式,然后由CPU自动运算以求出物理地址。
    注意:存储器寻址是在内存中寻址,必然要先知道该操作数所放在的位置地址,然后根据根据这个地址来寻找,区别于前两种,这里的寻址格式,在操作数位置是逻辑地址,格式如下:段寄存器:[偏移地址]
4.1直接寻址

(1)地址表达式的格式1:段寄存器:[偏移地址]

如:
MOV AL,ES:[2CH]
从ES附加段偏移地址位2CH的单元取数,赋值给AL
MOV AX DS:[2000H]
从数据段偏移地址为2000H的单元取值赋给AX

看一个例子:
在这里插入图片描述
看到[1234H],我们需要想到几点,第一点,该操作数在内存里面,第二点,方括号里面是偏移地址(逻辑地址),而不是物理地址(段基址+偏移地址)。

(2)地址表达式的格式2:段寄存器:变量名
-----用变量名代表存储单元的有效地址


说明:

  • 格式一很少使用,因为程序员不知道某单元的偏移地址
  • 汇编语言允许为某单元起一个“名字”,这个名字就称该单元的“变量名”,经过汇编之后,变量名有段基址和偏移量两种属性。
  • 变量名是唯一的,程序中不能有重复的变量名。

看个题目:数据段XX字节单元的内容为11H,ES附加段YY字单元的内容为2233H

 MOV  AL,DS:XX
 或 MOV AL,XX  ;取XX字节单元内容赋值给AL,此时AL=11H
MOV AX,ES:YY
或 MOV AX,YY ;取ES附加段YY字节单元的内容2233H赋值给AX

思考:大家想一想,如果在这里,我把AX改成AH/AL呢,那么答案是什么?
显然,AH表示数值高八位,在这里即为22H,AL则表示低八位,在这里即为33H.

4.2寄存器间接寻址

寄存器间接寻址,又称间接寻址,间址
注意,操作数在内存单元,而该单元的段基址在段寄存器里,偏移地址却在间接寄存器里面。
(1)间接寻址的地址表达式
段寄存器:[间接寄存器]
:某单元的物理地址=段寄存器内容(段基址)*16+间接寄存器(偏移地址)

(2)格式可以省略段寄存器。

例子1:
在这里插入图片描述
例子2:
数据段BUF字节单元的内容为55H,取出该数给AL;思考一下,应该怎么编写?答案在图片下面
在这里插入图片描述
解1:

MOV DS,数据段段基址
MOV BX,BUF单元的偏移地址
MOV AL,DS:[BX]   ;AL=55H,这里DS可省

解2:

MOV DS,数据段段基址
MOV BP,BUF单元的偏移地址
MOV AL,DS:[BP]   ;AL=55H,这里DS不能省略,因为BP是堆栈段,与BUF不在一个位置

解3:
采用直接寻址。BUF为变量名

MOV DS,数据段段基址
MOV AL,BUF

约定规则:
在这里插入图片描述

4.3基址寻址

该寻址方式的偏移地址一部分是由基址寄存器,另一部分则为常量构成。
(1)地址表达式格式:
段寄存器:[基址寄存器+位移量]
(2)这里的段寄存器依然可以省略。
先看一个约定:
在这里插入图片描述
例子一:
在这里插入图片描述
例子二:
设数据段BUF单元依次有:78H\56H\34H\12H
在这里插入图片描述

MOV DS,数据段段基址
MOV BX,BUF单元偏移地址
MOV DH,[BX+1]  ;DH=56H
MOV DX,[BX+2]  ;DX=1234H
4.4变址寻址

地址表达式格式:
段寄存器:[比例因子*变址寄存器+位移量]

先看个约定:
在这里插入图片描述
例子1:
在这里插入图片描述

4.6 基址+变址寻址

存储单元的偏移地址有三部的组成:
(1)地址表达式格式:
段寄存器:[基址寄存器+比例因子*变址寄存器+位移量]
段寄存器可以省略
例子:
在这里插入图片描述

5、寻址方式总结

  • 指令中的操作数有4种:立即数,寄存器数,内存操作数和I/O端口操作数。
  • 访问立即数叫做立即寻址方式,访问寄存器操作数叫做寄存器寻址方式。
  • 访问内存操作数有五种寻址方式:
    直接寻址、间接寻址、基址寻址、变址寻址、基址+变址寻址。

6、寻址方式总结续:

在这里插入图片描述

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

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

相关文章

Leetcode 142 环形链表II(链表:快2慢1指针相遇即有环)

Leetcode 142 环形链表II(链表:快2慢1指针相遇即有环) 解法1 https://leetcode.cn/problems/linked-list-cycle-ii/description/ 解法1 🔴1.【有无环】快慢指针,快指针每次走两步,慢指针每次走一步&#xf…

通过开发者工具-网络排查响应时间过长的问题

关键词:network 网络 pending 开发者工具 有时候我们会发现某次http请求花费了很长时间,比如会花费十几秒,那么我们可以通过开发者工具的网络和其他一些工具来分析请求时间过长的原因 Dev Tool 中时间线各阶段代表的意义 分别用edge、chorm…

单链表经典OJ题:反转链表

题目: 给你单链表的头节点 head ,i请你反转链表,并返回反转后的链表。 图例: 分析: 根据链表的特征,反转链表的本质便是改变节点内部的指针方向。 将原先指向下一个节点的指针进行修改,将其的…

正点原子嵌入式linux驱动开发——Linux蜂鸣器

蜂鸣器驱动原理 有源蜂鸣器只要通电就会叫,所以可以做一个供电电路,这个供电电路通过一个IO来控制其通断 ,一般使用三极管来搭建这个电路。 在Linux下编写蜂鸣器驱动就需要以下工作: 设备树中创建蜂鸣器节点,加入GP…

【MySQL系列】- SELECT语句执行顺序

【MySQL系列】- SELECT语句执行顺序 文章目录 【MySQL系列】- SELECT语句执行顺序一、MYSQL逻辑查询处理的步骤图二、MYSQL执行顺序详解2.1 执行FROM操作2.2 应用ON过滤器2.3 JOIN外部行2.4 应用WHERE过滤器2.5 GROUP BY分组2.6 应用ROLLUP 或 CUBE2.7 HAVING过滤2.8 处理SELEC…

Mysql数据库 1. SQL基础语法和操作

一、Mysql逻辑结构 一个数据库软件可以包含许多数据库 一个数据库包含许多表 一个表中包含许多字段(列) 数据库软件——>数据库——>数据表——>字段(列)、元组(行) 二、SQL语言基础语法 1.SQL…

01:linux基础---gcc/makefile/gdb

目录 一:GCC 1:简历 2:编译过程 3:编译顺序 A:预处理 B:编译 C:汇编 D:链接 4:编译选项 5:静/动态库 A: 前言 B: 库 C:静态库 D:动态库 6:练习 A: 目录结构 B: 目录结构 二:makefile 1:makefile变量 A:make变量预定义变量 B:make自动化变量 2:3个等…

springboot+html实现密码重置功能

目录 登录注册: 前端: chnangePssword.html 后端: controller: Mapper层: 逻辑: 登录注册: https://blog.csdn.net/m0_67930426/article/details/133849132 前端: 通过点击忘记密码跳转…

滚雪球学Java(53):从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

通讯协议学习之路:USART协议理论

通讯协议之路主要分为两部分,第一部分从理论上面讲解各类协议的通讯原理以及通讯格式,第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN;视频会发布在bilibili(UID:399951374) 一、…

把微信好友不小心删了,有什么办法找回?

常见的重新加回微信好友有以下几种: ①通过微信群找回,看有无共同的群,重新将对方加回来 ②通过朋友圈的动态找回 ③如果是加不久的好友,可以在微信新的朋友功能里重新添加 ④通过共同好友,让朋友圈推荐好友名片找…

一键式AI智能剪辑,轻松处理视频,释放无限创意!“

想象一下,您可以在几秒钟内完成一个复杂的视频剪辑,而无需投入大量的时间和精力。现在,这个梦想已经成为现实!我们的新一代AI智能剪辑技术,将使视频处理变得轻松无压力。 第一步:首先进入好简单批量智剪主…

C#上位机序列9: 批量读写+事件广播

1. 读取配置文件及创建变量信息(点位名称,地址,数据类型(bool/short/int/float/long/double)) 2. 读任务&写任务,数据有变化时事件广播通知 using HslCommunication; using HslCommunication.Core; usi…

基于YOLOv8模型的水下目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的水下目标检测系统可用于日常生活中检测与定位鱼、水母、企鹅、海鹦、鲨鱼、海星、黄貂鱼,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统…

34 机器学习(二):数据准备|knn

文章目录 数据准备数据下载数据切割转换器估计器 kNN正常的流程网格多折交叉训练原理讲解距离度量欧式距离(Euclidean Distance)曼哈顿距离(Manhattan Distance)切比雪夫距离 (Chebyshev Distance)还有一些自定义的距离 就请读者自行研究 再识K-近邻算法API选择n邻居的思辨总结…

MySQL分组查询每组最新的一条数据(提供三种实现方法,附带三种方法查询性能比较和分析查询原理)

目录 一、前言二、注意事项三、准备SQL四、错误查询分析4.1、错误原因 五、实现方法5.1、实现方法一(使用 LIMIT 查询)5.2、实现方法二(使用 DISTINCT 查询)5.3、实现方法三(使用 MAX(id) 查询,只适用于自增…

一篇文章讲明白double、float丢失精度的问题

1.背景 1.10.1 1.2000000000000002 发现上面计算的值竟然和数学计算不一致 2. 问题 计算机是通过二进制计算的,如果我们在二进制的视角来看待上面问题,就很容易发现问题了。 例如:把「0.1」转成二进制的表示,然后还原成十进制&…

846. 树的重心

输入样例 9 1 2 1 7 1 4 2 8 2 5 4 3 3 9 4 6输出样例: 4 分析:因为有n-1条边,所以每个点必然会连接到其他点,不存在孤立点,因此,我们从1-n任意点开始dfs都是可以的,因为无论怎么样&#xff0…

mrRobot

一、信息收集 1.访问地址 没啥信息,尝试扫下目录 2.目录扫描 key1 发现有wp-admin/和robots.txt robots.txt里面还拿到了一个密码字典,猜测是爆破wp的网站账号密码的 3.访问wp-admin/ ┌──(root💀kali)-[~/桌面] └─# sort -u fsoci…

Java并发面试题:(六)悲观锁和乐观锁和Java内存模型和CAS原理

悲观锁和乐观锁的区别 什么是悲观锁? 基本上我们理解的操作前对资源加锁,操作完后释放锁。说的都是悲观锁。悲观锁认为所有的资源都是不安全的,随时会被其他线程操作、更改。所以操作资源前一定要加一把锁、防止其他线程访问。 什么是乐观锁&…