汇编学习笔记29,30

周五,周六没有看,周日把29,30一起看了。

 

29讲内容为子程序调用的参数传递。

子程序调用的参数传递主要有几种:利用寄存器传递参数,利用约定存储单元传递参数,利用堆栈传递参数。

 

利用约定存储单元传递参数可适用于参数较多的情况下。

 

例:32位数相加

 

; 子程序名: MADD

; 功能:       32位数相加

; 入口参数: DATA1和DATA2缓冲区中分别存放要相加的32位数

; 出口参数: DATA3缓冲区中存放结果。

; 说明:       (1) 32位数据采用高高低低的原则存放在缓冲区中

;               (2) 可能产生的进位存放在DATA3开始的第5个字节中

MADD PROC

PUSH AX

PUSH CX

PUSH SI

MOV CX, 2

XOR SI, SI

MADD1: MOV AX, WORD PTR DATA1[SI]

ADC AX, WORD PTR DATA2[SI]

MOV WORD PTR DATA3[SI], AX

INC SI

INC SI

LOOP MADD1

MOV AL, 0

ADC AL, 0

MOV BYTE PTR DATA3 + 4, AL

POP SI

POP CX

POP AX

RET

MADD ENDP

 

利用堆栈传递参数,把要传递的参数依次压入堆栈中进行传递。

 

例:

 

; 子程序名: STRLEN

; 功      能: 测量字符串的长度

; 入口参数: 字符串起始地址的段值和偏移在堆栈中

; 出口参数: AX=字符串长度

STRLEN PROC

PUSH BP

MOV BP, SP

PUSH DS

PUSH SI

MOV DS, [BP + 6]

MOV SI, [BP + 4]

MOV AL, 0

STRLEN1: CMP AL, [SI]

JZ STRLEN2

INC SI

JMP STRLEN1

STRLEN2: MOV AX, SI

SUB AL, [BP + 4]

POP SI

POP DS

POP BP

RET

STRLEN ENDP

 

; 调用程序

MOV AX, SEG STRMESS

PUSH AX

MOV AX, OFFSET STRMESS

PUSH AX

CALL STRLEN

ADD SP 4

MOV LEN, AX

 

 

第30讲开始,讲DOS功能调用及应用。

DOS功能主要有三类,设备驱动(基本I/O),文件管理及其他(内存管理,置取时间,置取中间向量,中止程序等)

DOS功能调用分为三步:

1) 准备入口参数

2) 将调用号送入AH

3) 软中断指令INT 21H

 

1.基本I/O功能调用

1) 键盘输入

1号功能: 带回显的键盘输入, 输入字符送入DL中,检测CTRL+BREAK键,如果按下,则停止等待

8号功能: 不带回显的键盘输入,但是会检测用户按下CTRL+BREAK时停止。

7号功能: 不带回显的键盘输入,也不检测是否按下CTRL+BREAK

 

2) 键盘输出

2号功能: 向标准输出设备输出显示一个字符,入口参数放入DL

9号功能: 显示输出一个字符串,输出字符串首地址在DS: DX中,输出字符串以$结束。

 

3) 递归调用

直接调用它自身,称为直接递归调用。递归子程序必须使用寄存器或堆栈传递参数

 

例:用2进制形式显示所按键的ASCII码

 

CSEG SEGMENT

ASSUME CS: CSEG, DS: CSEG

START: MOV AH, 1

INT21H

CALL NEWLINE          ; 回车换行

MOV BL, AL

MOV CX, 8

NEXT: SHL BL, 1

MOV DL, 30H

ACD DL, 0

MOV AH, 2

INT 21H

LOOP NEXT

MOV DL, 'B'

MOV AH, 2

INT 21H

MOV AH, 4CH

INT 21H

CSEG ENDS

END START

 

; NEWLINE

; 回车换行

NEWLINE PROC

PUSH AX

PUSH DX

MOV DL, 0DH

MOV AH, 2

INT 21H

MOV DL, 0AH

MOV AH, 2

INT 21H

POP DX

POP AX

RET

NEWLINE ENDP

 

 

例2:求阶乘

 

; FACT

; n!

; (AX) = n

; (AX) = n!

FACT PROC

PUSH DX

MOV DX, AX

CMP AX, 0

JZ DONE

DEC AX

CALL FACT

MUL DX

POPDX

RET

DONE: MOV AX, 1

POP DX

RET

FACT ENDP

posted @ 2010-12-27 20:21  杨海龙  阅读(297)  评论(0编辑  收藏  举报