⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汇编002.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  a.CBW,前面已介绍,在第三篇。
  b.CWD,前面已介绍,在第三篇。
  c.CWDE,是80386新增的指令。格式:CWDE。功能:将AX的符号位扩展到EAX的高16位中。
  d.CDQ,是80386新增的指令。格式:CDQ。功能,将EAX的符号位扩展到EDX中。
  e.以上四条指令均不影响标志位。
  f.举例说明:
  ;If AX=1234H,EAX=99991234H
  CBW;After processing the instruction,AX=1234,DX=0000H
  CDQ;After processing the instruction,EAX=99991234H,EDX=FFFFFFFFH

  BB.逻辑运算指令和移位指令NOT,AND,OR,XOR,TEST,SAL,SAR,SHL,SHR,ROL,ROR,RCL,RCR,SHLD,SHRD
  a.NOT,AND,OR,XOR,TEST这些指令的功能和用法与8086完全相同,不过它们支持32位操作。
  b.TEST,测试指令,该指令测试的结果并不回送到目的操作数和源操数。之所以要使用这条的指令,主要是因为根据TEST指令得到的结果,进行程序的条件转移。
  c.SAL,算术左移,功能和8086一样,但在8086中,如果在移位的位数超过1位,那么一定要移位的位数放在CX寄存器中。在80386中,可以不用这样做,其它的移位指令也一样。除了这一点以外,用法和8086一样,当然也支持32位操作。以下的语句均是合法的。
  SHL AL,5;这在8086中是非法,但在80386中是合法的
  SHL WORD PTR [SI],3
  d.SAR,算术右移,将操作数右移指定的位数,但左边的符号位保持不变,移出的最低位进入CF标志位。
  e.SHL,逻辑左移,用法和功能与SAL一样。
  f.SHR,逻辑右移,将操作右移指定的位数,同时每移一位,左边用0补充,移出的最低位进入CF标志位。
  g.说明:在80386中,实际移位的位数是指令中移位位数的低5位,也就是说移位位数的范围在0-31或0-1FH,CF标志位总是保留着目的操作数最后被移出位的值。当移位位数大于操作数的长度时,CF被置0。如果移位位数为1,移位前后的结果的符号位都是一样,那么很明显的是该操作数经移位后没有移出,此时OF=0。这四条指令的移位示意图(我画的是16位操作数的移位示意图,8位和32依此类推),SAL,SHL相当于乘法;SAR,SHR相当于除法。
  SAL:
  |-------------------------------------------------------------------------------------------|
  |CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|
  |-- ----------------------------------------------------------------------------------------|
  SHL:
  |-------------------------------------------------------------------------------------------|
  |CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|
  |--- ---------------------------------------------------------------------------------------|
  SAR:
    |--------------------------------------------------------------------------------------------|
  |-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|CF||
  | |---|----------------------------------------------------------------------------------------|
  |     ^
  |-----|最高位保持不变
  SHR:
     |--------------------------------------------------------------------------------------------|
  0->|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|CF||
     |--------------------------------------------------------------------------------------------|
  h.ROL,循环左移,支持32位操作数,用法和8086一样。
  i.ROR,循环右移,支持32位操作数,用法和8086一样。
  j.RCL,带进位的循环左移,支持32位操作数,用法和8086一样。
  k.RCR,带进位的循环右移,支持32位操作数,用法和8086一样。
  l.ROL,ROR,RCL,RCR的移位示意图(仍然以16位操作数来画,8位/32位依次类推):
  ROL:
   |--------------------------------------------------------------------------------------------------|
   |<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|<--------|
   |--------------------------------------------------------------------------------------------------| 
   |--------------------------------------------------------------------------------------------------|  
  ROR:
   |-------------------------------------------------------------------------------------------|
   |->|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|
   |-------------------------------------------------------------------------------------------|
   |-------------------------------------------------------------------------------------------| 
 RCL:
   |-------------------------------------------------------------------------------------------------|
   |<-|CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|<-|
   |-------------------------------------------------------------------------------------------------|
   |-------------------------------------------------------------------------------------------------|   
  RCR:
   |-------------------------------------------------------------------------------------------------|
   |->|CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|
   |---- --------------------------------------------------------------------------------------------|
   |-------------------------------------------------------------------------------------------------|
  m.SHLD,80386新增的双精度左位指令,指令格式:SHLD OPRD1,OPRD2,M
  n.SHRD,80386新增的双精度右移指令,指令格式:SHRD,OPRD1,OPRD2,M
  o.m,n这两条指令的使用规则是:源操作数OPRD1可以是16位或32位通用寄存器或者16位存储单元或者32位存储单元,源操作数OPRD2必须是16位或32位通寄存器,M表示移位次数,可以是CL寄存器,也可以是8位立即数。功能:SHLD是将源操作数OPRD1移M位,空出的位用OPRD2高端的M位来填补,源操作数OPRD2的内容不变,最后移出的位放在CF中;SHRD将源操作数OPRD1移M位,空出的位用OPRD2低端M位来填补,源操作数OPRD2保持不变,最后移出的位放在CF中,对于这两条指令,当移位位数仅为1的话,移出和移后的符号位不变的话,那么OF=0,如果符号位不一样的话,那OF=1。
  p.这两条指令是80386新增的指令,举两个简单的例子加以说明:
  p1.SHLD:
  MOV AX,8321H
  MOV DX,5678H
  SHLD AX,DX,1
  SHLD AX,DX,2
  分析一下该指令的详细执行过程(用示意图, 第一个图画的就是AX的内容):
  AX=8321h
  |-------------------------------|
  |1|0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|   
  |-------------------------------|
  根据指令SHLD AX,DX,1,先左移一位,得到AX=0642H:
  |-------------------------------|
  |0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|0|    CF=1    
  |-------------------------------|
  经过上一步的移位后,AX的最后一位(即bit0)空出来,其值为0;根据指令的用法将用DX的第15位填充,填充后AX的内容为:
  |-------------------------------|
  |0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|0|    
  |-------------------------------|
  同时由于移位后AX的符号位与移位前AX的符号位不同,所以在移位过程中产生了溢出,OF=1,最后结果AX=0642H。
  同理,SHLD AX,DX,2,执行完这条指令后,最后结果为AX=0644H
  p2.SHRD:
  MOV EAX,12345678H
  MOV EDX,99994599H
  SHRD AX,DX,1
  SHRD AX,DX,2
  分析一下该指令的详细执行过程(用示意图,第一个图画的是EAX的内容):
  EAX=12345678H
  |---------------------------------------------------------------|
  |0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|1|0|1|1|0|0|1|1|1|1|0|0|0|
  |---------------------------------------------------------------|
  根据指令SHRD AX,DX,1,将AX右移一位得到EAX=091A2B3EH:
  |---------------------------------------------------------------|
  |0|0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|1|0|1|1|0|0|1|1|1|1|1|0|
  |---------------------------------------------------------------|
  经过上一步的移位后,EAX的最高位(第31位)空出来用0填充,根据指令的用法,最EDX的第0位来填充,填充后EAX的内容为:
  |---------------------------------------------------------------|
  |1|0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|0|1|1|0|0|1|1|1|1|0|0|0|
  |---------------------------------------------------------------|
  即EAX=891A2B3EH,CF=0,OF=0
  同理,指令SHRD AX,DX,2,执行完这条件指令后,最后结果为EAX=048D159C,CF=0,OF=0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -