1. ret指令用栈中的数据,修改IP的内容,实现近转移
-
cpu执行ret指令时候,进行两步操作,(IP)=((ss)*16+(sp)); (sp) = (sp)+2
-
retf指令同时修改CS和IP的内容,进行4步操作,(IP)=((ss)*16+(sp)); (sp) = (sp)+2; (CS)=((ss)*16+(sp)); (sp) = (sp)+2
-
先IP后CS
-
ret例子:
-
retf例子
2. call 指令,短转移
- 经常与ret指令配合
- 执行call指令,进行2步操作:将IP或CS+IP压入栈;转移jmp
格式:call 标号
- 将当前IP压栈后,转移到标号处执行指令;第一步压栈:(SP) =(SP) - 2; ((ss)*16+(sp)) = (IP); 第二步转移:(IP) = (IP) + 16位位移。
-
所以call和ret配合,能实现跳转之后的返回,类似于函数调用一样。
call far ptr 标号,段间转移
- 相当于:push cs; push ip; jmp far ptr 标号
call 16位寄存器
- 相当于:push ip;jmp 16位寄存器
转移地址在内存中的call指令
- call word ptr 内存单元地址:push ip;jmp word ptr 内存地址
- call dword ptr 内存地址:push cs;push ip;j mp dword ptr 内存单元地址,段地址高位,偏移地址低位
mul指令:乘法指令
- mul reg ; mul 内存地址
- 相乘两个数要么都是8位要么都是16位
- 乘数默认在ax(16位)或al(8位)中
- 对于8位x8位,结果就在ax,16位*16位,ax存放低16位,dx存放高16位,类似于div
模块化程序设计
如何存储子程序需要的参数和返回值
- 可以存在寄存器中
- 内存传递:可以存在内存中,把内存空间的首地址赋值给寄存器,传递给所需要的子程序,对于批量数据的返回结果也可以这样,
- 栈传递:用栈传递数据。
- db ‘asdwdfqw’,0 ;以0为结尾的字符串