汇编语言程序设计实验篇emu

合集下载

汇编语言程序设计实验篇emu新

汇编语言程序设计实验篇emu新

1.汇编语言程序设计实验篇1.1.汇编系统软件简介Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug的模拟器。

它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。

该软件兼容Intel 的下一代处理器,包括PentiumII、Pentium4。

利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。

1.1.1创建程序 TEMPLATE程序本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。

输入全部指令后,单击按钮,保存相应的程序段。

2.EXE TEMPLATE程序本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。

在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

《汇编语言程序设计》实验报告(一)

《汇编语言程序设计》实验报告(一)
MESS1 DB 'MATCH!’,13,10,’$'
MESS2 DB 'NO MATCH!’,13,10,’$'
DATA ENDS
对以上源程序重新汇编、连接、运行,结果输出为:MATCH!
七、实验总结
通过这次上机实践,我对汇编程序和连接程序的使用开始有一点了解。但刚开始还是很不顺的,总是出现找不到文件,后来经过同学的指导,终于知道自己的错误,原来是路径错误。所以还需要勤加练习,多多实践。
四、实验材料、工具、或软件
多媒体计算机、WINDOWS XP系统或纯DOS系统、MASM6.11以上版本或汇编语言程序设计实验集成环境。
五、实验要求
1. 编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NO MATCH’。用串比较功能来完成程序所要求的功能。
2.完成课堂例题,并用DEBUG运行,观察结果。
六、试验内容与步骤:(附上必要的调试过程及运行结果截图,可加附页)
试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NO MATCH’。用串比较功能来完成程序所要求的功能。上机步骤如下:
《汇编语言程序设计》实验报告(一)
姓名
学号
系别
班级
指导教师
实验日期
课程名称
《汇编语言程序设计》
同组实验者
一、实验名称:实验一汇编程序和连接程序的使用
二、实验目的:
1. 熟悉汇编语言的上机环境;
2. 学习EDIT,MASM,LINK程序的使用;3. 掌握建立、汇、链接、运行汇编语言程序的过程。

汇编语言程序设计实验内容(川大微机原理实验资料和内容以及MASM使用方法)

汇编语言程序设计实验内容(川大微机原理实验资料和内容以及MASM使用方法)

第一部分汇编语言程序设计实验一熟悉、使用DEBUG调试工具一.上机目的:1.了解并逐步熟悉汇编语言的编辑方法及特点.2.复习8088汇编语言的段结构、常用的指令与伪指令、存储空间的分配等。

3.掌握汇编语言的编辑、汇编及连接的过程。

4.了解并逐步掌握运用DEBUG进行调试汇编语言程序。

二.实验内容:1.运用8086汇编语言,编辑多字节非压缩型BCD数除法的简单程序,文件名取为*.ASM。

2.运用MASM﹒EXE文件进行汇编,修改发现的各种语法错误,直至正确,形成*.OBJ 文件。

3.运用LINK.EXE文件进行连接,形成*.EXE文件。

4.仔细阅读附录中的DEBUG部分,掌握各种命令的所有方法。

5.运用DEBUG。

EXE文件进行调试,使用单步执行命令—T两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D,观察存储器数据段内数值。

6.再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG 的设置断点,单步执行等功能发现错误所在并加以改正。

程序清单:多字节非压缩型BCD数除法(88754/6=14792)DA TA SEGMENTA DB 8,8,7,5,4B DB 6C DB 5DUP (0)N EQU 5DA TA ENDSCODE SEGMENTASSUME CS:CODE;DS:DATA;ES:DATA,START MOV AX,DA TAMOV DS,AXMOV ES,AXCLDLEA SI,ALEB DI,CMOV CX,NMOV AH,0LP1:LODSBAADDIV BSTOSBLOOP LP1MOV CX,NLEA DI,CLP2:MOV DL,[DI]MOV AH,2INT 21HDEC DILOOP LP2MOV AH,4CHINT 21HCODE: ENDSEND START实验二设计汇编语言程序一.8088提供了一套字符串处理指令,这些指令的特点是:在使用前必须先在指定的寄存器中存入源字符串和目的字符串的首地址及相关字符数,在处理过程中还可以使用REP重复操作前缀。

《汇编语言》实验报告

《汇编语言》实验报告

《汇编语言》实验报告实验名称:汇编语言实验报告实验目的:通过实验了解汇编语言的基本概念、语法结构和程序设计方法,掌握汇编语言的编写方法。

实验时间:2024年1月1日实验地点:实验室一、实验背景汇编语言是计算机硬件和软件之间的桥梁,通过汇编语言可以直接操作计算机的底层硬件。

