王爽《汇编语言》第三版 第十章 call和ret指令
引言
call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现自程序的设计。
10.1 ret 和 retf
  ret指令用栈中的数据,修改IP的内容,从而实现近转移!
  CPU执行ret指令时,进行下面两步操作:
  1.(IP)=((ss)*16+(sp))
  2.(sp)=(sp)+2
  retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;
  CPU执行retf指令时,进行下面两步操作:
  1.(IP)=((ss)*16+(sp))
  2.(sp)=(sp)+2
  3.(CS)=((ss)*16+(sp))
  4.(sp)=(sp)+2
  CPU执行ret指令时,相当于进行:
    pop IP
  CPU执行retf指令时,相当于进行:
    pop IP
    pop CS
10.2 call 指令
  call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:
  1.将当前的 IP  或  CS和IP 压入栈中
  2.转移(jmp)
10.3 依据位移进行转移的call指令
  call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。
  call 标号(将当前的 IP 压栈后,转到标号处执行指令)
  CPU 执行指令“call  标号”时,相当于进行:
    push IP
    jmp near ptr 标号  
10.4 转移的目的地址在指令中的call指令
  call far ptr 标号(实现的是段间转移)
  CPU 执行指令 “call far ptr 标号” 时,相当于进行:
    push CS
    push IP
    jmp far ptr  标号
10.5 转移地址在寄存器中的call指令
  call 16位寄存器
  CPU执行指令“call 16位寄存器”时,相当于进行:
    push IP 
    jmp 16位寄存器
10.6 转移地址在内存中的call指令
转移地址在内存中的call指令有两种格式:
1.call word ptr 内存单元地址:
    push IP
    jmp word ptr 内存单元地址
2.call dword ptr 内存单元地址:
    push CS
    push IP
    jmp dword ptr 内存单元地址
10.7 call 和 ret 的配合使用
10.8 mul 指令
mul是乘法指令。
  相乘的两个数:要么都是8位,要么都是16位。
  1.8 位:  乘数位于AL中和 8位寄存器或内存字节单元中,结果位于AX中;
  2.16 位: 乘数位于AX中和 16 位寄存器或内存字单元中,结果位于DX(高位)和AX(低位)中。
  内存单元可以用不同的寻址方式给出,比如:
    mul byte ptr ds:[0]
    含义为: (ax)=(al)*((ds)*16+0);
    mul word ptr [bx+si+8]
    含义为: 
      (ax)=(al)*((ds)*16+(bx)+(si)+8)结果的低16位;
      (dx)=(al)*((ds)*16+(bx)+(si)+8)结果的高16位;
10.9 模块化程序设计
10.10 参数和结果传递的问题
10.11 批量数据的传递
10.12 寄存器冲突的问题
参考资料:《小甲鱼汇编零基础入门》
《汇编语言》第三版
                    
                
                
            
        
浙公网安备 33010602011771号