子程序调用实验

子程序调用实验
子程序调用实验

计算机科学与技术系

实验报告

专业名称计算机科学与技术

课程名称微机原理与接口技术

项目名称子程序调用实验

班级

学号

姓名

同组人员无

实验日期 2016/12/5

一、实验目的与要求:

(简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。)

1、熟悉BCD码的调整指令。

2、熟悉ASCII转换成数字的方法。

3、熟悉压缩的BCD码转换成ASCII字符的方法。

4、熟悉子程序的定义和调用。

二、实验内容

(根据本次实验项目的具体任务和要求,完成相关内容,可包括:实验目的、算法原理、实验仪器、设备选型及连线图、算法描述或流程图、源代码、实验运行步骤、关键技术分析、测试数据与实验结果、其他)

内容:

从微机键盘上输入4位被加数、加数,并显示在信息窗口中,实现双字节的BCD 码(四位数)的加法,结果显示在信息窗口中,其中获得BCD码功能,高位0消隐并显示最后结果功能,将压缩的BCD码转换成ASCII字符,使用子程序调用实现。

原理:首先输入被加数,然后调用GetBCDKey函数得到双字节十进制被加数,同样的方法处理加数,然后将两个数带进位相加,得到的数高位0消隐显示出来。这里的得到双字节的十进制数是关键,还需要有将一个字节的压缩BCD码转换成两个字节数字的函数。

流程图:

三、实验分析与小结:

(实验过程中的问题分析、产生的原因以及解决方法;实验结果分析;有待优化思路)

1.程序分析:

.MODEL TINY

.STACK 100

.DATA

BUFFER DB 10 DUP(?);BUFFER存放8个不确定数

augend DB 2 DUP(?) ;被加数

addend DB 2 DUP(?) ;加数

msg1 DB 0DH,0AH,'请输入被加数: $'

msg2 DB 0DH,0AH,'请输入加数: $'

msg3 DB 0DH,0AH,'结果: $';msg3存放结果

;0DH和0AH分别是回车和换行的ASCII码,

;'$'是DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志.CODE

START: MOV AX,@DATA

MOV DS,AX

MOV ES,AX

CLD ;方向标志位清零 ;CLD与STD是用来操作方向标志位DF(Direction Flag)。

;CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串操作指令中

NOP ;空操作 ;NOP指令只使程序计数器PC加1,所以占用一个机器周期;其目的为保证写、读之间有个稳定时间

MOV AH,00H

MOV AL,03H

INT 10H ;清屏

START1: MOV AH,09H ;9号调用DX指向被加数的首地址,输出提示信息LEA DX,msg1 ;将源操作数给出的有效地址传送到指定的的寄存器中

INT 21H

LEA DI,augend ;DI->augend的首地址

MOV CX,4 ;按键次数

CALL GetBCDKey ;得到双字节十进制数(被加数)

JNB START2 ;没有输入任何数字,结束 CF=0

MOV AH,09H ;9号调用DX指向加数的首地址

LEA DX,msg2 ;将源操作数给出的有效地址传送到指定的的寄存器中

INT 21H

LEA DI,addend ;di指向加数

MOV CX,4 ;按键次数

CALL GetBCDKey ;得到双字节十进制数(加数)

JNB START2 ;没有输入任何数字,结束

MOV AL,augend ;被加数的低8位送al

ADD AL,addend ;al与加数的低位相加的结果送al

DAA ;BCD算术运算调整,转换为压缩型BCD

XCHG AL,AH ;高位与低位互换

MOV AL,augend + 1

ADC AL,addend + 1 ;高位

DAA

XCHG AL,AH

MOV BL,0

ADC BL,0 ;进位 bl存放的是进位 bl和ax相加是最后的结果

STD ;方向标志置1

LEA DI,BUFFER+4 ;存放显示结果

CALL B1toB2 ;低位

MOV AL,AH

CALL B1toB2 ;高位

MOV AL,BL

OR AL,30H ;转换成数字

STOSB ;存数

LEA SI,BUFFER

MOV CX,5

CALL BlackDisplay ;将高位0消隐

MOV AH,09H

LEA DX,msg3 ;9号调用DX指向结果的首地址

INT 21H

MOV AH,09H

LEA DX,BUFFER ;9号调用DX指向BUFFER的首地址

INT 21H

JMP START1 ;跳转到START1

START2: MOV AH,4CH ;结束程序

INT 21H

; JMP $

;将一个字节压缩BCD码转换成二个字节数字

B1toB2 PROC NEAR ;段内

PUSH AX ;ax存放的是相加后的结果

AND AL,0FH ;高四位置0

OR AL,30H ;加30H

STOSB ;存数个位百位

POP AX

AND AL,0F0H ;低四位置0

ROR AL,4 ;循环右移4位

OR AL,30H ;加30H

STOSB ;存数十位千位

RET

B1toB2 ENDP

BlackDisplay PROC NEAR

CLD ;方向标志清零

MOV DI,SI ;si送给di si指向buff的第一个缓冲区增量变化BlackDisplay1: LODSB ;将高位0消隐,取串

CMP AL,'0'

JNZ Exit ;若al不等于0跳转EXIT

LOOP BlackDisplay1 ;否则cx不为0一直循环 cx次

INC CX ;cx加1

Exit: DEC SI ;si前移

REP MOVSB ;重复传送字节

MOV AL,'$' ;把$符送al

STOSB ;存数

RET

BlackDisplay ENDP

GetBCDKey PROC NEAR

LEA SI,BUFFER

MOV AL,4 ;把4写入到buff

MOV [SI],AL ;[]是内存单元

MOV DX,SI

