MOV指令需要注意的 (转)

对于MOV 这个传送指令 有7点规定:

1. 两个操作数的数据类型一定要相同,源操作数是8位那么目的操作数也得是8位的。以此类推 16位 32位也一样。
        例如:mov   EAX,EAX  //正确的
                    mov   EAX,AX     //错误的
2.两个操作数不可以同时为段寄存器 ,
       例如: MOV    ES,DS  //错误的
3.代码段寄存器CS 不能作为 目的操作数,但可以作为 源操作数使用。
       例如:MOV   CS,AX  // 错误的
                   MOV   AX,CS  //正确的
4.立即数不可以直接传给段寄存器,
       例如:MOV   DS,100H   //错误的
5.立即数也不能作为目的操作数,
        例如:MOV 100H,AX    // 错误的
6.指令指针 IP 寄存器 不可以做为 MOV 指令操作数;
7.两个操作数不能同时作为存储单元,
        例如:MOV  VARA,VARB  
那么真的规定 2 4 7 这几个规定,我可以可以用寄存器作为中转来达到传递数值的最终目的。  
数据传递示范
汇编语言-mov注意事项

 

 

我们学习传送指令 中的填充指令 MOVSX 这个指令它的作用是把位数短的源操作数传送给位数长的目的操作数。

  指令的格式正确如下:
      指令             寄存器          内存地址                      //格式1
   MOVSX             EAX  ,       [0A2B3FO1]  

     指令             寄存器          寄存器                           //格式2
     MOVSX             EAX  ,       EBX

      指令             寄存器       立即数                             //格式3
     MOVSX             EAX  ,       100H    

填充指令功能:



汇编语言-mov注意事项

那么填充指令也分:符号填充指令与零填充指令
符号填充指令 =  MOVSX
符号填充指令填充方式: 用源操作数的 符合位 来填充 目的操作数的高位数据位。

零填充指令 =  MOVZX
零填充指令填充方式:恒用 0 来填充 目的操作数的高位数据位。
下面我举个例子: 假设 8位寄存器  AL = 78H  
  MOVSX     CX,AL
  执行这句指令后 CX 的值是多少?   既然MOVSX 是符号填充指令 那么答案将是等于:   0FF78H

而零填充指令
  MOVZX     CX,AL
  执行这句指令后 CX 的值是多少?   既然MOVZX 是零填充指令 那么答案将是等于:   0078H                                      

这样示范我相信大家都能够了解 是吧 O(∩_∩)O  

上面2句汇编指令 源操作数 都是完全一样的 都是 AL 寄存器,但因为它们的填充指令方式不同,所以得得结果就不同。

posted on 2013-09-23 21:37  莫扎特也是程序猿  阅读(2526)  评论(0)    收藏  举报

导航