分类: WINDOWS
2007-10-23 16:26:04
6.2.2 |
用寄存器传递参数 |
通过寄存器传递数据或数据地址。
通常选择AL、AX、DX:AX(或EAX)传递字节、字或双字。
传递16位偏移地址最好选择SI、DI或BX,
传递32位分段地址可以用DS:BX、DS:SI、DS:DI、ES:BX、ES:SI或ES:DI等。
当然,要根据需要来选择,以方便为主,但很少使用BP来传递参数。
DESG SEGMENT |
||
COUNT |
DW 5 |
;DW:1个字,即16bit或两个字节 |
ARRAY |
DW 8,-1,32766,0,100 |
;32766=7FFEH |
MAX |
DW ? |
|
DESG ENDS |
||
CSEG SEGMENT |
||
ASSUME CS:CSEG,DS:DSEG | ||
START: |
MOV AX,DSEG |
|
MOV DS,AX |
||
LEA SI,ARRAY |
;LEA:装入有效地址 | |
MOV CX,COUNT |
||
CALL FINDMAX |
||
MOV AH,4CH |
||
INT 21H |
||
FINDMAX PROC |
||
MINSW |
= 8000H |
;16位带符号数的最小值 |
PUSH SI |
||
PUSH CX |
||
MOV AX,MINSW |
||
NEXT: |
CMP AX,[SI] |
|
JG SKIP |
||
MOV AX,[SI] |
||
SKIP: |
ADD SI,2 |
|
LOOP NEXT |
||
POP CX |
||
POP SI |
||
RET |
;一定不要忘记 | |
FINDMAX ENDP |
||
CSEG ENDS |
||
END START |
6.2.3 |
用地址表传递参数 |
建立一个地址表,存放所有参数的地址,传递地址表的首地址给过程。
这种方法特别适合于参数较多的情况。
DESG SEGMENT |
||
COUNT |
DW 5 |
;DW:1个字,即16bit或两个字节 |
ARRAY |
DW 8,-1,32766,0,100 |
;32766=7FFEH |
MAX |
DW ? |
|
ADDRTBL |
DD COUNT,ARRAY,MAX |
;DD:双字 |
DESG ENDS |
||
CSEG1 SEGMENT |
||
ASSUME CS:CSEG1,DS:DSEG | ||
START: |
MOV AX,DSEG |
|
MOV DS,AX |
||
LEA BX,ADDRTBL |
;LEA:装入有效地址 | |
CALL FINDMAX |
||
MOV AH,4CH |
||
INT 21H |
||
CSEG1 ENDS |
||
CSEG2 SEGMENT |
||
ASSUME CS:CSEG2 |
||
FINDMAX PROC FAR |
||
MINSW |
= 8000H |
;16位带符号数的最小值 |
PUSH AX |
||
PUSH CX |
||
PUSH SI |
||
PUSH ES |
||
LES SI,[BX] |
||
MOV CX,ES:[SI] |
;取得元素个数 | |
LES SI,4[BX] |
;取得数组首地址 | |
MOV AX,MINSW |
||
NEXT: |
CMP AX,ES:[SI] |
|
JG SKIP |
||
MOV AX,ES:[SI] |
||
SKIP: |
ADD SI,2 |
|
LOOP NEXT |
||
LES SI,8[BX] |
;取得存放最大值的地址 | |
MOV ES:[SI],AX |
||
POP ES |
||
POP SI |
||
POP CX |
||
POP AX |
||
RET |
;一定不要忘记 | |
FINDMAX ENDP |
||
CSGN2 ENDS |
||
END START |