您的位置 首页 主动

汇编入门学习笔记 (八)—— 搬运指令

疯狂的暑假学习之汇编入门学习笔记(八)——转移指令参考:《汇编语言》王爽第9章可以修改ip或者同时修改cs和ip的指令统称为…

张狂的暑假学习之 汇编入门学习笔记 (八)—— 搬运指令

参阅: 《汇编语言》 王爽 第9章

能够修正ip或许一起修正cs和ip的指令统称为搬运指令。

8086CPU搬运转为分为:

段内搬运:只修正ip

段间搬运:一起修正cs和ip

段内搬运按ip修正的规模可分为:

短搬运:ip修正规模 -128~127

近搬运:ip修正规模 -32768~32767

搬运指令分为:

无条件搬运指令。如 jmp

条件搬运指令

循环指令。如 loop

进程。

中止。

1. offset,nop指令

offset 获取标号的偏移地址

nop 占用1一个字节

比如:

  1. assumecs:code
  2. codesegment
  3. start:movax,bx
  4. movsi,offsetstart
  5. movdi,offsets
  6. movax,cs:[si]
  7. movcs:[di],ax
  8. s:nop
  9. nop
  10. codeends
  11. endstart

2. 根据位移进行搬运的jmp指令

(1)jmp short 标号

是段内短搬运。

表明搬运到指定的标号处,且搬运的间隔规模为-128~127

用debug检查此指令时,会看见机器码,不会保存标号的地址,自会保存搬运的间隔

(2)jmp near ptr标号

是段内近搬运,搬运的间隔规模为-32768~32767,其他与jmp short 标号相同

2. 搬运地址在寄存器中的jmp指令

jmp 16位 reg

表明 (IP)=(16位 reg)

3.搬运地址在内存中的jmp指令

(1)jmp word ptr 内存单元地址

是段内近搬运。

比如:搬运到偏移地址为0123H的指令去,即便(IP)= 0123H

  1. movax,0123H
  2. movds:[0],ax
  3. jmpwordptrds:[0]

(2)jmp dword ptr 内存单元地址

是段间搬运

高地址表明搬运的段地址

低地址表明偏移地址

用debug检查机器码,能够发现,它是保存了段地址与偏移地址,而不是像段内搬运的指令时保存搬运的间隔

比如:搬运到段地址为0,偏移地址为0123H的指令去,即便得(CS)= 0,(IP)= 0123H

  1. movax,0123H
  2. movds:[0],ax
  3. movwordptrds:[2],0
  4. jmpdwordptrds:[0]

4. jcxz 指令

jcxz 指令为条件搬运指令。当cx为0时,搬运(与loop刚刚相反)。一切条件搬运指令都是短搬运。

比如:在内存2000H段中查找第一个值位0 的字节,并把它的偏移指定存储在dx中。

  1. assumecs:code
  2. codesegment
  3. start:movax,2000H
  4. movds,ax
  5. movbx,0
  6. s:movch,0
  7. movcl,[bx]
  8. jcxzok
  9. incbx
  10. jmpshorts
  11. ok:movdx,bx
  12. movax,4c00H
  13. int21H
  14. codeends
  15. endstart

5. jmp指令详细剖析

jmp s

jmp short s

jmp near ptr s

jmp far ptr s

向前搬运:

在像前搬运时,编译器能够在读到标号s后记下AC(地址核算器)的值as,在读到jmp …s (上面5种)后记下AC的值aj。编译器能够用as-aj核算出disp

(1)假如disp 在-128~127 内

上面的每一种指令都将转化为jmp short s

(2)假如disp 在-32768~32767内

关于jmp short s会编译过错

关于jmp s,jmp near ptr s会发生jmp near ptr s所对应的机器码。

关于jmp far ptr s,所对应的机器码为:EA 偏移地址 段地址。

先后搬运:

因为不能确认s方位,编译器先将上面的指令都作为 jmp short s来读取。记下jmp ..s 指令的方位和AC的值aj。

关于jmp short s 编译器生成一个EB和一个nop指令

关于jmp near ptr s编译器生成一个EB和两个nop指令

关于jmp far ptr s编译器生成一个EB和四个nop指令

当读到s时,记下AC的值as,核算disp = as – aj

(1)假如disp 在-128~127 内

指令都为 EB disp ,它们后边的一个nop变成8位的disp 。jmp s(1个)、jmp near ptr s (1个)跟jmp far ptr s (3个) nop指令不变

(2)假如disp 在-32768~32767内

关于jmp short s会编译过错

jmp s、jmp near ptr s 后边 两个nop变成搬运的16位disp。

jmp far ptr s 这填上相应的段地址,偏移地址。

6. 剖析一个古怪的程序

  1. assumecs:code
  2. codesegment
  3. movax,4c00h
  4. int21h
  5. start:movax,0
  6. s:nop
  7. nop
  8. movdi,offsets
  9. movsi,offsets2
  10. movax,cs:[si]
  11. movcs:[di],ax
  12. s0:jmpshorts
  13. s1:movax,0
  14. int21h
  15. movax,0
  16. s2:jmpshorts1
  17. nop
  18. codeends
  19. endstart

追后程序会运转s处的

mov ax,4c00h

int 21h

而正常停止。

为什么?

debug能够发现,jmp short s1 复制到s处后,由本来的jmp 0018H变成 jmp 0000H。

可是实质的机器码是EBF6没变便是ip = ip – 10。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/276845.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部