汇编语言程序设计Chapter6-8.pptVIP

  • 0
  • 0
  • 约1.72万字
  • 约 83页
  • 2018-12-09 发布于河南
  • 举报
汇编语言程序设计Chapter6-8

第7章 子程序和库 调用子程序指令格式如下: CALL 子程序名/Reg/Mem 子程序的调用指令分为近(near)调用和远(far)调用。如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移。 7.2 子程序的调用和返回指令 7.2.1 调用指令 第7章 子程序和库  如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作。 例如: CALL DISPLAY ;DISPLAY是子程序名 CALL BX ;BX的内容是子程序的偏移量 CALL WORD1 ;WORD1是内存字变量,其值是子程序的偏移量 CALL DWORD1 ;DWORD1是双字变量,其值是子程序偏移量和段值 CALL word ptr [BX] ;BX所指内存字单元的值是子程序的偏移量 CALL dword ptr [BX] ;BX所指内存双字单元的值是子程序的偏移量和段值 第7章 子程序和库 当子程序执行完时,需要返回到调用它的程序之中。为了实现此功能,指令系统提供了一条专用的子程序返回指令。其格式如下: RET/RETN/RETF [Imm] 子程序的返回在功能上是子程序调用的逆操作。为了与子程序的远、近调用相对应,子程序的返回也分:远返回和近返回。 7.2.2 返回指令 第7章 子程序和库 如果返回指令后面带有立即数(其值通常为偶数),则表示在得到返回地址之后,SP还要增加的偏移量,它不是类似于高级语言中子程序的返回值。 例如: RET ;可能是近返回,也可能是远返回 RETN ;近返回指令 RETF ;远返回指令 RET 6 ;子程序返回后,(SP)←(SP) + 6 第7章 子程序和库 例7.1:编写一个子程序UPPER,实现把寄存器AL中存放的字符变大写。 解: ;子程序功能:把AL中存放的字符变大写 ;入口参数:AL ;出口参数:AL ;算法描述:判断AL中字符必须在’a’~’z’之间才能把该字符变为大写 UPPER PROC CMP AL, ‘a’ ;书写’a’的ASCII码61H也可以 JB over CMP AL, ‘z’ JA over SUB AL, 20H ;书写指令AND AL, 0DFH也可以 over: RET UPPER ENDP 例7.2:编写一个求字符串长度的子程序StrLen,该字符串以0为结束标志,其首地址存放在DS:DX,其长度保存在CX中返回。 解: ;子程序功能:求字符串的长度 ;入口参数:DS:DX存放字符串的首地址,该字符串以0为结束标志 ;出口参数:CX存放该字符串的长度 ;算法描述:用BX来指针来扫描字符串中的字符,如果遇到其结束标 志,则停止扫描字符串操作 StrLen PROC PUSH AX PUSH BX ;用堆栈来保存子程序所用到的寄存器内容 XOR CX, CX XOR AL, AL MOV BX, DX again: CMP [BX], AL JZ over INC CX ;增加字符串的长度 INC BX ;访问字符串的指针向后移 JMP again over: POP BX ;恢复在子程序开始时所保存的寄存器内容 POP AX RET StrLen ENDP 第7章 子程序和库 一方面,由于CPU中的寄存器在任何程序中都是“可见”的,一个程序对某寄存器赋值后,在另一个程序中就能直接使用,所以,用寄存器来传递参数最直接、简便,也是最常用的参数传递方式。但另一方面,CPU中寄存器的个数和容量都是非常有限,所以,该方法适用于传递较少的参数信息。 例7.1是用寄存器传递参数的例子,子程序处理的数据被保存在寄存器AL中。假设有下列的程序段: … MOV AL, ‘b’ CALL UPPER ;子返回时,(AL)=’B’ … MOV AL, ‘2’ CALL UPPER ;子返回时,AL的值不变,因为’2’不是字母 … 7.3 子程序的参数传递 7.3.1 寄存器传递参数 第7章 子程序和库 例7.3:按五位十进制的形式显示寄存器BX中的内容,如果BX的值小于0,则应 在显示数值之前显示负号‘-’。 例如:(BX)=123,显示:00123;(BX)=-234

文档评论(0)

1亿VIP精品文档

相关文档