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
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
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