大学课程汇编语言的实验报告
汇编语言实验报告

实验一汇编程序的汇编及运行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.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~7

汇编语言实验报告1~7实验一:数据传输指令、算术指令、逻辑指令的使用实验内容:利用汇编语言,编写一个程序,实现两个整数相加,并将结果存入第三个变量中实验步骤:1. 声明三个变量a、b、c2. 将10存入a,将20存入b3. 将a的值传入al,将b的值传入bl4. 使用add指令将al和bl相加,将结果存入al5. 将al的值传入c6. 显示c的值实验结果:a db 10mov al,aadd al,blint 21hmov ax,4c00h实验二:分支指令的使用实验内容:利用汇编语言,编写一个程序,实现当输入的值为正数时,输出"I'm positive!";当输入的值为负数时,输出"I'm negative!";当输入的值为零时,输出"I'm zero!"1. 定义一个变量num2. 接收用户输入,并将其存储在num中3. 用test指令判断num的值4. 当num=0时,执行输出"I'm zero!"的指令7. 退出程序num db ?lea dx, promptsub al, '0'test num, numjz zerojs negjmp positiveneg:output:zero_msg db 'I am zero!$'prompt db 'Please enter a number:', 0dh, 0ah, '$'1. 定义变量i、sum,分别表示累加的数字和累加和2. 将i赋初值1,sum赋初值03. 进入循环5. 使用inc指令将i加16. 使用cmp指令将i与10比较,如果i小于等于10,继续循环,否则退出循环7. 输出结果mov bx, iloopStart:inc bx实验四:过程调用的使用2. 循环遍历1到100之间的每个数3. 用一个for语句嵌套一个for语句判断该数是否为质数4. 用两个自定义的子程序is_prime和output输出结果call is_primeskip:cmp i, 100prime_loop:div blretje newlinejmp done实验目的:掌握字符串操作指令的使用实验内容:利用汇编语言,编写一个程序,将字符串"SJTU"改为字符串"MIT"1. 定义字符串SJTU和MIT2. 定义两个变量i和len,分别表示字符串的下标和长度3. 使用movsb将SJTU的值传到MIT中4. 输出MITSJTU db 'SJTU'lea si, SJTUstringLoop:实验内容:利用汇编语言,编写一个程序,实现将输入的字符串写入一个文件中,然后再读取该文件中的字符串并输出2. 打开文件3. 将字符串写入文件中4. 关闭文件6. 读取文件内容8. 输出读取的字符串fileName db 'test.txt'content db 32 dup(?)mov cx, word ptr [content]实验内容:利用汇编语言,编写一个程序,在系统按下Ctrl+C时,输出一条信息并退出1. 声明函数handleCtrlC2. 获取中断21的地址,将其存储到文件头中org 100hmov [old_int_21h], es:bxmov dx, offset handleCtrlCend开始:。
汇编语言——实习报告

汇编语言——实习报告在大学的学习生涯中,我有幸参与了一次关于汇编语言的实习。
通过这次实习,我对汇编语言有了更深入的理解和掌握,也积累了宝贵的实践经验。
一、实习目的本次实习的主要目的是让我们熟悉汇编语言的编程环境和基本语法,掌握汇编语言程序的设计和调试方法,提高我们的编程能力和解决问题的能力。
同时,通过实际的项目开发,培养我们的团队合作精神和创新意识。
二、实习环境我们使用的编程环境是 MASM(Microsoft Macro Assembler),这是一款功能强大的汇编语言编译器。
同时,我们还使用了一些调试工具,如 DEBUG 和 CodeView,来帮助我们查找和解决程序中的错误。
三、实习内容1、基础语法学习在实习的初期,我们首先学习了汇编语言的基础语法,包括数据类型、寄存器的使用、指令系统等。
通过大量的示例代码和练习,我们逐渐掌握了如何使用汇编语言进行基本的算术运算、逻辑运算和数据传输。
2、程序设计与实现在掌握了基础语法之后,我们开始进行程序设计和实现。
我们先后完成了一些简单的程序,如加法器、减法器、乘法器等。
在这个过程中,我们不仅要考虑程序的功能实现,还要注意代码的优化和效率。
3、系统调用和中断处理接下来,我们学习了如何在汇编语言中进行系统调用和中断处理。
通过使用系统提供的中断服务例程,我们实现了一些与操作系统交互的功能,如文件操作、控制台输入输出等。
4、项目开发在实习的后期,我们分组进行了一个小型的项目开发。
我们的项目是开发一个简单的操作系统内核,包括进程管理、内存管理、文件系统等模块。
在项目开发过程中,我们充分发挥了团队合作的精神,每个人负责一个模块的设计和实现,然后进行整合和调试。
四、实习中遇到的问题及解决方法1、语法错误在编写汇编代码时,由于对语法规则的不熟悉,经常会出现语法错误。
例如,忘记在指令后面添加操作数、寄存器的使用错误等。
对于这些错误,我们通过仔细检查代码和参考教材中的语法规则,逐步找出并改正了错误。
汇编语言实验7实验报告

