8086CPU相关汇编语言的简单概述
8086CPU相关汇编语言的简单概述
- 1.寄存器
- 通用寄存器
- 8806CPU给出物理地址的方法
- 段寄存器
- 修改CS,IP的指令
- 2.寄存器(内存访问)
- 栈机制
- 3.[BX]和loop指令
- [BX]
- loop
- 段前缀
- 4.包含多个段的程序
- 5.更灵活的定位内存地址的方法
- and和or指令
- 大小写转换问题
- [bx+idata](idata[bx])
- SI和DI
- [bx+SI],[bx+DI]
- 6.数据处理的两个基本问题
- bx,si,di和bp
- 汇编语言中数据位置的表达
- 寻址方式
- 指令要处理的数据有多长
- div指令
- 伪指令dd
- dup
- 7.转移指令的原理
- 操作符offset
- jmp指令
- 依据位移进行转移的jmp指令
- 转移的目的地址值指令中的jmp指令
- 转移地址在寄存器中的jmp指令
- 转移地址在内存中的jmp指令
- jcxz指令
- 8.CALL和RET指令
- ret和retf
1.寄存器
8086CPU有14个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
通用寄存器
AX,BX,CX,DX
存放一般性的数据,可以分为高8位和第8位
8806CPU给出物理地址的方法
物理地址=段地址×16+偏移地址
段寄存器
CS,DS,SS,ES
CS和IP是是两个最关键的寄存器
CS:代码段寄存器 IP:指令指针寄存器
读取一条指令后,IP值会自动增加
修改CS,IP的指令
jmp 段地址:偏移地址
例如 jmp 2AE3:3 执行后CS = 2AE3H ,IP = 0003H
2.寄存器(内存访问)
8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址,8086不支持将数据直接送入段寄存器的操作
栈机制
8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。**任意时刻,SS:SP指向栈顶元素。**push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址
3.[BX]和loop指令
[BX]
mov ax,[bx] 功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中
loop
格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,①(cx)= (cx)-1 ②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行
段前缀
用于显式地指明内存单元的段地址的“ds:”,“cs:”等,称为段前缀
例如:mov ax,ds:[bx]
4.包含多个段的程序
DATAS SEGMENT;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV AH,4CHINT 21H
CODES ENDSEND START
dw 0,1,2,3,4,5,6,7,8,
dw即“define word”含义是定义字型数据,一个字型数据占两个字节
5.更灵活的定位内存地址的方法
and和or指令
(1)and指令:逻辑与指令,按位进行与运算。可以将操作对象的相应位设为0,其他位不变。
例如:将al的第六位设为0 and al,10111111B
(2)or指令:逻辑或指令,按位进行或运算。可以将操作对象的相应位设为1,其他位不变。
例如:将al的第六位设为0 or al,01000000B
大小写转换问题
小写字母的ASCII码值比大写字母大20H。
简便方法:一个字母,不管它原来是大写还是小写,将它的二进制码第5位置置0,它就变成大写字母;第5位置置1,就变成小写字母
[bx+idata](idata[bx])
我们在前面用[bx]的方式来指明一个内存单元,现在可以用[bx+idata]更灵活的表示
例如:mov ax,[bx+200]
SI和DI
si和di是8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用
[bx+SI],[bx+DI]
比 [bx+idata]更加灵活
6.数据处理的两个基本问题
bx,si,di和bp
①在8086CPU中,真有这4个寄存器可以用在[…]中来进行内存单元的寻址
②在[…]中,这4个寄存器可以单个出现,或只能以4中组合出现:bx和si,bx和di,bp和si,bp和di
③在[…]中使用bp,而在指令中没有显式地给出段地址,那么段地址默认就在ss中
汇编语言中数据位置的表达
①立即数:对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中)
②寄存器:指令要处理的数据在寄存器中
③段地址(SA)和偏移地址(EA):指令要处理的数据在内存中 ,用[X]的格式给出
寻址方式
指令要处理的数据有多长
8086CPU可以处理两种尺寸的数据,byte和word,在指令中要指明是字操作还是字节操作
①通过寄存器的名字来指明
字操作:mov ax,1000
字节操作:mov al,1000
②在没有寄存器名的情况下,用操作符X ptr指明内存单元的长度,X是byte或word
inc word ptr 【bx】
inc byte ptr 【bx】
div指令
①除数:有8位和16位两种,在一个reg或内存单元中
②被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在AX和DX中存放,DX存放高16位,AX存放低16位
③结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数
伪指令dd
前面用db和dw定义字节型数据和字型数据。dd用来定义dword(double word,双字)型数据
dup
是一个操作符 ,和dd,dw,db一样。dup用来进行数据的重复
例如:db 3 dup(0),定义了3个字节,都为0
db 3 dup(0,1,2),定义了9个字节0,1,2,0,1,2,0,1,2
7.转移指令的原理
可以修改IP,或同时修改CS和IP的指令系统统称为转移指令。概括地讲,转移指令就是可以控制CCPU执行内存中某处代码的指令。
只修改IP,称为段内转移
同时修改IP和CS,称为段间转移
根据对IP的修改范围不同,段内转移又分为:短转移和近转移
- 短转移IP的修改范围为-128~127
- 近转移的IP修改范围为-32768~32767
总体上可以分为以下几类:
- 无条件转移指令(如:jmp)
- 条件转移指令
- 循环指令
- 过程
- 中断
操作符offset
功能:取得标号的偏移地址
CODES SEGMENTASSUME CS:CODES
START:mov ax,offset start ;相当于mov ax,0
S:mov ax,offset s ;相当于mov ax,3CODES ENDSEND START
jmp指令
依据位移进行转移的jmp指令
段内短转移:jmp short 标号(转到标号处执行指令)
段内近转移:jmp near 标号
实际上,CPU在执行jmp指令的时候并不需要转移的目的地址。它包含的是转移的位移。这个位移是编译器根据汇编指令中的“标号”计算出来的。
转移的目的地址值指令中的jmp指令
jmp far ptr 标号 实现的是段间转移,有称为远转移
功能如下: (CS)=标号所在段的段地址 (IP)=标号所在段的偏移地址
转移地址在寄存器中的jmp指令
指令格式:jmp 16位 reg
功能:(IP)=(16位reg)
转移地址在内存中的jmp指令
- jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址
内存单元地址可以用寻址方式(见上文)的任一格式给出 - jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处的字是转移的目的偏移地址
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)
jcxz指令
jcxz指令为有条件指令,所有的有条件转移指令都是短转移。
指令格式:jcxz 标号(如果(CX)=0,转移到标号处执行)
操作:当(CX)=0是,(IP)=(IP)+8位位移
8位位移=标号处的地址-jcxz指令后的第一个字节的地址
8位位移的范围为:-128~127,用补码表示
8位位移由编译程序在编译时算出
当(CX)≠0时,什么也不做(程序向下执行)
8.CALL和RET指令
ret和retf
ret指令用栈中的数据,修改IP的内容,从而实现近转移;(相当于pop IP)
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。(相当于pop IP pop CS)
未完待续~
8086CPU相关汇编语言的简单概述相关推荐
- SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面
SpringSecurity的简单概述 是什么:SpringSecurity融合Spring技术栈,提供JavaEE应 用的整体安全解决方案:提供全面的安全服务 有什么用:可以进行身份验证,就是证明你 ...
- 计算机底层:计算机层次结构(高级语言到低级语言的简单概述)
计算机底层:计算机层次结构(高级语言到低级语言的简单概述): 操作系统可以有效地分配任务给cpu,控制硬件进行搞效率地使用等等,创造操作系统主要是为了满足两大需求:提高资源利用率.增强计算机系统性能. ...
- 垃圾回收器(简单概述)
垃圾回收器(简单概述) GC分类与性能指标 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定,可以由不同厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今衍生 ...
- java虚拟机-简单概述(五月的仓颉)
1 java的简单概述 java版本介绍 1.Java SE(标准版),主要活跃在桌面领域,主要包含了Java API组件. 2.Java EE(企业版),活跃在企业级领域,除了包含Java API ...
- XSS漏洞简单概述--UGa
XSS漏洞简单概述–UGa 个人笔记向,请多指点 *简介 XSS作为OWASP TOP 10之一,XSS被称为跨站脚本攻击(Cross-site scripting) ,本来应该缩写为CSS,但是由于 ...
- Unity Mecanim动画系统 之 IK(Inverse Kinematics即反向动力学)的相关说明和简单使用
Unity Mecanim动画系统 之 IK(Inverse Kinematics即反向动力学)的相关说明和简单使用 目录 Unity Mecanim动画系统 之 IK(Inverse Kinemat ...
- 关于“7个好习惯”的简单概述
Title: 关于"7个好习惯"的简单概述 Content: 同事发给的,共勉. 下面是关于"7个好习惯"的简单概述,与大家分享一下,希望对大家.对我们的团队有 ...
- 关于 Oracle ACFS 相关知识的简单学习
作者 | JiekeXu 来源 | JiekeXu之路(ID: JiekeXu_IT) 转载请联系授权 | (微信ID:xxq1426321293) 大家好,我是 JiekeXu,很高兴又和大家见面了 ...
- Hadoop的简单概述以及架构
Hadoop的简单概述以及架构 1.hadoop概述:hadoop是一个适合海量数据分布式存储和分布式计算的平台. 2.hadoop是一个统称,hadoop主要包含三大组件: (1)hdfs:是一个分 ...
最新文章
- 下一版本Windowsreg; CE 开发工具Smart Device Extensions for Microsoft Visual Studioreg; .NET...
- 【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
- 重写equals所要遵守的约定
- Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)
- python3中使用subprocess模块执行外部命令
- PAT 1003 Sharing (25)
- babyion 加载obj模型_在vue中使用babylonjs引入3d模型,打印mesh数据正常且无报错,但未在场景中显示,请问是什么环节出现了问题?...
- 2017-11-14【Python】爬虫练习
- Xshell配色为ubuntu风格
- 【matlab】元胞数组的创建
- diff git 指定时间_【GIT】从指定分支两个Tag中获取差异文件,进行代码的增量更新...
- mx350显卡天梯图_五月显卡性能排行 台式显卡天梯图2020年5月最新版
- 基于朴素贝叶斯算法实现情感分类
- Teach Yourself Programming in Ten Years
- 讨论BUCK、BOOST、BUCK-BOOST电路CCM模式下的设计参数计算
- hp390计算机硬盘模式设置,Bios设置中三种硬盘模式详解
- CTSC2016APIO2016爆零记
- caffe转onnx总结
- 如何使用 Xcode8 进行开发调试
- 小红书如何营销?各大品牌小红书运营投放营销策划方案合集(13份)
热门文章
- jupyter-notebook 以yarn模式运行出现的问题及解决
- python程序设计第二章序列类型 题库及选解
- 6. Java并发编程-并发包-Lock和Condition
- stata 求输出相关系数矩阵命令_Stata外部命令:那些最常用的和最新的命令
- java 并发: 原子类
- 正则,JWT token,容联云,celery,频道组,SKU,SPU,request对象的属性和方法的补充知识
- 向日葵远程看不到qq界面
- N76E003 避坑指南(持续更新)
- ANSYS Fluent UDF Manual 2020R2
- RFID技术有这7种缺点与不足,ZETA是否可以对其进行技术替代?