汇编学习——8086CPU

2024-04-28 01:08
文章标签 学习 汇编 8086cpu

本文主要是介绍汇编学习——8086CPU,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

8086寄存器


1)通用寄存器:

A、8个通用寄存器:AH,AL,BH,BL,CH,CL,DH,DL

B、2个变址寄存器:SI,DI

C、2个指针寄存器:BP,SP

这四个寄存器只能按16位操作,主要用来暂存数据或者地址

(2)段寄存器:

   主要为主储存器的分段管理提供段地址

(3)控制寄存器:

   指令指针IP实际上是一个16位的加计数器,始终指向下一条要执行的命令的地址

4、控制寄存器中的标志寄存器

(1)控制标志位:

DF:方向标志

IF:中断标志

TF:单步标志或者陷阱标志

 

(2)条件标志位

PF:奇偶标志:计算结果的低8位,若1的个数为偶数个,则PF=1,否则PF=0

ZF:零标志位:计算结果为0,ZF=1,否则ZF=0

AF:辅助进位/借位标志位:计算结果D3向D4进位或者借位,则AF=1,否则AF=0。

CF:进位/借位标志位:计算结果的最高位向前进位或者借位,则CF=1,否则CF=0

SF:符号标志位:计算记过为负,SF=1,否则SF=0,实际上就是计算机过的最高位(补码)

OF:溢出标志位:计算结果超出带符号数补码数的表示范围:OF=1,否则OF=0。用于计算加减法是否出错

(3)判断OF标志位的方法:


一、寻址方式

1、概念:

    一条指令由操作码和操作数构成,操作码是系统定义好的符号,执行指定的操作,操作数即是指令的对象,而寻址方式就是操作数的指定方式

操作码   目的操作数,源操作数

 

2、寻址方式的三种情况:

(1)CPU中(2)储存器(3)I/O中

 

3、寻址方式分类

(1)隐含寻址:

    指令中只有操作码没有指定的操作数,但是根据操作码就可确定相应的操作数

MUL BL;DIV BL;

(2)立即寻址:

    指令中直接给出要操作的数

ADD AL,50

    立即寻址只能用在源操作数上

(3)寄存器寻址:

A、指令中给出寄存器的名字,寄存器中的内容是要操作的数,这种方式称为寄存器寻址。

B、可以使用寄存器:8个通用16位寄存器(AX,BX,CX,DX,SI,DI,BP,SP),以及8个8位寄存器(AH,AL,BH,BL,CH,CL,DH,DL)

ADD AL,BL

(4)段寄存器寻址:

A、指令中给出段寄存器的名字,段寄存器中的内容是要操作的数,这种方式称为段寄存器寻址。

B、可以使用段寄存器:4个段寄存器(CS,DS,ES,SS)

C、8086中只有数据传输指令MOV,堆栈操作指令PUSH和POP可以使用段寄存器寻址方式

(5)I/0口寻址

A、操作数在I/O接口中,这种寻址方式为I/O寻址

B、只用使用IN/OUT操作。

C、直接IO寻址:使用一个8位无符号数指定端口号

    间接IO寻址:使用一个16位寄存器DX来指定端口号

(6)转移地址的寻址:

    指令指针IP会一直指向下一条要执行的命令,所以使用指令转移IP内容,成为转移地址的寻址

(7)储存器操作数的寻址

①概念:

   8086CPU有20根地址线,所以储存器每个单元的地址是20位(2进制),称为物理地址,而CPU内部的寄存器都是16位,只用一个寄存器不能完整表示储存器地址,所以拆成2个分量:段地址(CS,DS,ES,SS),偏移地址(BX,BP,SI,DI)

物理地址 = 段地址*10H + 偏移地址

 

②直接寻址

ADD AL,[Xvar]

将Xvar地址中的内容与AL相加,并储存在AL中;其中Xvar是在数据段中定义的一个变量名

A、直接寻址:要用变量名指定地址

     立即寻址:常数作为源操作数

ADD AL,[20H]

认为是立即寻址

 

③寄存器间接寻址

A、将储存器的偏移地址存在一个16位寄存器中,然后用方括号中的16位寄存器指定此偏移地址,成为寄存器间接寻址

B、BX,SI,DI搭配DS(数据段)

    BP搭配SS(堆栈段)

ADD AL,[BX];       从数据段的此地址取数据
ADD AL,[BP];       从堆栈段的此地址取数据

 

④寄存器相对寻址

A、就是在寄存器间接寻址的基础上,使用BX+D(8位或者16位的常数偏移量)作为地址

ADD AL [SI+5];    
ADD AL [BP-5];

 

⑤基址变址寻址

A、将一个基址寄存器(BX,BP)与一个变址寄存器(SI,DI)的内容相加作为偏移地址,段寄存器搭配由基址寄存器决定:BX搭配DS,BP搭配SS

B、计算公式:

物理地址=DS*10H+BX/DP+SI/DI

C、指令

