复杂的X86指令举例

1.串操作指令,对存储器中的数据串进行每次一个元素的操作,串的基本单位是字节或字,串长度可达64KB。

   MOVSB指令(字节串传送),在存储器中将指定位置的一个字节单元传送到存储器另一个指定的位置,REP 前缀(无条件重复,当CX寄存器不等于0时,重复执行串操作指令)

串操作指令的特性

  隐含操作数:源串地址为DS:SI,目的串地址为ES:DI,串的长度在CX寄存器中。

  隐含的操作,处理完一个串元素后的操作(硬件自动完成)

    (1)修改SI和DI,指向下一个串元素

    (2)若使用重复前缀,如果是则将CX寄存器的内容减1

  

  串传送方向(标志寄存器中的DF标志位) CPU提供两条控制指令,对标志位进行操作,STD把DF标志置1,CLD把DF标志置0

    设置DF=0:从“源串”的低地址开始传送,传送过程中,SI和DI自动增量修改

    设置DF=1:从“源串”的高地址开始传送,传送过程中,SI和DI自动减量修改 

    方向标志的作用应对“源串”和“目的串”的存储区域部分重叠的问题。

 

2.循环控制指令

  LOOPNE/LOOPNZ指令(不为零/不相等时循环)

  格式:LOOPNE LABEL

        LOOPNZ LABEL

  操作:(1)将CX寄存器的内容减1

     (2)若CX不等于0且ZF=0,转移到LABEL继续执行,否则,结束循环,顺序执行下一条指令

 

3.查表指令

  XLAT指令(换码,查表

  格式:XLAT

  操作:首先在数据段中定义一个字节型数据表

  (1)从BX中取得数据表起始地址的偏移量

  (2)在AL中取得数据表索引值

  (3)在数据表中查得表项内容

  (4)将查得的表项内容存入AL

 

4.十进制调整指令

  DAA指令(加法十进制调整指令)

  格式:DAA

  操作:跟在二进制加法指令之后

     将AL中的“和”数调整为压缩BCD数格式

        将调整结果送回AL

  15H + 16H,结果为2BH,执行DAA后,结果变为31H,压缩的BCD,意思是用4位二进制数来表示一个十进制数(0-9)。