微机原理子程序设计

合集下载

微机原理与技术实验四:子程序结构

微机原理与技术实验四:子程序结构

微机原理与技术实验四: 子程序结构实验四:子程序设计一、实验目的:掌握子程序结构, 熟悉汇编上机环•='二、实验内容: 设有数组SCORE存放学生的成绩(0-100分),编写一个子程序统计0~59分、60〜69分、70〜79分、80〜89分、90〜100分的人数,并分别存放到SCOREE. SCORED、SCOREC、SCORERSCOREA 单元中。

编写一个主程序与之配合使用。

二、实验步骤:1、在“轻松汇编”环境下编写、编译和生成程2、进入DEBUG界面,运行程序,观察SCOREE、SCORED> SCOREC、SCORED> SCOREA变量的值是否正确:在DEBUG下运行程序:F9键观察多个变量值:“Data” 9 “Add Watch” 今“输入变量1"“Data” 9 “Add Watch”今“输入变量2”DATA SEGMENTSCOREDB 80,78,45,81,90,72,60,75SCOREE DBSCORED DBSCOREC DBSCORED DBSCOREA DBDATA ENDSSTCK SEGMENTDB 10 DUP(?)STCK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STCKSTART:;以下为子程序COUNT PROC补全程序RET COUNT ENDP CODE ENDSMOV INTAH ,4CH 21H五、实验小结说明:实验报告要包涵上述五项DATA SEGMENTSCORE DB 80,7&45,81,90,72,60,75SCOREE DB 0SCORED DB 0SCOREC DB 0SCORER DB 0SCOREA DB 0DATA ENDSSTCK SEGMENTDB 10 DUP(?)STCK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STCKSTART:MOV AX,DATAMOV DS,AXLEA SI,SCOREMOV CX,8Al: CALLINCCOUNT SIDEC CXCMP CX,OJNZ AlMOV AH,4CHINT 21HCOUNT PROCMOV AL,[SI]CMP AL,90JNB A2CMP AL,80JNB A3CMP ALJOJNB A4CMP AL,60JNB A5INC SCOREERETA2: INC SCOREARETA3: INC SCORERRETA4: INCRETA5: INCRETCOUNT ENDP CODE ENDSEND SCOREC SCOREDSTART。

“汇编语言与微机原理”课程教学中汇编子程序实验设计

“汇编语言与微机原理”课程教学中汇编子程序实验设计

5 8 ・
Co mp u t e r Er a No. 2 2 01 3
“ 汇 编语言与 微机原理’ ’ 课 程教学中 汇编子 程序实 验设计
赵 永标 。张 其林 ,詹 彬 ,康长 青
( 湖北文理学院数学与计算机科学学院,湖北 襄阳 4 4 1 0 5 3 )
摘 要 :“ 汇编语 言与微 机原理” 是 计算机科 学与技术 专业 的必修基 础课 程。在教 学中汇编语 言子程序 实验设计普遍存
关键词 :汇编语言 ;子程序 ;宏 ;中断 ;实验设计 中图分类号 : G6 4 2 文献标志码 : B 文章 编号 : 1 0 0 6 — 8 2 2 8 ( 2 0 1 3 ) 0 2 — 5 8 — 0 2
Ex p e r i me n t a l d e s i g n o f a s s e mb l y s u b — r o u t i n e s i n “ a s s e mb l y l a n g u a g e a n d mi c r o c o mp u t e r p r i n c i p l e ’ ’
Z h a o Y o n g b i a o ,Z h a n g Qi l i n ,Z h a n Bi n ,Ka n g C h a n g q i n g
( S c h o o l o f M a t h e m a t i c s a n d C o m p u t e r S c i e n c e , H u b e i U n i v e r s i t y f o A r t a n d S c i e n c e , X i a n g y a n g , H u b e i 4 4 1 0 5 3 ,C h i n a )

微机原理4_2

微机原理4_2

Y
P1
标号1:
N Y P2
条件2成立 ?
标号2:

N
条件n成立 ?
Y
Pn
标号n:
N
Pn+1
标号n+Βιβλιοθήκη :TEST/CMP指令(测试条件1) Jx 标号1 ;不满足转标号1 处理体P1… JMP 标号n+1 标号1:TEST/CMP指令(测试条件2) Jx 标号2 ;不满足转标号2 处理体P2… JMP 标号n+1 标号2:TEST/CMP指令(测试条件3) Jx 标号3 ;不满足转标号3 处理体P3… JMP 标号n+1 标号3:TEST/CMP指令(测试条件4) … … 标号n+1:(公共出口)
Y
Z <= 1
结束
EXT:
MOV Z, AL RET
30
程 序 ;-- 数据段定义 ---------------------------------SEGMENT X DB 242 Y DB 67 Z DB ? DAT ENDS ;-- 代码段定义 ---------------------------------COD SEGMENT ASSUME DS: DAT, CS: COD MAIN PROC FAR PUSH DS ; 保存返回地址 SUB AX, AX PUSH AX MOV AX, DAT MOV DS, AX ; 初始化DS
3.源程序的基本结构:顺序、分支、循环、过程
14
如何绘制程序框图(流程图)?
(1)用方框表示工作框,框中用简明语言 标明要完成的功能
(2) 用菱形框表示判断框
?
Y
15
N
框中标明比较、判断和条件

微型计算机原理及接口技术ch10-子程序设计

微型计算机原理及接口技术ch10-子程序设计

第6章子程序设计为什么用子程序? UML中的设计模式?6.1.子程序结构主程序与子程序间的关系6.1.1子程序的定义过程名PROC 属性...RET/RETF[过程名] ENDP属性: NEAR, FAR1.主程序与子程序在同一代码段内例 6.1.1CODE SEGMENTMAIN PROC FAR…CALL SUB1…RETMAIN ENDPSUB1 PROC NEAR…CALL SUB2…RETSUB1 ENDPSUB2 PROC NEAR…RETSUB2 ENDP…CODE ENDSEND MAIN2.主程序与子程序不在同一个代码段例6.1.2CODE1 SEGMENTMAIN1 PROC FAR……CALL SUB3…MAIN1 ENDPSUB3 PROC FAR…RETSUB3 ENDPCODE1 ENDSCODE2 SEGMENTMAIN2 PROC FAR…CALL SUB3…MAIN2 ENDPCODE2 ENDSEND MAIN16.1.2子程序的调用和返回CALL RET 对堆栈的使用。

