call ret
1>
都是转移指令,修改ip,或同时修改cs ip
ret 指令用栈中的数据,修改ip的内容,实现近转移 pop to ip
retf 指令用栈中的数据,修改ip,cs的内容,实现远转移pop to ip/ pop to cs
格式
ret /retf
依靠栈来弹出 cs 和ip
作业
mov ax,1000h
push ax
mov ax,000h
push ax
retf
2>
call指令
执行call时候
1将当前的ip或,cs和ip push to stack
2转移
不能实现短转移
3>依据位移进行转移的call指令
push ip
jmp near ptr 标号
4>转移地址位目的地址的call指令
push cs
push ip
jmp far ptr 标号 ;先ip 后cs
作业
ax 0012h
ax=1010h
5>
转移地址在内存中的call指令
push ip
jmp 16位寄存器
作业0006H
6>
转移地址在内存中的call指令
1 call word ptr 内存单元地址
push ip
jmp word ptr 内存单元
2call dword ptr 内存单元地址
push cs
push ip
jmp dword ptr 内存单元
6>call 个ret的配合
框架
assume cs:code
code segment
main:
;
;
call sub1 ;push 保存ip
;
mov ax,4c00
int 21h
sub1: ; ;子程序
call sub2
;
ret ;pop 原来的ip
sub2: ; ;字程序
;
ret
code ends
end main
7>
mul指令
两个数相乘法
两个8位:一个默认在ah,另一个8位寄存器或内存单元
两个16位:一个默认在ax中,另一个16位寄存器或内存单元
结果:8位ah中 /16位,高位--dx,低位--ax
8>模块化程序设计
将复杂的问题分解
利用call ret指令,我们可以用简洁的方法,实现多个相互联系
功能独立的子程序来解决一个复杂的问题
9>参数和结构传递的问题
实际是:如何存储子程序需要的参数和产生的返回值
用寄存器来存储参数和结果最常用的方法
调用者:将参数送入参数寄存器,从结果寄存器中取到返回值
子程序:从参数寄存器取得参数,将返回值送入结果寄存器
data
dw 1,2,3,4,5,6,7,8
dd 0,0,0,0,0,0,0,0
start mov ax,data
mov ds,ax
mov si ,0
mov di,16
mov cx,8
s:
mov bx,[xi]
call cube
mov [di].2,dx ; 偏移地址(di)+2 ,dx为高的16bits 写入地址
add si,2
add di,4
loop sh
int 21h
10>
批量数据的传送
将批量数据放在内存中,将他们所在内存空间的首地址放在寄存器中,传递给需要的子程序
and byte ptr [si],11011111b ?
11>寄存器的冲突
bx定位数据项,si定位元素
子程序中使用的寄存器,很可能在主程序中也要使用!造成寄存器使用上的冲突
解决方案:
1:在编写的子程序的时候,注意看看子程序中有没有用到会产生冲突的寄存器
2:在编写子程序的时候,不要使用会产生冲突的寄存器
实际这两个方案不可行
简单通用解决办法
子程序开始:
子程序中的寄存器push
子程序内容
子程序中的寄存器pop
return ret/retf
12>课程设计
子程序-字符显示
子程序-除法溢出
子程序-数值显示
阅读(1141) | 评论(1) | 转发(0) |