MOV AH,0AH ;dx指向缓冲区

MOV AL,02H ;0:任意字符 1:16进制数 2:10进制数,10进制数输入

INT 21H

MOV AL,[BUFFER+1] ;把内存数据段buff地址+1的值给al

XOR AH,AH ;AH清零异或指令

MOV CX,AX ;ax的内容送CX cx的值是数据的个数

JCXZ GetBCDKey3 ;cx为0,转向GetBCDKey3 判断cx直接回车

cx=0

LEA SI,BUFFER+1 ;不为0

ADD SI,AX ;ax=4 si=5

STD ;std 使si或di递增

GetBCDKey1: LODSB ;ds:si->al

AND AL,0FH ;高4位清零

CMP CX,1 ;

JE GetBCDKey2

DEC CX ;进数位-1

MOV AH,AL

LODSB

AND AL,0FH

SHL AL,4 ;逻辑左移4位

OR AL,AH ;

GetBCDKey2: CLD

STOSB ;存串指令

STD

LOOP GetBCDKey1 ;cx=2 原先为4 上面减了一次一 loop再减一所以等于2 MOV CL,[BUFFER]

SUB CL,[BUFFER+1]

SHR CL,1 ;逻辑右移1位

MOV AL,0

CLD

REP STOSB ;重复存数

STC ;进位标志位置1

RET

GetBCDKey3: CLC ;进位标志位清零cf=0

RET ;返回

GetBCDKey ENDP

END START

在此次程序中需要了解进制调整指令功能:

DAA:

功能: 对AL中的两个组合进制数相加的结果进行调整,调整结果仍放在AL中,进位标志放在CF中.

1. 调整操作如下

(1) 若(AL) and 0FH>9 或 AF=1,则(AL)<--(AL)+6,AF<--1,对低四位的

调整.

(2) 若(AL) and 0F0H>90H 或 CF=1,则(AL)<--(AL)+60H,CF<--1.

可见,所有的调整均在AL中进行.若低4位需要调整,则为加6调整,且AF标志位为1;若高4位需要调整,则为加60H调整,且CF标志为1.

DAS:

功能: 对两个组合十进制数相减后存于AL中的结果进行调整,调整后产生一个组合的十进制数且仍存于AL中.

调整操作

若(AL) and 0FH > 9 或 AF=1,则(AL)<--(AL)-6,AF=1

若(AL) and 0F0H > 90H 或 CF=1,则(AL)<--(AL)-60,CF=1

AAA:

功能: 对两个组合的十进制数相加运算(存在AL中)的结果进行调整,产生一个未组合的十进制数放在AX中.

1. 组合的十进制数和未组合的十进制数:在计算中,十进制数可用四位

二进制数编码,称为BCD码.当一个节(8位)中存放一位BCD码,且放在字节的低4位, 高4位为空时称为未组合的BCD码.显然,一个字节中也可以存放两位BCD码,称一个字节中的两位BCD数为组合的BCD数.

2. AAA的调整操作

若(AL) and 0FH>9 或 AF=1,则调整如下:

(AL)<--(AL)+6,(AH)<--(AH)+1,AF=1,CF<--AF,(AL)<--(AL) and 0FH AAS:

功能: 对两个未组合十进制数相减后存于AL中的结果进行调整,调整后产生一个未组合的十进制数数且仍存于AL中.

1. 本指令影响标志位CF及AF.

2. 调整操作

若(AL) and 0FH > 9 或 AF=1

则(AL)<--(AL)-6,(AH)<--(AH)-1,CF<--AF,(AL)<--(AL) and 0FH, 否则 (AL)<--(AL) and 0FH.

程序的理解都在上述代码中有加注释。

另外需要了解子程序的定义,PROC和ENDP伪指令定义了子程序的开始和结束。过程体内必须有一条RET指令被执行。子程序的返回与调用也需要熟知。

1.屏幕显示

加数与被加数相加显示结果:

2.结果分析

如上图所示,实现两位、三位、四位十进制数的加法,且结果均正确无误。

3.小结

不得不说这次实验很难啊,本来老师说没给我代码的时候,自己就很苦恼,因为实在不知道自己该如何下手实验,老师给了代码以后,我就认真的看实验代码,一步步分析,尽管预习报告做了很多工作,但还是有很多地方不是很明白,然后就带着疑问上了实验课,老师在一步步讲解的过程中就很明白了,发现这个程序还真的挺复杂的,老师讲完之后还给我们时间琢磨,我在老师讲解的时候,在不懂得地方加上注释,再加上自己课前做的功课就很明白这个程序了。每做一次程序就获益匪浅。

四、其它

无。

得分(百分制)

ABAQUS中Fortran子程序调用方法

