• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-05-06 14:21 Aet 隐藏边栏 |   抢沙发  4 
文章评分 3 次,平均分 5.0

汇编

指令相关部分。

转移指令

  1. 可以修改IP,或同时修改CS和IP的指令统称为转移指令
    1. 换而言之,转移指令就是可以控制CPU执行内存中某处代码的指令
  2. 8086CPU转移指令
    1. 只修改IP,如:jmp ax
    2. 同时修改CS和IP,为段间转移,如:jmp 1000:0
    3. 根据对IP的修改范围,可分为
      1. 短转移:-128~127
      2. 近转移:-32768~32767
    4. 分类
      1. 无条件转移指令
      2. 条件转移指令
      3. 循环指令
      4. 过程
      5. 中断

offset

  1. offset在汇编中是由编译器处理的符号
  2. 功能是取得标号的偏移地址

jmp指令

  1. 无条件转移指令
  2. 可以只修改IP,也可以同时修改CS和IP
  3. jmp给出的信息
    1. 转移的目的地址
    2. 转移的距离(段间转移、段内短转移、段内近转移)

dmp根据位移进行转移

  1. jmp short 标号(转到标号处执行指令)
  2. 段内短转移,对IP的修改范围为-128~127,即向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节
  3. 转移指令结束后,CS:IP应该指向标号处的指令

jcxz

  1. 有条件转移指令,所有的有条件转移指令都是短转移
  2. 在对应的机器码中包含转移的位移,而不是目的地址
  3. 对IP的修改范围为:-128~127
  4. jcxz 标号:如果(cx)=0,转移到标号处执行,当(cx)!=0时,什么也不做
  5. 当(cx)=0时,(ip)=(ip)+8位位移
  6. 8位位移=标号处的地址-jcxz指令后的第一个字节的地址
  7. 8位位移的范围为:-128~127,用补码表示
  8. 8位位移由编译程序在编译时算出

loop

  1. 循环指令,所有的循环指令都是短转移
  2. 在对应的机器码中包含转移的位移,而不是目的地址
  3. 对IP的修改范围为:-128~127
  4. loop 标号:(cx)=(cx)-1,如果(cx)!=0,转移到标号处执行
    1. (cx)=(cx)-1
    2. 如果(cx)!=0,(ip)=(ip)+8
  5. 8位位移=标号处的地址-loop指令后的第一个字节的地址
  6. 8位位移的范围为:-128~127,用补码表示
  7. 8位位移由编译程序在编译时算出

位移转移的意义

  1. 它们对IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的
  2. 在它们对应的机器码中不包含转移的目的地址,而是包含的是目的地址的位移

ret

  1. 转移指令,可以修改IP或同时修改CS和IP
  2. ret用栈中的数据,修改IP的内容,从而实现近转移
  3. 执行ret指令
    1. (ip)=((ss)*16+(sp))
    2. (sp)=(sp)+2
  4. CPU执行ret指令,用汇编解释
    1. pop IP

retf

  1. 转移指令,可以修改IP或同时修改CS和IP
  2. retf用栈中的数据,修改CS和IP的内容,从而实现远转移
  3. 执行retf指令
    1. (ip)=((ss)*16+(sp))
    2. (sp)=(sp)+2
    3. (cs)=((ss)*16+(sp))
    4. (sp)=(sp)+2
  4. CPU执行retf指令,用汇编解释
    1. pop IP
    2. pop CS

call

  1. CPU执行call指令时,要进行两步操作
    1. 将当前的IP或CS和IP压入栈中
    2. 转移

  1. call指令不能实现短转移
  2. call指令实现转移的方法和jmp指令的原理相同

依据位移进行转移的call指令

  1. call 标号
    1. 将当前的IP压栈后,转到标号处执行指令

转移的目的地址在指令中的call指令

  1. call far ptr 标号
  2. 实现的是段间转移

转移地址在寄存器中的call指令

  1. call 16位reg

转移地址在内存中的call指令

第一种

  1. call word ptr 内存单元地址

第二种

  1. call dword ptr 内存单元地址

mul

  1. 乘法指令
  2. 两个相乘的数,要么都是8位,要么都是16位。
    1. 如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中
    2. 如果是16位,一个默认放在AX中,另一个放在16位reg或内存字单元中
  3. 如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果默认高位默认放在DX中,低位放在AX中。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2021-11-20
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享