第十章 call ret
ret 与 retf
ret 使用栈中的数据,修改 ip,进行程序跳转
CPU执行ret时,进行以下步骤:
- (ip) = (ss * 16 + sp)
- (sp) = (sp) + 2
retf 同ret,修改 ip 和 cs
- (ip) = (ss * 16 + sp)
- (sp) = (sp) + 2
- (cs) = (ss * 16 + sp)
- (sp) = (sp) + 2
call
-
call + 标号
sp = sp -2 ss*16+sp = ip ip = ip + 16位位移
-
call far ptr + 标号
sp = sp - 2 ss*16+sp = cs sp = sp -1 ss*16 + sp = ip cs = 目的ds ip = 目的ip
-
call + 16位寄存器
-
call word ptr 内存单元地址
push ip jmp word ptr 内存单元地址
call dword ptr 内存单元地址
push cs push ip jmp dword ptr 内存单元地址
dword 双字型数据,32bits,可以同时保存cs与ip
call与ret配合使用
mul指令
位数 | 要操作的数据 | 结果 |
---|---|---|
8 × 8 | al或内存单元 | ax |
16 × 16 | ax或内存单元 | dx(高位)ax(低位) |
注意:只能是8 × 8 或 16 ×16
批量数据返回
当批量数据需要返回时,使用寄存器明显不现实,这时将批量数据存储到内存单元中,返回内存单元首地址即可。还可以使用栈进行参数传递