汇编语言实验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. 字符串拼接程序首先,需要从键盘输入两个字符串。
《汇编语言》实验报告

《汇编语言》实验报告实验名称:汇编语言实验报告实验目的:通过实验了解汇编语言的基本概念、语法结构和程序设计方法,掌握汇编语言的编写方法。
实验时间:2024年1月1日实验地点:实验室一、实验背景汇编语言是计算机硬件和软件之间的桥梁,通过汇编语言可以直接操作计算机的底层硬件。
汇编语言是一种低级语言,使用汇编语言可以实现对计算机内存、寄存器等硬件资源的直接操作,从而实现程序的功能。
本实验通过编写汇编语言程序,加深对汇编语言的理解。
二、实验过程1. 确定实验环境:使用DOSBox模拟DOS环境进行汇编程序编写和调试。
2. 编写第一个汇编程序:编写一个简单的汇编程序,将字符串“Hello, World!”输出到屏幕上。
3.程序分析:a.定义要输出的字符串,将字符串存储在数据段中。
b.设置段寄存器,将数据段地址加载到DS寄存器中。
c.设置显示模式和光标位置。
d.将字符串逐个字符输出到屏幕上。
e.关闭显示模式。
4. 编译运行:使用汇编语言的编译器将汇编程序转换成机器码,并在DOSBox中运行程序。
5.调试程序:根据程序运行结果和分析,调试程序中存在的错误,并进行改正。
三、实验结果与分析经过多次编写和调试,我们成功实现了将字符串“Hello, World!”输出到屏幕上的功能。
通过程序分析和调试过程,加深了对汇编语言的理解和掌握。
四、实验总结通过本次实验,我们深入了解了汇编语言的基本概念、语法结构和程序设计方法。
通过实际编写汇编语言程序,对汇编语言的编写方法有了更加深入的认识。
同时,通过调试程序的过程,我们也提高了自身的问题解决能力和分析能力。
在今后的学习和工作中,我们将继续学习和深入研究汇编语言,提高自己的编程能力和创新思维能力。
总体而言,本次实验给我们带来了很大的收获,我们以后将更加努力地学习汇编语言,提高自己的编程水平,为以后的学习和工作做好充分的准备。
汇编语言实验十实验报告