第一种方法: / o/ J5 @6 U/ ^- o$ 1. 建立工作目录/ ]" 2. 将Abaqus安装目录\6.4-pr11\site下的aba_param_dp.inc或aba_param_sp.inc拷贝到工作目录,并改名为aba_param.inc; # ~/ |0 I0 E6 {, @4 X3 q: W3. 将编译的fortran程序拷贝到工作目录; 4. 将.obj文件拷贝到工作目录; 5. 建立好输入文件.inp; 6. 运行abaqusjob=inp_name user=fortran name即可。 第二种方法: 在Job模块里,创建工作,在EditJob对话框中选择General选项卡,在Usersubroutine file中点击Select 按钮,从弹出对话框中选择你要调用的子程序文件(后缀为.for或.f)。 , D8 i7 d/r c6 @" | 以下是网上摘录的资料,供参考:. |$ t/ }$W7 Y6 m4 h6 D6 j 用户进行二次开发时,要在命令行窗口执行下面的命令: 4 O. R+ ^,@( ? abaqus job=job_name user=sub_name ABAQUS会把用户的源程序编译成obj文件,然后临时生成一个静态库standardU.lib和动态库standardU.dll,还有其它一些临时文件,而它的主程序(如standard.exe和explicit.exe等)则没有任何改变,由此看来ABAQUS是通过加载上述2个库文件来实现对用户程序的连接,而一旦运行结束则删除所有的临时文件。这种运行机制与ANSYS、LS-DYNA、marc等都不同。 : j6 g' R-o( {0 [* N2 J3 X这些生成的临时文件要到文件夹C:\Documentsand Settings\Administrator\Local Settings\Temp\中才能找到,这也是6楼所说的藏了一些工作吧,大家不妨试一下。 1子程序格式(程序后缀是.f; .f90; .for;.obj??) 答:我试过,.for格是应该是不可以的,至少6.2和6.3版本应该是不行,其他的没用过,没有发言权。在Abaqus中,运行abaqusj=jobname user=username时,默认的用户子程序后缀名是.for(.f,.f90应该都不行的,手册上也有讲过),只有在username.for文件没有找到的情况下,才会去搜索username.obj,如果两者都没有,就会报错误信息。 如果username包括扩展名for或obj,那么就根据各自的扩展名ABAQUS会自动选择进行操作。 2CAE中如何调用?Command下如何调用? 答:CAE中在creat job的jobmanager中的general中可以指定子程序; Command下用命令:abaqus j=jobnameuser=userfilename (无后缀); 3若有多个子程序同时存在,如何处理 答:将其写在一个文件中即可,然后用一个总的子程序调用(具体参见手册) 4我对VF不是很熟,是否可以用VC,C++编写子程序? A: 若要在vf中调试,那么应该根据需要把SITE文件夹中的ABA_PARAM_DP.INC(双精度)或ABA_PARAM_SP.INC(单精度)拷到相应的位置,并改名为ABA_PARAM.INC即可。 据说6.4的将可以,6.3的你可以尝试着将VC,C++程序编译为obj文件,没试过。在你的工作目录下应该已经存在ufield.obj和uvarm.obj这两个文件(这两个文件应该是你分别单独调试ufield.FOR和uvarm.FOR时自动编译生成的,你可以将他们删掉试试看),但是由于你的FOR文件中已经有了UV ARM 和UFIELD这两个subroutine,显然会造成重复定义,请查实。 用户子程序的使用 假设你的输入文件为:a.inp b.for 那么在ABAQUS Command 中的命令应该是这样的: abaqusjob=a user=b

微机原理实验 源程序

《微机原理及接口技术》 实验指导书 杨霞周林英编 长安大学电子与控制工程学院 2009年9月

前言 本实验指导是为适应各大、中专院校开设微机原理及应用方面的课程需做大量软硬件实验的需要而编写的,供学生编程用。完成本实验指导中的实验,可使学生基本掌握8086/8088的结构原理、接口技术、程序设计技巧。手册中详细叙述了各实验的目的、内容,列出了接线图、程序框图和实验步骤。 主要学习内容为80X86语言实验环境配置、汇编源语言格式、输出字符、循环结构、子程序调用,以及加减乘除等指令操作、通用接口芯片的接口编程与使用。所有实验都是相互独立的,次序上也没有固定的先后关系,在使用本书进行教学时,教师可根据教学要求,选择相应实验。学习结束后,要求学生能够独立编写出综合加减乘除等指令,以及循环结构、子程序调用等程序控制程序、看懂一般接口芯片电路图。

目录 实验一清零程序 (4) 实验二拆字程序 (6) 实验三数据区移动 (8) 实验四多分支程序设计 (10) 实验五多字节减法运算 (13) 实验六显示程序 (16) 实验七 8251串口实验 (20) 实验八步进电机控制 (26) 附录一汇编语言的存储模型 (36) 附录二 8279键值显示程序 (37)

实验一清零程序 一、实验目的 掌握8088汇编语言程序设计和调试方法。 二、实验设备 STAR系列实验仪一套、PC机一台。 三、实验内容 把RAM区内4000H-40FFH单元的内容清零。 四、程序框图 五、源程序清单 .MODEL TINY .STACK 100 .DATA .CODE ORG 0100H START: MOV BX,4000H MOV AX,0000H MOV CX,80H L1: MOV [BX],AX INC BX INC BX LOOP L1 JMP $ END START 六、实验步骤

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

实验三 子程序设计实验 一、实验目的 1.学习子程序的定义和调用方法。 2.掌握子程序的程序设计、编制及调用。 二、实验设备 TDN86/88教学实验系统一台 三、实验内容及步骤 1.求无符号字节序列中的最大值和最小值 设有一字节序列,其存储首址为3000H ,字节数为08H 。利用子程序的方法编程求出该序列中的最大值和最小值。实验程序及流程如下: 主程序 STACK1 SEGMENT STACK DW 64 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE START: MOV SI,3000H MOV CX,0008H CALL branch A1: JMP A1 branch: JCXZ A4 PUSH SI PUSH CX PUSH BX

子程序 实验步骤 (1)输入源程序,进行编译、链接和加载。 (2)在调试区键入E0000:3000↙,输入8个字节的数据:D9、07、8B、C5、EB、04、9D、F9。 (3)运行程序,查看结果,在调试区键入R AX↙,显示结果应为AX=F9 04,AH中为最大值,AL中为最小值。 2.数组求和 设有一字节序列(存储地址和字节数可自定义),编写程序,求出该序列的和,求和工MOV BH,[SI] MOV BL,BH A1: LODSB CMP AL,BH JBE A2 MOV BH,AL JMP A3 A2: CMP AL,BL JAE A3 MOV BL,AL A3: LOOP A1 MOV AX,BX POP BX POP CX POP SI A4: RET CODE ENDS END START

微机原理及应用实验(题目)

微机原理及应用实验 实验一开发环境的使用 一、实验目的 掌握伟福开发环境的使用方法,包括源程序的输入、汇编、修改;工作寄存器内容的查看、修改;内部、外部RAM内容的查看、修改;PSW中个状态位的查看;机器码的查看;程序的各种运行方式,如单步执行、连续执行,断点的设置。二、实验内容 在伟福开发环境中编辑、汇编、执行一段汇编语言程序,把单片机片内的 30H~7FH 单元清零。 三、实验设备 PC机一台。 四、实验步骤 用连续或者单步的方式运行程序,检查30H-7FH 执行前后的内容变化。五、实验思考 1.如果需把30H-7FH 的内容改为55H,如何修改程序? 2.如何把128B的用户RAM全部清零? 六、程序清单 文件名称:CLEAR.ASM ORG 0000H CLEAR: MOV R0,#30H ;30H 送R0寄存器 MOV R6,#50H ;50H 送R6寄存器(用作计数器) CLR1: MOV A,#00H ;00 送累加器A MOV @R0,A ;00 送到30H-7FH 单元 INC R0 ;R0 加1 DJNZ R6,CLR1 ;不到50H个字节,继续 WAIT: LJMP WAIT END 实验二数据传送 一、实验目的 掌握MCS-51指令系统中的数据传送类指令的应用,通过实验,切实掌握数据传送类指令的各种不同的寻址方式的应用。 二、实验内容 1.编制一段程序,要求程序中包含7中不同寻址方式。 2.编制一段程序,将片内RAM30H~32H中的数据传送到片内RAM38H~3AH中。 3.编制一段程序,将片内RAM30H~32H中的数据传送到片外RAM1000H~1002H 中。 4.编制一段程序,将片内RAM40H~42H中的数据与片外RAM2000H~2002H中的数据互换。 三、实验设备 PC机一台。

实验3 子程序设计

实验3子程序设计实验 [实验目的] 1.掌握利用堆栈传递参数的子程序调用方法。 2.掌握子程序递归调用方法。 3.过程调用伪指令: PROC,ENDP,NEAR和FAR。 4.8088指令: CALL,RET,RET n。 5.利用RET指令退出EXE文件的方法。 [实验重点和难点] 1.利用堆栈传递参数的子程序调用方法; [实验课时] 2学时 [实验仪器] 联想启天2400微型计算机。 [实验原理] 1.参考教材的汇编语言程序设计 2. [实验内容与步骤] 1.利用堆栈传递参数的子程序调用(求累加和) 程序内容: STACK SEGMENT STACK DB 256 DUP(0) STACK ENDS DATA SEGMENT ARY1 DB 1,2,3,4,5,6,7,8,9,10 COUNT1 EQU $-ARY1 SUM1 DW ? ARY2 DB 10,11,12,13,14,15,16,17,18 COUNT2 EQU $-ARY2 SUM2 DW ? DATA ENDS MAIN SEGMENT ASSUME CS:MAIN,DS:DATA,SS:STACK START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,COUNT1 PUSH AX LEA AX,ARY1 PUSH AX CALL FAR PTR SUM MOV AX,COUNT2 PUSH AX LEA AX,ARY2 PUSH AX CALL FAR PTR SUM RET START ENDP MAIN ENDS PROCE SEGMENT ASSUME CS: PROCE SUM PROC FAR MOV BP,SP MOV CX,[BP+6] MOV BX,[BP+4] XOR AX,AX ADN: ADD AL,[BX] ADC AH,0 INC BX LOOP ADN MOV [BX],AX RET 4 SUM ENDP PROCE ENDS END START 操作步骤: (1)输入,汇编并将此程序连接成EXE文件。

ABAQUS用户子程序

当用到某个用户子程序时,用户所关心的主要有两方面:一是ABAQUS提供的用户子程序的接口参数。有些参数是ABAQUS传到用户子程序中的,例如SUBROUTINE DLOAD中的KSTEP,KINC,COORDS;有些是需要用户自己定义的,例如F。二是ABAQUS何时调用该用户子程序,对于不同的用户子程序ABAQUS调用的时间是不同的。有些是在每个STEP的开始,有的是STEP结尾,有的是在每个INCREMENT的开始等等。当ABAQUS 调用用户子程序是,都会把当前的STEP和INCREMENT利用用户子程序的两个实参KSTEP和KINC传给用户子程序,用户可编个小程序把它们输出到外部文件中,这样对ABAQUS何时调用该用户子程序就会有更深的了解。 (子程序中很重要的就是要知道由abaqus提供的那些参量的意义,如下) 首先介绍几个子程序: 一.SUBROUTINE DLOAD(F,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS, JLTYP,SNAME) 参数: 1.F为用户定义的是每个积分点所作用的荷载的大小; 2.KSTEP,KINC为ABAQUS传到用户子程序当前的STEP和INCREMENT值;3.TIME(1),TIME(2)为当前STEP TIME和INCREMENT TIME的值;4.NOEL,NPT为积分点所在单元的编号和积分点的编号; 5.COORDS为当前积分点的坐标; 6.除F外,所有参数的值都是ABAQUS传到用户子程序中的。 功能: 1.荷载可以被定义为积分点坐标、时间、单元编号和单元节点编号的函数。 2.用户可以从其他程序的结果文件中进行相关操作来定义积分点F的大小。 例1:这个例子在每个积分点施加的荷载不仅是坐标的函数,而且是随STEP变化而变化的。SUBROUTINE DLOAD(P,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS, 1 JLTYP,SNAME) INCLUDE 'ABA_PARAM.INC' C DIMENSION TIME(2),COORDS(3) CHARACTER*80 SNAME PARAMETER (PLOAD=100.E4) IF (KSTEP.EQ.1) THEN !当STEP=1时的荷载大小 P=PLOAD ELSE IF (KSTEP.EQ.2) THEN !当STEP=2时的荷载大小 P=COORDS(1)*PLOAD !施加在积分点的荷载P是坐标的函数 ELSE IF (KSTEP.EQ.3) THEN !当STEP=3时的荷载大小 P=COORDS(1)**2*PLOAD ELSE IF (KSTEP.EQ.4) THEN !当STEP=4时的荷载大小 P=COORDS(1)**3*PLOAD ELSE IF (KSTEP.EQ.5) THEN !当STEP=5时的荷载大小 P=COORDS(1)**4*PLOAD END IF RETURN END UMAT 子程序具有强大的功能,使用UMAT 子程序: (1) 可以定义材料的本构关系,使用ABAQUS 材料库中没有包含的材料进行计算,扩

微机原理子程序设计

实验三子程序设计 1、实验目的: (1)熟悉汇编语言的编辑、汇编、连接、运行的全过程。 (2)了解汇编语言的程序结构、学习调用过程实现输入输出及用INCLUDE 命令包含文件的方法。 (3)子程序设计 2.实验步骤: (1)用编辑软件记事本或EDIT 编辑一个扩展文件名为ASM的汇编语言源程序。 (2)用汇编程序TASM 汇编上述的汇编语言源程序,形成目标代码文件。 (扩展名为OBJ) (3)用连接程序TLINK连接目标代码文件,形成可执行文件。(扩展名为EXE) (4)运行可执行文件。观察执行结果,以验证其正确性。 3.实验内容: (1)从键盘上输入若干个十进制数(-32767

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

微机实验报告(1)

《微机实验》报告 实验名称 KeilC的使用与汇编语言上机操作 指导教师刘小英 专业班级中法1201 姓名肖洋学号 U3 联系电话 一、任务要求 1.掌握KeilC环境的使用 1)字节拆分、合并:调试程序,观察相关寄存器和单元的内容。 2)数据块填充:调试程序,观察相关寄存器和单元的内容。 2. 编写两个十六位数的加法程序。 有两个十六位无符号数,分别存放在从20H和30H开始的数据区中,低八位先存,高八 位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。 二、设计思路 1.字节拆分、合并程序:利用汇编语言中的 XCHD 和 SWAP 两个语句来实现将八位二进制 数拆分为两个四位二进制数并分别存储于不同的存储空间的功能,BCD 码与 30H 相或(加 上 30H)得到 ASCII 码。将两个 ASCII 码和 0FH 相与(高四位清零)得到 BCD 码,利 用 SWAP 语句将高位数放至高四位,将高位数和低位数相或可实现字节的合并。 2.数据块填充程序:将 R0 用作计数器,DPTR 用作片外数据指针,A 作为原始数据来源, 依顺序在片外的存储单元内容填充数据。利用循环语句来减少程序长度,并控制填充单 元个数为片外 100H 个。(通过 R0 的进位控制) 3.两个十六位数加法程序:把第一个十六位无符号数的地八位和高八位分别存于 20H 和 21H 中,把第二个十六位无符号数的地八位和高八位分别存于 30H 和 31H 中,对 20H 和 30H 中的两个低八位进行 ADD 加法操作,结果存于 R4 中;然后对 21H 和 31H 中的两 个高八位进行 ADDC 带进位的加法操作,结果存于 R3 中.然后将累加器 A 清零,并和#00H

