子程序设计实验

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

 

posted on 2008-11-09 12:48  光影  阅读(342)  评论(0编辑  收藏  举报

导航