网站推广怎么样,广告设计要学什么,网站设计多少钱,青云 wordpress加速0 前言
本文基于8086汇编语言#xff0c;不过x86系列语言具备向下兼容特点#xff0c;大多数情况都可以用。
与高级语言数据类型的自动转换和强制转换一样#xff0c;汇编语言的数据类型也有 自动匹配和手动匹配。
下面#xff0c;我来介绍一下汇编语言的相关原则。
1 …0 前言
本文基于8086汇编语言不过x86系列语言具备向下兼容特点大多数情况都可以用。
与高级语言数据类型的自动转换和强制转换一样汇编语言的数据类型也有 自动匹配和手动匹配。
下面我来介绍一下汇编语言的相关原则。
1 数据类型匹配的原则
任何时候数据的匹配只能是完全一样的数据类型才能进行数据传送。
也就是8位对8位16位对16位32位对32位。
比如
mov ax,bxmov al,bl
请注意这里的原则与操作数个数无关指令如果涉及到数据传送过程至少也要有数据提供方有数据接收方。 需要注意这里的数据传送是copy而不是remove传送之后原来的数据不消失只是复制过去。
你想问为什么是copy先明白一个问题计算机的本质是电子计算机是基于电的。你可以想象一下有两根导线中间有一个没有闭合的开关开关闭合前左边的是导线通电的右边的不带电现在将开关闭合右边的导线是不是也通电了左边的导线没有因此不带电吧开关闭合后通电的过程就是数据传送的过程我想你大概能理解为什么是copy了。
2 自动匹配
由上面的图你可以看到有三个部分
数据提供方A数据传送带B数据接收方C
自动匹配分为以下情况
B大小固定则AC的大小自动固定 例如指令pushpop要求必须是字传送也就是B的大小限定为16…… B大小不固定则AC只要有一方是固定另一方自动固定 例如mov ax,1因为ax固定16位则1也要是16位如果不是需要变成16位的插一句这就是符号扩展mov ax,bx双方都固定16位也是可以的
对于B固定的情况只有很少一部分记住即可这里谈一下不固定的部分。
AC分别代表数据的提供方和接收方它们不一定是两个操作数也可能是隐藏的例如有的指令是单操作数有的没有操作数但这都不妨碍它们都有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],1jmp word ptr ds:[0]
只能对内存单元地址做出规定也就是word ptr、byte ptr、dword ptr等立即数是墙头草别人多大他多大。
4 注意事项
需要注意的是对于数据类型匹配这件事情取决于编译器和CPU的设计者大多数情况是遵循我上面所说的原则的对于极少数特殊情况也是完全可能的不要因此感到惊讶。
5 小结
前面解释了很多不过你根本没有必要记忆只需要警惕一些特殊情况即可。
对于没有限定B部分的指令
双操作数指令出现内存单元地址和立即数地址要限定word ptr等类型单操作数内存单元地址要限定类型
就像赛跑规定了起点位置和长度就能够得到终点位置
起点位置就是内存单元地址比如ds:[0]代表起点位置为ds*16 0长度就是数据类型比如word ptr代表长度2个字节
对于其他指令集架构原理上是有相通性的请读者自行思考。