宏指令及子程序设计实验

实验五:宏指令及子程序设计实验 院系名称:电子工程学院 学生姓名:李倩(33) 专业名称:电子信息工程 班级:电子0808

宏指令及子程序设计实验 5.5.1 实验目的 1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。 2、掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。 3、了解宏指令与子程序的异同以及各自的适用场合。 5.5.2 实验预习要求 1、复习宏指令的定义与调用方法。 2、复习过子程序的定义与调用方法。 3、根据“2.5.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。 4、从“2.5.4 实验习题”中任选一道题目,编写源程序,以便上机调试。 5.5.3 实验内容 从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并将找出的最大数在 屏幕上显示出来。 要求: ①在屏幕上显示字符串提示信息的 功能由宏指令DSTRING实现; ②将键盘输入的十进制数转换成二 进制数由子程序DTOB实现; ③在N个无符号字节型二进制数中 找出最大数的功能由子程序FMAX实现; ④将一个无符号字节型二进制数转 换为十进制数并在屏幕上显示的功能由子 程序BTOAD实现。 程序运行结果如右图所示。 1、编程指导 (1)显示提示信息的宏指令DSTRING的编写 宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。这是因为,从执行速度上看,由于子程序调用涉及到保护断点的操作,因此,子程序调用比宏调用执行时间相对要稍长一些;但从生成的可执行文件的大小方面考虑,子程序调用生成的文件要小一些。读者在进行汇编语言程序设计时,应综合考虑两者的利弊,以便进行合理选择。 下面给出实现提示信息显示的宏指令的定义: DSTRING MACRO STRING PUSH DX PUSH AX MOV DX,OFFSET STRING MOV AH,09H INT 21H POP AX POP DX ENDM 请读者注意,宏指令应该先定义,后调用。因此,宏定义通常紧跟在代码段中段寄存器赋值指令之