汇编语言是一种低级语言,使用汇编语言可以实现对计算机内存、寄存器等硬件资源的直接操作,从而实现程序的功能。

本实验通过编写汇编语言程序,加深对汇编语言的理解。

二、实验过程1. 确定实验环境:使用DOSBox模拟DOS环境进行汇编程序编写和调试。

2. 编写第一个汇编程序:编写一个简单的汇编程序,将字符串“Hello, World!”输出到屏幕上。

3.程序分析:a.定义要输出的字符串,将字符串存储在数据段中。

b.设置段寄存器,将数据段地址加载到DS寄存器中。

c.设置显示模式和光标位置。

d.将字符串逐个字符输出到屏幕上。

e.关闭显示模式。

4. 编译运行:使用汇编语言的编译器将汇编程序转换成机器码,并在DOSBox中运行程序。

5.调试程序:根据程序运行结果和分析,调试程序中存在的错误,并进行改正。

三、实验结果与分析经过多次编写和调试,我们成功实现了将字符串“Hello, World!”输出到屏幕上的功能。

通过程序分析和调试过程,加深了对汇编语言的理解和掌握。

四、实验总结通过本次实验,我们深入了解了汇编语言的基本概念、语法结构和程序设计方法。

通过实际编写汇编语言程序,对汇编语言的编写方法有了更加深入的认识。

同时,通过调试程序的过程,我们也提高了自身的问题解决能力和分析能力。

在今后的学习和工作中,我们将继续学习和深入研究汇编语言,提高自己的编程能力和创新思维能力。

总体而言,本次实验给我们带来了很大的收获,我们以后将更加努力地学习汇编语言,提高自己的编程水平,为以后的学习和工作做好充分的准备。

汇编语言程序设计-实验

汇编语言程序设计-实验

3.用连接程序生成可执行程序文件 .
在DOS状态下键入以下命令: D:\MASM> LINK EG1 经汇编以后产生的目标程序文件(.OBJ文件) 并不是可执行程序文件,必须经过连接以后,才能 成为可执行文件(即扩展名为.EXE)。
连接过程如下图所示
提示将要产生的可执行文件名,通 提示将要产生的可执行文件名, 常直接按回车键表示使用默认文件 名 内存映象文件的提示,直接按回车键 内存映象文件的提示, 表示不产生此文件。 表示不产生此文件。 内存映象文件的提示,直接按回车键 内存映象文件的提示, 表示不产生此文件。 表示不产生此文件。
汇编语言程序设计 实验
汇编程序开发过程
建立汇编源程序(即:建立 文件名.asm) 使用EDIT.EXE文本编辑器进行输入 编译目标文件(即:编译为.obj 文件) 使用MASM进行汇编 编译不通过,重新修改(错误类型:源程序语句不合法) 依据MASM汇编过程中给出的行号进行修改 连接为可执行文件(即:连接为.exe 文件) 使用LINK进行连接 运行编译好的可执行文件 用调试工具调试,重新修改(逻辑错误)
参考程序:
要显示字符串必须以“$”为结束符 DATA SEGMENT 数据段定义 BUF DB 'Hello, world !$' 堆栈段的定义最后一定要加上STACK DATA ENDS STACK SEGMENT STACK DW 36 DUP(?) 堆栈段定义 STACK ENDS CODE SEGMENT ;段寄存器声明 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA ;主程序开始 MOV DS,AX MOV DX,OFFSET BUF MOV AH,9 显示字符串的9号DOS功能调用 INT 21H MOV AH,4CH 结束程序的运行,返回DOS INT 21H CODE ENDS ;结束主程序 END START

汇编上机实验报告

汇编上机实验报告

汇编上机实验报告实验目的:通过进行汇编语言上机实验,掌握汇编语言的基本语法和编程技巧,培养汇编程序设计能力。

实验内容:实验一:汇编程序的简单输入输出1.编写一个汇编程序,要求从键盘输入两个整数,然后将其相加,并将结果输出到屏幕上。

2. 利用调试器(如DOSBox或emu8086)执行并调试程序,观察程序运行过程和实际输出结果。

实验二:汇编程序的条件跳转1.编写一个汇编程序,要求从键盘输入一个整数,判断其是否大于10,若是,则将其打印到屏幕上;否则,将其乘以5并打印到屏幕上。

2. 利用调试器(如DOSBox或emu8086)执行并调试程序,观察程序运行过程和实际输出结果。

实验三:汇编程序的循环1.编写一个汇编程序,要求计算1到10的累加和,并将结果打印到屏幕上。

2. 利用调试器(如DOSBox或emu8086)执行并调试程序,观察程序运行过程和实际输出结果。