汇编语言实验十实验报告一、实验目的本次实验的主要目的是通过学习汇编语言中的输入输出指令和字符串操作指令,掌握如何在汇编语言中进行简单的输入输出和字符串操作。
二、实验内容本次实验主要包括以下内容:1. 输入输出指令:学习如何使用INT 21h中断来进行简单的键盘输入和屏幕输出操作。
2. 字符串操作指令:学习如何使用MOV、LEA、LDS等指令来进行字符串的存储、传递和比较等操作。
3. 实现一个简单程序:通过上述知识点,完成一个简单的程序,可以进行键盘输入和屏幕输出,并对两个字符串进行比较。
三、实验过程1. 输入输出指令在汇编语言中,我们可以使用INT 21h中断来进行键盘输入和屏幕输出操作。
其中,AH寄存器用于指定不同的功能号码。
例如:- AH=01h:在屏幕上显示一个字符- AH=02h:在屏幕上显示一个ASCII码值所代表的字符- AH=06h:从键盘读取一个字符下面是一个示例程序,可以让用户从键盘上输入一个字符,并将其显示在屏幕上:```mov ah, 06h ; 将06h存入AH寄存器int 21h ; 调用中断21hmov dl, al ; 将读取的字符存入dl寄存器mov ah, 02h ; 将02h存入AH寄存器int 21h ; 调用中断21h,显示字符```2. 字符串操作指令在汇编语言中,我们可以使用MOV、LEA、LDS等指令来进行字符串的存储、传递和比较等操作。
例如:- MOV:可以将一个字符串从一个内存地址复制到另一个内存地址- LEA:可以将一个字符串的地址加载到寄存器中- LDS:可以将一个段地址和偏移地址加载到DS和SI寄存器中下面是一个示例程序,可以将一个字符串从一个内存地址复制到另一个内存地址,并比较两个字符串是否相等:```mov si, offset str1 ; 将str1的偏移地址加载到SI寄存器中lea di, str2 ; 将str2的地址加载到DI寄存器中mov cx, length ; 将字符串长度加载到CX寄存器中copy_loop:lodsb ; 从SI指向的内存单元读取一字节数据,并自动将SI加1 stosb ; 将AL所包含的数据写入DI指向的内存单元,并自动将DI 加1loop copy_loop ; 循环执行,直至CX为0cmp str1, str2 ; 比较str1和str2是否相等je equal ; 如果相等,跳转到equal标签not_equal:; 如果不相等,执行一些操作jmp endequal:; 如果相等,执行一些操作end:```三、实验结果通过本次实验,我学会了如何在汇编语言中进行简单的输入输出和字符串操作。
汇编语言程序设计实验报告一

汇编语言程序设计实验报告(一)一、实验目的1. 掌握顺序程序设计方法2. 掌握分支程序的结构及分支程序的设计,调试方法3. 学习数据传送及算术和逻辑运算指令的用法4. 熟悉在PC 机上建立、汇编、连接、调试和运行汇编语言程序的过程二、实验内容1. 从键盘上接收一位十进制数X ,计算Y 值,并以十六进制形式显示出来,Y 按下列公式计算。
⎪⎪⎩⎪⎪⎨⎧===-=+=)6(2/)5()4(2)3(2222X X X X X X X X X X Y 2. 从键盘上接收两个一位十六进制数X 和Y ,然后再输入一个A-D 之间的字符,按下列要求计算。
A )当输入字符为A ,则计算X+Y ,并以十六进制形式显示出来B )当输入字符为B ,则计算|X-Y|,并以十六进制形式显示出来C )当输入字符为C ,则计算X*Y ,并以十六进制形式显示出来D )当输入字符为D ,则计算X/Y ,并以十六进制形式显示出来三、实验结果1、结果截图2、结果截图四、源代码1、代码DATA SEGMENTX DB ?TABLE DW L1,L2,L3,L4DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV AH,1INT 21HCMP AL,33HJB L0CMP AL,36HJA L0AND AL,0FHMOV X,ALSUB AL,3SHL AL,1XOR AH,AHMOV BX,OFFSET TABLEADD BX,AXJMP [BX]L1:MOV AL,XMUL ALADD AL,XJMP L7MUL ALSUB AL,XSUB AL,XJMP L7L3:MOV AL,XMUL ALJMP L7L4:MOV AL,XMUL ALMOV CL,2DIV CLJMP L7L7:MOV BL,ALMOV CL,4SHR AL,CLCMP AL,9JLE L5ADD AL,7L5:ADD AL,30HMOV DL,ALMOV AH,2INT 21HAND BL,0FHCMP BL,9JLE L6ADD BL,7L6:ADD BL,30HMOV DL,BLMOV AH,2INT 21HL0:MOV AH,4CHINT 21HCODE ENDSEND START2、代码DA TA SEGMENTX DB ?Y DB ?Z DB ?DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA START:MOV AX,DATAXOR AX,AXMOV AH,1INT 21HMOV X,ALMOV AH,1INT 21HMOV Y,ALMOV AH,1INT 21HMOV Z,ALMOV AL,XMOV BL,YMOV AH,ZCMP AL,39HJBE M1SUB AL,7M1:SUB AL,30H MOV X,ALCMP BL,39HJBE M2SUB BL,7M2:SUB BL,30H MOV Y,BLMOV AL,XMOV BL,YCMP AH,41HJE L1CMP AH,42HJE L4CMP AH,43HJE L6CMP AH,44HJE L7L1:ADD AL,BLJMP L5L4:CMP AL,BLJA L8SUB BL,ALMOV AL,BLJMP L5L8:SUB AL,BLJMP L5L6:MOV AL,XMUL BLJMP L5L7:XOR AX,AXMOV AL,XDIV BLL5:MOV BH,ALMOV CL,4SHR AL,CLCMP AL,9JLE L2ADD AL,7L2:ADD AL,30HMOV DL,ALMOV AH,2INT 21HAND BH,0FHCMP BH,9JLE L3ADD BH,7L3:ADD BH,30HMOV DL,BHMOV AH,2INT 21HL0:MOV AH,4CHINT 21HCODE ENDSEND START五、实验心得通过本次实验,我对汇编语言程序设计的方法和特点有了一点理解,并有以下心得体会。
汇编语言实验报告