CALL RETF6.1.3现场的保存与恢复为什么要保存现场与恢复现场?1.利用栈指令进行现场的保存与恢复例6.1.3SUB4 PROC NEARPUSH AXPUSH BXPUSH CX…子程序体POP CXPOP BXPOP AXRETSUB4 ENDP**注意保存与恢复的顺序.2.利用数据传送指令进行现场的保存与恢复DATA SEGMENTBUFFER DW 4 DUP(?) DATA ENDSSUB5 PROC NEARLEA DI, BUFFERMOV [DI], AXMOV [DI+2], BXMOV [DI+4], CXMov [DI+6], DX…子程序体LEA DI, BUFFERMOV AX, [DI]MOV BX, [DI+2]MOV CX, [DI+4]MOV DX, [DI+6]RETSUB5 ENDP**现场保存在子程序的数据空间.**有什么问题? DI?3.利用PUSHA和POPA进行现场的保存与恢复(286以上)SUB6 PROC NEARPUSHA…子程序体POPARETSUB6 ENDP4.利用PUSHAD和POPAD指令进行现场的保存与恢复(386以上)SUB7 PROC NEARPUSHAD…子程序体POPADRETSUB7 ENDP**保存的原则:子程序使用的寄存器,这些寄存器要保存与恢复.6.1.4子程序的参数传送传送参数方法: 通过通用寄存器(R C); 通过存储单元; 通过堆栈1.通过通用寄存器传送参数例6.1.7 用寄存器传送参数方式, 编制5位10进制加法程序。

微机原理软件实验报告

微机原理软件实验报告

实验名称:汇编语言程序设计实验日期:2023年3月10日实验地点:计算机实验室实验者:张三一、实验目的1. 熟悉汇编语言的基本语法和指令系统。

2. 掌握汇编语言程序设计的基本方法。

3. 通过实验,加深对微机原理的理解。

二、实验内容本次实验主要涉及以下内容:1. 数据传送指令的应用2. 算术运算指令的应用3. 控制转移指令的应用4. 子程序设计三、实验步骤1. 编写一个简单的程序,实现以下功能:(1)将数据0x1234存入寄存器AX;(2)将数据0x5678存入寄存器BX;(3)计算AX和BX的乘积,并将结果存入寄存器DX;(4)将乘积的高16位和低16位分别存入寄存器CX和AX。

2. 编写一个程序,实现以下功能:(1)将数据0x1A2B3C4D存入内存单元[0x1000];(2)从内存单元[0x1000]开始,读取连续4个字节的数据;3. 编写一个程序,实现以下功能:(1)定义一个子程序,实现两个整数的加法运算;(2)在主程序中调用该子程序,实现两个整数的加法运算。

四、实验结果与分析1. 数据传送指令的应用(1)将数据0x1234存入寄存器AX;MOV AX, 0x1234(2)将数据0x5678存入寄存器BX;MOV BX, 0x5678(3)计算AX和BX的乘积,并将结果存入寄存器DX;MUL BX(4)将乘积的高16位和低16位分别存入寄存器CX和AX; MOV CX, DXMOV AX, DX2. 算术运算指令的应用(1)将数据0x1A2B3C4D存入内存单元[0x1000];MOV [0x1000], 0x1A2B3C4D(2)从内存单元[0x1000]开始,读取连续4个字节的数据; MOV AX, [0x1000]MOV BX, [0x1000+2]MOV CX, [0x1000+4]MOV DX, [0x1000+6]MOV AH, 0x0EINT 0x103. 控制转移指令的应用(1)定义一个子程序,实现两个整数的加法运算;ADD procedure:ADD AX, BXRET(2)在主程序中调用该子程序,实现两个整数的加法运算;MOV AX, 0x1MOV BX, 0x2CALL ADDMOV CX, AX五、实验心得通过本次实验,我深刻理解了汇编语言的基本语法和指令系统,掌握了汇编语言程序设计的基本方法。

微机原理第八章微型计算机的程序设计

微机原理第八章微型计算机的程序设计

0000 0000 0000 0001 0000 0010
7
1. BCD数加法调整指令DAA和AAA (P196)


DAA-----两个压缩BCD数相加调整指令: (AL&0FH)>9或者AF=1,则AL加6; (AL&0F0H)>90H或CF=1,则AL加60H; 如:MOV AX,3456H
二进制编码的十进制数 就是BCD码(Binary Coded Decimal)。
6
两种BCD码的编码对照表
十进制数 0 1 2 3 … 9 10 11 12

压缩 BCD 码 0000 0001 0010 0011 … 1001 0001 0000 0001 0001 0001 0010

非压缩 BCD 码 0000 0000 0000 0001 0000 0010 0000 0011 … 0000 1001 0000 0001 0000 0001 0000 0001
11
例8.2 非压缩BCD数W1与W2(均为字变量)相加, 将其和送到SUM字节变量中。
• • • • data segment W1 DW 0809H ;即89D W2 DW 0607H ;即67D SUM DB 3 DUP(0)
• ;一个字节放1位BCD码,用来放加完后的值156 • data ends
• ADD AL,AH ; AL=0EH, AH=08H(没变) • MOV AH,0 • AAA ;属于第1种情况,故AL为(AL+6) &0F=14H&0FH=04H; AH=01H
9

【例8.1】的程序段为:
• • • • • • • • • stack segment stack ‘stack dw 32 dup(0) stack stack ends data segment W1 DW 8931H W2 DW 5678H SUM DB 3 DUP(0) data ends code segment

微机原理与接口技术-六章-程序设计

微机原理与接口技术-六章-程序设计

PROC MOV SAL SAL ADD MOV
NEAR AL,CL AL,1 AL,1 AL,CL CL,AL
RET DP5 ENDP MY ENDS END START AL=? BL=? CL=?
微机原理与接口技术
例: 累加数组中的元素。
主程序 data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? data ends code segment main proc far assume cs:code, ds:data start: push ds sub ax, ax push ax mov ax, data mov ds, ax call proadd ret main endp
④内存分配
微机原理与接口技术
6.3 分支程序(1)
条件满足? N 语句系列
Y
N
Y 条件满足? 语句系列2
语句系列1
两种分支结构示意图 例:编一个程序。从外设71H取一个数M,判断其值是否在10和 20之间,即10≤M<20。如果M≥20,则送0FFH给外设73H; 如果M<10,则送00H给外设73H;如果10≤M<20, 则送88H给外设73H。
Y
判断
N
处理
结束
微机原理与接口技术
6.2 简单程序(1)
例:将内存单元10050H的内容拆成两段,每段4位,分别存 入10051H(低4位)和10052H(高4位)单元。即 10051H和10052H单元的高4位都为0。
①分析: 理解题意,假设10050H单元的 内容是6CH,题意是把它分成 06H和0CH,分别存入10051H 和10052H单元中。 ②确定算法: 可以通过移位指令,也可以用 逻辑与运算指令(与0FH)。

微机原理软件实验报告

微机原理软件实验报告

