【汇编语言】数据类型的匹配问题:自动匹配与手动匹配
0 前言
本文基于8086汇编语言,不过x86系列语言具备向下兼容特点,大多数情况都可以用。
与高级语言数据类型的自动转换和强制转换一样,汇编语言的数据类型也有 自动匹配和手动匹配。
下面,我来介绍一下汇编语言的相关原则。
1 数据类型匹配的原则
任何时候,数据的匹配,只能是完全一样的数据类型才能进行数据传送。
也就是8位对8位,16位对16位,32位对32位。
比如
mov ax,bx
mov al,bl
请注意,这里的原则与操作数个数无关,指令如果涉及到数据传送过程,至少也要有数据提供方,有数据接收方。
需要注意,这里的数据传送,是copy,而不是remove,传送之后原来的数据不消失,只是复制过去。
你想问为什么是copy?先明白一个问题,计算机的本质,是电子计算机,是基于电的。你可以想象一下,有两根导线,中间有一个没有闭合的开关,开关闭合前,左边的是导线通电的,右边的不带电,现在将开关闭合,右边的导线是不是也通电了,左边的导线没有因此不带电吧?开关闭合后通电的过程,就是数据传送的过程,我想你大概能理解为什么是copy了。
2 自动匹配
由上面的图你可以看到,有三个部分
- 数据提供方A
- 数据传送带B
- 数据接收方C
自动匹配分为以下情况
- B大小固定:则A,C的大小自动固定
- 例如:指令push,pop要求必须是字传送,也就是B的大小限定为16
- ……
- B大小不固定:则A,C只要有一方是固定,另一方自动固定
- 例如:
mov ax,1
,因为ax
固定16位,则1
也要是16位,如果不是,需要变成16位的(插一句,这就是符号扩展) mov ax,bx
,双方都固定16位也是可以的
- 例如:
对于B固定的情况,只有很少一部分,记住即可,这里谈一下不固定的部分。
A,C分别代表数据的提供方和接收方,它们不一定是两个操作数,也可能是隐藏的,例如有的指令是单操作数,有的没有操作数,但这都不妨碍它们都有A和C。
A或C可能是
- 寄存器
- 内存单元
当一方为寄存器,例如使用ax
,则另一方就需要是16位的数据,可以是
- 寄存器,例如
bx
- 定义为
dw
类型的数据 - 某个数据的首地址,自动按16位提取,不需要加限制条件,例如
ds:[0]
- 立即数,自动扩展为16位的
当一方为dw
类型数据,也是同理。
不可以的情况:当一方为内存单元地址,另外一方为立即数,例如mov ds:[0],1
,这就是手动匹配,看下一节。
3 手动匹配
当A和C的大小都不能确定的时候,就需要手动匹配,加上限定条件了,这通常发生在<内存单元地址>
和立即数
身上,因为它们是不固定大小的,如果它们结合,或者单独出现,就必须加上限制条件。
例如
mov word ptr ds:[0],1
jmp word ptr ds:[0]
只能对内存单元地址做出规定,也就是word ptr
、byte ptr
、dword ptr
等,立即数是墙头草,别人多大他多大。
4 注意事项
需要注意的是,对于数据类型匹配这件事情,取决于编译器和CPU的设计者,大多数情况是遵循我上面所说的原则的,对于极少数特殊情况,也是完全可能的,不要因此感到惊讶。
5 小结
前面解释了很多,不过你根本没有必要记忆,只需要警惕一些特殊情况即可。
对于没有限定B部分的指令
- 双操作数指令,出现内存单元地址和立即数,地址要限定
word ptr
等类型 - 单操作数,内存单元地址要限定类型
就像赛跑,规定了起点位置和长度,就能够得到终点位置
- 起点位置就是内存单元地址,比如
ds:[0]
代表起点位置为ds*16 + 0
- 长度就是数据类型,比如
word ptr
代表长度2个字节
对于其他指令集架构,原理上是有相通性的,请读者自行思考。
【汇编语言】数据类型的匹配问题:自动匹配与手动匹配相关推荐
- 【图像处理】——特征匹配(SIFT特征检测器+FLANN特征匹配方法+KNN近邻最优匹配筛选)——cv.xfeatures2d.SIFT_create()sift.detectAndCompute
转载请注明地址 目录 1.特征检测和特征匹配方法 (1)特征检测算法 (2)特征匹配算法 (3)各种特征检测算法的比较 2.特征匹配的基本步骤(附带主要的函数) (1)图像预处理--灰度化(模板--查 ...
- 正则表达式匹配不包含特定字符串解决匹配溢出问题
匹配溢出问题在正则表达式当中算是比较常见的问题,它常常导致我们匹配结果莫名其妙的出错,本文专门为你讲解如何通过匹配不包含特定字符串的方法来解决这类问题. 那么,什么是匹配溢出呢? 下面我们来看个例子: ...
- css匹配title,解决css中的匹配问题
问题描述 众所周知在写 css的时候,会根据html 中类的定义或者 id 的定义来写相应的 css代码.给不同的类定义不同的样式,当然为了能够少写一些代码,大家就会在css 中引用匹配.匹配有模糊匹 ...
- stata 倾向得分匹配(二)偏差校正匹配估计量
在前期倾向匹配得分模型中,估计倾向得分存在不确定性,可使用probit. logit或非参数估计,主观性较强,更重要的是由于非精确匹配一般存在偏差,因此可通过校正匹配估计量来处理. 偏差校正匹配估计量 ...
- python 正则 匹配任意字符串_python中正则匹配
写代码时候,不管是爬虫,还是获取某些特定的资源,我们需要写正则表达式. 因为不常用,有些语法生疏.有时明明觉得自己的语法可以,可就是不行. 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之 ...
- 激光扫描匹配之基于点的扫描匹配
本文主要将激光扫描匹配分为三类: (1)基于点的扫描匹配: (2)基于特征的扫描匹配: (3)基于数学特性的扫描匹配. 下面重要介绍基于点的扫描匹配 一,基于点的扫描匹配直接对扫描获取的原始数据点进行 ...
- 定位匹配 模板匹配 地图_什么是地图匹配?
定位匹配 模板匹配 地图 By Marie Douriez, James Murphy, Kerrick Staley 玛丽·杜里兹(Marie Douriez),詹姆斯·墨菲(James Murph ...
- php 正则匹配特定中文,中文正则(正则表达式匹配指定中文)
\u4E00-\u9FA5能验证中文,但是包含中文符号 我只想要中文(不要'':,. function checkname(){ var name=document.getelementbyid("t ...
- cad特性匹配快捷键命令_CAD中特性匹配(格式刷)的运用
原标题:CAD中特性匹配(格式刷)的运用 特性匹配在CAD制图中也是比较常用的命令之一,所谓特性匹配是以已知的某一样式为标准,去改变另外一个样式时可以用这个命令.从而获得和参照的标准具有一样的格式,它 ...
最新文章
- FastStone Capture不止于完美截图体验
- Ubuntu/Fedora高版本安装海思SDK的方法
- 微软模式与实践团队发布Enterprise Library 4.1及Unity Application Block 1.2
- cesium模型不遮挡点线面_cesium点线面测试数据
- python 字典查询比列表快_Python 字典和列表的对比应用
- 拳王虚拟项目公社:分享一个大学生上班族都可做的虚拟副业项目
- linux arm fpu初始化,ARM处理器的浮点运算单元(FPU)
- 从零开始学习makefile(7) makefile的filter的作用
- mean函数 median函数【Matlab】
- 【CityHunter】游戏进度总控,及需求设计
- 关于物联网,互联网我们用到的通信
- MyBatis,你真的了解了吗
- 【对讲机的那点事】使用对讲机,你了解对讲机电池使用寿命及安全吗?
- 页面直接调用打印机,打印pdf文件
- 基于FPGA的数字交通红绿灯Verilog开发Modelsim仿真
- 计算机鼠标与键盘基本知识,电脑鼠标和键盘的基础设置方法
- STM32F103 PB3 作为 普通IO使用
- 【英语】八月英语总结
- 从宜人贷系统架构看互联网高并发对金融系统架构的挑战
- 惠普打印机驱动安装教程,怎么安装打印机驱动