子程序设计实验
1.调用子程序实现三数求和
STACKA SEGMENT
DB 100 DUP(?)
STACKA ENDS
DATA SEGMENT
NUM DW 1234H,5678H,2597H
SUM DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACKA
MAIN PROC FAR;主过程
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA BX,NUM;指针初始化
CALL ADDSUB;调用求和子程序
MOV SUM,CX;存结果
CALL DISP;调用显示子程序
RET
MAIN ENDP
ADDSUB PROC NEAR;求和子程序
MOV CX,0
ADD CX,[BX];利用存储器方式传参数进来
ADD CX,[BX+2]
ADD CX,[BX+4];利用寄存器方式返回结果
RET
ADDSUB ENDP
DISP PROC NEAR;显示子程序
MOV DI,16;16位二进制数,循环输出
L3: MOV DL,'0'
RCL CX,1;带进位循环左移一位
JNC L4;进位为零跳转L4,即要显示的该数为零
MOV DL,'1'
L4: MOV AH,2;输出到屏幕
INT 21H
DEC DI
JNZ L3
RET
DISP ENDP
CODE ENDS
END START
2.求平方根
STACKA SEGMENT
DB 100 DUP(?)
STACKA ENDS
DATA SEGMENT
N DW 81
PEG DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACKA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,N;取参数,用寄存器传
CALL SQRSUB;调用求平方根子程序
MOV PEG,BX;用寄存器返回结果
MOV AH,4CH
INT 21H
SQRSUB PROC NEAR;求平方根子程序
CALL ABSSUB;调用求绝对值子程序
MOV BX,0
MOV CX,1
SQR1: SUB AX,CX;循环,直到为负
JC SQR2;有借位,返回
INC BX;根的值加1
ADD CX,2;下一个奇数
JMP SQR1
SQR2: RET
SQRSUB ENDP
ABSSUB PROC NEAR;求绝对值子程序
AND AX,AX;影响符号位
JNS ABS1;结果为正,返回
NEG AX;负数求补,返回补码
ABS1: RET
ABSSUB ENDP
CODE ENDS
END START
ABSSUB PROC NEAR;求绝对值子程序
AND AX,AX;影响符号位
JNS ABS1;结果为正,返回
NEG AX;负数求补,返回补码
ABS1: RET
ABSSUB ENDP
CODE ENDS
END START
3.递归求N!
STACKA SEGMENT
DB 100 DUP(?)
STACKA ENDS
DATA SEGMENT
N DW 5
RTL DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACKA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,N
MOV DH,0
CALL FACT;递归调用求N!的子程序
MOV RTL,DX
MOV AH,4CH
INT 21H
FACT PROC NEAR;递归求N!的子程序
CMP AL,0
JZ DONE;0!返回1
PUSH AX;保存现场
DEC AX
CALL FACT;递归调用
BACK: POP CX;返回时操作
XOR AX,AX;异或,相当于把AX清零
MULT: ADD AX,DX
LOOP MULT;加CX(AX)次,相当于乘
MOV DX,AX
EXIT: RET
DONE: MOV DX,1;最底层,开始返回
JMP EXIT
FACT ENDP
CODE ENDS
END START
4.两位十六进制数转换成ASCII码并显示出来
DATA SEGMENT
BUF DB 12H,34H,56H,78H,90H,0ABh,0CDH,0EFH,0F3H,08BH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,10;设置循环次数
LEA SI,BUF;指针初始化F
AGAIN: MOV BL,[SI];取数
SHR BL,1;右移四位,取高位,TASM中可用SHR BL,4
SHR BL,1
SHR BL,1
SHR BL,1
CALL HEXASC;调用显示子程序
MOV BL,[SI];再次取该数
AND BL,0FH;取低位
CALL HEXASC;调用显示子程序
INC SI;修改指针
LOOP AGAIN
MOV AH,4CH;返回DOS
INT 21H
HEXASC PROC NEAR;显示子程序
CMP BL,9
JBE NEXT
ADD BL,7
NEXT: ADD BL,30H
MOV Dl,BL
SHR DL,1;右移四位,取高位,TASM中可用SHR DL,4
SHR DL,1
SHR DL,1
SHR DL,1
OR DL,30h
MOV AH,2
INT 21H
MOV DL,BL
AND DL,0FH
OR DL,30H
MOV AH,2
INT 21H
RET
HEXASC ENDP
CODE ENDS
END START