实验四:汇编程序的数组操作1.编写一个汇编程序,要求定义一个长度为10的数组,并将数组中的值初始化为0,然后利用循环将数组中的每一个元素加1,并将每个元素的值打印到屏幕上。

2. 利用调试器(如DOSBox或emu8086)执行并调试程序,观察程序运行过程和实际输出结果。

实验结果:实验一:汇编程序的简单输入输出编写的汇编程序通过键盘输入两个整数,实现了相加并将结果输出到屏幕上的功能。

程序运行正常,输出结果与预期一致。

实验二:汇编程序的条件跳转编写的汇编程序通过键盘输入一个整数,根据条件判断,实现了将输入数大于10时打印在屏幕上,否则将其乘以5并打印在屏幕上的功能。

程序运行正常,输出结果与预期一致。

实验三:汇编程序的循环编写的汇编程序通过循环计算1到10的累加和,并将结果打印在屏幕上。

程序运行正常,输出结果与预期一致。

实验四:汇编程序的数组操作编写的汇编程序通过定义一个长度为10的数组,并将数组中的值初始化为0,利用循环将数组中的每一个元素加1,并将每个元素的值打印到屏幕上。

汇编语言程序设计实验报告

汇编语言程序设计报告班级:学号:姓名:目录汇编语言程序设计报告 (1)汇编语言程序设计实验报告 (4)实验一 (4)实验内容 (4)实验目的 (4)实验代码 (4)实验代码整体思路 (5)1.检测所编程序的正确性 (5)实验二 (7)1.实验内容 (7)结果测试: (11)Debug: (11)实验三 (13)实验要求: (13)实验代码: (13)实验代码思路: (15)检测结果,验证正确性 (15)结论 (17)实验四 (17)实验内容 (17)流程图 (18)实验代码: (18)Windbg (21)实验结果测试: (23)输入数据进行测试 (24)实验五 (24)实验内容:多模块程序设计及多语言混合编程。

(24)要求: (24)实验代码: (24)实验代码分析说明: (26)实验数据检测:判断是否成功完成实验任务 (27)实验心得 (28)汇编语言程序设计实验报告实验一实验内容:熟悉DOS编程环境:编写一个DOS环境的汇编语言程序,要求从键盘输入一串字符,去除连续重复的字符后再显示,如:输入一串为“aaawwweerrty”的字符串,输出结果应为‘awerty’实验目的:通过上机实践加深对16位环境下编程的了解学会使用debuge调试程序实验代码:LEA SI, BUFFER + 1LP1:INC SILP2:MOV AL, [SI]CMP AL, 13JZ DISPCMP AL, [SI + 1]JNZ LP1MOV DI, SILP3:INC DIMOV AL, [DI + 1]MOV [DI], ALCMP AL, 13JZ LP2JMP LP3DISP:MOV AL, '$'MOV [SI], ALMOV AH, 9LEA DX, BUFFER + 2INT 21HEXIT:MOV AX, 4C00HINT 21HCODE ENDSEND MAIN实验代码整体思路:定义一个大小为60的缓冲区,用来存储从键盘输入的字符串;调用中断调用,将字符串输入到缓冲区当中;使用取地址符号Lea取得输入字符串的首地址然后后一位与前一位相比,若相同则将其舍弃,否者将其记录在缓冲区中,循环结束之后在其后补上字符“$”即可一次输出,无单个输出1.检测所编程序的正确性:编译所建的1.asm文件:按下回车键之后开始编译,如下图所示,编译结束表明没有错误不存在警告对编译成功之后的文件进行链接,以生成能运行的.exe文件,如下图1-1所示:1-1链接之后发现链接(Link)之后也是成功的,接下来就进行测试的最后一步,即运行1.exe文件,输入一串字符串,看能否达到预期的目的,如达到,则成功,否者重新编译。

汇编程序设计实验

汇编程序设计实验汇编程序设计实验是计算机科学与技术专业中一项重要的实践教学环节,它旨在培养学生对计算机硬件结构和低级语言程序设计的深入理解。

通过实验,学生可以学习到如何使用汇编语言编写程序,以及如何将这些程序转换为机器可以执行的指令。

实验目的1. 理解汇编语言的基本概念和语法结构。

2. 掌握汇编语言程序设计的基本方法和技巧。

3. 熟悉汇编程序的编写、编译、调试和运行过程。

4. 增强对计算机硬件工作原理的认识和理解。

实验环境- 汇编语言开发环境,如MASM、NASM等。

- 汇编器和链接器,用于将汇编源代码转换为可执行文件。

- 调试工具,如调试器,用于检查程序的执行过程。