ADD AL,[BX+SI];     只能相加
ADD AL,[BP-DI];     不能相减
ADD AL [BX+BP];     也不能是两个基址寄存器
ADD AL,[SI+DI];     或者是两个变址寻址器

 

⑥相对基址变址寻址

A、就是在寄存器基址变址寻址的基础上,使用BX+SI+D(8位或者16位的常数偏移量)作为地址

ADD AL,[BP+BI+5]
ADD AL,[BP+BI-5];   同样的,不能有减法

 

二、数据传送指令

1、通用数据传送指令

MOV dst,src;

(1)立即数传送给寄存器或储存单元

A、立即数只能作为源操作数

B、若寄存器是16位,立即数可以是16位或8位,若寄存器是8位的,立即数只能是8位的。

C、目的操作数是存储器,而立即数是8位,则存储器必须有类型说明

 

(2)通用寄存器与存储器之间的传送

若通用寄存器是8位,则按字节传送,若是16位,则按字传送。

 

(3)两个通用寄存器之间的传送

源和目的必须同为8位或者16位寄存器

 

(4)段寄存器与通用寄存器或存储器之间的传送

A、程序的一开始,经常需要用立即数对段寄存器赋初值,但是,立即数为源操作数,段寄存器为目的的操作数寻址方式是非法的,所以使用:

MOV AX,DATA
MOV DS,AX

B、段寄存器作为源操作数时:DS,SS,ES,CS都可以使用

              作为目的操作数:CS不能使用

C、IP不能作为源操作数或者目的操作数

D、两个存储单元之间的传送是允许的,所以

MOV AX,X1
MOV X2,AX

 

2、交换指令:

(1)指令格式

XCHG dst,src;

(2)操作数不能是立即数、段寄存器、存储器操作数

(3)操作数的长度要一致

 

3、堆栈操作指令

(1)入栈指令:

A、指令格式:

PUSH src

    将一个源操作数压入堆栈,具体过程:先将堆栈指针SP减2,然后将源操作数存入堆栈中SP所指的地址.

(2)出栈指令:

POP src
    将堆栈顶部的数据弹出给目的操作数,具体操作: 以SS为段地址,SP为偏移地址,将此地址中的数据取出传给目的操作数,然后堆栈指针SP加2

(3)一些注意事项:

A、POP和PUSH的操作数必须是16位的。通用寄存器和存储器皆可。

B、一些错误指令:

PUSH 1234     不能是立即数
PUSH AL         不能使用8位寄存器
PUSH IP          不能使用IP寄存器
POP   1234H   不能使用立即数
POP   AL         不能使用8位寄存器
POP  CS          CS不能作为目的操作数
C、 低字节在低地址,高字节在高地址

 

4、查表指令

(1)指令格式:

XLAT
XLAT src_table
     又称换码指令, 用BX指向数据段中一个表格的首地址,AL为某元素的下标,查表得到此元素的值存入AL中

(2)demo

MOV BX OFFSET TABLE 
MOV AL,5
XLAT

 

5、输入/输出指令

(1)指令格式

image

(2)一些注意点:

A、操作数必须是累加寄存器AL或者AX;另一个操作数是8位无符号port或者16位的数据寄存器DX,用来指定I/O接口电路中的一个地址

B、地址超8位,只能使用间接寻址。

 

6、地址传送指令

(1)有效地址传送:

A、指令格式:

LEA reg16,mem

     源操作数必须是存储器操作数,目的操作数必须是16位的通用寄存器,功能是将存储器操作数的偏移地址传送给给一个16通用寄存器.

B、OFFSET:功能是取存储器操作数的偏移地址。

 

(2)地址指针送寄存器和DS

LDS reg16,mem32;         等同于 reg16<---[mem32],DS<---[mem32+2]

 

(3)地址指针送寄存器和ES

LES reg16,mem32;         等同于 reg16<---[mem32],ES<---[mem32+2]

 

7、标志位传送指令

(1)标志寄存器送AH

A、指令格式:

LAHF;         等同于AH<----标志寄存器的低八位

(2)AH送标志寄存器

A、指令格式:

SAHF;       标志寄存器低8位<------AH

PS:只能对标志寄存器的低八位进行操作

(3)标志寄存器入栈

A、指令格式:

PUSHF;             SP<------SP-2    SS:[SP]<------ 标志寄存器

(4)标志寄存器出栈

A、指令格式:

POPF;         标志寄存器<-------SS:[SP], SP<----SP+2

 

三、汇编语言程序结构:

