汇编--学习笔记(十二)-子程序(二)-子程序数据传递

来源:互联网 发布:新东方托福知乎 编辑:程序博客网 时间:2024/06/04 04:57

一、利用存储器传送数据
 利用存储器传送数据时,通常是把一个参数表(数据表)放在某一数据区,然后把这个数据区的首地址传送给过程,而过程把计算结果送至某个变量。
例子一:
 主程序把一个3字节的参数表的首地址放在SI寄存器中。子程序ADSUB把参数表中第一个字节和第二个字节相加,结果存入第三个字节。

DISP MACRO ;宏定义     OR DL,30H     MOV AH,02H     INT 21H     ENDMDATAS SEGMENTLIST1 DB 23      DB 68      DB ?LIST2 DB 35,26,? DATAS ENDSSTACKS SEGMENT PARA STACK 'STACH'       DW 4 DUP(?)STACKS ENDSCODES SEGMENT    ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:    MOV AX,DATAS ;装载数据段中的值    MOV DS,AX    MOV AX,STACKS ;转载堆栈段中的值    MOV SS,AX    MOV SI,OFFSET LIST1 ;获取参数表1首地址,并将其放到SI中去CALL1:    CALL ADSUB  ;调用子程序对参数表1运算RET1:    CALL OUTP ;调用子程序,输出运算结果1    MOV DL,' ';显示一个空格符号    MOV AH,02H    INT 21H    LEA SI,LIST2 ;获取参数表2的首地址放到SI中CALL2:    CALL ADSUB ;调用子程序对参数表2运算RET2:    CALL OUTP    MOV AH,4CH    INT 21HADSUB PROC ;    MOV AL,[SI] ;将SI的第一个字节的值放到AL中去    ADD AL,[SI+1] ;将SI的第一个字节与第二字节与第二字节相加    MOV [SI+2],AL ;将前两个字节相加的值放到参数表的第三个字节中去    RETADSUB ENDPOUTP PROC    ;二进制化成十进制输出    MOV AH,0  ;AX高位清零    MOV BL,10    DIV BL    ;AX/BL    MOV DL,AL ;商在AL(十位)    MOV BH,AH    DISP    MOV DL,BH ;余数在AH(个位)    DISP    RETOUTP ENDPCODES ENDS    END START
原创粉丝点击