80x86指令【一】

您所在的位置:网站首页 地址传送类指令的作用 80x86指令【一】

80x86指令【一】

2024-07-17 06:51| 来源: 网络整理| 查看: 265

    根据我们要传送的数据类型和方式再细分,可以大概分成以下几个类型方便记忆:

 通用数据传送、地址传送、标志位传送,以及输入输出指令。

一、通用数据传送指令

 

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