实验内容1. 汇编语言基础- 学习汇编语言的指令集和操作数。

- 了解汇编语言的基本语法和程序结构。

2. 编写简单的汇编程序- 编写一个程序,实现数据的输入和输出。

- 编写一个程序,实现简单的算术运算。

3. 寄存器和内存操作- 学习如何使用寄存器进行数据存储和操作。

- 编写程序,实现内存地址的数据读写。

4. 循环和条件判断- 学习循环结构和条件判断的实现方法。

- 编写程序,实现循环和条件判断的功能。

5. 子程序调用- 学习子程序的编写和调用方法。

- 编写一个主程序和若干子程序,实现模块化编程。

6. 中断和异常处理- 了解中断和异常的基本概念。

- 编写程序,实现简单的中断服务程序。

7. 汇编与高级语言的接口- 学习如何将汇编程序与C/C++等高级语言程序进行接口。

- 编写程序,实现汇编语言与高级语言的混合编程。

实验步骤1. 环境搭建:安装并配置汇编语言开发环境。

2. 编写代码:根据实验要求编写汇编语言源代码。

3. 编译程序:使用汇编器将源代码编译为机器代码。

4. 链接程序:使用链接器将编译后的代码与其他必要的库链接成可执行文件。

5. 调试程序:使用调试工具检查程序的执行过程,找出并修复错误。

6. 运行程序:在适当的环境下运行程序,验证程序的正确性。

微原软件实验二:汇编语言程序设计

实验二:汇编语言程序设计一、实验目的1)掌握MASM 的操作步骤,能够将源程序编译成可执行文件。

2)掌握简单的汇编语言程序的设计(建立及调试)。

二、实验任务与内容1.实验任务1)编一程序,在显示器上显示256个ASCII代码,要求显示格式为每行显示16个字符,两个ASCII字符间空一格。

2)试编一程序,把地址偏移量为100H 单元开始的256 个单元分别写入:00H,01 H,02H,03H,…,FFH 数据。

统计写入的数据块中0 元素、正元素、负元素的个数,并分别把统计结果送人上述数据块之后的三个单元中。

用DOS功能调用显示上面两题中数据块Yes各单元(包括统计结果)内容。

为了显示清晰明了,要求每行显示16 个数据,两个数据之间用空格分开。

3)编一程序,把键入的十六进制数转换成十进制数并在屏幕上显示出来。

键入的最大数为FFFFH,若键人的不是十六进数字,则显示出错提示。