信息与通信工程学院微机原理软件实验报告班级:姓名:学号:日期:2011年12月实验一DEBUG的使用 (1)一、实验目的 (1)二、实验内容 (1)三、预习思考 (3)四、实验过程 (4)五、实验总结 (9)实验二分支、循环程序设计 (10)一、实验目的 (10)二、实验内容 (10)三、预习思考 (10)四、实验过程 (10)(一)、流程图 (11)(二)、源代码 (11)(三)、实验分析 (11)五、实验总结 (14)实验三代码转换程序设计 (15)一、实验目的 (15)二、实验内容 (15)三、预习思考 (15)四、实验过程 (16)(一)流程图 (16)(二)模块层次图 (16)(三)源代码 (17)(四)实验分析 (21)五、实验总结 (22)实验四子程序设计 (23)一、实验目的 (23)二、实验内容 (23)三、预习思考 (23)四、实验过程 (24)(一)流程图 (24)(二)模块层次图 (25)(三)源代码 (25)(四)实验分析 (34)五、实验总结 (35)实验五中断程序设计 (37)一、实验目的 (37)二、实验内容 (37)三、预习思考 (37)四、实验过程 (38)(一)流程图 (38)(二)源代码 (39)(三)实验分析 (45)五、实验总结 (46)实验一 DEBUG 的使用一、实验目的1.掌握汇编程序的编辑、编译、连接和执行的全过程;2.学习和掌握用DEBUG调试程序的方法。

二、实验内容1.用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20B DB 15Y DB 3 DUP(0)Z DB 0,0DAT ENDSSTA SEGMENT STACKDW 50 DUP(?)STA ENDSCOD SEGMENTASSUME CS:COD,DS:DATSTAR PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATMOV DS,AXMOV AX,STAMOV SS,AXMOV AL,AMOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,BMOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL,ZMOV AH,Z+1MUL AHADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSUB1 ENDPCOD ENDSEND STAR2.通过编译,连接形成可执行文件。

微机原理第04章4子程序

微机原理第04章4子程序

mov ah,9
;;宏定义体
lea dx,message
int 21h
endm

dispmsg string ;宏调用(宏指令)

1 mov ah,9
;宏展开
1 lea dx,string
1 int 21h
第4章:宏与比子程序的比较


子程序
仅是源程序级的简化: 宏调用在汇编时进行 程序语句的展开,不 需要返回;不减小目 标程序,执行速度没 有改变
第4章:例4.16 显示以“0” 结尾字符串的嵌套子程序
msg
;数据段 db 'Well, I made it !',0 ;代码段(主程序) mov si,offset msg ;主程序提供显示字符串 call dpstri ;调用子程序
第4章:例4.16 子程序
;子程序dpstri:显示DS:SI指向的字符串(以0结尾)
第4章:4.6 子程序设计
把功能相对独立的程序段单独编写和调 试,作为一个相对独立的模块供程序使 用,就形成子程序
子程序可以实现源程序的模块化,可简 化源程序结构,可以提高编程效率
主程序(调用程序)需要利用CALL指令 调用子程序(被调用程序)
子程序需要利用RET指令返回主程序
第4章:4.6.1 过程定义和 子程序编写
dpstri proc
push ax
dps1: mov dl,[si] ;取显示字符
inc si
cmp dl,0
;是结尾,则显示结束
jz dps2
call dpchar ;调用字符显示子程序
jmp dps1
dps2: pop ax ret
dpstri endp

微机原理与汇编语言程序设计课程设计

微机原理与汇编语言程序设计课程设计

微机原理与汇编语言程序设计课程设计
一、设计背景和目的
微机原理与汇编语言程序设计是计算机科学与技术专业的必修课程,本课程主要介绍微机组成原理、汇编语言程序设计和简单的计算机系统调试。

为了让学生更好地掌握本课程的知识和技能,课程设计是必不可少的环节。

本次课程设计旨在提高学生对微机组成原理和汇编语言程序设计的理解,加强学生实际操作能力,培养学生团队协作精神和创新思维能力。

二、设计内容
1. 设计目标
本次课程设计的目标是:
1.通过自主设计、实现和调试微机系统,让学生更加深入了解和掌握微
机组成原理和汇编语言程序设计。

2.培养学生实际操作能力,提高学生程序设计水平和调试能力。

3.加强学生团队协作精神和创新思维能力,让学生充分发挥自己的创造
力,实现学习成果的最大化。

2. 设计内容
本次课程设计将分为以下三个部分:
1.系统总体设计:根据具体要求,设计和规划微机系统的硬件组成和软
件结构,包括系统框架图、硬件接口电路图和软件模块设计等。

2.系统实现和调试:根据系统总体设计,分别实现硬件和软件,对系统
进行调试验证,并录制系统操作演示视频。

1。

微机原理与程序设计

微机原理与程序设计

微机原理与程序设计微机原理与程序设计是计算机科学与技术专业的一门重要课程,它是培养学生计算机基础知识和编程实践能力的关键课程之一。

本文将介绍微机原理与程序设计的基本概念、主要内容和学习方法,帮助读者更好地理解和掌握这门课程。

一、微机原理微机原理是微机系统的基础理论,它主要研究微机硬件系统的组成、工作原理和设计方法。

微机系统由中央处理器(CPU)、存储器、输入输出设备和系统总线等组成,它们之间通过总线进行数据和信号的传输。

微机原理研究的重点包括微机的结构、指令系统、中断系统、时序控制和总线结构等内容。

1. 微机的结构微机的结构主要包括中央处理器(CPU)、存储器和输入输出设备。

中央处理器是微机的核心部件,它包括运算器、控制器和寄存器等。

存储器用于存储程序和数据,包括随机存储器(RAM)和只读存储器(ROM)等。

输入输出设备用于与外部设备进行数据的输入和输出。

2. 指令系统指令系统是微机硬件的基本功能之一,它定义了微机执行的基本操作和指令格式。

指令系统包括数据传输指令、算术逻辑指令、控制转移指令等,通过这些指令可以实现数据的读写、运算和控制等功能。

3. 中断系统中断是微机系统中的一种重要的事件处理机制,它可以使微机在执行程序的同时响应外部事件。

中断系统包括中断源、中断控制器和中断处理程序等,通过中断可以实现对外部事件的及时响应和处理。

4. 时序控制时序控制是微机系统中的重要环节,它用于控制微机硬件的时序和操作的顺序。

时序控制包括时钟信号的产生和分配、指令的执行周期和时序、总线的访问和时序等。

5. 总线结构总线是微机硬件系统中各个部件之间进行数据和信号传输的通道,它包括地址总线、数据总线和控制总线等。

总线结构的设计和实现直接影响着微机系统的性能和扩展性。

二、程序设计程序设计是微机原理的重要应用领域,它是指根据问题需求和算法设计程序,并通过编程语言实现。

程序设计的关键是理解问题需求、选择合适的算法和数据结构,并用编程语言将算法转化为可执行的程序。

微机原理 4-2程序设计

微机原理 4-2程序设计

