汇编语言基本概念(续7)
前面学习了汇编指令中也有一些转移指令,在汇编中,转移就是GOTO,它没有IF,SWITCH等高级语言中的一些特性。汇编中指令的执行是按照CS:IP进行单步执行的。转移指令可以只修改IP,也可以两者同时修改。转移指令分无条件转移如jmp,条件jcxz,循环loop,过程及中断等五种。首先学习一个新的操作符offset,这个是由编译器处理的伪指令,功能是取得标号的偏移地址。如start: mov ax,offset start 相当于mov ax,0
上图就清楚的显示了offset只是在编译器处理阶段的伪指令,编译之后,这地方完全用真实的偏移值替换了。下面列出几种常见的转移指令:
【1】jmp short 标号 段内短转移,对IP的修改范围是-128~127,对应的机器指令EB偏移。这里的位移是标号处的地址-jmp指令后的第一个字节的地址
【2】jmp near ptr 标号 段内近转移。实现的功能是(IP)=(IP)+16位位移。同前面一样。位移范围是-32768 ~32767
【3】jmp far ptr 标号 段间转移,或称之为远转移,这里转移后指令的(cs)就是标号所在的段地址,(ip)就是标号在段中的偏移地址。
【4】jmp reg 转移地址在寄存器中的jmp指令。
【5】jmp word ptr 内存单元地址(段内转移) 从内存单元地址处开始存放着一个字,是转移的目的偏移地址。如 mov ax,0123h mov ds:[0],ax jmp word ptr ds:[0] => (IP) = 0123H
【6】jmp dword ptr 内存单元地址(段间转移) 从内存单元地址处开始存放着两个字,高地址是段地址,低地址处是偏移地址
【7】jcxz 标号 如果(cx)=0,转移到标号执行。是短转移.IP 范围是-128~127,其转移方式怀jmp short 标号相同。相当于if((cx) ==0) jmp short 标号
【8】loop 标号 指令为循环指令,短转移。 (cx)=(cx)-1 ,如果(cx)!=0,则转移
前面这几种汇编指令,以标号作为跳转目的地址的指令,其真正取到的地址都是相对地址,正因为是相对地址,所以程序装在内存的不同位置均可以执行,不必因为编译时候分配的地址而在装载时无法无法运行,也正因为是相对地址,并且这个相对地址是在汇编编译时候进行计算的,因此,实际上如果标号与jmp语句之间间隔过大,就会发生编译错误。