彙編--學習筆記(十二)-子程式(二)-子程式資料傳遞
阿新 • • 發佈:2019-01-03
一、利用儲存器傳送資料
利用儲存器傳送資料時,通常是把一個引數表(資料表)放在某一資料區,然後把這個資料區的首地址傳送給過程,而過程把計算結果送至某個變數。
例子一:
主程式把一個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