⼦程序⼀般都是完成某种特定功能的程序段。当⼀个程序调⽤⼀个⼦程序时,通常都向⼦程序传递若⼲个数据让它来处理;当⼦程序处理完后,⼀般也向调⽤它的程序传递处理结果,我们称这种在调⽤程序和⼦程序之间的信息传递为参数传递。
  ⽤程序向⼦程序传递的参数称为⼦程序的⼊⼝参数,⼦程序向调⽤它的程序传递的参数称为⼦程序的出⼝参数。⼦程序的⼊⼝参数和出⼝参数都是任意项,对某个具体的⼦程序来说,要根据具体情况来确定其⼊⼝和出⼝参数,也可以⼆者都没有。
  程序和被调⽤⼦程序之间的参数传递⽅法是程序员⾃⼰或和别⼈事先约定好的信息传递⽅法。这种信息传递⽅法可以是多种多样的,在本节,我们只介绍常⽤的、⾏之有效的参数传递⽅法有:寄存器传递参数、约定存储单元传递参数和堆栈传递参数等。如果对其它的参数传递⽅法感兴趣的话,可参考其它《汇编语⾔程序设计》书籍。
  7.3.1 寄存器传递参数
  ⼀⽅⾯,由于CPU中的寄存器在任何程序中都是“可见”的,⼀个程序对某寄存器赋值后,在另⼀个程序中就能直接使⽤,所以,⽤寄存器来传递参数最直接、简便,也是最常⽤的参数传递⽅式。但另⼀⽅⾯,CPU中寄存器的个数和容量都是⾮常有限,所以,该⽅法适⽤于传递较少的参数信息。
  例7.1是⽤寄存器传递参数的例⼦,⼦程序处理的数据被保存在寄存器AL中。假设有下列的程序段:
  …
  MOVAL, ’b’
  CALLUPPER;⼦返回时,(AL)=’B’
  …
  MOVAL, ’2’
  CALLUPPER;⼦返回时,AL的值不变,因为’2’不是字母
调用子程序的例子
  …
  例7.3 按五位⼗进制的形式显⽰寄存器BX中的内容,如果BX的值⼩于0,则应在显⽰数值之前显⽰负号’-’。
  例如:(BX)=123,显⽰:00123;(BX)=-234,显⽰:-00234;
  解:
  ;⼦程序功能:把寄存器BX的内容按⼗进制有符号数显⽰出来
  ;⼊⼝参数:BX
  ;出⼝参数:⽆,只有显⽰信息
;算法描述:
  1、定义6个字节的存储单元
  2、先判断BX是否⼩于零,如果是,则先显⽰负号’-’,再取BX的绝对值;
  3、采⽤除10,得余数的⽅法,从低位向⾼位求出每位⼗进制位;
  4、输出数据的字符串。
  SubDataSEGMENT
  DB 5 DUP(’0’), 0ah, 0dh, ’$’    ;0ah、0dh:换⾏、回车
  SubDataENDS
  DISPBXPROC
  ASSUMEDS:SubData
  PUSHDS
  PUSHDX
  PUSHCX
  PUSHAX
  MOVAX, SubData;取⼦程序所⽤的数据区段地址
  MOVDS, AX
  CMPBX, 0
  JGEnext
  MOVDL, ’-’
  MOVAH, 2
  INT21H;显⽰负号’-’
  NEGBX;求-BX,使其值为正数
  next:MOVSI, 4
  MOVAX, BX
  MOVCX, 10D
  again:XORDX, DX
  IDIVCX;DX存放余数,AX存放商
  ADDDL, ’0’
  MOV[SI], DL
  DECSI
  JGEagain
  XORDX, DX
  MOVAH, 9
  INT21H;调⽤中断21的功能9,显⽰DS:DX指向的字符串  POPAX
  POPCX
  POPDX
  POPDS
  RET
  DISPBXENDP

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。