image.png
    一、ret 和 retf:
    1、ret 指令用栈中的数据,修改IP的内容,从而实现近转移
    2、 CPU执行 ret 指令时,进行以下两步操作:
    ①、(IP)=((ss)16 + (sp))
    ②、(sp)=(sp) + 2
    3、retf 指令用栈中的数据,修改 CS 和 IP 的内容,从而实现远转移
    4、 CPU执行 retf 指令时,进行以下步操作:
    ①、(IP)=((ss)
    16 + (sp))
    ②、(sp)=(sp) + 2
    ③、(CS)=((ss)*16 + (sp))
    ④、(sp)=(sp) + 2

    二、call 指令:
    1、call 指令经常跟 ret 指令配合使用,因此CPU执行 call 指令,进行两步操作:
    ①、将当前的 IP 或 CS和IP压入栈中
    ②、转移(jmp)
    2、call 指令不能实现短转移,除此之外,call 指令实现转移的方法和 jmp 指令的原理相同

    三、依据位移进行转移的 call 指令:
    1、call 标号:(将当前的IP压入栈后,转到标号处执行指令)
    ①、16位位移 = “标号”处的地址-call 指令后的第一个字节的地址
    ②、16位位移的范围-32768~32767,用补码表示
    ③、16位位移由编译器在编译时算出
    2、 CPU执行此种格式的指令时,进行以下操作:
    ①、(sp)=(sp) - 2
    ((ss)*16 + (sp))=(IP)
    ②、(IP)=(IP) + 16位位移

    四、转移的目的地址在指令中的 call 指令:
    1、call far ptr 标号 :
    ①、(sp)=(sp) - 2
    ②、((ss)16 + (sp))=(CS)
    ③、(sp)=(sp) - 2
    ④、((ss)
    16 + (sp))=(IP)
    2、(CS)=标号所在的段地址
    (IP)=标号所在的偏移地址
    3、CPU执行”call far ptr 标号”时,相当于进行:
    push CS
    push IP
    jmp far ptr 标号

    五、转移地址在寄存器中的 call 指令:
    1、指令格式:call 16位寄存器
    功能:
    (sp)=(sp) - 2
    ((ss)*16 + (sp))=(IP)
    (IP)=(16位寄存器)
    2、汇编语法解释此种格式的指令,CPU执行 call 16位reg时,相当于进行:
    push IP
    jmp 16位寄存器

    六、转移地址在内存中的 call 指令:
    1、转移地址在内存中的 call 指令有两种格式:
    ②、call word ptr 内存单元地址
    ②、call dword ptr 内存单元地址
    2、call word ptr 内存单元地址
    汇编语法解释:
    push IP
    jmp word ptr 内存单元地址
    3、call dword ptr 内存单元地址
    汇编语法解释:
    push CS
    jmp dword ptr 内存单元地址
    七、call 和 ret 的配合使用:

    1. assume cs:code
    2. code segment
    3. start:mov ax,1
    4. mov cx,3
    5. call s
    6. mov bx,ax
    7. mov ax,4c00H
    8. int 21H
    9. s:add ax,ax
    10. loop s
    11. ret
    12. code ends
    13. end start

    八、mul 指令:
    1、mul是乘法指令,使用 mul 指令时,需注意以下:
    ①、相乘的两个数,要么都是8位,要么都是16位
    8位:AL中和8位寄存器或内存字节单元中
    16位:AX中和16位寄存器或内存字单元中
    ②、结果:
    8位:AX中
    16位:DX(高位) 和 AX(低位)中
    2、格式:
    mul reg
    mul 内存单元
    3、内存单元可以用不同的方式给出:
    ①、mul byte ptr ds:[0]
    含义:(ax)=(al)((ds)16 + 0)
    ②、mul word ptr [bx + si + 8]
    含义:
    (ax)=(ax)((ds)16 + (bx) + (si) + 8)结果的低16位
    (dx)=(ax)((ds)16 + (bx) + (si) + 8)结果的高16位
    image.pngimage.png