王爽《汇编语言》第9章 转移指令的原理

    可以修改IP,或同时修改CS和IP的指令统称为转移指令。
    段内转移只修改IP,分为短转移和近转移。
    转移指令可以分为:无条件转移指令,条件转移指令,循环指令,过程,中断这五类。
    offset取得段偏移地址。
    jmp为无条件转移指令,jmp shor只修改IP,范围为-128~127.
    注意jmp在只修改IP时,使用的是相对地址,所以同一个指令在不同地址执行起来转移到的地方是不一样的。
    jmp far ptr实现段间转移(远转移),同时修改CS和IP。
    可以使用jmp 16位reg实现转移。
    可以使用jmp word ptr+地址数值实现段内转移,用jmp dword ptr+地址数值实现段间转移。注意jmp dword ptr后面的地址数据高位代表CS,低位代表IP。


    jcxz为有条件转移指令,所有的有条件转移指令都是短转移,对IP的修改范围是-128~127。
    指令格式:jcxz 标号(如果(cx)=0,转移到标号处执行)
    操作:当(cx)=0时,(IP)=(IP)+8位位移;
    8位位移=标号处的地址-jcxz指令后的第一个字节的地址;
    8位位移的范围为-128~127,用补码表示;
    8位位移由编译程序在编译时算出。
    jcxz应该就是jmp cx=zroe的意思。

    loop指令为循环指令,所有的循环指令都是短转移。也是对cx减1,再对cx进行判断再做转移,只不过是cx!=0时转移,。注意:如果循环体里把cx赋值为0,loop还是会继续循环的,因为会先减1,0-1则为FFFF,不为0,不能跳出。需要跳出应该设置cx=1。

    根据位移进行转移是出于代码移植到不同地方的需要,因为只要相对位移中间代码的长度没变,相对位移是不变的;绝对地址是只要前面有长度改变是有都是会改变的。
    要注意相对位移的值范围为-128~127.超出范围时编译会报错。

你可能感兴趣的:(ASM)