微机原理及应用实验报告81487

实 验 报 告 课 程 名 称 实 验 名 称 实 验 日 期 学 生 专 业 学 生 学 号 学 生 姓 名 教 师 姓 名 成 绩 南京理工大学机械工程学院 微机原理及应用 实验1 DEBUG 操作实验 实验2 汇编程序设计实验 实验3 8253定时/计数器实验 实验4 8255 并行接口实验 年 月 日 至 年 月 日

实验一DEBUG命令及其操作 一、实验目的 1.熟练掌握debug的常用命令,学会用debug来调试程序。 2.深入了解数据在存储器中的存取方法及堆栈中数据的压入与弹出。 3.掌握各种寻址方法以及简单指令的执行过程。 二、实验要求 1.实验前要作好充分准备,包括汇编程序清单、调试步骤、调试方法以及对程序结果的分析等。 2.本实验要求在PC机上进行。 3.本实验只要求在DEBUG调试状态下进行,包括汇编程序,调试程序,执行程序。三、实验内容 ●实验内容1:学习用DEBUG调试工具进行源程序的输入、汇编、调试和执行。 实验报告要求: 1.写出运行结果; 2.小结debug常用命令及使用体会 答:1.原文已给出(略) 2.a 汇编 d显示内存单元内容 e修改单元内存内容 g执行命令 t单步(或多步)调试 n指定文件路径文件名(含扩展名) u反汇编 r查看寄存器值及修改 l加载程序 w写盘命令 体会:提升学习热情和动手能力有助于理解代码执行过程 ●实验内容2 设AX=3000H,BX=5000H,请编一程序段将AX的内容和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。 实验报告要求: 1.写出完成上述功能的程序段; 2.单步执行,并记录寄存器AX, BX及堆栈指针SP的值 答: A100 Mov ax,3000 ;ax:3000 bx:0000 sp:ffee Mov bx,5000 ;ax:3000 bx:5000 sp:ffee Push ax ;ax:3000 bx:5000 sp:ffec