2.实验内容1) 显示256个ASCII码(1)源程序DA TA SEGMENT ;定义数据段DB 256 DUP(?)DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX, DA TA ;数据段赋值MOV DS, AXMOV CX, 256MOV DH, 0LOP:TEST DH, 00001111B ;判断是否显示16个字符换行JNZ NEXTMOV DL, 13 ;换行CALL DISPMOV DL, 10CALL DISPNEXT:MOV DL, DH ;显示字符CALL DISPMOV DL, ' ' ;两字符间加空格CALL DISPINC DH ;使用DH计数LOOP LOPDONE: ;退出程序MOV AH,4CHINT 21HDISP PROC NEAR ;在屏幕上显示字符PUSH AXMOV AH, 2INT 21H ;DOS功能调用POP AXRETDISP ENDPCODE ENDSEND START(2)程序流程图2)写入数据,统计元素个数(1)源程序DA TA SEGMENTHEX DB '0123456789ABCDEF'M1 DB 13,10,'BUFFER DUMP:',13,10,36M2 DB 13,10,'NUMBER OF ZEROES:$'M3 DB 13,10,'NUMBER OF POSITIVE ELEMENTS:$'M4 DB 13,10,'NUMBER OF NEGATIVE ELEMENTS:$'ORG 100H ;从100H处开始BUF DB 256 DUP ('.')ZEROES DB 0POSTVS DB 0NEGTVS DB 0DA TA ENDSSTACK SEGMENT STACKDW 2048 DUP(?)STACK ENDSCODE SEGMENTMAIN: MOV AX,DATAMOV DS,AX ;缓冲区的地址存入DS:SI,清点数据时使用DS:SIMOV ES,AXASSUME DS:DATA,ES:DATAMOV SI,OFFSET BUF ;再存一遍到ES:DI,填充数据时使用ES:DIMOV DI,SIMOV CX,256 ;计数器XOR AX,AX ;AX清零CLD ;清零方向标志;先对BUF按要求1进行填充LP1: STOSB ;AL内容填入ES:[DI]、且DI自动+1 INC AX ;AL也加1LOOP LP1 ;循环;清点0元素、正负元素个数MOV CX,256 ;计数器LP2: LODSB ;从DS:[SI]里读出值到AL,SI自动增1CMP AL,0 ;AL与0比较JZ ISZERO ;是0,转去增加0元素计数器内容JG ISPOS ;是正数转去增加正元素计数器内容INC NEGTVS ;否则增加负元素计数器内容LP2NXT: LOOP LP2 ;继续循环直到CX为0JMP SHOW ;然后转去输出ISZERO: INC ZEROESJMP LP2NXTISPOS: INC POSTVSJMP LP2NXTSHOW: MOV DX,OFFSET M1 ;显示BUFFER DUMPCALL PUTSMOV CX,256MOV SI,OFFSET BUFLP3: JCXZ DONEMOV AX,DS ;显示DS:SI的地址CALL HEXWORDMOV DL,':'CALL PUTCMOV AX,SICALL HEXWORDMOV DL,' ' ;用两个空格把地址和数据分开CALL PUTCCALL PUTCPUSH CX ;下面输出8个数据,内层循环也用CX控制所以保存一下CX MOV CX,16LP4: LODSBCALL HEXBYTE ;读入一个数,按16进制显示出来CALL PUTC ;并且输出一个空格,与下个值分开,DL刚才已经赋值了LOOP LP4 ;一行输出8个CALL CRLF ;换行POP CX ;恢复CXSUB CX,16 ;人工调整CXJNC LP3 ;继续输出下行DONE: MOV DX,OFFSET M2 ;输出0元素统计CALL PUTSMOV AL,ZEROESXOR AH,AHCALL PRINTAXMOV DX,OFFSET M3 ;输出正元素统计CALL PUTSMOV AL,POSTVSXOR AH,AHCALL PRINTAXMOV DX,OFFSET M4 ;输出负元素统计CALL PUTSMOV AL,NEGTVSXOR AH,AHCALL PRINTAXMOV AH,4CH ;退出INT 21HHEXBYTE PROC ;输出AL里的十六进制数(2位)PUSH DXPUSH BXMOV BX,OFFSET HEX ;准备XLAT查表得到每个数位的字符PUSH AXSHR AL,1 ;AL右移4位后原来的高4位到了低4位上SHR AL,1SHR AL,1SHR AL,1XLATMOV DL,ALCALL PUTC ;输出高四位的数字POP AXAND AL,0FH ;清除AL高4位,AL内只剩下低四位了XLATMOV DL,ALCALL PUTC ;输出低四位的数字POP AXPOP BXPOP DXRETHEXBYTE ENDPHEXWORD PROC ;输出AX里的十六进制数(4位)PUSH AXMOV AL,AHCALL HEXBYTE ;先输出AH内容POP AXCALL HEXBYTE ;再输出AL内容RETHEXWORD ENDPPRINTAX PROC ;以10进制输出AX中的无符号整数OR AX,AX ;是0则直接输出JNZ @FPUSH DXMOV DL,'0'CALL PUTCPOP DXRETAA: PUSH AXPUSH CXPUSH DXPUSH BXMOV BX,10XOR DX,DXDIV BXMOV CX,AXOR CX,DX ;若商与余数都为0则结束递归JZ @FPUSH DX ;留存DX中的余数以在递归后输出CALL @B ;递归POP DX ;从最高位开始恢复余数ADD DL,'0'CALL PUTCAA: POP BXPOP DXPOP CXPOP AXRETPRINTAX ENDPPUTC PROC ;输出DL里的字符PUSH AXMOV AH,2POP AXRETPUTC ENDPPUTS PROC ;输出DS:DX指向的字串PUSH AXMOV AH,9INT 21HPOP AXRETPUTS ENDPCRLF PROC ;输出回车换行PUSH DXMOV DL,13CALL PUTCMOV DL,10CALL PUTCPOP DXRETCRLF ENDPCODE ENDSEND MAIN(2)程序流程图3)十六进制数转换成十进制数(1)源程序CODE SEGMENT ;定义代码段MAIN PROC FAR ;定义段间调用子程序ASSUME CS:CODE ;段寄存器关联说明CALL HEXIN ;调用子程序:键盘输入十六进制数并将其转换成二进制数CALL CRLFCALL BINIDECCALL CRLF ;调用子程序,输出一个回车、换行JMP MAINRETMAIN ENDPHEXIN PROC NEARMOV AX,0NEWCHAR:MOV AH,01HINT 21HSUB AL,30H ;al-30h→alJL EXIT ;al<0,转去保存转换结果,结束子程序,返回调用者CMP AL,10D ;al<10?JL ADD_TO ;是则转去转换对应的二进制数SUB AL,27H ;al-27h→alCMP AL,0AH ;al<0ah?(此时,相当于比较输入的字符是否小于'a')JL EXIT ;是则转去保存转换结果,结束子程序,返回调用者CMP AL,10H ;al>=10h?(此时,相当于比较输入的字符是否大于或等于'g')JGE EXIT ;是则转去保存转换结果,结束子程序,返回调用者ADD_TO:MOV CL,4SHL BX,CL ;bx左移4位MOV AH,0ADD BX,AXJMP NEWCHAR ;接受下一个十六进制字符EXIT:RETHEXIN ENDPBINIDEC PROC NEARMOV CX,10000DCALL DEC_DIV ;把bx的内容转换成对应的十进制ASCII码字符并显示MOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVRETDEC_DIV PROC NEAR ;把bx的内容转换成对应的十进制ASCII码字符并显示MOV AX,BXMOV DX,0 ;dx置0,准备做除法(除数是16位)DIV CXMOV BX,DX ;dx→bx,余数赋给bx保存MOV DL,AL ;al→dl,商数赋给dl,准备显示对应的十进制数字符ADD DL,30H ;dl+30h→dl,转换成对应的ASCII码字符MOV AH,02HINT 21HRETDEC_DIV ENDPBINIDEC ENDP ; 子程序,输出一个回车、换行CRLF PROC NEARMOV DL,0AH ;回车符→dlMOV AH,02H ;dos功能调用2号功能:显示一个字符(dl中)INT 21HMOV DL,0DHMOV AH,02HINT 21HRETCRLF ENDPCODE ENDSEND MAIN(2)程序流程图三、实验结果1)显示256个ASCII码2) 写入数据,统计元素个数3)十六进制数转换成十进制数四、实验总结心得体会:通过本次的实验,我对汇编语言的程序有了进一步的了解,加强了汇编语言的使用能力,并通过努力完成了本次试验。

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

