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、注意养成良好的风格:程序美观、注释。
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