复习汇编语言(3)

Hello world,hello blog!

Posted by 吴柚 on April 6, 2019

转移指令

  1. 转移指令:可以控制CPU执行内存中某处的代码的指令。

8086CPU的转移行为分为:

¥. 只修改IP时,称为段内转移,如:jmp ax。

    *短转移:IP的修改范围-128——127

    *近转移:IP的修改范围-32768——32767

¥.同时修改CS和IP 时,称为段间转移,如:jmp 1000:0。

8086CPU的转移指令分为:

  • 无条件转移指令(如:jmp)

  • 条件转移指令

  • 循环指令(如:LOOP)

  • 过程

  • 中断

  1. offset操作符,在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。

Mov ax,offset start ;取得标号start的偏移地址,送ax

  1. 依据位移进行转移的JMP指令

Jmp short 标号 (转到标号处执行指令)

实现的是段内转移,它向前转移时可以最多超过128个字节,向后转移可以最多越过127个字节。

“标号”是代码段中的标号,指明了指令要转移的目的地,转移指令结束后,CS:IP应该指向标号处的指令。

  • 指令“jmp short 标号”的功能为:(IP)=(IP)+8位位移

(1)8位位移=“标号”处的地址-jmp指令后的第一个字节的地址;

(2)short指明此处的位移为8位位移;

(3)8位位移的范围为-128——127,用补码表示;

(4)8位位移由编译程序在编译时算出。

  • 指令“jmp near ptr 标号”功能:(IP)=(IP)+16位位移

(1)16位位移=“标号”处的地址-jmp指令后的第一个字节的地址;

(2)near ptr指明此处的位移为16位位移,进行的是段内近转移;

(3)16位位移的范围为-32768——32767,用补码表示;

(4)16位位移由编译程序在编译时算出。

  1. 转移的目的地址在指令中的JMP指令

    指令“jmp far ptr 标号”实现段间转移,又称为远转移。功能:

    (CS)=标号所在段的段地址;

    (IP)=标号在段中的偏移地址。

  2. 转移地址在寄存器中的JMP指令

    指令格式:jmp 16位寄存器

    功能:(IP)=( 16位寄存器)

  3. 转移地址在内存中的JMP指令

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

       功能:从内存单元地址开始存放着一个字,是转移的目的偏移地址,内存单元地址可用寻址方式的任一格式给出
    
       ```
       如:Jmp word ptr ds:[0]
    
          Jmp word ptr [bx]
       ```
    

    (2)jmp dword ptr 内存单元地址(段间转移)

       功能:从内存单元地址开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
    
        (CS)=(内存单元地址+2)
    
        (IP)=(内存单元地址)内存单元地址可用寻址方式的任一格式给出。
    
       ```
       如:mov ax,0123h
    
          Mov [bx],ax
    
          Mov word ptr [bx+2],0
    
          Jmp dword ptr [bx]
    
       执行后,(CS)=0,(IP)=0123H,CS:IP指向0000:0123。
       ```
    
  4. loop指令 循环指令

所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都是:-128——127.

指令格式:loop 标号((cx)=(cx)-1,如果(cx)≠0,转移到标号处执行。)

操作:1.(cx)=(cx)-1;

      2. 如果(cx)≠0,(IP)=(IP)+8位位移。

         如果(cx)=0,什么也不做(程序向下执行)

相当于:(cx)- -;

        If((cx) ≠0)jmp short 标号;