第十章.md

第十章 call ret

ret 与 retf

ret 使用栈中的数据,修改 ip,进行程序跳转

CPU执行ret时,进行以下步骤:

  1. (ip) = (ss * 16 + sp)
  2. (sp) = (sp) + 2

retf 同ret,修改 ipcs

  1. (ip) = (ss * 16 + sp)
  2. (sp) = (sp) + 2
  3. (cs) = (ss * 16 + sp)
  4. (sp) = (sp) + 2

call

1567410682485

  1. call + 标号

    sp = sp -2
    ss*16+sp = ip
    ip = ip + 16位位移
    

    1567410897156

  2. call far ptr + 标号

    sp = sp - 2
    ss*16+sp = cs
    sp = sp -1
    ss*16 + sp = ip
    
    cs = 目的ds
    ip = 目的ip
    
  3. call + 16位寄存器

  4. call word ptr 内存单元地址

    push ip
    jmp word ptr 内存单元地址
    

    call dword ptr 内存单元地址

    push cs
    push ip
    jmp dword ptr 内存单元地址
    

    dword 双字型数据,32bits,可以同时保存cs与ip


call与ret配合使用

1567412538336


mul指令

位数 要操作的数据 结果
8 × 8 al或内存单元 ax
16 × 16 ax或内存单元 dx(高位)ax(低位)

注意:只能是8 × 8 或 16 ×16


批量数据返回

当批量数据需要返回时,使用寄存器明显不现实,这时将批量数据存储到内存单元中,返回内存单元首地址即可。还可以使用栈进行参数传递

原文地址:https://www.cnblogs.com/nsfoxer/p/14353813.html