复习汇编语言(4)

Hello world,hello blog!

Posted by 吴柚 on April 7, 2019

CALL和ret指令

  1. ret指令 用栈中的数据,修改IP的内容,从而实现近转移
    
    CPU执行ret指令时,1.(IP)=((SS)*16+(SP))
    
                     2. (SP)=(SP)+2
    
               相当于:POP IP
    
    Retf指令 用栈中的数据,修改CS和IP 的内容,实现远转移

    CPU执行retf指令时,进行下面四步操作:

                             1. (IP)=((SS)*16+(SP))

                             2. (SP)=(SP)+2

                             3. (CS)=((SS)*16+(SP))

                             4. (SP)=(SP)+2

               相当于:POP IP

                         POP CS
  1. CPU 执行CALL指令时,进行两步操作:
    
        1.将当前的IP或CS和IP压入栈中;
    
        2.转移
    
    CALL 指令不能实现短转移,除此之外,和JMP指令原理相同。
    
        “call 标号”(将当前IP压栈后,转到标号处执行指令)
    
               1. (SP)=(SP)-2      ((SS)*16+(SP))=(IP)
    
               2. (IP)=(IP)+16位位移。
    
           相当于:PUSH IP
    
                  JMP near ptr 标号
    

“call farptr 标号”段间转移

(1)(SP)=(SP)-2

((SS)*16+(SP))=(CS)

(SP)=(SP)-2

((SS)*16+(SP))=(IP)

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

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

      相当于:push cs

        Push IP

        Jmp far ptr  标号

Call 16位寄存器,

           功能:1. (SP)=(SP)-2

((SS)*16+(SP))=(IP)

(IP)=(16位寄存器)

           相当于: PUSH IP

                     Jmp 16位寄存器

        call wordptr 内存单元地址

           相当于:push IP

                     Jmp word ptr 内存单元地址

       call dwordptr 内存单元地址

           相当于:push CS

                  push IP

                  Jmp dword ptr 内存单元地址
  1. call 和 ret配合使用实现子程序的机制

框架如下:

Assume cs:code

Code segment

Main: :

        :

        Call sub1

        :

    Sub1: :

        Call sub2

        :

        Ret

    Sub2:

        :

        Ret

Code ends

End main

  1. mul 乘法指令;
  • 两个相乘的数,要么都是8位,要么都是16位;如果是8位,一个默认放在AH中,另一个放在8位寄存器或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位寄存器或内存字单元中。

  • 8位乘法,结果默认放在AX中;16位乘法,结果高位默认在DX中存放,低位在AX中存放。

  1. 避免寄存器冲突的:

在子程序的开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。

    标准框架:     

           子程序开始:子程序中使用的寄存器入栈

                         子程序内容

 子程序中使用的寄存器出栈

返回(ret,retf)