第4章 汇编语言程序设计
MS-DOS使用中断号21H作为系统说明,为程序员 提供了上百种系统服务功能。对这些功能的调用步骤 如下: (1) 由AH给出功能号。 (2) 根据相应功能的要求,设置入口参数。DOS系 统功能调用的入口参数通常是放在指定的内部寄存器 器中,少数功能调用也可以没有入口参数。 (3) 执行中断指令INT 21H。 (4) 分析和使用出口参数。
(1) 置入口参数;
(2) 选功能号于 AH 中;
(3) 使用“ INT 中断号”语句调用。
微机原理与接口技术 BIOS 调用 常用的 第4章
汇编语言程序设计
1、INT 10H(显示器输出) 中断 10H 来实现各种屏幕处理功能
AH功能号有:
微机原理与接口技术 BIOS 调用 常用的 第4章
汇编语言程序设计
微机原理与接口技术 DOS 调用 第4章 汇编语言程序设计 常用的 程序结束的常用方法: (1)DOS功能调用4CH:MOV AH ,4CH INT 21H (2)DOS中断调用20H:INT 20H (3)转移到0单元:JMP 0;0单元有INT 20H (4)DOS功能调用00H:MOV AH,0 INT 21H (5)HLT暂停
START: MOV MOV MOV ADD MOV MOV ADC MOV MOV INT CODE ENDS END
AX,DATA DS,AX AX,XL AX,YL ZL,AX AX,XH AX,YH ZH,AX AH,4CH 21H
三、顺序程序设计 微机原理与接口技术 第4章
例4.2.3.2:
3、示例 例4.2.4.1 例4.2.4.2 例4.2.4.3
汇编语言程序设计
条件转移分支 Page132例4-15 跳转实现多路分支

微机原理汇编语言的设计

微机原理汇编语言的设计
微机原理汇编语言的设 计
目录 CONTENT
• 微机原理概述 • 汇编语言基础 • 汇编语言程序设计 • 微机原理与汇编语言的应用 • 汇编语言与微机原理的发展趋势
01
微机原理概述
微机的基本组成
运算器
执行算术和逻辑运算的部件。
控制器
控制微机各部件协调工作的部 件。
存储器
存储程序和数据的部件。
输入/输出设备
随着半导体技术的不断发展,微处理器的性能将不断提升,运算速度和能效比将进一步提 高。
微机系统的集成度将不断提高
随着芯片制造工艺的进步,微机系统的集成度将不断提高,更多的功能和模块将被集成在 一块芯片上。
微机系统的可扩展性和可配置性将不断增强
为了满足不同应用的需求,微机系统的可扩展性和可配置性将不断增强,提供更多的接口 和可编程功能。
内存管理程序设计需要考虑如何提高内存的利用率和访问速度,以及 如何保证程序的正确性和稳定性。
内存管理程序设计还需要考虑如何处理内存的异常和错误,以及如何 实现内存的保护和隔离。
05
汇编语言与微机原理的发 展趋势
汇编语言的未来发展
汇编语言将更加注重可读 性和可维护性
随着软件工程的发展,汇编语言的编写将更 加注重代码的可读性和可维护性,以提高代 码质量和降低开发成本。
逻辑运算指令用于执行各种逻辑运算,如与、或、非等。
汇编语言的指令系统
01
数据传送指令用于在内存和寄存器之间传输数据。
02
输入输出指令用于控制输入输出设备,如键盘、显 示器等。
03
中断处理指令用于处理中断事件,如定时器中断、 外部事件中断等。
汇编语言的程序结构
汇编语言的程序结构包括 程序头、程序主体和程序 尾三部分。

微机原理实验--子程序与宏指令

微机原理实验--子程序与宏指令

27.编制计算N(N<50)个偶数之和(2+4+6+…)的子程序和接收键入N及将结果显示在主程序。

子程序代码:stack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序acall sum;调用子程序sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hRETstart endpsum proc;定义子程序sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,axmov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxRETsum endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0RETa endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endpcode endsend start截图如下:宏指令代码:sum macro A;定义宏sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,Amov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxendmstack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序aSUM ax;宏展开sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hretstart endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0reta endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endp code endsend start 截图如下:。

微机原理实验之子程序设计

微机原理实验之子程序设计

子程序设计实验一、实验目的1.学习子程序的概念和调试方式。

2.把握子程序、子程序的嵌套、递归子程序的结构;3.把握子程序的程序设计及调试方式。

二、实验设备PC 机一台,TD-PITE 实验装置一套。

三、实验内容及步骤1.求无符号字节序列中的最大值和最小值设有一字节序列,其存储首地址为3000H,字节数为08H。

利用子程序的方式编程求出该序列中的最大值和最小值。

程序流程图如图4-1所示。

图4-1 程序流程图实验程序SSTACK SEGMENT STACKDW 64 DUP(?)SSTACK ENDSCODE SEGMENTASSUME CS:CODESTART: MOV AX, 0000HMOV DS, AXMOV SI, 3000H ; 数据区首址MOV CX, 0008HCALL BRANCH ; 调用子程序HERE: JMP HEREBRANCH PROC NEARJCXZ A4PUSH SIPUSH CXPUSH BXMOV BH, [SI]MOV BL, BHCLDA1: LODSBCMP AL, BHJBE A2MOV BH, ALJMP A3A2: CMP AL, BLJAE A3MOV BL, ALA3: LOOP A1MOV AX, BXPOP BXPOP CXPOP SIA4: RETBRANCH ENDPCODE ENDSEND START实验步骤:(1)依照程序流程图编写实验程序;(2)经编译、链接无误后装入系统;(3)键入E3000命令,输入8个字节的数据,如:D9 07 8B C5 EB 04 9D F9;(4)运行实验程序;(5)点击停止按钮,停止程序运行,观看寄放器窗口中AX的值,AX应为F9 04,其中AH中为最大值,AL中为最小值;(6)反复测试几组数据,查验程序的正确性。

程序说明:该程序利用BH和BL暂存现行的最大值和最小值,开始时初始化成首字节的内容,然后进入循环操作,从字节序列中逐个掏出一个字节的内容与BH和BL相较较,假设掏出的字节内容比BH的内容大或比BL的内容小,那么修改之。

微机原理实验三 编程实现子程序调用

微机原理实验三 编程实现子程序调用

实验二编程实现循环程序**************************************************************************************一、题目内容**************************************************************************************•编程实现:• 1.主程序由键盘输入一个数(<10),用子程序1实现DATA段以这个数为首连续十个整数填充字节数组buf。

譬如显示提示:”Please input a number:”,键盘输入3,执行子程序1后buf db 3,4,5,6,7,8,9,10,11,12。

• 2.主程序实现十个数求和,调用另一子程序2实现将和逐位转为ASCII码显示:”Sum is: xx”。

•提示:和不会超过十进制3位数,所以将和除以10,逐位转换,再加上30H即分别可以得它们的ASCII码。

