汇编语言实验
- 格式:doc
- 大小:28.00 KB
- 文档页数:7
实验一、Debug调试实验指导书一、实验目的1.进一步学习汇编语言基本指令使用方法;2.学习DEBUG调试工具的基本使用方法;掌握debug调试命令a、u、r、d、t、g等3.逐条观察程序指令的执行过程,理解指令的功能,理解程序自动、顺序地执行的概念,实践其过程(重点)。
二、实验题目1.编写、输入一个32位二进制数相加程序,逐条执行指令,观察指令执行情况。
2.使用已经过汇编和连接的小程序(t3-2.exe),将其装入内存,逐条执行指令,观察执行过程和结果。
在实验过程中,使用D命令修改XXX和YYY单元中的数据,再重新计算其结果。
三、编程提示1.启动计算机的WINDOWS操作系统,运行DEBUG程序。
2.方法1:在开始菜单中找到“运行”,输入“cmd”后回车,启动ms-dos command程序,再在该程序内输入“DEBUG”并按回车,即启动DEBUG调试程序。
3.方法2:在开始菜单中找到“运行”,输入“DEBUG”后确定,即启动DEBUG调试程序。
4.开始编程方法1:在debug中输入a命令,并回车。
显示出的地址是当前指令代码所存放的地址。
接着,逐条有序地输入汇编指令,直接回车即可结束程序指令的输入过程。
如需修改程序,则先确定错误指令的地址,再使用“a 地址号”命令修改。
注意,修改前后指令长度如发生改变,会对该指令以后的指令码的存储造成影响,使程序不能正确执行。
(为什么?)方法2:将事先已经准备好的可执行程序(.exe文件)装入存储器,使用如下命令:debug 文件名.exe。
(.exe必须写全,否则找不到程序文件,为什么?)5.程序调试过程(1)使用u命令将程序反汇编,观察其汇编指令的与源程序的对应关系,观察每一条指令的代码、存放地址、指令代码长度等;(重要)(2)使用r命令读出各寄存器中的数值,从CS:IP寄存器中的数值确定程序当前应执行的指令;(结合计算机硬件知识加以理解)(3)察看当前指令的长度、指令代码、指令功能、操作数的寻址方式、所涉及的寄存器和存储器中的数值;(4)使用d命令读出所关注的存储器中的数值,并计算其地址顺序;(5)使用t命令执行单条指令,察看指令执行后相关存储器和存储器中的数值变化情况,察看标志位寄存器的变化情况,判断指令执行后的计算结果是否正确?如遇到条件转移指令时要判断是否转移,转移或不转移时下一条指令的地址是什么?(重要)(6)使用e命令读出、修改存储器中的相关数据,可重新执行相关计算指令,再观察结果。
汇编语⾔实验报告福建农林⼤学⾦⼭学院(程序设计类课程)实验报告课程名称:汇编语⾔姓名:系:专业:年级:学号:指导教师:职称:2010~2011学年第⼆学期实验项⽬列表福建农林⼤学⾦⼭学院实验报告系:专业:年级:姓名:学号:实验课程:汇编语⾔实验室号:_ _1#605 实验设备号: I3 实验时间: 2011.4.25 指导教师签字:成绩:实验⼀汇编程序的汇编及运⾏1.实验⽬的和要求(1)熟悉汇编程序的汇编、连接、执⾏过程;(2)⽣成LST⽂件,查看LST⽂件;(3)⽣成OBJ⽂件,修改语法错误;(4)⽣成EXE⽂件;(5)执⾏程序。
2.实验环境IBM—PC机及其兼容机;实验的软件环境是:操作系统:DOS 2.0以上;调试程序:/doc/aa5b4424a5e9856a56126062.html ;⽂本编程程序: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 ENDSEND(2)输⼊有错误的⽂件,修改错误语句。
(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: DATABEING 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 START(3)输⼊正确的程序,汇编、连接、运⾏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) ⾸先,⽤记事本输⼊各段程序,并储存成源程序,保存在MASM⽬录下。
王爽《汇编语⾔》(第三版)实验10解析1、显⽰字符串assume cs:codedata segmentdb 'welcome to masm!',0data endscode segmentstart: mov dh,8mov dl,3mov cl,2mov ax,datamov ds,axmov si,0call show_strmov ax,4c00hint 21hshow_str: push dxpush cxpush si ; 保护⼦程序寄存器中⽤到的寄存器; 由于主程序的限定; 这⾥由CPU⾃动为我们分配栈空间mov di,0 ;显⽰缓存区中的偏移量mov bl,dhdec bl ; bl-1才是真正的⾏,因为⾏号从0开始计数mov al,160mul bl ; 每⾏160字节⽤⾏数*每⾏偏移量得到⽬标⾏的偏移量mov bx,ax ; mul bl之后,乘积存储在ax中,这⾥要转存⼊bx中mov al,2 ; 列的偏移量为2,两个字节代表⼀列!!!mul dl ; 与⾏偏移量同理add bl,al ;将列偏移量与⾏偏移量相加,得到指定位置的偏移量。
mov ax,0b800hmov es,ax ;指定显⽰缓存区的内存位置mov al,cl ; 由于后⾯jcxz语句的判断要⽤到cx,所以我们要将; cl(颜⾊)先存下来。
s: mov ch,0mov cl,ds:[si] ;⾸先将当前指向字符串的某个字符存⼊cx中jcxz ok ; 如果cx为0,则转移到ok标号执⾏相应代码mov es:[bx+di],cl ;将字符传⼊低地址mov es:[bx+di+1],al ; 将颜⾊传⼊⾼地址add di,2 ; 列偏移量为2inc si ; 字符串的偏移量为1loop s ; 不为0,继续复制ok: pop dxpop cxpop si ; 还原寄存器变量ret ; 结束⼦程序调⽤code endsend start2、解决除法溢出的问题这⾥要注意,把⼀个数放在了dx,⾼位寄存器中,那么就相当于65536。
汇编语言实验7实验报告一、实验目的本次实验旨在通过汇编语言编写程序,实现对字符串的操作和输出。
二、实验内容1. 编写一个汇编程序,要求从键盘输入一个字符串,并将其逆序输出到屏幕上;2. 编写一个汇编程序,要求从键盘输入两个字符串,并将它们拼接起来后输出到屏幕上。
三、实验过程1. 字符串逆序输出程序首先,需要从键盘输入一个字符串。
为了方便起见,我们可以先规定字符串的最大长度为100。
接着,我们需要定义两个变量:```buffer db 100 ; 用于存储输入的字符串length dw ? ; 存储输入的字符串长度```其中,db代表定义字节型变量,dw代表定义双字节型变量。
然后,我们需要使用INT 21H中断来读取用户输入的字符串。
具体而言,我们可以使用下面这段代码:```mov ah, 0Ah ; 设置INT 21H功能号为0Ahmov dx, offset buffer ; 将buffer的地址传给DX寄存器int 21h ; 调用INT 21H中断```该代码会将用户输入的字符串存储在buffer中,并且将其长度存储在length变量中。
接着,我们需要将该字符串逆序输出到屏幕上。
为了实现这个功能,我们可以使用栈来存储字符串中的每个字符,并逐个弹出来输出。
具体而言,我们可以使用下面这段代码:```mov si, offset buffer + 1 ; 将si寄存器指向字符串的第一个字符mov cx, length ; 将cx寄存器设置为字符串长度dec cx ; 字符串长度需要减1reverse:push byte ptr [si] ; 将当前字符压入栈中inc si ; 指向下一个字符loop reverse ; 循环直到所有字符都被压入栈中mov ah, 02h ; 设置INT 21H功能号为02h,表示输出一个字符print:pop dx ; 弹出栈顶元素int 21h ; 输出该字符loop print ; 循环直到所有字符都被弹出并输出完毕```2. 字符串拼接程序首先,需要从键盘输入两个字符串。
汇编语言程序设计实验小结本次汇编语言程序设计实验旨在通过实践,加深对汇编语言编程的理解和掌握,并通过编写和调试汇编程序,提升实际应用能力。
在本次实验中,我学到了许多关于汇编语言程序设计的知识和技巧,也遇到了一些挑战和问题。
以下是我对这次实验的小结。
在实验开始之前,我进行了充分的学习和准备。
通过阅读教材和参考资料,我了解了汇编语言的基本概念、指令集和编程规范。
同时,我还学习了调试工具的使用方法,以便在编写程序时能够进行实时调试,提高效率和准确性。
在实验过程中,我遇到了一些困难和挑战。
其中之一是理解和运用汇编语言的指令集。
由于汇编语言是一种低级语言,指令的数量和种类相对较多,需要深入了解每个指令的功能和使用方法。
为了解决这个问题,我通过查阅资料和请教老师,逐步掌握了常用指令的用法,并能够根据实际需求选择合适的指令进行编程。
另一个困难是调试程序时出现的错误。
由于汇编语言是一种底层语言,对程序员的要求较高,一旦出现错误,往往需要仔细检查每一步的操作和数据处理过程。
在实验中,我遇到了一些错误,例如指令书写错误、寄存器使用错误等。
为了解决这些问题,我采取了逐步调试的方法,通过观察变量的值、输出结果的正确性等来定位错误的位置,并逐步修改代码,最终成功解决了问题。
在实验过程中,我也发现了汇编语言编程的一些优点和特点。
首先,汇编语言可以直接访问底层硬件资源,使得程序的执行效率较高。
其次,汇编语言的灵活性较高,可以实现一些高级语言难以实现的功能。
例如,通过汇编语言编写的程序可以直接操作内存,实现对特定位置的数据读取和存储。
再次,汇编语言的指令集相对简单,易于学习和理解。
因此,掌握汇编语言编程对于深入理解计算机体系结构和底层工作原理非常有帮助。
通过本次实验,我不仅学到了汇编语言程序设计的知识和技巧,还培养了分析和解决问题的能力。
在以后的学习和工作中,我将继续学习和掌握汇编语言编程,将其应用于实际项目中,提高程序的性能和效率。
矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。
如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。
㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。
(2 列出开发利用方案编制所依据的主要基础性资料的名称。
如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。
对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。
二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。
2、国内近、远期的需求量及主要销向预测。
㈡产品价格分析
1、国内矿产品价格现状。
2、矿产品价格稳定性及变化趋势。
三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。
2、矿区矿产资源概况。
3、该设计与矿区总体开发的关系。
㈡该设计项目的资源概况
1、矿床地质及构造特征。
2、矿床开采技术条件及水文地质条件。
汇编语⾔学习知识程序设计实验⽬录⽬录 (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.工具软件MASM、LINK的使用2.常用DEBUG命令的使用: G,D,R,T,U,Q3.完整程序设计方法的格式。
二、目的要求1.掌握常用工具软件MASM、LINK的使用2.掌握常用DEBUG命令: G,D,R,T,U,Q 能灵活使用这些命令调试程序3.掌握完整程序设计方法的格式,能正确书写数据段,代码段等。
三、实验内容比较两个字符串string1和string2所含的字符是否相同,如果相同则显示’Match'否则显示’No match’.请读程序,并将程序补充完整。
DSEG SEGMENTstring1 db 'Move the cursor backward.'string2 db 'Move the cursor backward.'mess1 db 'Match.',13,10,'$'mess2 db 'No match.',13,10,'$'DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEG, es:DSEG,MAIN PROC FARstart: mov ax, dsegmov ds, axmov es, axlea si ,string1①cld②repz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx,mess1disp: mov ah,09hint 21hmov ax, 4c00hint 21hMAIN ENDPCSEG ENDSend start实验步骤:1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在d:\masm下,注意保存时将文件扩展名改为.asm(如test1.asm)。
2)屏幕左下角”开始”–“运行”输入cmd ,进入dos命令操作,先用d: 和cd mas m 命令改变路经,接着用”masm + 文件名” (如masm test1,这里文件名可以不带扩展名)对源文件进行汇编,产生.obj文件和.LST文件。
实验一:熟悉环境及DEBUG应用实验目的:1、复习C/C++的变量、地址、指针、内存空间等概念;2、熟悉基本的DOS命令;3、掌握DEBUG的启动及其使用方法与常用命令。
4、初步认识CPU的寄存器。
实验内容:一、C/C++语言回顾目的:通过C/C++的变量、地址、指针、内存空间等概念的回顾,了解计算机内数据的存放方式和访问方式。
1、编程定义一个整型int、一个双精度型double、一个字符型char的指针,并赋初值,然后显示各指针所指目标的值与地址,各指针的值与指针本身的地址及各指针所占字节数(其中地址用十六进制显示,注意字符指针输出是字符串,必须强制转换为无类型指针)。
要求运行结果如下所示:变量内容首地址长度(字节)cval ‘A’0x0012ff64 1类型:整型: int, short int, short, long int, long, unsigned int, unsigned short, unsigned long实型: float, double, long double字符型: char#include<iostream>using namespace std;int main(){int *ip,ival=100;double *dp,dval=99.9;char *cp,cval='A';ip=&ival;dp=&dval;cp=&cval;cout<<*ip<<'\t'<<&*ip<<'\t'<<sizeof(*ip)<<endl;cout<<*dp<<'\t'<<&*dp<<'\t'<<sizeof(*dp)<<endl;cout<<*cp<<'\t'<<(void*)&*cp<<'\t'<<sizeof(*cp)<<endl;//字符指针输出是字符串,必须强制转换为无类型指针cout<<*cp<<'\t'<<&*cp<<'\t'<<sizeof(*cp)<<endl;//输出A开头的字符串cout<<ip<<'\t'<<&ip<<'\t'<<sizeof(ip)<<endl;cout<<dp<<'\t'<<&dp<<'\t'<<sizeof(dp)<<endl;cout<<(void*)cp<<'\t'<<&cp<<'\t'<<sizeof(cp)<<endl;return 0;}2、编程定义一个一维数组、一个二维数组、一个字符串(字符数组)、一个结构体,并赋初值,然后显示各指针所指目标的值与地址,各指针的值与指针本身的地址及各指针所占字节数(长度)。
arm汇编语言编程实验报告实验二ARM汇编语言编程实验.doc班级计算机科学与技术(嵌入式)学号课程名称ARM体系结构姓名实验成绩日期指导教师冯灵霞实验报告院系信息工程学院一、实验目的1、掌握ADT IDEARM开发环境中基本的工程设置以及程序编译方法。
2、掌握ADT IDEARM开发环境中基本的程序调试方法。
3、掌握基本的ARM汇编语言编程方法。
二、实验内容用汇编语言编写一个程序实现如下目的:从源地址拷贝num个字(num*4个字节)的数据到目的地址dst中。
三、预备知识1、ARM汇编语言的基础知识。
2、程序调试的基础知识和方法。
四、实验设备1、硬件:JXARM9-2440教学实验箱、PC机。
2、软件:PC机操作系统Windows 98(2000、XP)+ADT IDE开发环境。
五、基础知识ADT IDE集成了GNU汇编器arm-elf-as、编译器arm-elf-gcc和链接器arm-elf-ld。
在ADT IDE中编写的程序必须符合GNU的语法规则。
下面介绍一些基本的GNU汇编知识以及本实验用到的ARM 汇编指令。
1、GUN汇编语言语法及规则1)_start_start为程序默认入口点,代码段默认起始地址为0x800,如果需要修改可以在链接脚本文件中指定。
2)标号语法:symbol:symbol为定义的符号。
说明:上述代码定义一个标号,它表示程序中当前的指令或数据地址。
如果在程序中出现两个相同的标号,汇编器将会产生一个警告,且只有第一个标号有效。
2、GNU汇编语言伪操作1).equ伪操作语法:.equ symbol,exprexpr为基于寄存器的地址值、程序中的标号、32位的地址常量或位的常量。
symbol为.equ伪操作为expr定义的字符名称。
说明:该操作符为数字常量、基于寄存器的值和程序中的标号定义一个字符名称,相当于C语言中的宏定义。
示例:.equ USERMODE,0x102).global伪操作符语法:.global symbolsymbol为声明的符号的名称。
计算机科学系实验报告
一、实验目的:进一步掌握子程序的编写和调用
二、实验内容、程序清单及运行结果
题目:编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母。
;名称:letterc
;功能:将以0结尾的字符串中的小写字母转变成大写字母
;参数:ds:si指向字符串首地址
assume cs:code
data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
start:movax,data
movds,ax
mov si,0
callletterc
mov ax,4c00h
int 21h
letterc:mov cx,0
movcl,ds:[si]
jcxz ok
cmp cl,97
jb next
cmp cl,122
ja next
and cl,11011111b
mov ds:[si],cl
next:incsi
jmp short letterc
ok:ret
code ends
end start
三、实验结论、实验体会
小写字母[a,z]对应的ASCLL码的范围是[97,122],所以可以用cmp cl,97;jb next; cmp cl 122;ja next来判断字符是否为小写字母。
汇编语言程序设计的实验环境及上机步骤一、实验环境汇编语言程序设计的实验环境如下:1.硬件环境微型计算机(Intel x86系列CPU)一台2.软件环境⏹Windows98/2000/XP操作系统⏹任意一种文本编辑器(EDIT、NOTEPAD(记事本)、UltraEDIT等)⏹汇编程序(MASM.EXE或TASM.EXE)⏹连接程序(LINK.EXE或TLINK.EXE)⏹调试程序(DEBUG.EXE或TD.EXE)文本编辑器建议使用EDIT或NOTEPAD,汇编程序建议使用MASM.EXE,连接程序建议使用LINK.EXE,调试程序建议使用TD.EXE。
二、上机实验步骤注:以下步骤适用于除汇编语言程序设计的实验一到实验四外的所有实验(实验一到实验四仅使用TD.EXE)。
1.确定源程序的存放目录建议源程序存放的目录名为ASM(或MASM),并放在C盘或D盘的根目录下。
如果没有创建过此目录,请用如下方法创建:通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中点击右键,在弹出的菜单中选择“新建”→“文件夹”,并把新建的文件夹命名为ASM。
请把MASM.EXE、LINK.EXE、DENUG.EXE和TD.EXE都拷贝到此目录中。
2.建立ASM源程序建立ASM源程序可以使用EDIT或NOTEPAD(记事本)文本编辑器。
下面的例子说明了用EDIT文本编辑器来建立ASM源程序的步骤(假定要建立的源程序名为HELLO.ASM),用NOTEPAD(记事本)建立ASM源程序的步骤与此类似。
在Windows中点击桌面左下角的“开始”按钮→选择“运行”→在弹出的窗口中输入“ C:\ASM\HELLO.ASM”,屏幕上出现EDIT的编辑窗口,如图1所示。
图1 文本编辑器EDIT的编辑窗口窗口标题行显示了EDIT程序的完整路径名。
紧接着标题行下面的是菜单行,窗口最下面一行是提示行。
菜单可以用Alt键激活,然后用方向键选择菜单项,也可以直接用Alt-F打开File文件菜单,用Alt-E打开Edit编辑菜单,等等。
《汇编语⾔》实验三——编程、编译、连接、跟踪实验任务⼀:将下⾯的程序保存为t1.asm⽂件,将其⽣成可执⾏⽂件t1.exe。
⽤记事本编辑代码,保存为t1.asm:编译、连接,⽣成可执⾏⽂件:运⾏程序:得到输出结果为06下⾯研究修改line4和line9中寄存器dl的值,对结果产⽣的影响。
为简化编译、连接的过程,决定采⽤批处理⽂件的形式来完成这个过程:⽣成⼀个名为m_l.bat的批处理⽂件。
修改:line4的3—>4,line9的6—>8:编译、连接、执⾏:得到输出结果08⽤debug对t1.exe调试:⽤r命令查看各寄存器的值:发现cs的值为076A,ds的值为075A,满⾜(cs)=(ds)+10H查看psp的内容:可以看到,psp的头两个字节的确是CD 20使⽤u命令反汇编,观察源代码:单步调试:实验任务⼆:将下⾯的程序保存为t2.asm⽂件,将其⽣成可执⾏⽂件t2.exe⽤记事本编辑代码,保存为t2.asm:编译、连接,⽣成可执⾏⽂件:运⾏结果:在屏幕的左上⽅出现红⾊数值36下⾯研究修改line7和line10的部分数据对结果产⽣的影响①line4的 0433h—>0432h, line10的 0436h—>0439h编译、连接、运⾏:运⾏结果:在屏幕的左上⽅出现红⾊数值29①line4的 0433h—>0333h, line10的 0436h—>0336h编译、连接、运⾏:运⾏结果:在屏幕的左上⽅出现蓝⾊数值36从以上3组结果可以看出,line7控制第⼀个字符的输出,line10控制第⼆个字符的输出。
⼆者[bx]的⾼字节决定了颜⾊,低字节控制显⽰的字符。
用汇编语言实现八段数码管显示一、实验要求利用实验仪提供的显示电路,动态显示一行数据.二、实验目的1. 了解数码管动态显示的原理。
2. 了解用总线方式控制数码管显示三、实验线路及连线四、实验说明1.本实验仪提供了6 位8段码LED 显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
8位段码、6位位码是由两片74LS374输出。
位码经MC1413或ULN2003倒相驱动后,选择相应显示位。
本实验仪中 8位段码输出地址为0X004H ,位码输出地址为 0X002H 。
此处X 是由KEY/LED CS 决定,参见地址译码。
做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。
以便用相应的地址来访问。
例如,将KEY/LED CS 接到CS0上,则段码地址为08004H ,位码地址为08002H 。
位选通信号 (0x002H)段码输出 (0x004H)数据总线七段数码管的字型代码表如下表:五、程序框图程序代码OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ;mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ;mov r2, #00100000b ;Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ;mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ;mov r6, #01call Delaymov a, r2 ;rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ;retStart:mov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ;mov @r0,a ;inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#0DispAgain:call DisplayLED ;djnz DelayT,DispAgain ljmp MLoopend。
汇编语言编程实验报告学号:姓名:成绩:目录一、实验一: ......................................................错误!未定义书签。
二、实验二: (4)三、实验三: (8)四、实验四: (10)五、实验五: ......................................................错误!未定义书签。
六、实验六: (19)七、汇编实验总结 (23)实验一一. 实验题目【汇编语言补充作业T20T20】编写完整程序,利用】编写完整程序,利用DOS 系统功能调用,从键盘输入一个字符串,并将该字符串从屏幕上换行后并输出。
二. 程序流程及思路实现字符串输入,需要分成三个步骤:实现字符串输入,需要分成三个步骤:1、在数据段中定义一个缓存区为存放字符串做准备;2、DOS 系统功能调用0AH 号子功能,(DS:DX DS:DX))= = 输入缓冲区首址;输入缓冲区首址;输入缓冲区首址;3、在输入的字符串尾加上‘、在输入的字符串尾加上‘$$’字符,以作为输出结束条件。
’字符,以作为输出结束条件。
实现字符串输出,则需要注意的问题是:实现字符串输出,则需要注意的问题是:1、缓冲区第三个字节才开始存放输入的字符,前两个字节分别存放缓冲区长度和字符串实际字符数;和字符串实际字符数;2、输出回车换行可利用字符串:、输出回车换行可利用字符串:CR DB 0AH,0DH,CR DB 0AH,0DH,CR DB 0AH,0DH,’’$’。
’。
三. 源程序清单DATA SEGMENTN EQU 50MAXLEN DB N ;MAXLEN DB N ;缓冲区字符的最大长度缓冲区字符的最大长度缓冲区字符的最大长度ACTLEN DB ? ;ACTLEN DB ? ;实际字符个数实际字符个数实际字符个数STRING DB N DUP(?) ;STRING DB N DUP(?) ;字符空间字符空间字符空间CR DB 0AH,0DH,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXLEA DX,MAXLENMOV AH,0AHINT 21H ;字符串输入字符串输入MOV AH,09HLEA DX,CRINT 21H ;回车换行回车换行MOV BL,MAXLEN+1 ;取实际的字符长度取实际的字符长度MOV BH,0LEA SI,MAXLEN+2 ;取字符开始的首地址取字符开始的首地址MOV BYTE PTR [SI+BX],'$' ;输出结尾要加上输出结尾要加上$ $MOV DX,SI ;把开始存放字符的首地址赋给DX(注:以下程序采用b方法)方法)。
实验指导一.上机实验的一般步骤和要求:1.上机前对选定的实验题应有所了解,并写好程序。
2.上机过程中对重要方法和步骤、问题和结果应有记录。
3.所有程序原则上都要通过调试手段运行。
4.实验后进行分析和总结,给出实验报告。
二.实验报告的内容一般有:1.实验题的内容及要求。
2.思路和方法、算法描述及有注释和说明的程序清单。
3.程序调试和运行的重要步骤、问题和结果。
4.分析和总结。
三.实验环境的建立参看第二章第一节。
通常在WINDOWS XP系统下。
如果其他操作系统(如WIN 7),不支持汇编程序工作,可安装Masm for Windows集成实验环境asm20125(支持Win2000、WinXP、WinVISTA、WIN7等操作系统)。
/实验1 上机过程及程序调试实验目的:1.通过第二章两个简单实例认识汇编语言程序,初步了解程序格式;段定义;标号;DOS系统功能;操作数;指令;说明语句等作用。
2.掌握汇编语言程序从设计到形成可执行程序文件的方法和步骤。
即编辑、汇编、连接。
了解汇编语言的系统工作文件和工作环境。
理解汇编程序和连接程序的作用。
理解列表文件内容。
3.初步了解程序的运行和调试方法。
学会使用DEBUG主要命令和常用的DOS命令。
实验内容:【1】编辑第二章两个简单实例,通过汇编、连接。
【2】用DEBUG对hello程序进行调试。
问题:(1) 该程序在内存中的起始地址是多少?结束地址是多少?共占几个字节?(2) 0B63:0008表示什么意思?(3) 程序中定义的串‘HELLO, WORLD !$’在内存中的起始地址是多少?请用DEBUG命令显示该串。
(4) 如果用带有断点的G命令运行该程序,写出命令。
(5) 用P命令单步执行程序。
(6) 用T命令跟踪程序,在跟踪执行INT 21时出现什么问题?(7) 用A命令在偏移地址100H处建立该段程序,并运行。
(8) 用W命令把该段程序写成文件,再调入。
实验2 算术及位串处理程序实验目的:掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等基本编程方法,熟练使用DEBUG。
实验报告实验名称汇编语言程序设计||专业班级:信息安全学号:姓名:实验一汇编语言上机过程和Debug常用调试命令一.实验目的:学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法。
二.实验题目:熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。
在调试过程中,学习及掌握debug程序的各种操作命令。
三.问题描述:试编写一程序:比较两个字符串string1和string2所含的字符是否相同,若相同则显示‘match’; 否则,显示‘no match’。
四.方法说明:a) 使用ws、tc或EDIT编辑程序来建立源文件,然后存盘,使系统返回DOS。
b) 用汇编程序masm(或asm)对源文件汇编产生目标文件obj如:汇编指示出错则需重新调用编辑程序修改错误,直至汇编通过为止。
c) 用连接程序link 产生执行文件EXE.d) 执行程序,可直接从DOS执行程序。
e) 使用debug程序调试程序的方法。
五.实验步骤:1.调用字处理程序EDIT 建立以sample.asm文件datarea segmentstring1 db ‘move the cursor backward.’string2 db ‘move the cursor backward.’mess1 db ‘Match..’,13,10,’$’mess2 db ‘No match!..’,13,10,’$’datarea endsprognam segmentmain proc farassume cs:prognam,ds:datarea,es:datarea start:push dssub ax,axpush axmov ax,datareamov ds,axmov es,axlea si,string1lea di,string2cldmov cx,25repz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx, mess1disp:mov ah,09int 21hretmain endpprognam endsend start2.对源文件汇编产生目标文件obj D:\masm 文件名。
汇编语言程序设计 实验一 DEBUG 程序使用技巧 学号: 姓名:
1. 寄存器和内存 开始 Debug 程序。输入“Q ” 退出程序。再次启动 Debug。 输入 “r ”来显示CPU的当前状态和寄存器中的当前内容。 输入 “r AX ”和“1234”,_______寄存器中的内容变为 1234。 输入 “r DS ”和“2000”,_______寄存器中的内容变为 2000。 输入 “d DS:1000 ”来显示数据段中 80H 字节数据,把数据抄在这里:
输入 “f DS:1000 1100 77 ”再显示一次这 80H 字节。判断这条指令的作用是什么? 再输入 “d 2000:1000 ”来显示数据段中 80H 字节数据。观察与前面的数据有无不同。 输入 “d 1900:0100 ”和“d 1ff0:0100 ”来显示两个存储段中的内容。比较其中 2000:0000 段中的数据。相同段落中的数据相同么?根据你的观察,得出结论,是否程序员可以用不同的段起始地址和偏移量组合,把不容内容存入相同的内存段中。 2.输入机器码,使用单步和断点 退出 Debug,再重新启动 Debug。 输入 “r ”观察 CPU 的状态,下一条指令是什么?
使用两种方式输入一段程序,第一种方式:直接输入机器码。 输入 “u ”来显示程序段中的指令序列。然后输入 “d CS:100 ” 来显示代码段中的数据。观察显示内容。 “u CS:100 106 ”做反汇编,就是显示出汇编语句。将这几句汇编语句记录下来:
使用输入 “r ”观察 CPU 的状态,使用 “t ”来跟踪程序,直至最后一条指令执行完毕。注意,跟踪程序前,要让 IP 寄存器中的值是 100H。一直监视 AX 和 IP 寄存器的内容变化,尤其是标志位的变化。 第二种方式,是输入汇编语句。重启 Debug 程序。 先输入 “a CS:100 ”,然后输入: MOV AX, FF00 ADD AX,01F0 MOV BX,AX NEG BX ADD AX,BX
输入 “u CS:100 10A ”就可以得到这几条语句的机器码。把机器码记录下来:
使用命令“r ip ”再输入 “100 ”,可以将寄存器 IP 中的内容置为 “100H”。再输入“r ”观察 CPU 的状态,然后反复输入 “t ” 跟踪程序,直到程序结束。解释为什么标志位内容会有改变?另外,说明这段程序完成什么任务?
重新把寄存器 IP 的内容变为 100H,不使用跟踪命令 “t”,改用“g 10c”来完成程序。 程序中还可以加断点,做法是在程序中加入 “int 3” 这条指令。如果这条指令在程序的末尾,我们可以通过输入 “g ” 来完成运行程序。这样就不需像上面需要告诉 Debug 程序最后机器码字节的地址偏移量了。“int 3”是 Debug 中很有效的返回控制指令。把这条指令放在程序中必要的位置上,在这条指令后面的代码在不允许时就不会运行。 3.ASCII 字符码,从键盘输入,从显示器输出 (i) 标准 ASCII ( American Standard Code for Information Interchange ) 码使用 7- bit 二进制数来代表字符。一般文本信息经常用 ASCII 编码。 使用命令 “a CS:100 ”, 输入下面的代码: MOV BX,0 MOV [BX],BL INC BX CMP BH,1 JNE 103 INT 3
使用 “d DS:0 100 ”命令,显示程序运行前相应内存段中的数据。运行上面的程序来填充 DS:0000-00FF 这段内存中的内容。再次输入 “d DS:0 100 ”命令来显示填充的内容。在窗口的右边,可以看到相应的ASCII码字符。
如果填充的内容不是字符,显示就用点表示。用类似方法,如何将字符串“How are you?”写入计算机内存呢?
(ii) 计算机的 BIOS ( Basic Input / Output System ) 程序有很多子程序,用来通过标准外设处理输入和输出,比如,键盘和显示器。
BIOS 的程序都可以通过称为系统中断的特殊指令被调用。例如: INT 16H 返回值是把下一个键盘输入值送入寄存器 AL INT 10H 当 BH = 0 时,将光标移到由寄存器 DH 和 DL 内容所指定的行和列的位置上 INT 21H 当 AH = 2 时,将 DL 中的内容作为 ASCII 码的字符显示出来 INT 21H 当 AH = 9 时,将位于 DS:DX 的内容显示为字符串 ( 一个 ASCII 码序列由 $ 符作结束符)。
(ii)(a) 将下列代码输入程序段 CS:0100 中: MOV AH,0 INT 16H INT 3 JMP 100 使用“u CS:100 110 ” 命令,将程序转换为机器码。其中 “JMP 100”的机器码是 “EBF9”。如果使用的是相对寻址方式,我们可以猜测出机器码中“F9”的含义么?相对寻址方式比绝对地址方便的地方是什么?
重置 IP 的内容为 100H,再输入“g ”来执行程序。程序中断时,输入字母“B”,检查寄存器 AL 中的内容为: _________ 重复上面的动作,但输入不同字母,记录下每次 AL 中的内容,能不能判断出来,这段程序的功能是什么?
(ii)(b) 将下面的代码输入 CS:200 中: MOV BH,0 MOV DL,0 MOV DH,0 MOV AH,2 INT 10 MOV DX,0 MOV AH,9 INT 21 INT 3
通过命令 “e DS:0 68 65 6C 6C 21 24.”在内存数据段中输入了一个字符串,将 IP 设为 200,输入 “g.” 来运行程序,在屏幕左上角能找到输入的字符串是什么:_____________ 这个程序是用来做什么的? _____________________________________________________ _____________________________________________________ 4. 内存寻址 把下面程序输入到内存中以地址 CS:0000 为起始的代码段中。 MOV AX,33 MOV AX,[SI] MOV AX,[SI+2] MOV AX,[SI]2 MOV AX,[25] MOV AX,[BX+SI] MOV AX,[BX+SI-3] MOV AX,20[BX+SI-10] INT 3
这些指令分别使用了哪些寻址方式? 将上面的程序翻译为机器码时,可以发现有些指令的机器码是相同的。哪些代码的机器码相同?根据发现,得出的结论是什么?
将数据段与代码段对齐,将数据段中前 40H 字节的数据显示出来,使用命令“d DS:0 40.”,把这些数据记录下来。
假设 BX 和 SI 中的内容分别是 12 和 17,判断一下程序运行后的结果是什么?跟踪程序,记录 AX 寄存器中的内容,与你预计的结果相符么? 5. 堆栈. (i) 将程序输入内存中以地址 CS:0000 为起始的代码段中: MOV BX,22 MOV AX,33 PUSH AX PUSH BX MOV AX,0 MOV BX,0 POP AX POP BX INT 3
跟踪程序,记录发现的变化。不要忘记运行前要把 IP 的内容变为 0。 步骤 AX BX SP 堆栈内容 1 ________ ________ ________ _________________ 2 ________ ________ ________ _________________ 3 ________ ________ ________ _________________ 4 ________ ________ ________ _________________ 5 ________ ________ ________ _________________ 6 ________ ________ ________ _________________ 7 ________ ________ ________ _________________ 8 ________ ________ ________ _________________
增加什么语句,能够使 AX 和 BX 的内容在程序运行后被恢复。
(ii) 重启 Debug 将指令 "INT 3" 在代码段地址 CS:100 中输入。 输入 “r.” 记录堆栈段和代码段的参数: SS:____________ SP:____________ CS:____________ IP:______________ 将堆栈段中 SS:FFE0 FFFF 的内容显示出来,记录堆栈段中的有效数据。 地址 : ______________________________________________________________________ 内容 : ______________________________________________________________________
执行 "INT 3" 指令,引起 CPU 的软件中断。相应的中断程序被调用。中断服务程序的最后一条指令是 "IRET",它告诉 CPU 中断服务结束。 一步步跟踪 "INT 3" 直到 "IRET" 指令被执行。注意寄存器 SP 中内容的变化,记录被推入堆栈的内容,以及中断程序终止时,弹出命令将什么内容送到什么地方?根据观察,能找到 INT 3 中断向量的内容么?中断服务程序的起始地址是什么?