北京理工大学汇编实验三
- 格式:pdf
- 大小:849.30 KB
- 文档页数:24
实验一MASM for Windows 环境下的汇编语言编程环境使用一. 实验目的1.掌握MASM for Windows 环境下的汇编语言编程环境使用;2.掌握汇编语言程序设计的基本流程;3.掌握8086/8088 基本指令的使用方法和功能;4.熟练掌握DEBUG 的使用方法。
二.实验基本原理1.设计思想建立源地址指针和目标地址指针,将字节数送入CX寄存器,取源数据一个字节送入AL中,将源数据再从AL中送入目标地址单元中,最后判断是否传送完毕。
2.相关知识(1).通用传送指令包括MOV、PUSH、POP、XCHG和XLAT指令,本次实验用到的是MOV 和PUSH。
a.基本传送指令MOV,指令格式及操作:MOV DST,SRC ;DST为目标操作数,SRC为源操作数。
该指令功能是将员操作数内容传送到目标操作数,但源操作数内容保持不变。
其特点是:①进行8位、16位数据操作;②适用于各种寻址方式;③源操作数和目标操作数数据类型必须一致;④立即数不能作为目标操作数,也不能直接传送到段寄存器;⑤存储器之间不能直接传送;⑥CS不能作为目标操作数。
b.压入指令PUSH,指令格式及操作:PUSH SRC ; SRC为源操作数,可以是寄存器、段寄存器或者存储器操作数,但不允许为立即数指令功能是:首先调整堆栈指针、然后将16位源操作数送入SP所指的存储单元中。
(2)OFFSET是将数值回送变量或标号的偏移地址值。
三.实验程序清单DATA SEGMENTBUF1 DB 1H,2H,3H,4H,5H,6H,7H,8H,9H,0AH,0BH,0CH,0DH,0EH,0FHBUF2 DB 20 DUP(?)COUNT EQU $-BUF1DATA ENDSSTACK1 SEGMENT STACKDB 20 DUP(?)STACK1 ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK1,CS:CODESTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV SI,OFFSET BUF1 ;建立源地址指针MOV DI,OFFSET BUF2 ;建立目标地址指针MOV CX,COUNT ;字节数送入CX 寄存器L1: MOV AL,[SI] ;取源数据一个字节送入AL 中MOV [DI],AL ;将源数据送入目标地址单元中INC SIINC DIDEC CXJNZ L1 ;判断是否传送完毕EXIT: RETSTART ENDPCODE ENDSEND START四.实验步骤1. 利用MASM for Windows 输入源程序,然后运行,如果有误需要修改2.利用debug 命令,使用L、U、G 及DDS:0 命令调试并运行程序,具体命令使用方法:(1)用DEBUG 的R 命令查看、改变CPU 中寄存器的内容(2)用DEBUG 的D 命令查看内存的内容;(4)用DEBUG 的U 命令将内存中的机器指令翻译成汇编指令五.实验结果BUF1的数据存入BUF2中。
北京理工大学珠海学院实验报告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY班级:学号:姓名:指导教师:成绩实验题目:实验时间:一、实验目的:掌握ARP命令的用法,理解ARP协议原理,理解ARP协议的分组格式。
二、实验内容及步骤:1.实验内容:用ARP命令查看本机ARP缓存中的内容,ARP命令的参数的使用,捕获ARP分组,分析分组格式和首部各字段的含义。
2.实验步骤:(1)观察ARP缓存表的内容通过命令arp –a 查看本机ARP缓存的内容,分析每个项目的含义。
在命令窗口执行命令ping 临机IP,再观察ARP缓存的内容,理解ARP缓存的作用和生成过程。
(2)观察ARP缓存生存时间反复用命令arp –a 查看ARP缓存,通过计时观察动态ARP缓存的生存时间。
(3)观察本机ARP缓存生成过程在命令行下用arp –d命令删除PC1上的所有arp表项,然后用ping 临机ip,用该命令来触发arp过程。
通过科来网络分析系统捕获分组可以观察arp过程。
此时在PC1和PC2上,在命令行下用arp –a命令即可观察到对方的MAC地址。
根据观察到的现象理解arp过程。
(4)观察ARP分组格式启动科来网络分析系统,开始捕获,在命令窗口执行命令ping 临机ip,命令执行完成后,停止捕获,观察ARP分组的内容。
三、实验结果1.ping 10.0.149.183 发现bytes=32 ttl=642.连续输入arp -a查看缓存,发现动态ARP生存时间是2分钟。
3.输入arp -d 删除ARP 上的表项。
4.输入ping 10.0.149.183 先不回车,打开科莱网络分析系统,然后回车,停止科莱网络分析系统抓包,查看数据。
四、思考与讨论1.实验过程观察到了动态ARP缓存经过一定时间自动删除,如何生成静态ARP缓存?答:可以对每台主机IP和MAC地址静态绑定,通过命令arp -s可以实现“arp -s IP MAC地址”2.ARP缓存中各个项目的含义是什么?类型字段的类型及含义分别是什么?答:第一个字段是广播类型的MAC地址,其目标是网络上的所有主机。
实验一 流体流动阻力的测定摘要:通过实验测定流体在光滑管、粗糙管、层流管中流动时,借助于伯努利方程计算摩擦阻力系数和雷诺数之间的关系,并与理论值相比较。
同时以实验手段计算突然扩大处的局部阻力,并对以上数据加以分析,得出结论。
一、目的及任务1.掌握测定流体流动阻力的实验的一般实验方法。
2.测定直管的摩擦阻力系数λ及突然扩大管和阀门的局部阻力系数ξ。
3.测定层流管的摩擦阻力。
4.验证湍流区内摩擦阻力系数λ与雷诺数Re 和相对粗糙度的函数。
5.将所得的光滑管的λ-Re 方程与Blasius 方程相比较。
二、基本原理1.直管摩擦阻力不可压缩流体(如水),在圆形直管中做稳定流动时,由于黏性和涡流的作用产生摩擦阻力;流体在突然扩大、弯头等管件时,由于流体运动速度和方向的突然变化,产生局部阻力。
影响流体阻力的因素较多,在工程上采用量纲分析方法简化实验,得到在一定条件下具有普遍意义的结果,其方法如下。
流体流动阻力与流体的性质,流体流经处几何尺寸以及流动状态有光,可表示为∆p=f (d ,l ,u ,ρ,μ,ε)引入下列无量纲数群雷诺数Re=μρdu相对粗糙度d ε 管子的长径比dl从而得到),,du (p 2d ld u εμρρψ=∆令λ=Φ(Re ,dε) 2)(Re,2u d d l pερΦ=∆可得摩擦阻力系数与压头损失之间的关系,这种关系可用实验方法直接测定。
22u d l ph f ⨯=∆=λρ式中 f h ——直管阻力,J/Kg ; l ——被测管长,m ; d ——被测管内径,m ;u ——平均流速,m/s ;λ——摩擦阻力系数。
当流体在一管径为d 的圆形管中流动时,选取两个截面,用U 形压差计测出这两个截面间的静压强差,即为流体流过两截面间的流动阻力。
根据伯努利方程找出静压强差和摩擦阻力系数的关系式,即可求出摩擦阻力系数。
改变流速可测出不同Re 下的摩擦阻力系数,这样就可得出某一相对粗糙度下管子的λ-Re 关系。
汇编语言实验报告实验一 DOS环境下的汇编语言编程环境使用(基础与验证型)班级:05211002姓名:张宁学号:1120102310实验日期:2012.9.7晚6:00~9:00汇编语言实验报告实验一 DOS 环境下的汇编语言编程环境使用(基础与验证型)一、实验要求和目的1、掌握汇编语言程序设计的基本流程和学会上机开发简单程序;2、熟练掌握宏汇编程序MASM 的使用;3、熟练掌握连接程序LINK 的使用;4、熟练掌握DEBUG 的使用;二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识汇编语言程序设计上机开发过程如图1.1 所示。
四、实验内容与步骤1、汇编、链接并调试给出的简单程序,找出程序中的错误。
(一)录入并建立汇编语言源程序文件(ASM 文件)(二)用汇编程序MASM 将ASM 文件汇编成目标程序文件(OBJ 文件)(三)用连接程序LINK 生成可执行程序文件(EXE 文件)(四)程序的调试2、完成程序设计:分类统计字数组data 中正数、负数和零的个数,并分别存入内存字变量Positive、Negative 和Zero 中,数组元素个数保存在其第一个字中。
使用Debug 查看Positive、Negative 和Zero 三个变量的数据。
五、实验过程及结果:实验一:1.输入给出的程序2.运行输入的程序,发现了三处错误:根据错误提示,发现错误为ADDITION后未打冒号,CMP错打为COM。
修改原代码:改为:3.代码编译成功,生成OBJ文件,再生成EXE文件,可成功运行。
4.在原程序代码后添加两行代码,以验证ADDITION的逻辑正确性,改动如下:现实在DA TA1中添加字节型sum ,再将ADDITION的运行结果,从AX送到sum中去。
5.调试发现ADDITION并没用正确运行。
检查语句逻辑性发现,应将JAE改成JB,才能实现累加并终结。
实验室管理文件汇编爆炸科学与技术国家重点实验室(北京理工大学)目录规章制度2学术委员会章程(修改稿)24学术交流与论文(著)发表管理条例26开放基金申请与管理条例29自主研究课题管理条例32“杰出青年科学研究基金培育计划“实施办法36“全国优秀博士学位论文培育计划”实施办法39重点实验室专项经费管理办法(草)42开放课题经费管理办法46基本科研业务费(自主研究课题经费)管理办法48实验中心资源管理和使用办法51计算与仿真中心机房安全管理制度58关于开展“可移动式救生舱舱体抗爆炸冲击性能数值模拟分析”工作的管理规定64山东研究基地科研专项基金管理办法66山东研究基地章程68仪器设备使用收费细则72重点实验室学术论文署名格式77规章制度(2000年3月通过) 第一章总则第二章实验室机构设置第三章室务委员会章程第四章学术委员会章程第五章实验室办公室工作条例第六章实验管理中心工作条例第七章研究组工作条例第八章客座人员工作条例第九章访问学者基金管理条例第十章开放基金管理条例第十一章参加学术会议的有关规定第十二章学术活动条例第十三章对论著发表的有关规定第十四章财务管理条例第十五章实验室房屋管理办法第十六章实验室仪器设备管理与使用办法第十七章实验室爆炸品管理办法第十八章实验室技安管理办法第十九章实验室治安管理办法第二十章实验室环境卫生管理办法第二十一章附则第一章总则第一条爆炸科学与技术国家重点实验室是从事爆炸与爆炸安全及其相关领域基础理论研究和应用基础研究的国家级科学研究与人才培养基地。
第二条实验室根据国内外本领域发展的趋势,紧密结合我国国防建设与国民经济建设需要,确立并调整研究方向。
鼓励和提倡多学科交叉、融合,鼓励针对新时期国防建设和国民经济建设中的重大问题开展研究。
第三条实验室由国防科工委主管,依托北京理工大学,接受国家科技部、国防科工委和北京理工大学等上级组织的领导、监督和检查。
因而实验室的工作还需体现出国防科工委和北京理工大学科技、教育发展的需求。
3.3 8253基础实验一、实验目的1、进一步熟悉GX-8000实验系统2、进一步熟悉汇编语言程序的设计、调试过程。
3、掌握可编程定时器/计数器芯片8253的工作原理和编程方法。
二、实验内容1、产生周期为1秒的方波信号,用逻辑笔观察输出结果2、脉冲计数器:对单脉冲按钮进行计数,按下5次,L0点亮;可重复计数3、跑马灯1)8个LED循环点亮;2)循环方式为:L0->L1->L2->L3->L4->L5->L6->L7->L1->L2...;每隔1秒LED状态变化一次;3)使用8255A和8253实现三、实验程序1、程序;这是自动生成的代码模板STACKS SEGMENT STACK ;堆栈段DW 128 DUP(?) ;注意这里只有128个字节STACKS ENDSDATAS SEGMENT ;数据段;请在这里定义您的数据DATAS ENDSCODES SEGMENT ;代码段ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS ;初始化MOV DS,AX;请在这里添加您的代码MOV DX, 28BHMOV AL, 00110110B; 8253控制字设置计数器0OUT DX, ALMOV DX, 288HMOV AX ,00H;设置计数器0初值OUT DX, ALMOV AL, 10HOUT DX, ALMOV DX, 28BHMOV AL, 01110110B ; 8253控制字设置计数器1OUT DX, ALMOV DX, 289HMOV AL, 00H ; 设置计数器1初值OUT DX, ALMOV AL, 10HOUT DX, ALCODES ENDSEND START2、程序;这是自动生成的代码模板STACKS SEGMENT STACK ;堆栈段DW 128 DUP(?) ;注意这里只有128个字节STACKS ENDSDATAS SEGMENT ;数据段;请在这里定义您的数据DATAS ENDSCODES SEGMENT ;代码段ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS ;初始化MOV DS,AX;请在这里添加您的代码MOV AL, 00010100B ; 0通道设置为方式2MOV DX, 28BHOUT DX, ALMOV AL, 5 ;0通道初值设为5MOV DX, 288HOUT DX, ALCODES ENDSEND START3、程序;这是自动生成的代码模板STACKS SEGMENT STACK ;堆栈段DW 128 DUP(?) ;注意这里只有128个字节STACKS ENDSDATAS SEGMENT ;数据段;请在这里定义您的数据DATAS ENDSCODES SEGMENT ;代码段ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS ;初始化MOV DS,AXMOV DX, 28BH ;8253A初始化MOV AL, 00110110BOUT DX, ALMOV DX, 288HMOV AX ,1000OUT DX, ALMOV AL, AHOUT DX, ALMOV DX, 28BHMOV AL, 01110110BOUT DX, ALMOV DX, 289HMOV AX ,1000OUT DX, ALMOV AL, AHOUT DX, ALMOV CL, 0FFHMOV AH ,00000001BMOV AL, 10100000BMOV DX, 283HOUT DX, ALMOV AL ,0DH ;pC6置一OUT DX, ALAGAIN:MOV AL, AHMOV DX,280HOUT DX, AL ;A口输出LED状态数据MOV DX, 282HREADC:IN AL, DX ;读C口ROL AL, 4 ;左移4位,使PC3位于最高位,以便判断是否为1CMP AL, 10000000BJB READC ;小于1,说明时钟周期还没到来,继续读C口ROL AH, 1 ;否则读取下一LED状态(通过左移来实现)JMP AGAIN;请在这里添加您的代码CODES ENDSEND START四、实验结果1、2、3、五、实验小结思考题:1、如果不加非门,则会变成L0灯一直是亮的,每按5次灭一次;2、如果连接的是负脉冲信号,结果不变。
北京理工大学汇编语言实验报告实验五子程序设计实验实验五子程序设计实验(设计性实验)一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言子程序设计方法;3.熟悉利用汇编语言子程序参数传递方法;4.熟悉汇编语言字符串处理基本指令的使用方法;5.掌握利用汇编语言实现字符串的输入输出程序设计方法;6.掌握数制转换程序实现方法。
二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识A)子程序知识要点:1、掌握子程序的定义语句;过程名 PROC [near/far]过程体RET过程名 ENDP2.子程序结构形式一个完整的子程序一般应包含下列内容:1. )子程序的说明部分在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法. 说明时,应含如下内容:.子程序名:命名时要名中见意..子程序的功能:说明子程序完成的任务;.子程序入口参数:说明子程序运行所需参数及存放位置;.子程序出口参数:说明子程序运行结果的参数及存放位置;.子程序所占用的寄存器和工作单元;.子程序调用示例;2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET 指令来完成。
.段内调用与返回:调用子程序指令与子程序同在一个段内。
因此只修改IP;.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。
3.)子程序的现场保护与恢复保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复。
一般利用堆栈实现现场保护和恢复的格式:过程名PROC [NEAR/FAR]PUSH BXPUSH DXPOP DXPOP AXRET过程名 ENDP4.子程序的参数传递方法1.寄存器传递参数这种方式是最基本的参数传递方式。
2.存储器单元传(变量)递参数这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。
北京理工大学-微机原理综合设计实验-数字电压表A————————————————————————————————作者:————————————————————————————————日期:微机原理与接口技术实验报告实验内容:微机原理综合设计实验数字电压表A组别:31姓名:12届黄大师班级:xxxxxxxxx 学号:xxxxxxxxxx一、实验目的1、掌握8255的使用及编程原理。
2、掌握8253定时/计数器的编程原理。
3、掌握ADC0809的使用方法。
4、掌握共阴极七段数码管的工作原理。
5、加强多芯片的综合运用。
6、加强汇编语言程序设计。
二、实验内容利用ADC0809采集电位器的电压值,将采集的电压值通过8255显示在七段数码管上,显示数据保留小数点后2位,利用8253定时数据更新,每隔0.5秒数据更新一次。
扩展要求:具有设置报警阈值功能,当超过阈值时,点亮一个LED灯。
三、实验方法1、设计思路先利用ADC0809采集电位器的电压值,此时的电压值在AL中,但其真正的值应该为5/255*AL伏。
根据要求保留小数点后2位,利用程序先将AL乘以500/255,约为196,即将电压值扩大100倍,先除以100,得到最高位,再依次除以10,得到小数点后第一,二位,分别存在连续的三个存储单元中。
定义0-9共阴极七段数码管的显示码数据段,再通过8255 依次选通3个数码管,通过8255依次送入刚才所得的三个值的显示码。
利用8253工作在方式二,每隔0.5秒产生一低脉冲送到8255,利用程序检验,每隔0.5秒才调用电压采集程序。
对于扩展要求可利用74LS273实现。
实验简单主要原理图如下:将可变电位器AN0与ADC0809的ADIN0相连,将CS2与ADC0809的片选CS0809端相连,将ADC0809的EOC 与8255的PC0相连,CS0与8253的片选CS8253相连,CLK3(750KHz )与8253CLK0相连,8253的OUT0与8253CLK2相连,OUT2与8255的PA0相连,CS1与8255的片选CS8255相连,PC4-PC6与LED1-LED3依次相连,PB0-PB7依次与LED-A —LED-DP 相连。
汇编语⾔学习知识程序设计实验⽬录⽬录 (1)实验⼀利⽤DEBUG熟悉常⽤指令的使⽤ (2)⼀、实验⽬的 (2)⼆、⽰例 (2)三、实验题 (2)实验⼆汇编程序和连接程序的使⽤ (6)⼀、实验⽬的。
(6)⼆、⽰例。
(6)三、实验题。
(8)实验三顺序结构程序设计 (11)⼀、实验⽬的 (11)⼆、⽰例 (11)三、实验题 (12)四、实验报告 (15)实验四循环结构程序设计 (16)⼀、实验⽬的 (16)⼆、⽰例 (16)三、实验题 (18)实验五分⽀结构程序设计 (21)⼀、实验⽬的 (21)⼆、⽰例 (21)三、实验题 (22)实验六⼦程序设计 (29)⼀、实验⽬的 (29)⼆、实验题 (29)实验⼀利⽤DEBUG熟悉常⽤指令的使⽤⼀、实验⽬的熟悉指令系统,掌握常⽤指令的⽤法;通过实验加深对各种寻址⽅式的理解;能熟练使⽤DEBUG中的命令对指令进⾏反汇编,观察并了解机器代码。
⼆、⽰例请分别⽤⼀条汇编语⾔指令完成如下功能:(过程略)。
1.⽤寄存器BX和SI的基址变址寻址⽅式把存储器的⼀个字节与AL寄存器的内容相加,并把结果送到AL中。
ADD AL,[BX][SI]2.⽤位移量为0520H的直接寻址⽅式把存储器中的⼀个字与3412H相加,并把结果送回该存储单元。
ADD WORF PTR [0520H],3412H三、实验题1.调试、验证下列指令的结果,已知(DS)=2000H,(BX)=0100H,(SI)=0002H,(BP)=0200H,(SS)=2300H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,(23204)=88H,说明各指令执⾏完后AX寄存器的内容。
要求输⼊指令,相应存储单元的内容要事先设置,单步P执⾏,观察执⾏结果。
(设置存储器的值)①.MOV AX,1200H②.MOV AX,BX③.MOV AX,[1200H]④.MOV AX,[BX]⑤.MOV AX,1100[BX]⑥.MOV AX,[BX][SI]⑦.MOV AX,1100[BX][SI]⑧ .MOV AX,[BP+SI+04]2、上机调试、验证教材习题3.15。
实验一汇编程序的汇编及运行1.实验目的和要求1、熟悉汇编程序的汇编、连接、执行过程2、生成LST文件,查看LST文件3、生成OBJ文件,修改语法错误4、生成EXE文件5、执行2.实验环境IBM—PC机及其兼容机实验的软件环境是:操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。
3.实验内容及实验数据记录1、将数据段输入,取名1.txt,保存在MASM文件夹下。
生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。
试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?DATA SEGMENTORG 20HNUM1=8NUM2=NUM1+10HDA1 DB ‘IBM PC’DA2 DB 0AH, 0DHCOUNT EQU $-DA1DATA ENDSEND2、输入有错误的文件,修改错误语句。
(MASM没有出现错误即可。
不必连接、运行。
)DATA SEGMENTVAR1 DB 0, 25, ODH, 300VAR2 DB 12H, A4H, 6BHVAR3 DB ’ABCDEF’VAR4 DW 1234H, 5678HVAR5 DW 10H DUP(?)DATA ENDSCODE SEGMENTASSUME CS: CODE, DE: DATA BEING MOV AX, DATAMOV DS, AXLEA SI, VAR5MOV BX, OFFSET VAR2MOV [SI], 0ABHMOV AX, VAR1+2MOV [BX], [SI]MOV VAR5+4, VAR4MOV AH, 4CHINT 21HCODE ENDSEND START3、输入正确的程序,汇编、连接、运行STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSDATAS SEGMENTSTRING DB ‘WELCOME!’, 13, 10, ‘$’DATAS ENDSCODES SEGMENTASSUME CS: CODES, DS: DATASSTART:MOV AX, DATASMOV DS, AXLEA DX, STRINGMOV AH, 9INT 21HMOV AH, 4CHINT 21HCODES ENDSEND START4.算法描述及实验步骤(1)编写源程序。
一、 实验目的 1)、熟悉串操作指令的功能与应用; 2、掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序; 3、了解汇编语言字符串处理基本流程; 二、实验环境与原理 1、实验硬件环境 1) 硬件环境:惠普 64 位一体化计算机及局域网; 2) 软件环境:windows 8,红蜘蛛管理系统,MASM for Windows。 2、实验原理 1) 字符串操作流程 a. SI 寄存器保存源串首地址; b. DI 寄存器保存目的串首地址; c. CX 寄存器保存字符串长度; d. CLD 或 STD 指令设置字符串处理方向; e. 当CLD 指令使 DF=0,在执行串处理指令时可使地址自动增量;STD 使 DF=1,在执行串处理指令时可使地址自动减量。 2) 重复前缀指令 a. 重复次数由计数寄存器 CX 中存放的值决定,指令每重复执行一次,计数器 CX 中值减 1,当 CX 中值减至 0 时,停止重复执行,继续执行下一条指令。 b. 当 REP 无条件重复前缀,重复串操作直到计数寄存器的内容 CX 为 0 为止。经常与REP配合工作的字符串处理指令有 MOVS、STOS 和 LODS。 c. 当 REPE/REPZ 判断计数寄存器的内容 CX 是否为 0 或 ZF=0(即比较的两个操作数不等),只要满足一个则重复执行结束,否则继续执行。可以与 REPE/REPZ 配合工作的串指令有 CMPS 和 SCAS。 d. 当 REPNE/REPNZ 判断计数寄存器的内容是否为 0 或 ZF=1(即比较的两个操作数相等),只要满足一个则重复执行结束,否则继续执行。可以与 REPE/REPZ 配合工作的串指令有 CMPS 和 SCAS。 3) 字符串操作指令 a. lodsb、lodsw:把 DS:SI 指向的存储单元中的数据装入 AL 或 AX,然后根据 DF 标志增减 SI; b. stosb、stosw:把 AL 或 AX 中的数据装入 ES:DI 指向的存储单元,然后根据 DF 标志增减 DI; c. movsb、movsw:把 DS:SI 指向的存储单元中的数据装入 ES:DI 指向的存储单元中,然后根据 DF 标志分别增减 SI 和 DI; d. scasb、scasw:把 AL 或 AX 中的数据与 ES:DI 指向的存储单元中的数据相减,影响标志位,然后根据 DF 标志分别增减 SI 和 DI; e. cmpsb、cmpsw:把 DS:SI 指向的存储单元中的数据与 ES:DI 指向的存储单元中的数据相减,影响标志位,然后根据 DF 标志分别增减 SI 和 DI; f. rep:重复其后的串操作指令。重复前先判断 CX 是否为 0,为 0 就结束重复,否则CX 减 1,重复其后的串操作指令。主要用在 MOVS 和 STOS 前。一般不用在 LODS 前。 上述指令涉及的寄存器:段寄存器 DS 和 ES、变址寄存器 SI 和 DI、累加器 AX、计数器 CX 涉及的标志位:DF、AF、CF、OF、PF、SF、ZF。
三、实验步骤 1、编写程序,比较两个字符串 BUF1 和 BUF 所含的字符是否相同,相同则 AL 返回 0,不同 AL 返回 1,字符串长度要求自动获取,要求用字符串处理方法。提示:输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。 2、编写程序,设有一字符串存放在以 BUF 为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出。提示:从串的第一个字符开始统计,直到遇到定义的字符串结束符为止,看看在这个过程中总共有多少个字符,即求得串的长度。 3、编写程序,将内存中 BUF1 某一区域的数据传送到另一区域 BUF2 中,要求用字符串处理方法。 4、编写程序,在已知字符串中搜索特定字符’#’,若找到则 AL 返回 0,找不到AL 返回 1,要求用字符串处理方法。 5、 编写程序,统计一串字符串中字符"&"出现的次数,要求用字符串处理方法。 6、 编写程序,设有一字符串已存放在 STRBUF 为首址的数据区中,编一程序找出其中的‘#’字符,如果字符串中不存在‘#’字符则应该输出“Not found”。
四、程序清单和框图 1、DATAS SEGMENT BUF1 DB 18H DB ? DB 18 DUP(0) BUF2 DB 18H DB ? DB 18 DUP(0) DATAS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV ES,AX MOV DX,OFFSET BUF1 MOV AH,0AH ;输入字符串1 INT 21H MOV DL,0AH MOV AH,02H INT 21H MOV DX,OFFSET BUF2 MOV AH,0AH ;输入字符串2 INT 21H MOV AH,02H MOV DL, 0AH INT 21H
MOV AL,BUF1[1] ;AL为字符串1的长度 MOV AH,BUF2[1] ; AH为字符串2的长度 CMP AL,AH JZ CP MOV DL,31H JMP OVER CP: LEA SI,BUF1 LEA DI,BUF2 MOV CL,BUF1[1] CLD REPZ CMPSB ;字符串比较 JNZ NO MOV DL,30H ;两个字符串相同,输出0 MOV AL,0H JMP OVER NO: MOV DL ,31H MOV AL ,1H ;两个字符串不同,输出1
OVER: MOV AH,02H ;输出1 INT 21H MOV AH,4CH INT 21H CODES ENDS END START
程序分析:程序的主要在于BUF1和BUF2的输入,灵活应用0AH、2H’功能,在两个字符串之间加上换行,可以避免BUF1被BUF2的输入遮盖。使用字符串操作符时要注意固定格式,格式错了产生的错误在调试过程中很难被发现。最后将比较的结果转换成ASCII码传给DL用2H功能显示在屏幕上 框图: N Y
Y N N Y
开始 初始化BUF1,BUF2内存单元
输入BUF1、BUF2字符串,设置SI、DI
循环次数CX为字符串长度 两个字符串长度是否相等
比较DS:SI和ES:DI中字符 SI、DI加1,CX减1
相同且CX不为0 ZF=1? AL=0 AL=1
结束 2、 DATAS SEGMENT BUF DB 10H DB ? DB 10 DUP(0) DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV DX,OFFSET BUF MOV AH,0AH INT 21H MOV CL,30H ADD CL,BUF[1] ;将字符串传给CL并转化成ASCII码 MOV AH,2H MOV DL,0AH INT 21H MOV DL,CL ;屏幕输出字符串长度 INT 21H MOV AH,4CH INT 21H CODES ENDS END START
程序分析:程序比较简单,利用定义字符串的方式,BUF[1]为输入字符串的长度 框图: 开始
初始化BUF内存单元 输入BUF字符串 CL=BUF[1]
结束 3、从BUF1第二个字符开始传到BUF2中
DATAS SEGMENT BUF1 DB 12H,23H,0ABH,98H,96H,77H,36H,13H,99H L1 EQU $-BUF1 ;9 BUF2 DB 20 DUP(0) DATAS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV ES,AX MOV CL,L1 MOV SI,1H ;将BUF1的第二位开始存入BUF2中 LEA DI,BUF2 CLD LOPP:MOVSB DEC CX JNZ LOPP HLT MOV AH,4CH INT 21H CODES ENDS END START
程序分析:程序使用的串操作指令是MOVSB,该指令的功能是把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI。利用指令可以方便将BUF1内存储单元中的内容复制到BUF2内存单元中。