1. 程式人生 > >彙編--學習筆記(十二)-子程式(二)-子程式資料傳遞

彙編--學習筆記(十二)-子程式(二)-子程式資料傳遞

一、利用儲存器傳送資料
 利用儲存器傳送資料時,通常是把一個引數表(資料表)放在某一資料區,然後把這個資料區的首地址傳送給過程,而過程把計算結果送至某個變數。
例子一:
 主程式把一個3位元組的引數表的首地址放在SI暫存器中。子程式ADSUB把引數表中第一個位元組和第二個位元組相加,結果存入第三個位元組。

DISP MACRO ;巨集定義
     OR DL,30H
     MOV AH,02H
     INT 21H
     ENDM

DATAS SEGMENT
LIST1 DB 23
      DB 68
      DB ?
LIST2 DB 35,26,? 
DATAS ENDS

STACKS SEGMENT PARA STACK 'STACH'
       DW 4 DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    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 21H ADSUB PROC ; MOV AL,[SI] ;將SI的第一個位元組的值放到AL中去 ADD AL,[SI+1] ;將SI的第一個位元組與第二位元組與第二位元組相加 MOV [SI+2],AL ;將前兩個位元組相加的值放到引數表的第三個位元組中去 RET ADSUB ENDP OUTP 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 RET OUTP ENDP CODES ENDS END
START