子程序设计实验

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

4.两位十六进制数转换成ASCII码并显示出来

posted on 2008-11-07 19:00  光影  阅读(228)  评论(0编辑  收藏  举报

导航