带参数调用子程序怎么实现

在子程序中定义局部变量表IN ,OUT,IN_OUT,TEMP等。用参数调用子例行程序子例行程序可能包含交接的参数。参数在子例行程序的局部变量表中定义。参数必须有一个符号名(最多为23个字符)、一个变量类型和一个数据类型。可向子例行程序交接16个参数或从子例行程序交接16个参数。局部变量表中的变量类型域定义参数是否交接至子例行程序(IN)、交接至或交接出子例行程序(IN_OUT)或交接出子例行程序(OUT)。下表说明子例行程序的参数类型。欲增加参数条目,将光标放在您希望增加的类型的变量类型域上(IN、IN_OUT或OUT)。单极滑鼠右键,获得选项菜单。选择“插入”选项,然后选择“下一行”选项。在当前条目的下方会显示所选类型的另一个参数条目。调用参数类型说明IN 参数被交接至子例行程序。如果参数是直接地址(例如VB10),在指定位置的数值被交接至子例行程序。如果参数是间接地址,(例如*AC1),位于指向位置的数值被交接至子例行程序。如果参数是数据常量(16#1234)或地址(&VB100),常量或地址数值被交接至子例行程序。IN_OUT 位于指定参数位置的数值被交接至子例行程序,来自子例行程序的结果数值被返回至相同的位置。输入/输出参数不允许使用常量(例如16#1234)和地址(例如&VB100)。OUT 来自子例行程序的结果数值被返回至指定的参数位置。常量(例如16#1234)和地址(例如&VB100)不允许用作输出。TEMP 未用作交接参数的任何本地内存不得用于子例行程序中的临时存储。局部变量表中的数据类型域定义参数的大小和格式。下表列出了参数类型。参数数据类型说明功率流布尔功率流仅限用于位(布尔)输入。该说明通知STEP 7-Micro/WIN 32该输入参数是依据位逻辑指令组合的功率流结果。布尔功率流输入必须首先在局部变量表中任何其他类型输入之前显示。只有输入参数允许这样使用。下例中的启用输入(EN)和IN1输入使用布尔逻辑。布尔该数据类型用于单位输入和输出。下例中的IN3是布尔输入。字节、字、双字这些数据类型分别识别1、2或4个字节不带符号的输入或输出参数。整数、双整数这些数据类型分别识别2或4个字节带符号的输入或输出参数。实数该数据类型识别单精度(4个字节)IEEE浮点数值。

微机8086实验程序

;A1.asm ;显示程序实验 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS DA TA SEGMENT MES1 DB 'Show a as hex:',0AH,0DH,'$' SD DB 'c' DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DA TA MOV DS,AX MOV DX,OFFSET MES1 ;show message MOV AH,09H INT 21 MOV SI,OFFSET SD MOV AL,DS:[SI] AND AL,0F0H ;取高4位 MOV CL,4 SHR AL,CL CMP AL,0AH ;是否是A以上的数 JB C2 ADD AL,07H C2: ADD AL,30H MOV DL,AL ;show character MOV AH,02H INT 21H MOV AL,DS:[SI] AND AL,0FH ;取低4位 CMP AL,0AH JB C3 ADD AL,07H C3: ADD AL,30H MOV DL,AL ;show character MOV AH,02H INT 21H WAIT1: MOV AH,1 ;判断是否有按键按下 INT 16H JZ W AIT1 ;无按键则跳回继续等待,有则退出MOV AX,4C00H ;go back to dos INT 21H CODE ENDS

END START ;A2.asm ;数据传送实验 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS DDATA SEGMENT MSR DB 'HELLO,WORLD!$' LEN EQU $- MSR DDATA ENDS EXDA SEGMENT MSD DB LEN DUP(?) EXDA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DDATA,ES:EXDA START: MOV AX,DDA TA MOV DS,AX MOV AX,EXDA MOV ES,AX MOV SI,OFFSET MSR MOV DI,OFFSET MSD MOV CX,LEN MOV BX,0 NEXT: MOV AL,MSR[BX] MOV ES:MSD[BX],AL INC BX LOOP NEXT PUSH ES POP DS MOV DX,OFFSET MSD MOV AH,9 INT 21H WAIT1: MOV AH,1 ;判断是否有按键按下 INT 16H JZ W AIT1 ;无按键则跳回继续等待,有则退出 MOV AX,4C00H INT 21H

微机实验 子程序设计

微机实验三分支和循环程序设计实验 一、分支程序设计实验 1.实验目的 1.掌握分支程序的结构。 2掌握分支程序的设计、调试方法。 2.实验设备 微机一台 3.内容 设计一数据块间的搬移程序 设计思想: 程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。源数据块和目的数据块在存贮中可能有三种情况。 对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。 可以得出以下结论:当源数据块首址〉目的块首址时,从数据块首址开始传送数据。当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。 流程图: 结果: 在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。可见程序正确。

实现代码如下: DATA SEGMENT ORG 3500H SRC_MESS DB 1,2,3,4,5,6 ORG 3510H NEW_LOC DB 20 DUP(0) DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,SRC_MESS LEA DI,NEW_LOC MOV CX,6 CLD ;DF置0 CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。 JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSB NEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据 DEC SI ; ADD DI,CX ;DI+=DI+CX-1 DEC DI ; STD ; DF置1 JMP NEXT2 ; CODE ENDS END START 结果显示:将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。 DATA SEGMENT

北京理工大学汇编语言实验报告实验五 子程序设计实验

实验五子程序设计实验(设计性实验) 一、实验要求和目的 1.熟悉汇编语言程序设计结构; 2.熟悉汇编语言子程序设计方法; 3.熟悉利用汇编语言子程序参数传递方法; 4.熟悉汇编语言字符串处理基本指令的使用方法; 5.掌握利用汇编语言实现字符串的输入输出程序设计方法; 6.掌握数制转换程序实现方法。 二、软硬件环境 1、硬件环境:计算机系统windows; 2、软件环境:装有MASM、DEBUG、LINK、等应用程序。 三、实验涉及的主要知识 A)子程序知识要点: 1、掌握子程序的定义语句; 过程名 PROC [near/far] 过程体 RET 过程名 ENDP 2.子程序结构形式 一个完整的子程序一般应包含下列内容: 1. )子程序的说明部分 在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法. 说明时,应含如下内容: .子程序名:命名时要名中见意. .子程序的功能:说明子程序完成的任务; .子程序入口参数:说明子程序运行所需参数及存放位置; .子程序出口参数:说明子程序运行结果的参数及存放位置; .子程序所占用的寄存器和工作单元; .子程序调用示例; 2、)掌握子程序的调用与返回 在汇编语言中,子程序的调用用CALL,返回用RET 指令来完成。 .段内调用与返回:调用子程序指令与子程序同在一个段内。因此只修改IP; .段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。 3.)子程序的现场保护与恢复 保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复。 一般利用堆栈实现现场保护和恢复的格式: 过程名PROC [NEAR/FAR]