汇编语言程序设计实验报告三(子程序设计实验)汇编语言程序设计实验报告三(子程序设计实验)实验目的掌握主程序与子程序之间的调用关系及其调用方法。

掌握子程序调用过程中近程调用与远程调用的区别。

熟练掌握码型变换的程序。

实验内容从键盘输入二位非压缩BCD数,存入AX寄存器中,编程实现将其转换为二进制数,并在屏幕上显示。

要求码型转换程序用远程子程序编写,字符显示用近程子程序编写。

数据可循环输入,遇‘00’结束。

实验准备预习子程序设计的基本方法,根据实验内容要求编写出实验用程序。

熟悉键盘输入和字符显示的程序段的编制。

实验步骤编辑、汇编源程序,生成可执行文件。

执行程序,检查输入、输出结果,看是否正确。

如不正确,用DEBUG检查,修改源程序,再汇编、运行,直到程序正确为止。

用DEBUG的T命令或P命令跟踪程序的执行,观察在远程和近程调用过程中,堆栈的变化情况。

实验报告要求分析近程调用和远程调用的主要区别。

用DEBUG命令观察执行过程有何不同。

分析实验结果及所遇到的问题的解决方法。

程序流程图开始TRAN程序标准序开始读入十进制数据放AX中AXAXAND0F0FH是00?YBLALN调用转换子程序结束AL左移3位回车、换行BL左移1位于ALAL+BL主程序流程图ALAL+AHRET转换子程序TRAN流程图程序清单STASEGMENTSTACK’STACK’DB100DUP(0)STAENDS GSAGSEGMENTPARA‘CODE’ASSUMECS:CSAG MAINPROCFARSTRAT:PUSHDSSUBAX,AXPUSHAXREV:MOVAH,1INT21HMOVBL,ALINT21HMOVAH,ALMOVAL,BLCMPAX,3030H JEENDTRAN CALLNEARPTRTRAN CALLFARPTRCON MOVAL,0DH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP JMPREV ENDTRAN:RET MAINENDP TRANPROCNEAR ANDAX,0F0FHMOVBL,ALMOVBL,ALMOVCL,3SHLAL,CLMOVCL,1SHLBL,CLADDAL,BLADDAL,AHRETTRANENDPCSAGENDS CSBGSEGMENTPARA’CODE’ASSUMECS:CSBG CONPROCFARPUSHAXMOVCL,4 SHRAL,CL ADDAL,30H CMPAL,39H JBECON2 ADDAL,7CON2:PUSHAX MOVAL,0DH CALLFARPTRDISP MOVAL,OAH CALLFARPTRDISP POPAX CALLFARPTRDISP POPAX ANDAL,0FHADDAL,30H CMPAL,39H JBECON1ADDAL,7CON1:CALLFARPTRDISP RETCONEDNP DISPPROCFAR PUSHBXMOVBX,0MOVAH,14INT10HPOPBXRETDISPENDPCSBGENDS ENDSTART。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.汇编语言程序设计实验篇1.1.汇编系统软件简介Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug 的模拟器。

