汇编实验2
- 格式:doc
- 大小:133.00 KB
- 文档页数:6
班级:2学号:姓名:成绩:实验二拆字、拼字程序一实验目的掌握汇编语言设计和调试方法,熟悉键盘操作。
二实验内容1.把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。
ORG 0660HSE02: MOV DPTR,#2000HMOVX A,@DPTRMOV B,A;(2000)→A→BSW AP A;交换ANL A,#0FH ;屏敝高位INC DPTRMOVX @DPTR,A;送2001HINC DPTRMOV A,BANL A,#0FH ;(2000)内容屏敝高位MOVX @DPTR,A;送2002HSJMP $END2. 把2000H、2001H的低位分别送入2002H高低位,一般本程序用于把显示缓冲区的数据取出拼装成—个字节ORG 0680HSE03: MOV DPTR,#2000HMOVX A,@DPTRANL A,#0FH ;(2000H)内容屏敝高位SW AP A;交换MOV B,A;保存INC DPTRMOVX A,@DPTR ;(2001H)内容送AANL A,#0FH ;屏敝高位ORL A,B ;或INC DPTRMOVX @DPTR,A;送2002HSJMP $END三实验步骤编译、装载程序,以连续或单步方式运行程序,检查2000~20FFH中执行程序前后的变化。
四思考1.将2000的高低位分别送入3000H、3001H的高位, 3000H、3001H低位清零;ORG 0660HSE02: MOV DPTR,#2000HMOVX A,@DPTRMOV B,A;(2000)→A→BSW AP A;交换ANL A,#0FH ;MOV DPTR,#3000HMOVX @DPTR,A;送3000HINC DPTRMOV A,BANL A,#0FHMOVX @DPTR,A;送3001HEND2.把片内20H,21H的高位拼在一起送到片内30H单元。
实验二 用“李萨如图形法” 测量简谐振动的频率一、实验目的1.了解李萨如图形的物理意义规律和特点。
2.学会用“李萨如图形法”测量简谐振动的频率。
二、实验装置图2-1 实验装置框图三、实验原理互相垂直、频率不同的两振动的合成,其合成振动波形比较复杂,在一般情况下,图形是不稳定的。
但当两个振动的频率为整数比时,即可合成稳定的图形,称为李萨如图形。
李萨如图形的形成如图2-2(a)所示,在图2-2(a)中,沿X 、Y 两个方向对两振动信号作两对边框,每对边框各有n x 和n y 两个切点,n x 与n y 之比就等于两个振动周期T x 、T y 之比,即:n y /n x =T y /T x =f x /f y 。
所以。
只要示波器荧光屏上出现了稳定图形,就可根据李萨如图形的规律求出待测频率f 。
1.1/ y x f f 时,振动方程: )2cos(111ϕπ+=t f A x (2-1))2cos(222ϕπ+=t f A y (2-2) 当21ϕϕ=,则21A yA x =,图形为过原点的直线; 当πϕϕ+=21,则21A y A x -=,图形为过原点的直线;当221πϕϕ±=-,则1222212=+A y A x ,图形为以X 、Y 轴为对称轴的椭圆;当21ϕϕ-为其它任意值时,得到的图形是形状各不相同的椭圆。
2.1/≠y x f f 时,合成振动波形不再是椭圆,而是更为复杂的图形。
但是,只要y x f f /是一个有理数,总能形成一个稳定的图形。
例如,2/=y x f f 时,图为“8”形,这表明,当Y 轴变化了一个正峰和一个负峰,则X 轴变化了两个正峰和两个负峰。
2/1/=y x f f 时,图形为“∞”形,这表明,当Y 轴变化了两个正峰和两个负峰,则X 轴变化了一个正峰和一个负峰。
李萨如图形的原理可以直观地同图解法来证明。
由图2-2(a)可以看出:当4/21πϕϕϕ=-=时,示波器上的图形是一斜椭圆;当ϕ由0变到2/π时,图形则由一根斜直线经斜椭圆变为正椭圆;当ϕ继续增加,则又变为斜椭圆,但椭圆的长轴所在象限由I 、Ⅲ象限变为Ⅱ、Ⅳ象限;当ϕ增至π时,图形又变为斜直线。
实验一、寻找最大数最小数实验吴艳红 11283019一、实验目的1、学习循环程序结构,掌握编写循环处理程序的方法和技巧。
2、通过循环结构程序熟悉汇编语言程序设计的主要方法。
3、了解和掌握程序设计过程中算法的选择。
4、掌握汇编语言调试方法。
二、实验题目以buff开始的内存单元中有10个有符号数(字节型DB):-37、28、-115、-2、98、-100、93、120、56、-99请编写程序,找出最大的数并存入MAX单元中,同时也找出最小的数并存入MIN单元中,在Debug下运行程序,查看数据区MAX和MIN的内容检验运行结果。
三、实验过程1、新建一个.txt文件,在文件中编辑寻找最大数最小数的源程序代码,并以max——min.asm命名保存,程序代码见附。
2、用MASM 文件汇编源程序,C>masm max_min.asm; 生成目标文件max_min.obj和max_min.lst。
3、用LINK连接程序,C>link max_min; 形成max_min.exe文件。
结果见截图1:截图14、在DEBUG调试环境下调试并运行max_min.exe程序。
C>debug max_min.exe,首先用R指令,后使用U指令查看编写的程序结果见截图2截图2单步执行完命令后,用 D DS:0 检查数据区MAX及MIN内容,检查结果是否正确。
见截图3:已知78H为最大数,8DH为最小数,说明程序运行结果正确。
截图3四、实验过程遇到的问题以及解决办之前一直在尝试利用加法将ASCII码转换成字符输出,结果总是出现乱码,经过仔细的考虑和认真的尝试之后,终于发现了问题所在:本组给定的数据为-37、28、-115、-2、98、-100、93、120、56、-99,当把最大数还有最小数输入到寄存器DL中用以输出时,数据以补码的形式保存,可是数据默认是ASCII码,每一个ASCII码对应一个字符,所以当存入数据78H时,表示ASCII码的120位字符x,即输出x,而不是78H,如果提出改进,将BUF 的输入值改为0,1,2,3,4,5,6,7,8,9十位数时,经过ASCII码与字符的转换,即在ASCII 码的基础上加一个30H,那么就将数字转换成了相应的字符,如截图4,即为修改后的运行结果截图:输出结果为0和9,结果正确。
汇编语言程序设计实验报告二(分支循环程序实验)一、实验目的1、掌握分支程序、循环程序的设计方法。
2、熟悉DEBUG程序的使用方法。
3、掌握汇编语言程序的编辑、汇编、连接以及调试过程。
二、实验内容1、编写一程序,将内存中某一区域的数据传送到另一个区域中(要求用循结构,不考虑数据块重叠问题)。
2、编写一程序,将内存中某一区域的数据传送到另一区域(要求考虑数据块重叠问题)。
三、实验准备1、预习数据传送指令,熟悉分支和循环程序设计方法。
2、预习DEBUG调试程序的使用方法。
3、根据实验内容要求,编写好实验源程序。
四、实验步骤1、用QE或其它编辑软件,在计算机上编辑源程序,使其正确无误。
2、汇编、连接源程序,产生.EXE可执行文件。
3、运行程序。
(1) 进入DEBUG。
打入DEBUGT MYPROG.EXE。
MYPROG为所编程序的文件名。
(2) 先用G命令连续剧连续执行程序,程序执行完毕后,观察运行结果。
如果执行后是对的,说明程序编写是正确的,如果结果不对,说明程序有错误,则执行下一步。
(3) 检查程序。
在程序中设置若干断点,以便杳出错误所在。
(4) 采用单步命令T或执行程序,观察各寄存器和存储单元内容,以便找到错误之处。
五、实验报告要求1、列出程序清单,并给出程序流程图。
2、总结实现数据传送的几种方法,指出它们的区别。
开始3、分析实验中所遇到的一些问题,分析错误原因。
4、说明本实验中是如何使用DEBUG进行调试的。
CX、SI、DI置初值六、流程图勤开始设置增量方式CX、SI、DI置初值保存SI内容AL [SI] SI SI+源块长度[DI] AL N SI>DIYSI SI+1 恢复SI内容恢复SI内容DI DI+1CX CX-1 设置减量方式N CX=0, SI指向源块末尾DI指向目的块末尾Y结束 [DI] [SI]题一流程图 N 传完了吗, 书馆 Y结束题二流程图七、程序清单题一程序清单:STACK SEGMENT STACK ‘STACK’DB 100 DUP(0)STACK ENDSDATA SEGMENT PARA ‘DATA’SOUR DB 0、1、2、3、4、5、6、7、8、9 DEST DB 10 DUP(,)DB ‘$’DATA ENDSSEGMENT PARA‘CODE’ASSUME CS:CODEMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,10MOV SI,offset SOURMOV DI, offset DESTAGAIN: MOV AL,[SI]MOV [DI],ALINC SIIN DILOOP AGAINMOV DX,offset DESTMOV AH,09HINT 21HRETMAIN ENDPCODE ENDSEND START题二程序清单:DATA SEGMENT PARA ‘DATA’STRG DB ‘ABCDEFGHIJKLMNOP’STG1 EQU STRG+4STG2 EQU STHG+8STRSE EQU 6DATA ENDSSTACK SEGMENT PARA ‘CODE’DB 100 DUP(0) STACK ENDSCODE SEGMENT PARA ‘CODE’ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,STRSEMOV SI,OFFSET STG1MOV DI,OFFSET STG2CLDPUSH SIADD SI,STRSE-1CMP SI,DIPOP SIJL MOVESTDADD SI,STRSE-1ADD DI,STRSE-1 MOVE: REP MOVSB RETMAIN ENDPCODE ENDSEND START。
实验二:监控程序与汇编实验报告一、实验目的本次实验的主要目的是深入了解监控程序的工作原理和汇编语言的编程方法,通过实际操作和编程实践,提高对计算机底层工作机制的理解和掌握能力。
二、实验环境1、操作系统:Windows 102、编程工具:MASM 汇编编译器3、调试工具:DEBUG 调试器三、实验内容1、监控程序的基本原理监控程序是一种系统软件,它负责管理计算机系统的资源,如内存、处理器、输入输出设备等。
监控程序提供了一系列的服务和功能,如任务调度、内存管理、中断处理等,以确保计算机系统的正常运行。
2、汇编语言的基础知识汇编语言是一种低级编程语言,它直接操作计算机的硬件资源,如寄存器、内存地址等。
学习了汇编语言的指令格式、寻址方式、数据类型等基础知识。
3、简单的汇编程序编写与调试使用汇编语言编写了一些简单的程序,如加法运算、数据存储与读取等。
通过 DEBUG 调试器对编写的程序进行调试,查看寄存器和内存的状态,分析程序的执行过程和结果。
四、实验步骤1、安装和配置实验环境下载并安装 MASM 汇编编译器和 DEBUG 调试器。
配置环境变量,以便在命令行中能够方便地使用这些工具。
2、学习监控程序的原理通过阅读相关的教材和资料,了解监控程序的功能和工作流程。
分析监控程序在计算机系统中的作用和地位。
3、学习汇编语言的基础知识掌握汇编语言的指令集和语法规则。
练习不同的寻址方式和数据类型的使用。
4、编写简单的汇编程序使用文本编辑器编写汇编程序代码。
保存为asm 文件。
5、编译和链接汇编程序在命令行中使用 MASM 编译器对asm 文件进行编译,生成obj 文件。
使用 LINK 链接器将obj 文件链接为可执行文件exe。
6、调试汇编程序启动 DEBUG 调试器,加载可执行文件。
使用调试命令查看寄存器、内存的内容,单步执行程序,观察程序的执行过程和结果。
五、实验结果与分析1、加法运算程序编写了一个实现两个数相加的汇编程序。
汇编语言实验二查找匹配字符串一、目的查找匹配字符串SEARCH二、实验内容程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。
流程图N YY Y输入关键字结束关键字长度=0输入句子句子长度<关键字长度Y保存关键字长度到cx ,cx 入栈,保存总循环次数(句子长度-关键字长度+1)到al ,将句子的首地址放进bx(作为基址寄存器) si=di=0(变址寄存器)开始比较[bx+di]与[si]是否相等si+1,di+1,cx-1(同时指向下一个字符)YN bx+1(句子指向下一个字符) cx 出栈,再入栈,si,di 清零,al-1 cx 是否为0N 匹配完成,调用子程序输出al 是否为0 不匹配,输出三、设计和编码DATA SEGMENTmess1 DB'Enter keyword:','$'mess2 DB'Enter Sentence:','$'mess3 DB'Match at location:','$' mess4 DB'NOT MATCH.',13,10,'$' mess5 DB'H if the sentence',13,10,'$'change DB 13,10,'$'stoknin1 label bytemax1 db 10act1 db?stokn1 db 10 dup(?)stoknin2 label bytemax2 db 50act2 db?stokn2 db 50 dup(?)DATA ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODE SEGMENT;*************************************代码段main proc farassume cs:code,ds:data,es:dataSTART:push dssub AX,AXsub BX,BXsub DI,DIsub SI,SIpush AX ;为返回dos并清空后面要用到的寄存器MOV AX,DATAMOV DS,AXLEA DX,mess1MOV ah,09INT 21h ;输出Enter keywordLEA DX,stoknin1MOV ah,0ah ;用21号中段的0ah号功能获取关键字INT 21hcmp act1,0je exit ;如果为空直接退出程序a10:;********************************输入Sentence并判断LEA DX,changeMOV ah,09INT 21h ;输出回程,换行LEA DX,mess2MOV ah,09INT 21h ;输出Enter Sentence:LEA DX,stoknin2MOV ah,0ahINT 21h ;用21号中段的0ah号功能获取句子MOV AL,act1CBWMOV CX,AX ;保存关键字长度到cxPUSH CX ;cx入栈MOV AL,act2cmp AL,0je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1js a50 ;若句子长度小于关键字长度,则跳转显示not match INC ALCBWLEA BX,stokn2 ;将句子的首地址放进BXMOV DI,0MOV SI,0a20:;****************************************比较,内循环MOV AH,[BX+DI]CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30jne a30INC DIINC SIDEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完CMP CX,0je a40jmp a20a30:;*****************************************外循环,BX+1,清空si,di继续内循环比较INC BXDEC ALcmp AL,0je a50MOV DI,0MOV SI,0POP CXpush CXjmp a20a40:;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出SUB BX,offset stokn2INC BXLEA DX,changeMOV ah,09INT 21hLEA DX,mess3MOV ah,09INT 21hCALL btohLEA DX,mess5MOV ah,09INT 21hjmp a10;****************************************二进制转换十六进制btoh PROC NEARMOV CH,4rotate: MOV CL,4ROL BX,CLMOV AL,BLand AL,0fhadd AL,30hcmp al,3ahjl printitadd al,7hprintit:MOV dl,alMOV ah,2int 21hdec chjnz rotateretbtoh endpa50:;*****************************************显示not matchLEA DX,changeMOV ah,09INT 21hLEA DX,mess4MOV ah,09INT 21hjmp a10exit:retmain endpCODE ENDSEND START 四、运行结果及分析五、实验小结六、附录(选)。
实验二 分支与循环程序设计实验
实验目的:熟练掌握Keil 环境下汇编语言程序的调试方法,加深对汇编语言指
令、机器码、寻址方式等基本内容的理解,掌握分支程序和简单程序的设计与调试方法,了解并行IO 口的使用。
实验内容:
1. 设有8bits 符号数X 存于外部RAM 单元,按以下方式计算后的结果Y 也存于外部RAM 单元,请按要求编写程序。
240/2204020X X Y X X X
X ⎧≥⎪=<<⎨⎪≤⎩当当当
2. 利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD 码的形式)。
P
3.0为低电平时开始计时,为高电平时停止计时。
设计1s 延时子程序(延时误差小于10us ,晶振频率12MHz )。
提高部分(选做):
a. 实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。
利用P3.7状态选择加、减计数方式。
b. 利用P3口低四位状态控制开始和停止计数,控制方式自定。
思考题:
1.实现多分支结构程序的主要方法有哪些?举例说明。
2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?怎样用十进制加法指令实现减1计数?。
《化学必修2》实验汇编实验一:钾与水的反应:实验内容实验现象实验结论钾与水反应钾与水剧烈反应,浮在水面上,熔化成小球,不停地滚动,有气体产生,甚至发生轻微的爆炸。
钾能与水反应,反应产生气体、放热钠与水反应钠浮在水面上,熔化成小球,不停地滚动,发出“吱吱”响声,有气体产生向反应后的溶液里加入2滴酚酞试液,立即显红色。
练习1.BD实验二:金属与水、酸的反应1.现象镁与冷水不反应,加热后,镁条表面有气泡产生,一段时间后溶液变红。
化学方程式Mg+2H2O=Mg(OH)2+H2↑2.Mg Al现象产生气泡速率较快铝片表面有气泡产生化学方程式Mg+2HCl=Mg(OH)Cl2+H2↑2Al+6HCl=2AlCl3+3H2↑结论:金属与水或同浓度的酸反应的难易程度、剧烈程度可以用于比较金属的活泼性。
实验三:钠与氯气反应:现象钠在氯气中剧烈燃烧,产生大量白烟化学方程式2Na+Cl2=2NaCl实验四:化学反应与能量1.现象与解释:手有温暖的感觉,温度计测量的温度升高。
说明该反应是放热反应。
2.现象与解释:玻璃片上的水结成冰。
说明该反应是吸热反应。
实验五:催化剂对化学反应速率的影响。
(注意对比实验的设计方法)现象结论加入MnO2有大量气泡冒出MnO2对H2O2的分解有催化作用加入FeCl3有大量气泡冒出FeCl3对H2O2的分解有催化作用不用其它试剂没有明显现象结论:许多过渡金属的氧化物或盐类对H2O2的分解有催化作用。
练习2.(1)催化剂(或催化),2H2O22H2O+O2↑(2)2HIO+H2O2=I2+2H2O+O22H2O22H2O+O2↑(3)不正确,O元素和I元素的化合价均上升,没有化合价降低的元素(或违背电荷守衡原理)H2O2+2I-+2H+=2H2O+I22H2O22H2O+O2↑实验六:甲烷与氯气的反应(注意反应条件的控制) 现象包黑纸 没有明显变化没包黑纸①量筒内气体颜色变浅。
②量筒内壁出现黄色油状液滴。
实验二MASM、LINK指令的使用一、实验目的1.熟练掌握文本编辑器的基本用法。
2.熟悉汇编语言的编辑、汇编、连接、运行的全过程。
3.熟悉Debug调试程序的常用命令和用法。
二、实验要求1.编辑一个扩展文件名为ASM的汇编语言源程序。
2. 用汇编程序MASM汇编上述的汇编语言源程序,形成目标代码文件。
(扩展名为OBJ)3.用连接程序LINK连接目标代码文件,形成可执行文件。
(扩展名为EXE)4.运行可执行文件。
观察执行结果,以验证其正确性。
三、实验任务1. 在文本编辑器(如:记事本程序)中先输入下列汇编语言源程序(注意:文件类型是.ASM文件),使用MASM程序和LINK程序对汇编语言源程序进行汇编和链接,用“debug 可执行文件名”命令,将生成的可执行文件装入内存,然后逐条执行指令,观察执行过程和结果。
练习程序段(实现ZZZ=XXX*16+YYY)如下:DSEG SEGMENTXXX DW 1234HYYY DW 5678HZZZ DD ?DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AXMOV AX,XXXXOR DX,DXADD AX,AXADC DX,DXADD AX,AXADC DX,DXADD AX,AXADC DX,DXADD AX,AXADC DX,DXADD AX,YYYADC DX,0MOV WORD PTR ZZZ,AXMOV WORD PTR ZZZ+2,DXMOV AH,4CHINT 21HCSEG ENDSEND START四、实验步骤1.任选熟悉的编辑软件(、记事本等),输入示例程序,存盘取名为EX1.ASM 2.利用MASM进行汇编,过程如下:开始->运行->cmd <Enter>然后在DOS的当前系统提示符下输入:CD \masm611 <Enter>C:\masm611>MASM EX1 <Enter>屏幕显示:Microsoft (R) Macro Assembler Version 5.00Copyright (C) Micosoft Cop. 1981-1985, 1987Object filename [EX1.OBJ]: <Enter>Source listing [NUL.LST]: <Enter>Cross reference [NUL.CRF]: <Enter>以上信息中方括中为该项提示的缺省回答值,冒号后面等待用户输入信息,若不改变缺省值则直接按回车键。
目录系统认识 (1)实验一数码转换编程及程序调试 (5)实验二运算类编程实验 (11)实验三分支程序、循环程序设计实验 (16)实验四子程序设计实验 (22)实验五显示程序实验 (26)实验六串行通讯应用实验 (27)附录WMD86 联机软件使用说明 (40)系统认识一、实验目的掌握TD-PITE微机原理与接口技术教学实验系统的操作,熟悉Wmd86联机集成开发调试软件的操作环境。
二、实验设备PC微机一台,TD-PITE实验装置一套。
三、实验内容编写实验程序,将00H~0FH共16个数写入内存3000H开始的连续16个存储单元中。
四、实验步骤1. 运行Wmd86软件,进入Wmd86集成开发环境。
2. 根据程序设计使用语言的不同,通过在“设置”下拉列表来选择需要使用的语言,如图1所示。
语言选择后,下次再启动软件,语言环境保持这次的修改不变。
在这里,我们选择汇编语言。
图13. 语言选择后,点击新建或按Ctrl+N组合键来新建一个文档,如图2所示。
默认文件名为Wmd861。
图24. 编写实验程序,如图3所示,并保存,此时系统会提示输入新的文件名,输完后点击保存。
图3程序:SSTACK SEGMENT STACK ;定义堆栈段DW 32 DUP(?)SSTACK ENDSCODE SEGMENTASSUME CS:CODE, SS:SSTACKSTART: PUSH DSXOR AX, AXMOV DS, AXMOV SI, 3000H ;建立数据起始地址MOV CX, 16 ;循环次数AA1: MOV [SI], ALINC SI ;地址自加1INC AL ;数据自加1LOOP AA1AA2: JMP AA2CODE ENDSEND START5. 点击,编译文件,若程序编译无误,则输出如图4所示的输出信息,然后再点击进行链接,链接无误输出如图5所示的输出信息。
图4图56. 连接PC与实验系统的通讯电缆,打开实验系统电源。
实验二:二进制到BCD码转换学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握无条件转移指令、条件转移指令;2.掌握利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法;3.掌握直接向视频RAM送ASCII码进行屏幕显示的方法;4.掌握屏幕字符显示程序编写与调试。
二、实验内容将存放在BIN的一个16位无符号数转换为BCD码,结果的万、千,百、十、个位依次存放在BCD+0、BCD+1、BCD+2、BCD+3、BCD+4单元内三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求对操作数的寻址、转换方法至少要由两种以上。
五、主要实验步骤及结果1.直接向VRAM送ASCII码显示字符(1)用A命令在100H处键入下列程序MOV AX,B000MOV DS,AXXOR AL,ALXOR BX,BXMOV CX,100LOP:MOV [BX],ALINC BXINC ALPUSH CXMOV CX,8DELY:PUSH CXMOV CX,0J:LOOP JPOP CXLOOP DELYPOP CXLOOP LOPINT 20(2)用N命令和W命令将此程序存入文件中。
(一定要先存入!)(3)用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H 2号功能调用有何不同?控制字符区在该程序中没有显示,在上一个程序中显示为笑脸等符号。
(4)自编程序:将存放在BIN的一个16位无符号数转换为BCD码反汇编;-U10013A3:0100 BB0010 MOV BX,100013A3:0103 8B07 MOV AX,[BX]13A3:0105 BB0000 MOV BX,000013A3:0108 BA0000 MOV DX,000013A3:010B BB0A00 MOV BX,000A13A3:010E F7F3 DIV BX13A3:0110 A21310 MOV [1013],AL13A3:0113 89161410 MOV [1014],DX13A3:0117 BB6400 MOV BX,006413A3:011A F7F3 DIV BX13A3:011C A21210 MOV [1012],AL13A3:011F 89D0 MOV AX,DX执行情况:-t=100AX=0000 BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13A3 ES=13A3 SS=13A3 CS=13A3 IP=0103 NV UP EI PL NZ NA PO NC 13A3:01038B07 MOV AX,[BX] DS:1000=0000六、思考题利用INT 21H 显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?答:利用INT 21H显示时,07H-0DH的控制符会用笑脸之类的符号显示;直接向VRAM 送ACSII码时,07H-0DH的控制符不显示。
汇编实验2.1-2.4软件工程20091120183 李铮2.1数据传送指令的使用1.实验目的:负责把数据、地址或立即数传送到寄存器、存储单元以及I/O端口,或从内存单元、I/O端口中读取数据。
可以分为下面几类:1. 通用传送指令:MOV,PUSH,POP,XCHG,XLA T2. 输入输出指令指令: IN,OUT3. 目的地址传送指令: LEA,LDS,LES4. 标志位传送指令: LAHF,SAHF,PUSHF,POPF2.实验步骤:1. 传送指令1)用A命令在内存100H处键入下列内容:MOV AX,1234MOV BX,5678XCHG AX,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG AX,DX2)用U命令检查键入的程序并记录,特别注意左边的机器码。
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
2.改变标志寄存器psw中tf标志的状态(0——1或1——0),其余位保持不变。
3. 设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。
在DEBUG状态下使用A 命令送入下面程序,并用单步T命令执行的方法,分析每条指令源地址的形成过程?当数据传送每完成一次,试分析AX寄存器中的内容是什么?程序清单如下:MOV AX,BXMOV AX,0304HMOV AX,[0304H]MOV AX,[BX]MOV AX,0001[BX]MOV AX,[BX][SI]HLT4. 使用标志位传送指令,编程序段将标志位寄存器的低八位的值存入内存单元DS:1000H 中或堆栈中,然后将标志位寄存器的低八位置位为10101010。
2.2算术逻辑运算和移位指令的使用1.实验目的:使用算术逻辑运算和移位指令,可以实现对二进制数据的加、减、乘、除等四则运算,与、或、非、异或等逻辑运算,以及移位运算和代码转换运算。
实验报告二课程微机原理实验名称汇编语言程序上机过程以及调试第页专业电子信息班级__ __ 学号_ __ 姓名实验日期:2014 年 3 月10 日报告退发(订正、重做)一、实验目的学习汇编语言程序设计的基本步骤,即编辑(EDIT)程序、汇编(MASM)、连接(LINK)和运行,使对汇编语言程序设计有一个初步的认识。
二、实验内容1、学习使用全屏幕文本编辑软件EDIT。
用EDIT输入一段给定的源程序。
2、用MASM对已存盘的源程序进行汇编,形成目标文件(.OBJ);如有错误,再返回到EDIT进行修改。
3、用LINK对上述形成的目标文件进行连接,形成可执行文件(.EXE)4、在DOS提示符下运行该可执行文件。
[汇编语言程序的编写格式]汇编语言程序一般由几个段组成,它们分别是堆栈段,数据段,代码段。
任何一个源程序至少必须有一个代码段和一条作为源程序结束的伪指令END。
段的定义有两种格式,分述如下:1,完整的段定义格式:一个段由段头,段体,段尾组成,形式如下:段名SEGMENT[定位类型][组合类型][‘类别’]……段名ENDS其中SEGMENT后的参数一般可省略,详细说明参阅后面的有关章节。
2,简化的段定义格式(MASM5.0版本提供)每段以.开始后跟固定的段名,一般形式如下:DOSSEG.MODEL 存储类型;“存储类型”可选择为SMALL。
.STACK[大小];堆栈段,“大小”指定堆栈的字节数。
.DATA;数据段。
.CODE[名字];代码段;一般只有一个代码段,名字可缺少……例1:用完整的段定义编写一源程序。
NAME EXAM1;可以省略DATA SEGMENT;定义数据段,以下是数据段的内容STR1 DB “HELLO,WELCOME!”,13,10,‘$’STR2 DB “DO YOU LIKE COMPUTER?(Y/N)”,13 10,‘$’STR3 DB “NICE!”,13,10,‘$’STR4 DB “SORRY!”,13,10,‘$’STR5 DB “UNKNOW,ANSWER AGAIN!(Y/N)”,DB 13,10,‘$’STR6 DB “SEE YOU NEXT TIME!”,13,10,‘$’DA TA ENDS ;数据段结束CODE SEGMENT ;定义代码段ASSUME CS:CODE;DS:DATA;以下是代码段内容START:MOV AX,DA TA;给数据段寄存器赋值MOV DS,AXMOV AH,9;显示一字符串的功能号MOV DX,OFFSET STR1;显示字符串STR1的偏址INT 21H;DOS功能调用ASK :MOV DX,OFFFSET STR2;显示字符串STR2INT 21HMOV AH,1;键盘输入一字符的功能号INT 21H;键入的字符ASCⅡ码在ALNOT AL;求反TEST AL,‘Y’;是否按下‘Y’或‘y’键JE NEXT1TEST AL,‘y’JE NEXT1TEST AL,‘N’;是否按下‘N’键或‘y’键JE NEXT2TEST AL, ‘n’JE NEXT2MOV DX,OFFSET STR5;不是按上述键MOV AH,9INT 21HJMP ASK;再返回ASKNEXT1:MOV DX,OFFSET STR3;是按下‘Y’或‘y’键MOV AH,9INT 21HJMP BYENEXT2:MOV DX,OFFSET STR4;是按下‘N’或‘n’键MOV AH,9INT 21HBYE:MOV DX,OFFSET STR6INT 21HMOV DL,7;喇叭响的ASCⅡ码MOV AH,2INT 21HMOV AH,4CH;退回DOSINT 21HCODE ENDS;代码段结束END START;源程序结束注:源程序中的每一行注释语句前一定要加分号‘;’,下同。
8086汇编语⾔学习(⼆)8086汇编开发环境搭建和Debug模式介绍1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语⾔。
⼯欲善其事,必先利其器,在8086汇编语⾔正式开始学习之前,先介绍⼀下如何搭建8086汇编的开发环境。
汇编语⾔设计之初是⽤于在没有操作系统的裸机上直接操作硬件的,但对于⼤部分⼈来说,在8086裸机上直接进⾏编程将会⾯临各种困难。
好在我们可以使⽤软件模拟器来模拟硬件进⾏8086的学习实践。
在《汇编语⾔》中作者推荐通过windows环境下的masm和debug进⾏学习。
masm介绍: masm是⼀款DOS下的汇编⼯具包,在8086汇编的学习中我们需要其中的⼏个⽂件,分别是masm.exe,link.exe。
masm.exe 汇编器,⽤于将⽂本格式的汇编语⾔源⽂件编译为.obj结尾的⼆进制⽂件,其⽣成的.obj结尾的⼆进制⽬标⽂件是被编译的源⽂件的对应的机器码。
单独的源程序⽬标⽂件通常是⽆法直接运⾏的,还需要和互相依赖的其它同样编译完成的⼆进制⽂件链接在⼀起才能⽣成最终的可执⾏⽂件(⽐如所需要的静态库函数) 。
因此,obj⽂件通常也被叫做中间⽂件。
link.exe 链接器,obj⽂件需要通过链接才能转换成可执⾏程序,⽽链接器就是负责完成这⼀任务的。
链接器能将多个obj⽬标⽂件以及其所依赖的库程序进⾏统⼀处理(例如多个⽬标⽂件中指令、数据内存地址的偏移处理),并⽣成可执⾏⽂件。
debug介绍: debug.exe 调试器,windows提供了⼀个在dos中调试8086汇编程序的⼯具debug.exe,提供了展⽰程序运⾏时CPU中各寄存器、内存中数据,指令级的单步调试等功能。
debug程序的使⽤会在本篇博客的后半段进⾏详细介绍。
64位操作系统兼容性问题: 由于《汇编语⾔》⼀书出版较早,当时的windows系统还是32位的,32位windows系统都默认安装了masm与debug,能打开dos窗⼝直接使⽤。
实验二初级程序的编写与调试一、实验目的1、熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
2、深入了解数据在存储器中的存取方法及堆栈中数据的压入与弹出。
3、掌握各种寻址方法及简单指令的执行过程。
二、程序(调试)说明1、设堆栈指针SP=2000H,AX=3000H,BX=5000H。
请编写程序将AX的内容和BX 的内容进行交换。
用堆栈作为两存储器交换的中间存储单元,用DEBUG调试程序进行汇编与调试-A 1000BB3:0100 MOV SP,20000BB3:0103 MOV AX,3000 ;赋初值0BB3:0106 MOV BX,50000BB3:0109 PUSH AX ;压入堆栈0BB3:010A PUSH BX0BB3:010B POP AX ;弹出堆栈0BB3:010C POP BX0BB3:010D INT 20 ;中断当前执行程序0BB3:010F HLT0BB3:0110-用堆栈作为两存储器交换的中间存储单元,使用起来很方便。
2、设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH、0BH、0CH、0DH、0EH。
在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程。
当数据传送完毕,AX中的内容是什么。
MOV AX,BXMOV AX,0304HMOV AX,[0304H]MOV AX,[BX]MOV AX,0001[BX]MOV AX,[BX][SI]MOV AX,0001[BX][SI]INT 20HHLT第一步:显示、填充、清零。
第二步:给存储器偏移地址300H~304H连续单元设初值1、2、3、4、5;并在0AH~0EH上显示出来;第三步:输入代码,并显示。
这时AX、BX、CX、DX都为0。
赋BX、SI的初值第四步:,并显示存储器偏移地址300H~304H连续单元。
微机原理实验报告实验二熟悉汇编程序建立及其调试方法一、实验目的1.熟悉汇编语言源程序的框架结构,学会编制汇编程序。
2.熟悉汇编语言上机操作的过程,学会汇编程序调试方法。
二、实验内容1.学习编写汇编语言源程序的方法,了解数据存放格式。
2.阅读给出的程序,找出程序中的错误。
3.通过调试给出的汇编语言源程序,了解并掌握汇编语言程序的建立、汇编、链接、调试、修改和运行等全过程。
三、修改后的程序STACKSG SEGMENT PARA STACK'STACK' ;定义堆栈段DB 256 DUP (?) ;堆栈段为256个字节空间,STACKSG ENDSDATASG SEGMENT PARA 'DATA' ;设置数据段BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512;定义数据段有20个字的数据 DW 23, 56, 420, 75, 0,-1024,-67,39,-2000COUNT EQU 20 ;定义计数次数常量COUNT等于20MAX DW ? ;保留1个字空间,用以存放最大值结果DATASG ENDSCODESG SEGMENT ;代码段ASSUME SS : STACKSG, CS : CODESG ;STACKSG为堆栈段CODESG为代码段ASSUME DS : DATASG ;DATASG为数据段ORG 100H ;指令语句的起始偏移量为100HBEGIN: MOV AX, DATASG ;保存最大值结果MOV DS,AX ;给段寄存器赋值LEA SI,BLOCK ;将SI设为指向数据的指针MOV CX,COUNT ;设置循环次数,CX中装入计数初值DEC CX ;CX循环次数减1MOV AX,[SI] ;从内存取数到AXCHKMAX: ADD SI,2 ;取完一次数据,地址偏移量加2CMP [SI],AX ;数据指针当前所指单元的值与 AX比较JLE NEXT ;取其中较大者存于AX中MOV AX,[SI]NEXT: LOOP CHKMAX ;与数据段最后一个数据比较后跳出循环MOV MAX,AX ;保存最大值到MAXMOV AH,4CH ;退出程序INT 21HCODESG ENDSEND BEGIN程序的功能:输入20个数,比较出数值最大的一个数。
仲恺农业工程学院实验报告纸
信息科学与技术学院(院、系)计算机科学与技术专业142 班
学号:201420224430 姓名:黄丽君实验日期教师评定
汇编语言程序设计实验2 人机界面设计初步
实验目的:
1、掌握汇编语言的开发环境
2、熟悉汇编语言的调试过程
3、掌握DOS功能调用的使用方法
实验内容:
1、编程实现:从键盘输入一个4位的年份,判断输出该年是否为闰年
2、编程实现:在屏幕上显示一个菜单,并且实现菜单中的退出功能。
实验步骤
(1)
DSEG SEGMENT ;定义数据段
INBUFF DB 5,?,5 DUP(?)
PROMPT DB 'please input the year:','$'
ERRMSG DB 'input illegal!','$'
YES DB ' is a leap year:','$'
NO DB ' is not a leap year:','$'
MESS DB ' continue?(y/n):','$'
NEWLINE DB 13,10,'$'
DSEG ENDS
SSEG SEGMENT STACK ;定义堆栈段
DB 100H DUP(?) ;设置堆栈段大小为100H
SSEG ENDS
CSEG SEGMENT ;定义代码段
ASSUME CS:CSEG, DS:DSEG, SS:SSEG ;关联段寄存器START:
push ds
sub ax,ax
push ax
mov ax,DSEG
mov ds,ax
lop0:
call input
call judge
lea dx,mess
mov ah,09h
int 21h ;是否继续输入年份的判断
mov ah,01h
int 21h
cmp al,'n'
je exit
continue:
lea dx,newline
mov ah,09h
int 21h
jmp lop0
exit:
ret
;MAIN endp
;输入一个具体的年份,并转换成10进制
;返回:
;(ax)=输入的年份
input proc near
push bx
push cx
push dx
s1:
lea dx,prompt
mov ah,09h
int 21h ;提示输出
lea dx,inbuff
mov ah,0ah
int 21h ;键盘输入
mov dl,byte ptr inbuff[1] ;把有效地址为inbuff的字节送给dl cmp dl,4 ;输入的值判断是否为4位数
jne error ;调用输入不合条件时的错误处理mov cx,4
lea bx,inbuff
add bx,2
mov ax,0
mov dx,0
lop1: ;检查输入有效性
mov dl,10
mul dl
mov dl,byte ptr [bx]
sub dl,30h ;将字符转化为数值
cmp dl,0
jb error
cmp dl,9
ja error
inc bx ;循环体中字符在字符串中的位置bx+1 loop lop1
jmp s2
error: ;错误处理
lea dx,newline
mov ah,09h
int 21h
lea dx,errmsg
mov ah,09h
int 21h
lea dx,newline
mov ah,09h
int 21h
jmp s1
s2:
mov cx,ax
lea dx,newline
mov ah,09h
int 21h
mov ax,cx
pop dx
pop cx
pop bx ;现场恢复
ret
input endp
;判断一个年份是否闰年
;输入:
;(ax)=年份
judge proc near
push bx
push cx
push dx
push ax ;保存ax;输出要判断的年份
mov cx,4
lea bx,inbuff
add bx,2
lop2:
mov dl,byte ptr [bx]
mov ah,02h
int 21h
inc bx
loop lop2 ;循环输出年份正确时结果中的年份
lop3:
mov dx,0
mov cx,ax ;保存ax到cx中
mov bx,4 ;判断是否能被4整除
div bx
cmp dx,0
jne notleap
mov ax,cx
mov bx,100 ;判断是否能被100整除
div bx
cmp dx,0
jne isleap
mov ax,cx
mov bx,400 ;判断是否能被400整除
div bx
cmp dx,0
jne notleap
isleap:
lea dx,yes
mov ah,09h
int 21h
jmp s3
notleap:
lea dx,no
mov ah,09h
int 21h
s3:
;换行
lea dx,newline
mov ah,09h
int 21h ;输出年份正确时结果的剩余部分pop dx
pop cx
pop bx
ret
judge endp
CSEG ENDS
END START ; 程序结束
(2)
DSEG SEGMENT ;定义数据段
DSEG ENDS
SSEG SEGMENT STACK ;定义堆栈段
DB 100H DUP(?) ;设置堆栈段大小为100H
SSEG ENDS
CSEG SEGMENT ;定义代码段
ASSUME CS:CSEG, DS:DSEG, SS:SSEG ;关联段寄存器
ORG 100H
START: ;主程序入口点
;TO DO:添加主程序代码
; ------------------------------------------------------
JMP BBB
MEUN: DB 10,13,' -----------------MENU----------------------'
DB 10,13,' | | '
DB 10,13,' | 1.EXIT | '
DB 10,13,' | 0.QUIT |'
DB 10,13,' | | '
DB 10,13,' |-------------------------------------------|'
DB 10,13,' please choose one of 0-1:','$'
BBB: PUSH CS
POP DS
DISP0:
MOV AH,15
INT 10H
MOV AH,0
INT 10H
LEA DX,MEUN
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,'0'
JE EXIT
CMP AL,'1'
JE DISP1
JMP DISP0
DISP1: ;------------------------------------------------------- ; 退出DOS
MOV AH, 4CH ;返回DOS系统
INT 21H
EXIT: MOV AH,4CH
INT 21H
CSEG ENDS
;TO DO: 添加其他段[可选]
;///////////////////////////////////////////////////////////////
END START ; 程序结束。