微机原理实验程序

硬件实验七 D/A转换实验 (2 锯齿波 --------------- ; 注意:进行本实验前, 请先装载运行 D/A 0V输出 (调基准电压程序Asm88\da_0v.asm ; 使 D/A输出端“ AOUT ” 输出电压为 0V , 再进行本实验。 CODE SEGMENT ASSUME CS:CODE,DS:CODE,ES:CODE ORG 33F0H DAPORT EQU 0FFE0H H7: MOV DX,DAPORT MOV AL,00H P7: OUT DX,AL INC AL JMP P7 CODE ENDS END H7 串行通信 CODE SEGMENT ASSUME CS:CODE,DS:CODE,ES:CODE ORG 35C0H ;TX=RX

H11: JMP START Z8251 EQU 0FFE1H D8251 EQU 0FFE0H COM_MOD EQU 04EH COM_COM EQU 25H ZXK EQU 0FFDCH ZWK EQU 0FFDDH LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H BUF DB ?,?,?,?,?,? START: MOV BX,4000H MOV AL,[BX] CMP AL,00H JNZ SR0 SR8251: MOV DX,Z8251 MOV AL,COM_MOD OUT DX,AL MOV AL,COM_COM OUT DX,AL MOV AL,10

汇编语言程序设计实验报告三(子程序设计实验)

汇编语言程序设计实验报告三(子程序设计实验) 一、实验目的 1、掌握主程序与子程序之间的调用关系及其调用方法。 2、掌握子程序调用过程中近程调用与远程调用的区别。 3、熟练掌握码型变换的程序。 二、实验内容 1、从键盘输入二位非压缩BCD数,存入AX寄存器中,编程实现将其转换为二进制 数,并在屏幕上显示。要求码型转换程序用远程子程序编写,字符显示用近程子程序编写。数据可循环输入,遇‘00’结束。 三、实验准备 1、预习子程序设计的基本方法,根据实验内容要求编写出实验用程序。 2、熟悉键盘输入和字符显示的程序段的编制。 四、实验步骤 1、编辑、汇编源程序,生成可执行文件。 2、执行程序,检查输入、输出结果,看是否正确。如不正确,用DEBUG检查,修改 源程序,再汇编、运行,直到程序正确为止。 3、用DEBUG的T命令或P命令跟踪程序的执行,观察在远程和近程调用过程中,堆 栈的变化情况。 五、实验报告要求 1、分析近程调用和远程调用的主要区别。用DEBUG命令观察执行过程有何不同。 2、分析实验结果及所遇到的问题的解决方法。 主程序流程图 转换子程序TRAN流程图

七、程序清单 STA SEGMENT STACK ’STACK’ DB 100 DUP(0) STA ENDS GSAG SEGMENT PARA ‘CODE’ ASSUME CS:CSAG MAIN PROC FAR STRA T: PUSH DS SUB AX,AX PUSH AX REV: MOV AH,1 INT 21H MOV BL,AL INT 21H MOV AH,AL MOV AL,BL CMP AX,3030H JE ENDTRAN CALL NEAR PTR TRAN CALL FAR PTR CON MOV AL,0DH CALL FAR PTR DISP MOV AL,0AH CALL FAR PTR DISP MOV AL,0AH CALL FAR PTR DISP JMP REV ENDTRAN: RET MAIN ENDP TRAN PROC NEAR AND AX,0F0FH MOV BL,AL MOV BL,AL MOV CL,3 SHL AL,CL MOV CL,1 SHL BL,CL ADD AL,BL ADD AL,AH RET TRAN ENDP CSAG ENDS CSBG SEGMENT PARA’CODE’ ASSUME CS:CSBG

微机原理与接口技术实验指导_3_分支程序设计实验

2.3 分支程序设计实验 2.3.1 实验目的 1、掌握分支程序的设计方法。 2、掌握宏定义及宏调用的基本方法。 3、了解小写和大写字母的ASCII码表示及其转换方法。了解数字及其它字符在的ASCII码表示方法。 4、进一步掌握调试工具的使用方法 2.3.2 实验预习要求 1、复习比较指令、条件转移指令的用法。 2、复习宏定义及宏调用的基本方法。 3、根据“2.3.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。 4、程序框架中显示提示信息的指令序列用宏调用实现。 5、从“2.3.4 实验习题”中任选一道题目,编写源程序,以便上机调试。 2.3.3 实验内容 从键盘输入一字符,判断该字符是小写字母、大写字母、数字或其它字符。若输入为小写字母,显示“Y ou Input a Lowercase Letter!”;若输入为大写字母,显示“Y ou Input a Uppercase Letter!”;若输入为数字,显示“Y ou Input a Digit!”;若输入为其它字符,显示“Y ou Input Other Letter!”。 1、编程指导 数字0~9的ASCII码为30H~39H;大写字母的ASCII码为41H~5AH,小写字母的ASCII码为61H~7AH。本题目将字符分为小写字母、大写字母、数字及其它字符,根据键入字符的ASCII码值判断其所属类型,并显示相应的信息。字符串显示使用功能号为09H的DOS功能调用,接收键盘输入的单个字符使用功能号为01H的DOS功能调用。 2、流程图及程序框图 (1)流程图

(2)程序框架 DA TA SEGMENT INFOR1 DB 0AH,0DH,"PLEASE PRESS ANY KEY TO INPUT A LETTER: $" INFOR2 DB 0AH,0DH,"YOU INPUT A LOWERCASE LETTER! $" INFOR3 DB 0AH,0DH,"YOU INPUT A UPPERCASE LETTER! $" INFOR4 DB 0AH,0DH,"YOU INPUT A DIGIT! $" INFOR5 DB 0AH,0DH,"YOU INPUT OTHER LETTER! $" DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DA TA MOV DS,AX MOV DX, OFFSET INFOR1 MOV AH,09H INT 21H MOV AH,01H INT 21H MOV DX, OFFSET INFOR1 MOV AH,09H CMP AL,'0' JB OTHER CMP AL,'9' JBE DIGIT CMP AL,'A' JB OTHER CMP AL,'Z' JBE UPPER CMP AL,'a' JB OTHER CMP AL,'z' JBE LOWER JMP PEND LOWER: MOV DX,OFFSET INFOR2 MOV AH,09H INT 21H JMP PEND UPPER: MOV DX,OFFSET INFOR3 MOV AH,09H INT 21H JMP PEND DIGIT:MOV DX,OFFSET INFOR4

子程序设计实验

实验四子程序设计实验 一、实验目的 1.学习子程序的定义和调试方法。 2.掌握子程序、子程序的嵌套、递归子程序的结构; 3.掌握子程序的程序设计及调试方法。 二、实验设备 PC 机一台,TD-PITE 实验装置一套。 三、实验内容及步骤 1.求无符号字节序列中的最大值和最小值 设有一字节序列,其存储首地址为3000H,字节数为08H。利用子程序的方法编程求出该序列中的最大值和最小值。程序流程图如图4-1所示。 图4-1 程序流程图 实验程序 SSTACK SEGMENT STACK DW 64 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE

START: MOV AX, 0000H MOV DS, AX MOV SI, 3000H ; 数据区首址 MOV CX, 0008H CALL BRANCH ; 调用子程序 HERE: JMP HERE BRANCH PROC NEAR JCXZ A4 PUSH SI PUSH CX PUSH BX MOV BH, [SI] MOV BL, BH CLD A1: LODSB CMP AL, BH JBE A2 MOV BH, AL JMP A3 A2: CMP AL, BL JAE A3 MOV BL, AL A3: LOOP A1 MOV AX, BX POP BX POP CX POP SI A4: RET BRANCH ENDP CODE ENDS END 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的内容小,则修改之。当循环操作结束时,将BH送AH,将BL送AL,作为返回值,同时恢复BX原先的内容。

相关文档
最新文档