它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。

该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。

利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。

1.1.1创建程序 TEMPLATE程序本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。

输入全部指令后,单击按钮,保存相应的程序段。

2.EXE TEMPLATE程序本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。

在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

输入全部指令后,单击按钮,保存相应的程序。

1.1.2执行程序在编辑界面中,如图所示,单击按钮,自动完成源程序的编译和链接。

在“emulator”对话框中(),左边部分列出了寄存器的当前值,右边部分是已经输入的程序段,中间部分是右边每条指令的物理地址和对应的机器代码,中间的文本框中列出了当前指令的CS和IP。

单击按钮,可以单步执行一条指令;单击按钮,可以一次执行完所有程序;单击按钮,可以重新回到第一条指令的位置处;单击按钮,可以重新加载另一个程序。

修改“emulator”对话框中文本框的内容,也可以观察其它段的内容,在图所示界面中,DS=0700H,若要察看该数据段中偏移地址为6000H位置处的内存单元内容,可以在文本框中输入0700:6000,显示结果如图所示,中间部分依次列出从该地址开始的所有字节的内容。

在“emulator”对话框的底部,单击按钮,可以观察栈的内容;单击按钮,可以观察标志寄存器中标志位的内容。

在“emulator”对话框中,选择“view”菜单中的“memory”菜单项,也可以观察内存的情况。

在“Random Access Memory”对话框中,可以修改文本框中的值可以确定所要观察的地址,该值由段基地址:段内偏移地址构成,如图所示,当前要观察的内存地址为(6000:0010)。

在显示结果中,左边是逻辑地址,中间是从该地址的开始连续16个字节的内容,右边是每个字节对应的字符。

在该对话框中,也可以直接修改存储器单元的值,如图所示,从60010H开始的连续4个字节的内容已经被修改为12H,34H,56H和78H。

1.2基础实验1.2.1数据传送指令1.实验目的1)熟悉8086指令系统的数据传送指令及8086的寻址方式。

2)利用emu8086调试工具调试汇编程序。

2.实验设备微型计算机、emu80863.实验原理通用数据传送指令包括:1)通用数据传送指令,如MOV,PUSH,POP,XCHG,CBW,CWD;2)目标地址传送指令,如LDS,LES;3)标志传送指令,如LAHF,SAHF,PUSHF,POPF;4)输入输出指令,如IN,OUT,LEA寻址方式包括:1)立即寻址;2)直接寻址;3)寄存器寻址;4)寄存器间接寻值;5)寄存器相对寻址;6)基址-变址寻址;7)基址—变址—相对寻址;8)隐含寻址4.实验内容(1)创建COM TEMPLATE程序,输入以下程序段,观察程序的执行情况,程序段如下:MOV BL,08H ;BX=?MOV CL,BL ;CL=?MOV AX,03FFH ;AX=?MOV BX,AX ;BX=?MOV DS:[6000H],BX ;DS:[6000H]=?(提示:在emulator对话框中间的文本框中输入段基地址:段内偏移地址,可以观察其它逻辑段相应存储单元的内容)(2)创建COM TEMPLATE程序,用以下程序段将一组数据压入PUSH堆栈区,然后通过三种不同方式出栈。

观察栈的变化情况(提示:在emulator对话框中,单击按钮可以察看栈中内容)以及出栈后数据的变化情况,并把结果填入表 1-1中。

程序段如下:MOV AX,0102HMOV BX,0304HMOV CX,0506HMOV DX,0708HPUSH AXPUSH BXPUSH DX第—种出栈方式的指令序列:POP DXPOP CXPOP BXPOP AX第二种出栈方式的指令序列(注:替换掉第—种出栈方式的指令序列):POP AXPOP BXPOP CXPOP DX第三种出栈方式的指令序列(注:替换掉第二种出栈方式的指令序列):POP CXPOP DXPOP AX表 1-1数据传送实验结果表格(3)创建COM TEMPLATE程序,分别输入下列指令,按要求设置各寄存器及内存单元的值(提示:在“emulator”对话框中,可以直接修改寄存器的值;选择“view”菜单中的“memory”菜单项可以设置内存单元的值),其中BX=0010H,SI=0001H,[60010H]=12H,[60011H]=34H,[60012H]=56H,[60013H]=78H,[60120H]=0ABH,[60121H]=0CDH,[60122H]=0EFH,观察指令执行后AX中的内容。

