80x86指令【一】 |
您所在的位置:网站首页 › 地址传送类指令的作用 › 80x86指令【一】 |
根据我们要传送的数据类型和方式再细分,可以大概分成以下几个类型方便记忆: 通用数据传送、地址传送、标志位传送,以及输入输出指令。 一、通用数据传送指令
1、MOV相关 运用方法其实在之前的寻址方法里面就讲的挺清楚了。 ①MOV(move) 要点: 目的操作数和源操作数必须为同一类型的数据,位数必须相同。
传送立即数时,一定要注意和目的操作数的数据类型进行匹配。尤其是传送到存储器的时候,(传送到寄存器还好,因为MOV AX,12H中这里的立即数就会被视为16位。),一定要注意指定好数据的类型,防止歧义。 e.g. MOV BYTE PTR [BX],12H ;指定数据类型为字节 此指令 ——不可以修改CS的值,即CS不可以作为目的操作数。原因:CS存储的是当前所在段的段地址,一旦修改会造成麻烦。【这样做是合法的,但是这样容易导致错误,因此不能这么做。】 ——不可以修改或读取IP和标志位寄存器的数值,因此有专门的标志位传送指令,后面会提到。 ——不可以在段寄存器间或内存单元间传送数据。(原因暂不明) ——不可以把立即数直接传送到段寄存器中(本人推测是因为段的数量有限,如果把立即数传给段寄存器相当于用户可以自主分段,然后就很容易乱。) ②MOVSX & MOVZX 这两条指令都是386以上才能用的。 目的操作数必须为通用寄存器,源操作数必须为通用寄存器或者存储器操作数两者之一。 SX代表 sign-extend,ZX代表 zero-extend。单词直译可知,MOVSX是把源操作数进行符号扩展到目的操作数,MOVZX是把源操作数进行零扩展到目的操作数。 由于这是“扩展”,因此目的操作数的字长必须长于源操作数。
2、PUSH & POP相关 此类指令的操作的数据类型长度为16位以上。 PUSH类的就是把目标压入堆栈中,POP类的就是把目标从栈中弹出来,并相应修改SP指针的值。 PUSH和POP指令中,源操作数可以为通用寄存器、段寄存器或存储器中的数据。 注意:POP CS非法,原因与前面的MOV一样,CS的值不能这样被用户修改,否则容易出错。
-------------------------------------------------------------------------
关于堆栈段: ——段地址存放在段寄存器SS中,堆栈指针SP指向栈顶。栈底是高地址,存放先入栈的数据。因此,入栈时,栈顶上浮,SP的值减小;出栈时,栈顶下降,SP的值增加。
-------------------------------------------------------------------------
所以PUSH指令的执行过程其实是这样的。数据先入栈,然后SP上浮,指向栈顶,值减小。 POP的执行过程类似。 ------------------扩------------充------------------ ************************************ POP指令的执行过程可以看做如下方式: (temp) |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |