第十章 call和ret指令
1、call和ret指令都是转移指令,他们都修改ip或同时修改cs和ip。
2、ret指令用栈中的数据,修改ip的内容,从而实现近转移。操作:1.(ip)=((ss*16)+(sp));2.(sp)=(sp)+2。retf指令用栈中的内容同时修改cs和ip
3、call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:1.将当前的ip或cs和ip压入栈中;2.转移(jmp)。Call指令不能实现短转移,跟jmp操作相似。操作:1.push IP;2.jum near ptr 标号。范围-32768~32767,补码表示。(转移位移)
4、转移的目的地址在指令中的call指令:段间转移指令call far ptr 标号。操作:1.push cs,push ip,jmp far ptr 标号。
检测点10.3:先cs入栈1000,此时ip=8,8+8=16,也就是10h。
5、转移地址在寄存器中的call指令:call 16位寄存器,操作:push ip,jmp s。2.call word ptr 内存单元地址,操作:push ip,jmp word ptr 内存单元地址。3.call dword ptr 内存地址,操作:push ip,jmp dword ptr 内存单元地址。
6、call和ret配合使用:利用call和ret来实现子程序机制,call指令转去执行子程序之前,call指令后面的指令的地址将存储在栈中,在子程序后面使用ret指令,用栈中的数据恢复设置的ip的值,从而转到call指令后面的代码处继续执行。
7、mul指令,乘法指令。相乘的两个数:要么都是8位的,要么都是16位的。乘数默认8位在al中,16位在ax中。结果8位:AX中,16位:高位dx中,低位ax中。格式:mul reg;mul 内存单元。
8、模块化程序设计:call和ret指令配合支持了汇编语言编程中的模块化设计(也就是面对过程)。①参数和结果的传递问题:批量数据传递,将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序,对于具有批量数据的返回结果,也可用同样的方法。除此之外,通用的方法就是栈。
9、注意养成良好的风格:程序美观、注释。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ;将以0结尾的字符串转化为大写(这个程序有问题,cx的处理)
2 assume cs:code,ds:data
3
4 data segment
5 db 'word',0
6 db 'unix',0
7 db 'wind',0
8 db 'good',0
9 data ends
10
11 code segment
12
13 start: mov ax,data
14 mov ds,ax
15 mov bx,0
16
17 mov cx,4
18 s:mov si,bx
19 call capital
20
21 add bx,5
22 loop s
23
24 mov ax,4c00h
25 int 21h
26
27 capital:mov cl,[si]
28 mov ch,0
29 jcxz ok ;判断cx是否为0
30 and byte ptr [si],11011111b
31 inc si
32 jmp short capital
33 ok:ret
34
35 code ends
36 edn start
这两天在看课后习题,头疼死了。。。。