1)MOV AX,1200H2)MOV AX,BX3)MOV AX,[0120H]5)MOV AX,0110H[BX]6)MOV AX,[BX][SI]7)MOV AX,0110H[BX][SI](4)创建COM TEMPLATE程序,试分别用8086的直接寻址、寄存器间接寻址、变址寻址、寄存器相对寻址传送指令编写程序段,将DS:6000H字节存储单元中的内容传送到DS:6020H 单元中。

(5)设AX=1111H,BX=2222H,[DS:6010H]=3333H。

试编写COM TEMPLATE程序,将AX的内容与BX的内容交换,然后再将BX的内容与DS:6010H单元的内容进行交换。

(6)若[DS:6000H]=0EEFFH,[ES:7000H]=0CCDDH,请编写COM TEMPLATE程序,将两个存储单元的内容交换。

5.实验习题指出下列指令的错误并加以改正,并在emu8086中验证。

1)MOV [BX],[SI]2)MOV AH,BX3)MOV AX,[SI][DI]4)MOV BYTE PTR[BX],2000H6)MOV DS,2000H6.实验报告要求1)整理源程序段和运行结果。

2)给出几种在emu8086中察看内存单元的方法。

1.2.2算术逻辑运算指令1.实验目的1)熟悉算术逻辑运算指令的功能。

2)了解标志寄存器中各标志位的意义以及指令执行对它的影响。

2.实验设备微型计算机、emu80863.实验原理算术运算指令包括:1)加法指令,如ADD,ADC,INC;2)减法指令,如SUB,SBB,DEC,NEG,CMP;3)乘法指令,如MUL,IMUL;4)除法指令,如DIV,IDIV。

逻辑运算指令包括:AND,OR,NOT,XOR,TEST4.实验内容(1)创建COM TEMPLATE程序,输入以下程序段,单步执行并记录标志位的变化情况(提示:在emulator对话框中,单击按钮察看标志寄存器的值)。

程序段及结果表格如表 1-2。

表 1-2算术逻辑运算实验结果表格(2)用BX作为地址指针,从BX所指的内存单元[0010H]开始连续存入三个无符号数(10H、04H、30H),计算内存单元中这三个数的和,并将和放在0013H单元中,再求出这三个数的乘积,并将乘积存入0014单元中,写出完成此功能的COM TEMPLATE程序。

(3)创建COM TEMPLATE程序,写出完成下述功能的程序段,并指出程序运行后AX=? 1)将15H传送到AL;2)再将AL的内容乘以2;3)将15H传送到BL;4)把AL的内容乘以BL的内容。

(4)创建以下两个程序段的COM TEMPLATE程序并上机验证。

1)给数据段中从偏移地址1000H开始的12个字存储单元的内容赋值,请将第4条比较指令填写完整(划线处)。

MOV SI,1000HNEXT: MOV WORD PTR[SI],1ADD SI,2CMP SI,JNE NEXT2)假定要按高地址到低地址的顺序进行清除操作(高地址从1016H开始),则上述程序段应如何修改?5.实验习题简要说明ADD、SUB、AND、OR指令对标志位的影响。

6.报告要求1)整理源程序段和运行结果,回答实验中的问题。

1.2.3移位指令1.实验目的1)熟悉移位指令的功能。

2)了解标志寄存器中各标志位的意义以及指令执行对它的影响。

2.实验设备微型计算机、emu80863.实验原理移位指令包括:1)非循环移位指令,如SAL,SAR,SHL,SHR;2)循环移位指令,如ROL,ROR,RCL,RCR4.实验内容(1)创建COM TEMPLATE程序,输入以下程序段,单步执行并记录标志位的变化情况(提示:在emulator对话框中,单击按钮可以察看标志寄存器的值)。

程序段及结果表格如表 1-3。

表 1-3移位实验结果表格1(2)写出完成下述功能的COM TEMPLATE程序并上机验证,程序运行后的商=?1)传送数据2058H到[DS:1000H]单元中,数据12H到DS:1002H单元中;2)把DS:1000H单元中的数据传送到AX寄存器;3)把AX寄存器的内容算术右移二位;4)再把AX寄存器的内容除以DS:1002H字节单元中的数;5)最后把商存入字节单元DS:1003H中。

(3)创建COM TEMPLATE程序,输入以下程序段,单步执行并记录每一条指令对内存单元的影响结果(提示:在“emulator”对话框中,选择“view”菜单中的“memory”菜单项可以察看内存单元的值),分析结果并说明该程序段的功能是什么。

相关文档
最新文档