**************************************************************************************二、流程图****************************************************************************************************************************************************************************三、程序代码**************************************************************************************stack segment stack 'stack'dw 32 dup(0)stack ends;==========================data segmentTIP1 DB 'Plesase input a number(0<n<10) : $'BUF DB 10 DUP(?)TIP2 DB 'From n to n+10 is the result of the : $'SUM DW 0data ends;==========================STAC SEGMENT ;用于变量定义予置的堆栈空间STA DB 100 DUP(?)STAC ENDS;==========================code segment;===================MAIN proc farassume ss:stack,cs:code,ds:datapush dssub ax,axmov ax,datamov ds,ax;===========MOV DX,OFFSET TIP1 ;显示提示语MOV AH,9INT 21HXOR AX,AX ;键入并显示一个字符,把字符的ASCII码存入AL中MOV AH,1INT 21HMOV DL,0AH ;换行PUSH AXMOV AH,2INT 21HPOP AXMOV DI,OFFSET BUF ;取BUF的首址存入DI中XOR CX,CXCALL AddNum ;—1—调用子程序FUZHI实现DATA段以这个数为首连续十个整数填充字节数组bufXOR AX,AXMOV CX,0AH ;给LOOP2循环赋初值10MOV DI,OFFSET BUFAGAIN2: ADD AX,[DI] ;主程序实现求上述十个数的和,存入AX中INC DILOOP AGAIN2 ;循环10次CALL DELAY1S ;—2—调用子函数延时1SPUSH AXCALL Transf ;—3—调用另一子程序ZHUANG实现将和逐位转为ASCII码显示POP AX;MOV AH,4CH ;返回DOS,不用这个,对话框会一闪而退;INT 21H;RETmov ah, 1 ;这个的话对话框会暂停int 21hMAIN ENDP;/***************************************************************************/; 子程序名: AddNum; 功能: 实现DA TA段以输入的那个数为首连续十个整数填充字节数组buf; 入口参数:; DS:DI←待填充的数组buf的首地址; AL←输入的那个数; 出口参数: 【DI】←填充结果;/***************************************************************************/AddNum PROCPUSH CXSUB AL,30H ;将AL转为十进制MOV CX,0AH ;给LOOP循环赋初值10AGAIN1: MOV [DI],AL ;将AL存入BUF中INC DI ;DI+1,即数组BUF中的地址单元+1INC AL ;AL+1LOOP AGAIN1POP CXRET ;返回主程序AddNum ENDP;/***************************************************************************/ ; 子程序名: Transf; 功能: 实现将和逐位转为ASCII码显示; 入口参数:; DS:DI←数组buf的首地址; AX←和的十进制数; 出口参数: AX←和的ASCII码;/***************************************************************************/Transf PROCPUSHFPUSH AXPUSH BXPUSH CXPUSH DXXOR BX,BXPUSH AXXOR AH,AHCMP AX,64HJNB SANWEIPOP AXXOR AH,AHMOV BL,10 ;将除数赋值为10DIV BL ;将和AX除以10,商存入AL中,所以AL为十位数。

华工微机实验资料报告材料-实验四-子程序地调用

华工微机实验资料报告材料-实验四-子程序地调用

实验报告课程名称微型计算机原理及其应用实验项目子程序设计学生朱轲信学生学号8专业/班级信息工程秉铨实验班实验成绩电子与信息学院实验中心制二〇一七年版预习报告一、实验目的1、学习子程序的定义和调用方法。

2、掌握子程序、子程序嵌套的结构。

3、掌握子程序的程序设计、编制及调试方法。

二、实验设备微机一台、TDS-MD微机一台三、实验容及步骤程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:按1键完成字符串小写字母变大写字母用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。

用户按任一键,重做,按ESC键,返回主菜单。

按2键完成找最大值(二选一)1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII 码值最大的字符显示出来。

2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。

用户按任一键,重做,按ESC 键,返回主菜单。

按3键完成排序(二选一)1、接收用户输入的可显示字符串,以回车结束。

程序按ASCII码值大小由大到小排序并输出显示。

2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。

程序将其中最大的数显示出来。

用户按任一键,重做,按ESC键,返回主菜单。

按4键显示时间首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:××(时):××(分):××(秒),最好定点显示。

用户按任一键,重新对时,按ESC 键,返回主菜单。

按5键,结束程序运行,返回系统提示符。