实验一Debug程序的使用一.实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验内容1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。
2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。
要求:本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序1、启动DOS操作系统2、运行程序(若当前盘为C)C:>DEBUG↙3、用“A”命令编辑和汇编源程序–A ↙186E:0100 MOV AX,[0200]↙186E:0103 MOV BX,[0202]↙186E:0107 ADD AX,[0204]↙186E:010B ADC BX,[0206]↙186E:010F MOV [0208],AX↙186E:0112 MOV [020A],BX↙186E:0116 ↙4、用“U”命令反汇编验证源程序–U CS:0100↙186E:0100 A10002 MOV AX,[0200]186E:0103 8B1E0202 MOV BX,[0202]186E:0107 03060402 ADD AX,[0204]186E:010B 131E0602 ADC BX,[0206]186E:010F A30802 MOV [0208],AX186E:0112 891E0A02 MOV [020A],BX186E:0116–5、程序未执行前,用“R”命令观察,相关寄存器的内容。
–R↙如:(AX)= 0000 ,(BX)= 0000 ,(SI)= 0000 ,(DI)= 0000 ,(CS)= 13F5 ,(IP)= 0100 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告实验课程:学生姓名:学号:专业班级:电气信息类III班2011年12月20日目录(1)汇编语言程序上机过程 (2)(2)字符串处理程序实验 (6)(3)子程序实验 (13)(4)中断程序实验 (21)(5)C++调用汇编子程序 (25)南昌大学实验报告---(1)汇编语言程序上机过程学生姓名:学号:专业班级:实验类型:□验证■综合□设计□创新实验日期:2011.11.12/13实验成绩:一、实验目的熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。
了解汇编语言程序的汇编、运行环境。
二、实验内容1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;2.伪指令:SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;3.利用的INT21H的1号功能实现键盘输入的方法;三、实验环境PC微机DOS操作系统或Windows操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境四、实验要求1.仔细阅读有关伪指令SEGMENT,ENDS,ASSUME,END,OFFSET,DUP的内容;2.了解利用的INT21H的1号功能实现键盘输入的方法,了解.EXE文件和.COM文件的区别及用INT21H4C号功能返回系统的方法;3.阅读下面程序段。
五、主要实验步骤程序:data segmentmessage db'This is a sample program of keyboard and disply'db0dh,0ah,'Please strike the key!',0dh,0ah,'$'data endsstack segment para stack'stack'db50dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackstart:mov ax,datamov ds,axmov dx,offset messagemov ah,9int21hagain:mov ah,1int21hcmp al,1bhje exitcmp al,61hjc ndcmp al,7ahja ndand al,11011111bnd:mov dl,almov ah,2int21hjmp againexit:mov ah,4chint21hcode endsend start实验步骤:1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。
2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3.用TYPE命令显示1产生的.LST文件。
4.用LINK将.OBJ文件连接成可执行的.EXE文件。
5.在DOS状态下运行LINK产生的.EXE文件。
即在屏幕上显示标题并提示你按键。
每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。
按ESC键可返回DOS。
若未出现预期结果,用DEBUG检查程序。
六、思考题1、若在源程序中把INT21H的'H'省去,会产生什么现象?代码编译连接均为正常,但是运行时无法输入与输出,也无法退出。
2、把INT21H4CH号功能改为INT20H,行不行?更改后,编译链接均正常,输入输出也正常,但是按下ESC退出时会出现错误,错误如下:七、参考资料《IBM-PC汇编语言程序设计》《汇编语言实验指导书》南昌大学实验报告---(2)字符串处理实验学生姓名:学号:专业班级:实验类型:□验证■综合□设计□创新实验日期:2011.11.20/21实验成绩:___一.实验目的1.熟悉串操作指令的功能与应用;2.掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。
二.实验内容1.字符串统计。
自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。
2.在给定的字符串中,删除重复的字符,其余的字符向前递补。
三.实验要求1.认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。
2.按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。
四.实验环境PC微机DOS操作系统或Windows操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境五.实验步骤1.用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。
程序每次执行,都能得到不同的结果。
;COUNTDC.ASMDATA SEGMENTSTRN DB80DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DI,STRNMOV CL,0AGAIN:MOV AH,1 INT21HCMP AL,0DHJZ DONEMOV[DI],ALINC DIINC CLJMP AGAIN DONE:LEA SI,STRN MOV CH,0MOV BL,0CLDCYCLE:LODSB①CMP AL,61HMP AL,7AHCJA NEXTINC BL NEXT:LOOP CYCLE MOV AL,BLMOV AH,0MOV CL,10DIV CLXCHG AH,ALPUSH AXMOV DX,0DHMOV AH,2INT21HMOV DX,0AHMOV AH,2INT21HPOP AXMOV DL,AHOR DL,30HMOV AH,2PUSH AXINT21HPOP AXMOV DL,AL1OR DL,30H1INT21HPOP AXMOV DL,ALOR DL,30HMOV AH,2INT21HMOV AH,4CHINT21HCODE ENDSEND START编译源程序:如下,发现地29行有错误。
用EDIT命令找到错误地方,并进行修改,如下图所示:修改后保存程序,重新编译:重新编译后程序没有错误,用反汇编查看指令代码:如下图所示:运行程序,验证程序设计结果的正确性。
显示结果如下:从键盘上输入字符串“ADKJjkdjfljdeowekdjg”,共二十个字符,其中小写字母十六个,由运行结果可知,程序运行正确,实现了设计要求。
②实验2课参考教材第五章练习10的解法,但要编写一个在同一个字符串中删除字符,并将其余字符向前递补。
删除字符串中重复字符的源程序清单:MOV BYTE PTR[SI],0GOON:LOOP COMP;查出与该字符重复的所有字符,并用0NEXT1:POP DXPOP SIDEC SIDEC DXMOV CX,DXJNZ REPEAT;对所有重复字符都进行查找LEA SI,STRN;删除重复字符MOV CL,LENMOV CH,0CYCLE:MOV AL,[SI]INC CLCMP AL,0;是重复字符吗?JNZ NEXT;不是,查找下一个字符DEC CX;递补子串长度送CXJZ ALLDONECALL DELE;删除该空字符并递补DEC SINEXT:INC SI③LOOP CYCLEALLDONE:MOV DL,0AHMOV AH,2INT21HMOV DL,0DHMOV AH,2INT21HLEA DX,STRNMOV AH,9INT21HMOV AH,4CHINT21HDELE PROCPUSH SIPUSH CXCLDMOV DI,SI;空字符处为目的首址INC SI;下一个地址为源串首址REP MOVSBPOP CXPOP SIRETDELE ENDPCODE ENDSEND STARTPOP SIRETDELE ENDPCODE ENDSEND START编译源程序,检查程序的正确性,如下图所示:源程序在27行有错误,有提示的消息可知,此处需要用到变址或基址寄存器,用EDIT命令找到错误的地方,并改正:此处是寄存器直接寻址,把cl的值送给标号为LEN存储单元,所以应去掉”[]”修改程序保存再编译以检查是否还有错误:有上图编译可知,程序修改正确,接下来连接成目标程序:生成的目标程序名为DELD.EXE用反汇编命令查看程序代码:运行程序,检验程序设计的正确性:执行程序,输入字符串”DKJKLDKEIOWEJDLJAHNVL”,根据编写要求,显示的结果为“KIOWEDJAHNVL“,既删除字符串中重复的字符。
如上图所示。
南昌大学实验报告---(3)子程序实验学生姓名:学号:专业班级:实验类型:□验证■综合□设计□创新实验日期:2011.12.8/15实验成绩:一、实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
二、实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符”b”的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符”b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三、实验环境PC微机DOS操作系统或Windows操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境四、实验要求1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
五、主要实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。