复制代码
DATA SEGMENT                       ;数据段开始……                                            ;伪指令,定义数据段变量
DATA ENDS                              ;数据段结束EXTRA SEGMENT                     ;扩展段开始……                                            ;伪指令,定义扩展段变量
EXTRA ENDS                            ;扩展段结束STACK SEGMENT                    ;堆栈段开始……                                            ;伪指令,定义数据段变量
STACK ENDS                            ;堆栈段结束MAC1 MACRO                            ;宏指令定义开始
……                                                ;伪指令或者指令,宏定义体
ENDM                                         ;宏指令定义结束CODE SEGMENT                       ;代码段开始
ASSUME    CS:CODE,DS:DATA,ES:EXTRA,SS:STACK
START:                                       ;主程序起始地址定义MOV      AX,DATA                    ;寄存器初始化MOV      DS,AXMOV      AX,EXTRAMOV      ES,AXMOV      AX,STACKMOV      SS,AX……                                                  ;指令
CALL  SUB1                                  ;调用子程序
……;                                                 ;指令
MAC1                                            ;调用宏指令
……                                                  ;指令
MOV AH,4CH                                ;返回DOSINT  21HSUB1  PROC                               ;子程序定义开始……RET                                             ;返回主程序SUB1  ENDP                               ;子程序定义结束
CODE ENDS                                 ;代码段结束
END START                                  ;结束汇编
复制代码

1、分段结构

(1)代码段结束处,必须加入如下代码,实现返回系统的功能

MOV,AH,4CH
INT 21H

(2)子程序中必须有RET使之能返回主程序

 

2、语句格式

(1)指令语句:

A、格式:

标号:操作码       目的操作数,源操作数;注释

(2)伪指令语句:

A、格式:

变量     操作码   操作数,……,操作数;注释

B、作用:

    汇编时起到辅助作用,不产生机器码,也称为指示性语句。

(3)宏定义语句

A、格式:

标号:宏定义指令名   实际参数;注释

B、使用MACRO伪指令定义了一条宏指令之后,在代码段中就可以用宏指令语句来调用此宏指令。

 

3、变量和标号:

     变量和标号都是来表示存储器中的地址,标号只能在代码段中定义,变量可以在任意段中定义。标量和标号都有段地址、偏移地址和类型三种属性,变量的类型属性有:BYTE,WORD,DWORD几种。标号的类型有NEAR或者FAR两种。

 

4、操作数、表达式和操作符

(1)算术操作符:+ – * / 和MOD

     加减可以对地址进行操作

(2)逻辑操作符:AND,OR,XOR,NOT,SHL(左移),SHR(右移)

     和指令操作码方法一致,但只能对数值进行操作,不能对地址进行操作

(3)关系操作符:EQ(相等)、NE(不等)、GT(大于)、LT(小于)、GE(大于等于)、LE(小于等于)

      A、用0表示假,用0FFH或者0FFFFH表示真。

      B、可以比较数值也可以比较地址

(4)分析操作符:SEG,OFFSET,TYPE,LENGTH和SIZE

SEG取段地址
OFFSET取偏移地址
TYPE取类型
1:BYTE
2:WORD
4:DWORD
LENGTH取变量中用DUP定义的数据的个数
SIZELENGTH和TYPE的乘积

(5)属性操作符:HIGH、LOW、SHORT、PTR、THIS和段操作符共6个

HIGH取高字节
LOW取低字节
SHORT段类型
PTR改变标号
THIS改变变量类型

 

5、常用伪指令

(1)符号定义伪指令
A、格式:

名称   EQU  表达式     ;使用EQU定义的名称可以进行修改
名称 = 表达式           ;不可以进行修改   

B、作用:

   就是定义个符号常量的作用。

(2)数据定义伪指令

A、格式:

变量    伪操作符   表达式,表达式,……;注释
变量    伪操作符   重复次数   DUP(表达式,表达式,……);注释

B、说明

①其中变量和注释可有可无,然后定义数据的伪操作符有以下5个:DB(字节),DW(字)、DD(双字)、DQ(8个字节)和DT(10个字节)

②若要定义一组数是相同的,使用第二种方法

若要预留地址空间,没有初始数值,则数据项可以写为”?“每一个”?“代表一个数据,占用的地址为由伪操作符决定

 

四、汇编成语上机过程,(使用寻址方式验证代码来书写)

1、DOSBox模拟器初始化

image

      其中g:\汇编目录下有:

image

 

2、编辑

image

键入代码后回车。

edit xunzhi.asm

image

得到如上界面,进行书写代码,并保存。

image

 

3、汇编

image

如图键入代码,回车回车回车

image

这里会显示语法错误信息,如果有错就会报错

 

3、链接

image

键入代码回车

image

没有错误,则进行调试

 

5、调试

image

如图键入代码:然后回车就进入调试

(1)键入U回车

image

A、U命令是反汇编,将内存中的机器码反汇编成指令显示。

B、可能每次不能显示全部指令,所以再U可以继续显示,U0可以返回到代码段的首部

image

 

(2)在内存中查看数据段,扩展段和堆栈段中的数据

查看内存中的数据使用命令

D+地址:0
D076A:0

image

再次键入D命令,会继续往下面显示

 

(3)单步运行程序,查看运行结果

t=0 从第一句开始,按t顺心执行

image


 




这篇关于汇编学习——8086CPU的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941972

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识