四、流程图与程序代码流程图:流程图1—主菜单流程图2--过程一流程图3—过程二流程图4—过程三 流程图5—过程四代码:STACK SEGMENT STACK 'STACK'DW 100 DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENTORG 3500H;数据段主要保存一些字符串以及定义一些字符串变量COPYRIGHT DB '-------ALL PROGRAMED BY MRZHU--------',0DH,0AH,'$'COMMON DB 'Please input 1 to 5 to select a function',0DH,0AH,'$'S1 DB '1.Input a string,then convert the small letters to big letters',0DH,0AH,'$'S2 DB '2.Find the biggest-ASCII-code character',0DH,0AH,'$'S3 DB '3.Sort the character by ASCII code by decreasing order',0DH,0AH,'$'S4 DB '4.display the ticking time',0DH,0AH,'$'S5 DB '5.Exit the program',0DH,0AH,'$'CR_LF DB 0DH,0DH,'$'IN_MAIN DB 'Now input a number(1-5): ','$'MAIN_ERROR DB 0DH,0AH,'ERROR:Please input a correct number;',0DH,0AH,'$'PRO_1_S1 DB 0DH,0AH,'Now input a string(number or letter):',0DH,0AH,'$'PRO_1_S2 DB 0DH,0AH,'The string has been changed to: ','$'PRO_2_S1 DB 0DH,0AH,'Now input a string(any symbol): ',0DH,0AH,'$'PRO_2_S2 DB 0DH,0AH,'The biggest-ASCII-code symbol is: ','$'PRO_3_S1 DB 0DH,0AH,'Now input a string(any symbol): ',0DH,0AH,'$'PRO_3_S2 DB 0DH,0AH,'The string has been sorted: ','$'PRO_4_S1 DB 0DH,0AH,'Setting time (XX:XX:XX <Hours:Minutes:Seconds>): ',0DH,0AH,'$'PRO_4_S2 DB 0DH,0AH,'SETTING DONE! ',0DH,0AH,'$'PRO_4_S3 DB 0DH,0AH,'TIME_NOW(Press any key to stop): ',0DH,0AH,'$'PRO_4_ERROR_LEN DB 0DH,0AH,'!!ERROR(Length overflow): Please input in the correct format!',0DH,0AH,'$'PRO_4_ERROR_NOT_NUM DB 0DH,0AH,'!!ERROR(Not number or not ":"): Please input in the correct format!',0DH,0AH,'$'PRO_4_ERROR_NUM_OVER DB 0DH,0AH,'!!ERROR(Number overflow): Please input the correct number!',0DH,0AH,'$'PRO_END_S DB 0DH,0AH,'Press any key to continue except ESC',0DH,0AH,'$'STRING1 DB 50DB ?DB 50 DUP(?)STRING2 DB 50DB ?DB 50 DUP(?)STRING3 DB 50DB ?DB 50 DUP(?)STRING4 DB 50DB ?DB 50 DUP(?)DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,STACKMOV SS,AXMOV SP,OFFSET TOPPUSH DSSUB AX,AXPUSH AX ;初始化堆栈MOV AX,DATAMOV DS,AXMENU:MOV DX,OFFSET COPYRIGHTMOV AH,9INT 21HMOV DX,OFFSET COMMONMOV AH,9INT 21HMOV DX,OFFSET S1MOV AH,9INT 21HMOV DX,OFFSET S2MOV AH,9INT 21HMOV DX,OFFSET S3MOV AH,9INT 21HMOV DX,OFFSET S4MOV AH,9INT 21HMOV DX,OFFSET S5MOV AH,9INT 21HMOV DX,OFFSET CR_LFMOV AH,9INT 21HIN_A_NUM:MOV DX,OFFSET IN_MAINMOV AH,9INT 21H ;显示主菜单信息MOV AH,01HINT 21H ;输入一个字符CMP AL,'1'JE P1CMP AL,'2'JE P2CMP AL,'3'JE P3CMP AL,'4'JE P4CMP AL,'5'JE P5_EXIT ;判断输入的字符并跳转MOV DX,OFFSET MAIN_ERRORMOV AH,9INT 21HJMP IN_A_NUM ;其他字符时输出提醒并跳转到重新输入P1:CALL PRO_1MOV DX,OFFSET CR_LFMOV AH,9INT 21H ;换行JMP MENUP2:CALL PRO_2MOV DX,OFFSET CR_LFINT 21H ;换行JMP MENUP3:CALL PRO_3MOV DX,OFFSET CR_LFMOV AH,9INT 21H ;换行JMP MENUP4:CALL PRO_4MOV DX,OFFSET CR_LFMOV AH,9INT 21H ;换行JMP MENUP5_EXIT:RET ;返回DOS MAIN ENDP ;MAIN段结束PRO_1 PROC NEAR ;过程一PRO_1_START:MOV DX,OFFSET PRO_1_S1INT 21H ;输出提示语MOV DX,OFFSET STRING1MOV AH,0AHINT 21H ;把STRING1的字符串首地址给DX,输入一个字符串MOV CX,0MOV CL,STRING1[1]MOV BX,1LOOP1: ;循环,将小写字母改为大写INC BXMOV AL,STRING1[BX]CMP AL,61HJB NEXT1CMP AL,7AHJA NEXT1SUB AL,20HMOV STRING1[BX],ALNEXT1:LOOP LOOP1INC BXMOV STRING1[BX],'$'MOV DX,OFFSET PRO_1_S2INT 21H ;输出提示的句子MOV DX,OFFSET STRING1[2]MOV AH,9INT 21H ;输出改变后的字符串MOV DX,OFFSET CR_LFMOV AH,9INT 21H ;换行MOV DX,OFFSET PRO_END_S ;输出通用结束提示语MOV AH,9INT 21HMOV AH,01HINT 21H ;输入一个字符,实现跳转的判断CMP AL,1BHJE NEXT1_2JMP PRO_1_START ;如果是ESC则不跳转到子程序开头,是则跳转NEXT1_2:RETPRO_1 ENDPPRO_2 PROC NEAR ;过程二PRO_2_START:MOV DX,OFFSET PRO_2_S1 ;输出提示语MOV AH,9INT 21HMOV DX,OFFSET STRING2 ;把STRING2的字符串首地址给DX,接收一个字符串MOV AH,0AHINT 21HMOV CX,0MOV CL,STRING2[1]MOV BX,1MOV AL,0LOOP2:INC BXCMP AL,STRING2[BX]JAE NEXT2_1 ;AL大于等于字符ASCII值时跳转MOV AL,STRING2[BX]NEXT2_1:LOOP LOOP2INC BXMOV SI,BX ;把BX的值放到SI,也就是指向回车的位置MOV BL,AL ;把AL放到BL,防止中断指令时破坏ALMOV DX,OFFSET PRO_2_S2MOV AH,9INT 21H ;输出提示语MOV DL,BLMOV AH,2INT 21H ;显示最大ASCII的字符MOV DX,OFFSET PRO_END_S ;输出通用结束提示语MOV AH,9INT 21HMOV AH,01HINT 21H ;输入一个字符,实现跳转的判断CMP AL,1BHJE NEXT2_2JMP PRO_2_START ;如果是ESC则不跳转到子程序开头,是则跳转NEXT2_2:RETPRO_2 ENDPPRO_3 PROC NEAR ;过程三PRO_3_START:MOV DX,OFFSET PRO_3_S1 ;输出提示语MOV AH,9INT 21HMOV DX,OFFSET STRING3 ;把STRING3的字符串首地址给DX,接收一个字符串MOV AH,0AHINT 21HMOV CX,0MOV CL,STRING3[1] ;把字符串里字符个数赋给CXDEC CX ;实际比较的次数为CX-1CMP CX,0JE NO_SORTEDLOOP3_1: ;下面的LOOP3_1是冒泡排序MOV BX,CX ;把CX的值存到BX,防止层循环破坏CX MOV SI,2LOOP3_2:MOV AL,STRING3[SI]CMP AL,STRING3[SI+1]JAE NEXT3_1XCHG AL,STRING3[SI+1]XCHG AL,STRING3[SI]NEXT3_1:INC SILOOP LOOP3_2MOV CX,BXLOOP LOOP3_1NO_SORTED:MOV BX,0MOV BL,STRING3[1];ADD BL,2MOV STRING3[BX],'$' ;将$存入改变后的字符串以作结束标志MOV DX,OFFSET PRO_3_S2 ;输出提示语MOV AH,9INT 21HMOV DX,OFFSET STRING3[2] ;输出改变后的字符串MOV AH,9INT 21HMOV DX,OFFSET PRO_END_S ;输出通用结束提示语MOV AH,9INT 21HMOV AH,01HINT 21H ;输入一个字符,实现跳转的判断CMP AL,1BHJE NEXT3_2JMP PRO_3_START ;如果是ESC则不跳转到子程序开头,是则跳转NEXT3_2:RETPRO_3 ENDPPRO_4 PROC NEAR ;过程四MOV DX,OFFSET PRO_4_S1 ;输出提示语MOV AH,9INT 21HMOV DX,OFFSET STRING4 ;把STRING4的字符串首地址给DX,接收一个字符串MOV AH,0AHINT 21HMOV BX,0MOV BL,STRING4[1];ADD BL,2MOV STRING4[BX],'$' ;将$存入改变后的字符串以作结束标志CALL PRO_4_IFERROR ;调用判断子程序来判断是否输入了正确的格式CMP BX,0JE PRO_4_ERROR_1 ;BX=0则为长度溢出CMP BX,1JE PRO_4_ERROR_2 ;BX=1则输入的字符有误JMP PRO_4_NO_ERRORPRO_4_ERROR_1:MOV DX,OFFSET PRO_4_ERROR_LEN ;输出提示语MOV AH,9INT 21HJMP PRO_4_STARTMOV DX,OFFSET PRO_4_ERROR_NOT_NUM ;输出提示语MOV AH,9INT 21HJMP PRO_4_STARTPRO_4_NO_ERROR: ;下面各段把时间的ASCII转为无符号数,并判断MOV BH,STRING4[2] ;对时的处理MOV BL,STRING4[3]SUB BH,30HSUB BL,30HMOV AL,BHMOV DL,10MUL DLMOV BH,AL ;BH乘以10ADD BH,BL ;BH+BL->BH将ASCII转换成无符号数CMP BH,0JB PRO_4_EOOOR_NUM_HRCMP BH,24JA PRO_4_EOOOR_NUM_HRJMP PRO_4_NOERROR_NUM_HRPRO_4_EOOOR_NUM_HR:MOV DX,OFFSET PRO_4_ERROR_NUM_OVER ;输出提示语INT 21HJMP PRO_4_STARTPRO_4_NOERROR_NUM_HR:MOV CH,BH ;把BH值放入CH,即设置时的入口参数MOV BH,STRING4[5] ;对分的处理MOV BL,STRING4[6]SUB BH,30HSUB BL,30HMOV AL,BHMOV DL,10MUL DLMOV BH,AL ;BH乘以10ADD BH,BL ;BH+BL->BH将ASCII转换成无符号数CMP BH,0JB PRO_4_EOOOR_NUM_MINCMP BH,60JA PRO_4_EOOOR_NUM_MINJMP PRO_4_NOERROR_NUM_MINPRO_4_EOOOR_NUM_MIN:MOV DX,OFFSET PRO_4_ERROR_NUM_OVER ;输出提示语MOV AH,9JMP PRO_4_STARTPRO_4_NOERROR_NUM_MIN:MOV CL,BH ;把BH值放入CL,即设置分的入口参数MOV BH,STRING4[8] ;对秒的处理MOV BL,STRING4[9]SUB BH,30HSUB BL,30HMOV AL,BHMOV DL,10MUL DLMOV BH,AL ;BH乘以10ADD BH,BL ;BH+BL->BH将ASCII转换成无符号数CMP BH,0JB PRO_4_EOOOR_NUM_SECCMP BH,60JA PRO_4_EOOOR_NUM_SECJMP PRO_4_NOERROR_NUM_SECPRO_4_EOOOR_NUM_SEC:MOV DX,OFFSET PRO_4_ERROR_NUM_OVER ;输出提示语MOV AH,9INT 21HJMP PRO_4_STARTPRO_4_NOERROR_NUM_SEC:MOV DH,BH ;把BH值放入DH,即设置秒的入口参数MOV DL,0 ;初始化1/100秒MOV AH,2DHINT 21H ;设置时间MOV DX,OFFSET PRO_4_S2 ;输出提示语MOV AH,9INT 21HMOV DX,OFFSET PRO_4_S3 ;输出提示语MOV AH,9INT 21HLOOP4_1: ;循环显示时间MOV AH,2CHINT 21H ;获取系统时间,CH:CL:DH:DL H:M:S:1/100S Time_set: ;十六进制转ASCII码MOV AX,0 ;时MOV AL,CHMOV BL,10DIV BLADD AL,30H ;时的高位ADD AH,30H ;时的低位MOV STRING4[2],ALMOV STRING4[3],AHMOV AX,0 ;分MOV AL,CLMOV BL,10DIV BLADD AL,30H ;高位ADD AH,30H ;低位MOV STRING4[5],ALMOV STRING4[6],AHMOV AX,0 ;秒MOV AL,DHMOV BL,10DIV BLADD AL,30H ;高位ADD AH,30H ;低位MOV STRING4[8],ALMOV STRING4[9],AHMOV DX,OFFSET STRING4[2]MOV AH,9INT 21HMOV DL,0DH ;换行,便于下次显示MOV AH,02HINT 21HMOV AH,0BHINT 21HCMP AL,0JE LOOP4_1MOV DX,OFFSET PRO_END_S ;输出通用结束提示语MOV AH,9INT 21HMOV AH,01HINT 21H ;输入一个字符,实现跳转的判断CMP AL,1BHJE NEXT4_10JMP PRO_4_START ;如果是ESC则不跳转到子程序开头,是则跳转NEXT4_10:RETPRO_4 ENDPPRO_4_IFERROR PROC NEARMOV BX,2CMP STRING4[1],8JZ NEXT4_1MOV BX,0 ;用BX保存错误类型,并返回RETCMP STRING4[2],30H ;检查第一个数字JB NEXT4_2_NO_NUMCMP STRING4[2],39HJA NEXT4_2_NO_NUMJMP NEXT4_2NEXT4_2_NO_NUM:MOV BX,1RETNEXT4_2:CMP STRING4[3],30H ;检查第二个数字JB NEXT4_3_NO_NUMCMP STRING4[3],39HJA NEXT4_3_NO_NUMJMP NEXT4_3NEXT4_3_NO_NUM:MOV BX,1RETNEXT4_3:CMP STRING4[4],3AH ;检查引号JE NEXT4_4MOV BX,1RETCMP STRING4[5],30H ;检查第三个数字JB NEXT4_5_NO_NUMCMP STRING4[5],39HJA NEXT4_5_NO_NUMJMP NEXT4_5NEXT4_5_NO_NUM:MOV BX,1RETNEXT4_5:CMP STRING4[6],30H ;检查第四个数字JB NEXT4_6_NO_NUMCMP STRING4[6],39HJA NEXT4_6_NO_NUMJMP NEXT4_6NEXT4_6_NO_NUM:MOV BX,1RETNEXT4_6:CMP STRING4[7],3AH ;检查引号JE NEXT4_7MOV BX,1RETCMP STRING4[8],30H ;检查第五个数字JB NEXT4_8_NO_NUMCMP STRING4[8],39HJA NEXT4_8_NO_NUMJMP NEXT4_8NEXT4_8_NO_NUM:MOV BX,1RETNEXT4_8:CMP STRING4[9],30H ;检查第六个数字JB NEXT4_9_NO_NUMCMP STRING4[9],39HJA NEXT4_9_NO_NUMJMP NEXT4_9NEXT4_9_NO_NUM:MOV BX,1RETNEXT4_9:RETPRO_4_IFERROR ENDPCODE ENDSEND MAIN ;程序结束原始数据记录地点:楼房实验日期与时间:实验台号原始数据检查实验教师:图1-主菜单图2-过程一图3-过程二图4-过程三图5-过程四(实际中时间会跳动)图6-过程四(对各种错误格式的处理)图7-退出程序数据分析与实验结论主菜单:可正常显示菜单信息,并根据输入实现跳转,与预期一致。

