计算机硬件上机实验4程序

更新时间:2023-11-17 20:35:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第四次实验 子程序结构 必做实验

1. 补:P32 2)实验内容① ②

2. P43实验内容② ;P45 实验内容④,P51实验内容① 练习实验

3. P39 例1.7; P51 2)实验内容③

P39 例1.7

编写实现三数求和运算, 并将结果以二进制形式显示出来 设 3个数为:1234H, 5678H, 2597H

(CX)和: 8E43H 显示为:1000 1110 0100 0011

子程序DISP完成相关操作

DISP PROC NEAR ;

MOV DI,16 ;将显示16位信息,每位或'1'或'0' L3: MOV DL,'0' ;取'0'的ASCII码 RCL CX,1 ;从和的最高位开始

;每次移动一位进入进位位

JNC L4 ;无进位, 准备显示DL中的'0'

MOV DL,'1' ;有进位,DL中存入'1',准备显示‘1' L4: MOV AH,2 ;DOS 02号功能

INT 21H ;显示DL中的'0'或'1' DEC DI ;计数器减1

JNZ L3 ;16个二进制符号显示完?尚未,继续

RET ;已完,返回主程序(L2处) :

CF CX 1000 1110 0100 0011 有无进位 这里的0或1

P43 2)实验内容 ②

关于16进制数转ASCII

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 加30H 加37H (为编程方便,先加7,再加30H) 寄存器传递参数

;把从BUF开始的 10个单元中两位16进制数转换为SACII, ;并在屏幕上显示出来.要求码型转换通过子程序HEXASC实现。 ;近程调用:主、子程序共用一个代码段。采用寄存器传递参数 近程调用 堆栈中只 。。。。。。。。。。。。 保存偏移 AGAIN: MOV AL,[BX] 地址 000D CALL HEXASC 返回地址 0010 INC BX 。。。。。。。。。 入口地址 0017 HEXASC PROC NEAR MOV DL, AL PUSH CX 。。。。 POP CX PUSH AX 。。。。 POP AX

主程序 子程序 注意堆栈的 动作变化 初始栈顶 SS:0000 XXXX

CALL SS:FFFE 0010 (共用一个代码段,只保存偏移地址) PUSH CX SS:FFFC 000A 在执行RET时,应 POP CX 保证SP指向FFFE PUSH AX SS:FFFC 28AB POP AX

DATA SEGMENT

BUF DB 0ABH,0CDH,0DEH,01H,02H,03H,3AH,4BH,5CH,6FH DATA ENDS CODE SEGMENT

第一次取AB,通 ASSUME CS:CODE,DS:DATA 过寄存器AL,传START: MOV AX,DATA 递给子程序 MOV DS,AX MOV CX,10 ;计数器置初值10 LEA BX,BUF ;BX指向被转换数据 AGAIN: MOV AL,[BX] ;取两位16进制数XY,送AL CALL HEXASC ;调子程序完成转换(参数在寄存器AL) INC BX ;从子程序返回,指向下一个待转换数据 LOOP AGAIN ;10次转换完成?尚未,继续 MOV AH,4CH ;已完成,退出 INT 21H

HEXASC PROC NEAR ;定义子程序为近过程(同一代码段) MOV DL,AL ;通过寄存器AL,把主程序的参数 ;(两位16进制数XY)送到子程序 PUSH CX ;保存计数器当前值(SHR要用CL) MOV CL,4 ;设移位4次 SHR DL,CL ;移位后,DL=0X

POP CX ;恢复计数器当前值 PUSH AX ;保存XY

CMP DL,9 ;16进制数X与9比较 JBE NEXT ;小于或等于9,转NEXT ADD DL,7 ;大于9,先加7

NEXT: ADD DL,30H ;再加30H. 小于等于9,只加30H MOV AH,2 ;已把X转换为ASCII码,

INT 21H ; 调DOS 2号功能在屏幕上显示X POP AX ;恢复AX内的XY MOV DL,AL ;DL=XY AND DL,0FH ;DL=0YH CMP DL,9 ;Y与9比较

JBE NEXT1 ;小于等于9,转NEXT1 ADD DL,7 ;大于9,先加7

NEXT1: ADD DL,30H ;再加30H.小于等于9,只加30H ;把Y转换为ASCII码 MOV AH,2 ;显示Y INT 21H

RET ;返回主程序 HEXASC ENDP ;子程序结束 CODE ENDS ;代码段结束 END START ;整个程序结束

P45 ④

;编写求自然数级数前几项刚大于1000的项数n

2 2 22

; 1+ 2+ 3 + 4 +………

;寄存器传递参数。本子程序是近程调用过程 DATA SEGMENT

N DW ? ;分配两个单元存放项数n

SUM DW ? ;存放刚大于1000的前n项的平方和 DATA ENDS ;

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV BX,0 ;BX存放平方累加和,BX带初值进入子程序 MOV CX,1 ;CX用于存放从1开始的自然数(项数) AGAIN: MOV AX,CX ;通过寄存器AX把当前自然数

; (向子程序传递的参数)传送给子程序 CALL SQUARE ;调子程序完成自然数平方、累加 CMP BX,1000 ;从子程序带回结果,大于1000? JA EXIT ;是,转EXIT INC CX ;否,自然数加1

JMP AGAIN ;继续进行平方和累加 EXIT: MOV N,CX ;大于1000,存项数n

MOV SUM,BX ;前n项的平方和累加值存入内存SUM MOV AH,4CH INT 21H

;以下是子程序SQUARE(完成平方、累加操作) ****** SQUARE PROC NEAR ;定义近过程 MUL AL ;计算平方

ADD BX,AX ;完成累加,返回给主程序的参数送入BX RET ;返回主程序 SQUARE ENDP ;子程序结束

;子程序结束***************

CODE ENDS ;代码段结束 END START ;整个程序结束

BX AX BX 主程序 子程序 完成初始化,比较,存结果 完成平方、累加

本文来源:https://www.bwwdw.com/article/u9vv.html

Top