Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1355661
  • 博文数量: 416
  • 博客积分: 13005
  • 博客等级: 上将
  • 技术积分: 3297
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 16:26
文章分类

全部博文(416)

文章存档

2014年(1)

2013年(4)

2012年(46)

2011年(64)

2010年(12)

2009年(4)

2008年(40)

2007年(187)

2006年(58)

分类: WINDOWS

2007-10-23 16:26:04

6.2.2

用寄存器传递参数

通过寄存器传递数据或数据地址。

  通常选择ALAXDX:AX(或EAX)传递字节、字或双字。

  传递16位偏移地址最好选择SIDIBX

  传递32位分段地址可以用DS:BXDS:SIDS:DIES:BXES:SIES:DI等。

  当然,要根据需要来选择,以方便为主,但很少使用BP来传递参数。

 

 

DESG SEGMENT

COUNT

DW 5

;DW1个字,即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

;DW1个字,即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

 

 

阅读(1161) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~