8086微机原理实验之子程序及中断实验

8086微机原理实验之子程序及中断实验

执行主程序
将 data 放在 dx,并 保存到 ds 中,ax 存 es
取子程序的偏移放 在 ax
调用子程序和中断, 实现:AX=AX+BX
结束
1
三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等) 代码: data segment a dw 5fh b dw 3fh c dw '?' data ends code segment assume cs:code,ds:data start: mov dx,data mov ds,dx xor ax,ax mov es,ax mov ax,offset change mov word ptr es:[80h],ax mov ax,seg change mov word ptr es:[82h],ax int 20h jmp s change proc near xor ax,ax xor bx,bx mov ax,a mov bx,b add ax,bx mov c,ax iret change endp code ends s: end start
3
计算机硬件实验室实验报告
课程名称:微机原理及应用 姓 名 学 号 班 级 成 绩源自设备名称及软件环境 实验名称
Windows XP 操作系统 emu8086 仿真器 实验日期
[0005]子程序及中断实验
一.实验内容 1.实现子程序和中断服务子程序的设计; 2.编写子程序设置40H 中断为自定义中断服务子程序; 3.编写中断服务子程序实现 AX=AX+BX; 4.编写主程序调用子程序和中断。 二.理论分析或算法分析 定义数据段 Data
2
四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等) 执行前:

