分类: 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 |
||