微机原理与应用:第二十讲 汇编语言子程序设计举例

微机原理与应用:第二十讲 汇编语言子程序设计举例

保护现场。
保护现场。
#08H; 将工作寄存器设置在1区。
#40H; 设置压缩BCD码数据区指针。
#50H; 设置非压缩BCD码数据区指针。
#5; 设置计数器。
把ACC清零。
@R0; 将压缩BCD码与ACC的低4位交换。
A;
存放已形成的非压缩BCD码。
10
例4-15程序续
INC MOV SWAP MOV INC INC DJNZ POP POP RET;
的内部数据存储器中。影响1区寄存器R0、R1和R6。 ;出口参数:非压缩BCD码放在50H为首地址的内部数据存储器中。
9
例4-15程序续
BCDCON:PUSH PUSH MOV MOV MOV MOV
LOOP: CLR XCHD MOV
ACC; PSW; PSW, R0, R1, R6, A; A, @R1,
14
恢复现场。
11
定点数运算程序设计
1、双字节补码加法程序设计
例4-16:编一子程序,完成两双字节补码相加。设加数和 被加数分别存放在R2R3和R4R5中,运算的结果存 放在R6R7中。若运算结果发生溢出,使00H位单 元=1;反之,使00H位单元=0。
12
程序编制
;双字节补码加法子程序 ;入口参数:子程序名COMADD,加数和被加数分别存放在0区寄存
13
程序编制续
MOV R7, A;
MOV A,
R2;
ADDC A,
R4;
MOV R6, A;
MOV C,
OV;
MOV FLAG, C;
POP ACC;
POP PSW;
RET;
存放补码数据的低8位相加的结果。 取补码数据的高8位于ACC。 补码数据的高8位相加,并加低8位进位。 存放补码数据的高8位相加的结果。 将溢出位的状态传入Cy。 将数据运算可能产生的溢出位传入00H位。 恢复现场。 恢复现场。 子程序返回。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三子程序设计
1、实验目的:
(1)熟悉汇编语言的编辑、汇编、连接、运行的全过程。

(2)了解汇编语言的程序结构、学习调用过程实现输入输出及用INCLUDE 命令包含文件的方法。

(3)子程序设计
2.实验步骤:
(1)用编辑软件记事本或EDIT 编辑一个扩展文件名为ASM的汇编语言源程序。

(2)用汇编程序TASM 汇编上述的汇编语言源程序,形成目标代码文件。

(扩展名为OBJ)
(3)用连接程序TLINK连接目标代码文件,形成可执行文件。

(扩展名为EXE)
(4)运行可执行文件。

观察执行结果,以验证其正确性。

3.实验内容:
(1)从键盘上输入若干个十进制数(-32767<x<32767),然后排序并输出其升序后的结果。

.model small
.stack 256
.data
count=5
array dw count dup (?)
in_message db "please enter data:$"
out_message db "sort result is :$"
.code
.startup
mov ah,9
lea dx,in_message
int 21h
mov cx,count
mov si,offset array
again: call read ;输入count数据存入array数组中
call dpcrlf
mov [si],bx
inc si
inc si
loop again
mov cx,count ;排序(升序)
dec cx
again2: lea si,array
mov di,cx
again1: mov ax,[si]
cmp ax,[si+2]
jle next1
xchg ax,[si+2]
xchg ax,[si]
next1: add si,2
loop again1
mov cx,di
loop again2
mov ah,9
lea dx,out_message
int 21h
mov cx,count ;输出(升序)
lea si,array
again3: mov bx,[si]
call write
call dpcrlf
inc si
inc si
loop again3
mov ax,4c00h
int 21h
INCLUDE out_B_D.ASM
INCLUDE in_D_B.ASM
END
(2)从键盘上输入若干个十进制数(-32767<x<32767),然后排序并输出其降序后的结果。

.model small
.stack 256
.data
count=5
array dw count dup (?)
in_message db "please enter data:$"
out_message db "sort result is :$"
.code
.startup
mov ah,9
lea dx,in_message
int 21h
mov cx,count
mov si,offset array
again: call read ;输入count数据存入array数组中
call dpcrlf
mov [si],bx
inc si
inc si
loop again
mov cx,count ;排序(降序)
dec cx
again2: lea si,array
mov di,cx
again1: mov ax,[si]
cmp ax,[si+2]
jge next1
xchg ax,[si+2]
xchg ax,[si]
next1: add si,2
loop again1
mov cx,di
loop again2
mov ah,9
lea dx,out_message
int 21h
mov cx,count ;输出(降序)
lea si,array
again3: mov bx,[si]
call write
call dpcrlf
inc si
inc si
loop again3
mov ax,4c00h
int 21h
INCLUDE out_B_D.ASM
INCLUDE in_D_B.ASM
END
(3)从键盘上输入若干个十进制数(-32767<x<32767),然后利用交换标志优化排序算法排序并输出其降序后的结果。

.model small
.stack 256
.data
count=5
array dw count dup (?)
in_message db "please enter data:$"
out_message db "sort result is :$"
.code
.startup
mov ah,9
lea dx,in_message
int 21h
mov cx,count
mov si,offset array
again: call read ;输入count数据存入array数组中 call dpcrlf
mov [si],bx
inc si
inc si
loop again
mov cx,count ;排序(降序)
dec cx
again2: lea si,array
mov di,cx
mov bx,0
again1: mov ax,[si]
cmp ax,[si+2]
jge next1
xchg ax,[si+2]
xchg ax,[si]
mov bx,-1
next1: add si,2
loop again1
mov cx,di
dec cx
cmp bx,-1
jz again2
mov ah,9
lea dx,out_message
int 21h
mov cx,count ;输出(降序)
lea si,array
again3: mov bx,[si]
call write
call dpcrlf
inc si
inc si
loop again3
mov ax,4c00h
int 21h
INCLUDE out_B_D.ASM
INCLUDE in_D_B.ASM
END
4、实验总结
本次微机原理与接口技术实验是子程序设计实验,通过实验,我能够熟悉汇编语言的编辑、汇编、连接、运行的全过程,了解汇编语言的程序结构、学习调用过程实现输入输出及用INCLUDE命令包含文件的方法,对子程序设计有了进一步理解。

本实验程序有点多,但是通过老师和同学的帮助,顺利完成实验。

实验中运行可执行文件,观察执行结果,以验证其正确性,达到了实验目的。

相关文档
最新文档