汇编实验四 子程序设计
汇编语言实验4详细讲解
汇编语言实验4详细讲解一、引言汇编语言是一种底层的计算机语言,它直接操作计算机的硬件。
在汇编语言实验4中,我们将深入了解汇编语言的一些重要概念和技巧。
本文将详细讲解汇编语言实验4的内容,帮助读者更好地理解和应用汇编语言。
二、实验目的汇编语言实验4的主要目的是学习和掌握在汇编语言中使用条件和循环结构的方法。
通过实验,我们将能够编写能够根据条件执行不同操作的程序,并实现循环执行一定次数的功能。
三、实验内容1. 条件结构条件结构是根据条件的真假来执行不同的操作。
在汇编语言中,我们可以使用条件跳转指令来实现条件结构。
条件跳转指令根据条件寄存器的值来决定是否跳转到指定的地址执行。
常用的条件跳转指令有JZ、JNZ、JC、JNC等。
2. 循环结构循环结构是重复执行一段代码的结构。
在汇编语言中,我们可以使用循环指令来实现循环结构。
循环指令根据计数器的值来判断是否继续执行循环体,并在每次循环结束后更新计数器的值。
常用的循环指令有LOOP、LOOPE、LOOPZ、LOOPNE、LOOPNZ等。
四、实验步骤1. 定义和初始化计数器在循环结构中,我们首先需要定义一个计数器,并对其进行初始化。
计数器可以使用DX寄存器或AX寄存器来保存。
2. 执行循环体在循环结构中,我们需要执行的代码放在循环体中。
循环体的代码将会被重复执行,直到计数器的值为0或满足其他条件。
3. 更新计数器的值在每次循环结束后,我们需要更新计数器的值。
可以使用INC或DEC指令对计数器进行加1或减1操作。
4. 判断是否继续执行循环在每次循环结束后,我们需要判断是否继续执行循环。
可以使用循环指令来实现此功能。
根据计数器的值或其他条件来判断是否继续执行循环。
五、实验示例下面是一个简单的实验示例,演示了如何使用条件和循环结构来实现一个简单的程序:```MOV CX, 10 ; 初始化计数器为10MOV AX, 0 ; 将AX寄存器清零LOOP_START:ADD AX, CX ; 将CX的值加到AX中LOOP LOOP_START ; 循环执行,直到CX的值为0MOV BX, AX ; 将AX的值保存到BX寄存器中```在上面的示例中,我们首先将CX寄存器初始化为10,然后将AX 寄存器清零。
子程序设计实验报告
实验名称:子程序设计实验日期:2023年X月X日实验地点:XX大学计算机实验室实验目的:1. 理解子程序的概念和作用。
2. 掌握子程序的设计方法和调用方式。
3. 学会使用子程序提高程序的可读性和可维护性。
实验内容:一、实验背景子程序是程序设计中常用的一种结构,它可以将一段具有独立功能的代码封装起来,方便在其他程序中调用。
使用子程序可以提高程序的可读性、可维护性和模块化程度。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验步骤1. 创建一个新的C++项目,命名为“子程序设计”。
2. 在项目中创建一个头文件“Subroutine.h”,用于声明子程序。
3. 在头文件中声明两个子程序:`Add` 和 `Subtract`。
4. 在头文件中定义一个全局变量 `Result`。
5. 在源文件“Subroutine.cpp”中实现头文件中声明的子程序。
6. 在主函数中调用子程序,并输出结果。
7. 编译并运行程序,观察输出结果。
四、实验代码1. 头文件“Subroutine.h”:```cpp#ifndef SUBROUTINE_H#define SUBROUTINE_Hvoid Add(int a, int b);void Subtract(int a, int b); int Result;#endif // SUBROUTINE_H```2. 源文件“Subroutine.cpp”:```cpp#include "Subroutine.h"void Add(int a, int b) {Result = a + b;}void Subtract(int a, int b) { Result = a - b;}```3. 主函数“main.cpp”:```cpp#include <iostream>#include "Subroutine.h"int main() {int a = 10;int b = 5;Add(a, b);std::cout << "Add: " << Result << std::endl;Subtract(a, b);std::cout << "Subtract: " << Result << std::endl;return 0;}```五、实验结果与分析1. 编译并运行程序,输出结果如下:```Add: 15Subtract: 5```2. 分析:(1)在实验中,我们首先在头文件中声明了两个子程序 `Add` 和 `Subtract`,它们分别用于计算两个整数的和与差。
华南理工大学微机与接口实验报告(四实验,题目原理流程图代码截图完整版)
微机原理实验报告班 级:2012级电子科学与技术卓工班级电子科学与技术卓工班姓 名: 黄中一黄中一 学 号: 201236460273序 号:评阅分数:评阅分数:实验一一、实验目的1、学会如何建立汇编源文件ASM2、学会调用MASM 宏汇编程序对源文件进行汇编,获得目标程序宏汇编程序对源文件进行汇编,获得目标程序 OBJ 及LST 列表文件列表文件3、学会调用LINK 连接程序汇编后的目标文件OBJ 连接成可执行的文件连接成可执行的文件EXE 4、学会使用DEBUG 调试程序把可执行文件装入内存并调试运行,用D 命令显示目标程序,用U 命令对可执行文件反汇编,用G 命令运行调试。
命令运行调试。
二、实验设备装有MASM 软件的IBM PC 机三、实验内容1、汇编程序对源程序进行编译,生成扩展名为OBJ 的目标文件;连接程序是将目标程序和库文件进行连接、定位,生成扩展名为EXE 的可执行文件;调试程序是对目标文件进行调试,验证它的正确性。
是对目标文件进行调试,验证它的正确性。
2、DEBUG 程序各种命令的使用方法程序各种命令的使用方法功能功能命令格式命令格式 使用说明使用说明显示内存单元内容显示内存单元内容D 地址地址从指定地址开始显示40H 个字节或80H 个字节个字节 修改内存单元内容修改内存单元内容 E 地址地址先显示地址和单元内容等待输入修改的内容输入修改的内容检查和修改寄检查和修改寄存器的内容存器的内容R 显示全部寄存器和标志位及下条指令单元十六进制数码和反汇编格式和反汇编格式反汇编反汇编U 地址地址从指定地址开始反汇编16个或32个字节个字节 汇编汇编 A 地址地址从指定地址直接输入语句并从指定指定汇编装入内存从指定指定汇编装入内存跟踪跟踪 T =地址=地址 从指定地址开始逐条跟踪指令运行运行 G =地址=地址无断点,执行正在调试的指令执行正在调试的指令 退出退出Q退出DEBUG 返回DOS3、实验过程①、在edit 环境,写字板,记事本等中输入源程序。
汇编语言程序设计实验报告
汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是计算机中最基本的语言,通常用于处理硬件相关问题。
在这个实验中,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
以下是我们的实验报告。
正文:1. 实验环境我们使用的实验环境是Intel 8086微处理器与高级汇编语言。
微处理器使用的是PCB-512主板,而高级汇编语言是MASM。
2. 实验目的我们的实验目的主要是学习汇编语言的基础知识和编程技巧,包括了汇编语言的寄存器、指令、内存管理等方面的知识。
我们的另一个目的是掌握汇编语言的常用编程技巧,能够独立完成一些简单的汇编程序。
3. 实验内容我们的实验内容主要包括以下几点:(1)学习汇编语言的基础知识,包括寄存器、指令、内存管理等方面的知识。
(2)掌握汇编语言的常用编程技巧,包括数据输入输出、运算、跳转等基本操作。
(3)实践用汇编语言编写程序,如计算器、菜单等实用程序。
(4)了解8086微处理器的结构和原理。
4. 实验过程在这个实验过程中,我们完成了以下几个程序:(1)计算器计算器是一个简单的程序,主要用于实现两个数之间的加、减、乘、除等基本运算。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
(2)菜单菜单是一个实用程序,主要用于展示一个简单的菜单并实现用户选择相关功能的功能。
我们使用了汇编语言中的跳转指令、输入输出指令等实现了这个程序。
5. 实验结果在我们的实验中,我们成功完成了上述两个程序。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
6. 实验总结在这个实验过程中,我们学习汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
我们通过编写计算器和菜单等简单实用程序,加深了对汇编语言的理解和认识。
我们认为这个实验对我们今后的学习和工作都有很大的帮助。
结论:通过这个实验,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
汇编语言程序设计实验指导
汇编语言程序设计实验指导【实验提要】以下列举的10个实验,都是以Intel的8086及后续系列微处理器的指令系统为核心,采用宏汇编工具MASM6. X以及调试工具DEBUG或DEBUG32,针对本教材所述内容进行相关的上机实践。
旨在帮助学生加深认识和理解理论教学知识,通过大量的上机实验熟悉8086 CPU的指令功能、用途和使用技巧,进而提高汇编语言程序设计的能力。
(带*号的为选作内容)实验一调试工具DEBUG的应用实验目的通过实验掌握下列知识:1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG的功能;2、DEBUG命令: A,D,E,F,H,R,T,U的使用;3、BCD码、ASCII码及用十六进制数表示二进制码的方法;4、寄存器: AX,BX,CX,DX,FLAGS,IP。
内容及步骤注:本次实验可以参照教材上关于DEBUG的叙述内容进行。
一、DEBUG 命令使用1、开机后,切换到命令提示符窗口下,出现提示符后键入命令DEBUG, 进入调试环境,显示提示符 '- '。
2、用命令 F 200 220 'AB' 将'AB'的两个ASCII码循环填入内存。
注:第一个参数200是当前段的起始偏移地址,第二个参数220是终了偏移地址,第三个参数‘AB’是被填入的数值,若不给出第二个参数则填入128(8行)个字节。
3、用命令 D200 观察内存中的十六进制码及屏幕右边的ASCII字符。
4、用命令 F230 23F 12 重复上二项实验,观察结果并比较。
5、用命令 E200 41 42 43 44 45将A-E的ASCII码写入地址为200开始的内存单元中,再用D命令观察结果,看键入的十六进制数和ASCII码的对应关系。
6、用H命令检查下列各组十六进制数的和与差(补码表示):(1)56H,34H (2)23H,45H (3)AB,3045H注:输入 H 12 34 则在下一行显示0046 FFDE,即二者的补码和与差。
汇编实验四:查找电话号码
一、实验目的学习用汇编语言设计与编写子程序二、实验要求(1) 要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;(2) 程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;(3) 凡有新的输入后,程序应按人名对电话号码表重新排序;(4) 程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。
name tel.X X X X X X X X三、实验提示:(1)显示提示符’Input name:’;(2)调用子程序 input_name 接收人名;(3)调用子程序 stor_name 把人名存入电话号码表 tel_tab 中:(4)显示提示符’Input a telephone number:’;(5)调用子程序 inphone 接收电话号码,并把它存入电话号码表tel_tab中;(6)如输入已结束则调用 name_sort 子程序对电话号码表接人名排序;(7)显示提示符’Do you want a telephone number ?(Y/N)’;(8)回答N收退出程序;(9)回答Y则再显示提示符’name ?’;(10)调用子程序 input_name接收人名;(11)调用子程序 name_search 在电话号码表中查找所要的电话号码;(12)调用子程序 printline 按要求格式显示人名及电话号码;(13)重复查号提示符直至用户不要求查号为止。
四、实验程序datarea segmenttel_name label bytemaxnlen db 20namelen db ?namefld db 21 dup(?) ;定义20个字符的用于存放人名的字符串tel_num label bytemaxtlen db 8tellen db ?telfld db 9 dup(?) ;定义8个字符的用于存放电话号码的字符串tel_tab db 50 dup(20 dup(' '), 8 dup(' ')) ;定义可存放50项纪录的电话号码表tel_sav db 28 dup(?), 13, 10, '$'list db 20 dup(' '), 8 dup(' '), 0dh, 0ah, '$' ;定义电话号码表的每个条目string1 db 'Input name:', '$'string2 db 'Input a telphone number:', '$'string3 db 'Do you want a telephone number?(Y/N)', '$'string4 db 'name?', '$'string5 db 'Would you like to input a telephone list?(Y/N)', '$'string6 db 'The Tel_Lab is empty.', '$'string7 db 'There is no list fitting.', '$'string8 db 'name tel. ', '$'string9 db 'Do you want a Tel_Lab?(Y/N)', '$'endadd dw ?swapped db 0tel_count db 0 ;计算电话号码表中的条目数量datarea endsprognam segmentmain proc far ;主程序assume cs: prognam, ds: datarea, es: datareastart:push dssub ax, axpush axmov ax, datareamov ds, axmov es, axcldlea di, tel_tab ;将电话号码表传给目的变址寄存器cho_inp: ;进行选择,是否输入条目mov ah, 09lea dx, string5int 21h ;输出“Would you like to in put a telephone list?(Y/N)”mov ah, 01int 21h ;输入,进行选择mov dl, 4ehcmp al, dlje sort_n ;若输入为N,则跳转至sort_n,进行电话号码表的排序mov dl, 6ehcmp al, dlje sort_n ;若输入为n,则同上mov dl, 59hcmp al, dlje input_n ;若输入为Y,则跳转至input_n,进行电话号码条目的输入mov dl, 79hcmp al, dlje input_n ;若输入为y,则同上mov ah, 02mov dx, 0dhint 21hmov dx, 0ahint 21hjmp cho_inp ;若输入不为Y(y)/N(n),则返回cho_inp,重新进行选择input_n: ;输入人名,并保存mov ah, 02mov dx, 0dhint 21hmov dx, 0ahint 21hmov ah, 09lea dx, string1int 21h ;输出“Input name:”call input_name ;调用子程序input_name接收人名call stor_name ;调用子程序stor_name把人名存入电话号码表tel_tab中input_p: ;输入电话号码,并保存lea dx,string2mov ah, 09int 21h ;输出“Input a telephone number:”call inphone ;调用子程序inphone接收电话号码,并把它存入电话号码表tel_tab 中jmp cho_inp ;跳转至cho_inp,按提示选择是否继续输入条目sort_n: ;对电话号码表进行排序mov ah, 02mov dx, 0dhint 21hmov dx, 0ahint 21hcall name_sort ;调用子程序name_sort,对电话号码表按人名排序print_lab: ;输出整个电话号码表lea dx, string9mov ah, 09int 21h ;输出“Do you want a tel_lab?(Y/N)”mov ah, 01int 21h ;输入,进行选择mov cl, almov ah, 02mov dl, 0dhint 21hmov ah, 02mov dl, 0ahint 21hmov al, clmov dl, 4ehcmp al, dlje search_n ;若输入为N,则跳转至search_n,进行电话号码的查找mov dl, 6ehcmp al, dlje search_n ;若输入为n,则同上mov dl, 59hcmp al, dlje goon_p ;若输入为Y,则跳转至goon_p,继续该部分操作mov dl, 79hcmp al, dlje goon_p ;若输入为y,则同上jmp print_lab ;若输入不为Y(y)/N(n),则跳转至print_lab,重新进行选择goon_p: ;继续输出电话号码表的操作call printall ;调用子程序printall,输出整个电话号码表search_n: ;查找电话号码条目lea dx, string3mov ah, 09int 21h ;输出“Do you want a telephone number?(Y/N)”mov ah, 01int 21h ;输入,进行选择mov cl, almov ah, 02mov dl, 0dhint 21hmov ah, 02mov dl, 0ahint 21hmov al, clmov dl, 4ehcmp al, dlje exit ;若输入为N,则跳转至exit,退出程序mov dl, 6ehcmp al, dlje exit ;若输入为n,则同上mov dl, 59hcmp al, dlje goon_s ;若输入为Y,则跳转至goon_s,继续该部分操作mov dl, 79hcmp al, dlje goon_s ;若输入为y,则同上jmp search_n ;若输入不为Y(y)/N(n),则跳转至search_n,重新进行选择goon_s: ;继续查找操作lea dx, string4mov ah, 09int 21h ;输出“name?”mov ah, 02mov dl, 0dhint 21hmov ah, 02mov dl, 0ahint 21hcall input_name ;调用子程序input_name,接收人名call name_search ;调用子程序name_search,对电话号码表按人名进行查找jmp search_n ;跳转至search_n,继续进行查找exit: ;退出程序retmain endpinput_name proc near ;子程序input_name,用于接受人名mov ah, 0ahlea dx, tel_nameint 21h ;输入人名mov ah, 02hmov dl, 0dhint 21hmov dl, 0ahint 21hmov bh, 0mov bl, namelenmov cx, 20sub cx, bxnamebrk: ;将人名除外所剩下的字符用空格填满mov namefld[bx], 20hinc bxloop namebrkretinput_name endpstor_name proc near ;子程序stor_name,用于把人名存入电话号码表tel_tab中inc tel_count ;将人名存入电话号码之后,电话号码条目数量增1cldlea si, namefldmov cx, 10rep movswretstor_name endpinphone proc near ;子程序inphone,用于接受电话号码,并把它存入电话号码表tel_tab 中mov ah, 0ahlea dx, tel_numint 21h ;输入电话号码mov ah, 02hmov dl, 0dhint 21hmov dl, 0ahint 21hmov bh, 0mov bl, tellenmov cx, 8sub cx, bxtelbrk: ;将电话号码数字除外,所剩下的字符用空格填满mov telfld[bx], 20hinc bxloop telbrkcldlea si, telfldmov cx, 4rep movswretinphone endpname_sort proc near ;子程序name_sort,用于对电话号码表按人名排序sub di, 56mov endadd, dicmp al, 0je emptystart_sort:mov swapped, 0lea si, tel_tabcmp_n:mov cx, 20mov di, siadd di, 28mov ax, dimov bx, sirepe cmpsbjbe no_exchgcall exchange_name ;调用子程序exchang_name,将两个相邻的条目进行对调jmp no_exchgempty: ;若电话号码表为空mov ah, 09lea dx, string6int 21h ;输出“The tel_lab is empty.”jmp exit_sortno_exchg: ;不进行对调mov si, axcmp si, endaddjbe cmp_ncmp swapped, 0jnz start_sortexit_sort:retname_sort endpexchange_name proc near ;子程序exchange_name,用于将电话号码表中的两个相邻的条目进行对调mov cx, 14mov si, bxrep movswmov cx, 14mov di, bxrep movswmov cx, 14lea si, listrep movswmov swapped, 1retexchange_name endpname_search proc near ;子程序name_search,用于按人名在电话号码表中查找所要的电话号码push dimov al, tel_countlea si, tel_tabagain:cmp al, 0je no_listmov cx, 20lea di, namefldmov bx, sirepz cmpsbjb find_nja no_listdec almov ah, 09lea dx, string8int 21h ;输出“name tel. ”mov ah, 02mov dl, 0dhint 21hmov dl, 0ahint 21hcall printline ;调用子程序printline,输出所查找到的条目jmp exit_schfind_n:mov si, bxjmp againno_list: ;若不存在该条目mov ah, 09lea dx, string7int 21h ;输出“There is no list fitting.”mov ah, 02mov dl, 0dhint 21hmov dl, 0ahint 21hexit_sch:pop diretname_search endpprintline proc near ;子程序printline,用于输出所查找到的电话号码条目mov si, bxlea di, listmov cx, 14rep movswmov ah, 09lea dx, listint 21hretprintline endpprintall proc near ;子程序printall,用于输出整个电话号码表push dimov ah, 09lea dx, string8int 21hmov ah, 02mov dl, 0dhint 21hmov dl, 0ahint 21hmov bl, tel_countcmp bl, 0je empty_lablea si, tel_tabnext:lea di, listmov cx, 14rep movswmov ah, 09lea dx, listint 21hdec bljnz nextjmp exit_pallempty_lab:mov ah, 09lea dx, string6int 21hexit_pall:pop diretprintall endpprognam endsend start五、模块说明主函数main:用来显示用户操作提示,调用子模块,使程序完成查找电话号码的过程接收人名函数input_name:输入人名,将此人名保存至缓冲区,并用空格补足保存人名函数stor_name:将人名从缓冲区中取出,保存在电话号码表中的人名区中接收并且保存电话号码函数inphone:输入电话号码,将此电话号码保存至缓冲区,并用空格补足,然后,将电话号码从缓冲区中取出,保存在电话号码表中的电话号码区中电话号码表排序函数name_sort:运用冒泡法,对电话号码表按人名排序对调条目位置函数exchange:将不符合排序规律的条目的位置进行调整查找电话号码函数name_search:输入人名,在电话号码表中依次比较人名进行查找输出电话号码条目函数printline:查找到条目之后,将条目输出输出电话号码表函数printall:将整个电话号码表的所有条目依次输出六、模块层次图七、调试结果。
汇编语言实验报告_6
青岛理工大学课程实验报告
课程名称汇编语言程序设计班级实验日期
2013.11.3
姓名学号实验成绩
实验
名称
子程序
实验目的及要求1.掌握子程序设计相关指令和伪指令的使用方法
2.掌握子程序设计方法, 特别是参数传递方法
3.掌握主程序和子程序之间的调用关系和调用方法
4.熟悉循环和子程序结合应用解答问题的思路
实验环境1.命令行方式
2.MASM.EXE LINK.EXE DEBUG.EXE
实验内容1.设DATA1开始的内存单元中, 存放着一串带符号字数据, 要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。
然后在显示器输出排好序的数据, 中间用’,’隔开。
2.输出数据使用子程序方式。
算法描述及实验步骤步骤:
(1)设置数据段地址
(2)设置堆栈段地址
(3)设置堆栈指针
(4)调用9号功能, 输出一个提示性字符串。
(5)循环进入子程序, 输出原始数据。
(6)在子程序内循环输出每一位的十进制数字。
(7)主程序进行内外循环, 进行冒泡排序。
(8)再一次调用子程序输出排序后的结果。
调试过程及实验结果调试过程:
(2)(1)在输出时, 调用DOS 9号功能, 并不是只要语句MOV AH,09H
(3)它是存在入口条件的, 入口条件:DS:DX=输出字符缓冲区首地址。
所以前面必须加上MOV DX,OFFSET NOTE1。
(4)汇编语言是不会再输出汉字的。
(5)子程序结束时一定要有RET
(6)冒泡排序也遇到一些困难。
调试结果:。
《汇编语言程序设计》实验指导手册解析
《汇编语言程序设计》实验指导手册《汇编语言程序设计》实验是学习本课程的每个考生必须要通过的一个重要的实践环节。
本指导手册依照我系各类计算机专科专业教学大纲,根据人民邮电出版社的《汇编语言程序设计》(梁发寅著)教材编写而成。
本指导手册共计有编有10个实验,在实际实验过程中可以按照实际教学进度情况加以增删。
每个实验都应做到:1.做好上机实验的准备工作:应考者对每个实验需要进行预习,了解相关内容和具体要求,熟悉上机操作步骤,学会相关系统软件的使用,掌握各种操作调试命令。
2.编写源程序:按照实验题目的要求,应考者要事先独立完成汇编语言源程序的编写工作,并对源程序进行认真的静态检查,减少错误的发生。
3.完成实验报告:做完上机实验,应考者要严格按照实验报告的格式要求写出实验报告。
实验报告的内容为:实验名称、实验的目的、实验的内容和要求、实验步骤、实验结果并附上源程序清单和程序流程图。
实验一汇编语言上机环境(一)实验目的1熟悉汇编语言上机环境;2掌握汇编语言上机过程与步骤。
(二)实验器材与实验准备实验器材:硬件:微机一台软件:DOS或WIN98/2000/XPMASM . EXE和LINK . EXE实验准备:cs1 segmentassume cs : cs1 , ds : cs1start: push cspop dsmov ah,0int 10hlea dx , str0mov ah,9int 21hmov ah,4chint 21hstr0 db 'hello' , '$'cs1 endsend start(三)实验内容和要求1.建立汇编源程序文件2.逐步汇编,连接生成可执行文件3.运行生成的可执行文件(四)实验步骤:1.在记事本中创建和编辑源文件2. 将MASM . EXE和LINK . EXE以及源文件拷贝在同一目录下3. 汇编源文件4. 连接目标文件5. 执行可执行文件(五) 实验结果分析在生成可执行文件过程中,一共生成了多少个相关的文件,它们的作用分别是什么?实验二 DEBUG 的使用(一)实验目的1、熟悉 DEBUG 程序中的命令,学会在 DEBUG 下调试运行汇编语言源程序。
汇编实验四分支和循环程序设计实验(设计性实验)
汇编实验四分支和循环程序设计实验(设计性实验)汇编语言实验报告实验四分支和循环程序设计实验(设计性实验)班级:姓名:学号:实验日期:实验四分支和循环程序设计实验(设计性实验)一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言分支程序基本指令的使用方法;3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法;4.了解汇编语言循环程序设计的基本流程;5.熟悉汇编语言循环基本指令的使用方法;6.掌握利用汇编语言的循环指令完成循环程序设计方法。
二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识在实际应用中,经常根据一些条件来选择一条分支执行。
汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号相减而导致的结果来进行。
1.无条件转移指令JMP无条件转移指令JMP 是使程序无条件转移至目标处,又分为段内转移、段间转移。
2.条件转移指令JXX条件转移指令可分为三大类:1).简单条件转移指令指令。
根据单个标志位的状态判断转移条件。
标志位指令转移条件意义CF JC CF=0 有进位/借位JNC CF=1 无进位/借位ZF JE/JZ ZF=1 相等/等于0JNE/JNZ ZF=0 不相等/不等于0 SF JS SF=1 是负数JNS SF=0 是正数OF JO OF=1 有溢出JNO OF=0 无溢出PF JP/JPE PF=1 有偶数个1JNP/JPO PF=0 有奇数个12).无符号数条件转移指令。
假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是A-B,其转移指令如下:指令转移条件意义JA/JNBE CF=0 AND ZF=0 A>BJAE/JNB CF=0 OR ZF=1 A>=BJB/JNAE CF=1 AND ZF=0 A<b< p="">JBE/JNA CF=1 OR ZF=1 A<=B3).带符号数条件转移指令。
汇编语言程序设计2
目录系统认识 (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与实验系统的通讯电缆,打开实验系统电源。
汇编实验报告
汇编实验报告一、实验目的本次汇编实验的主要目的是深入了解汇编语言的基本语法和编程结构,掌握汇编程序的编写、调试和运行过程,提高对计算机底层硬件的理解和操作能力。
二、实验环境1、操作系统:Windows 102、编程工具:MASM(Microsoft Macro Assembler)三、实验内容1、数据传送与运算编写程序实现不同寄存器之间的数据传送。
进行简单的算术运算,如加法、减法、乘法和除法,并将结果存储在指定的寄存器或内存单元中。
2、逻辑运算与移位操作进行逻辑运算,包括与、或、非和异或操作。
实现移位操作,如左移和右移,并观察数据的变化。
3、分支与循环结构使用条件跳转指令实现分支结构,根据不同的条件执行不同的代码段。
运用循环指令实现循环操作,如计数循环和条件循环。
4、子程序调用编写子程序来完成特定的功能,如计算阶乘、查找最大值等。
在主程序中调用子程序,并传递参数和获取返回值。
四、实验步骤1、数据传送与运算打开 MASM 编程工具,新建一个汇编源文件。
使用 MOV 指令将数据从一个寄存器传送到另一个寄存器,例如:MOV AX, BX 。
进行加法运算,使用 ADD 指令,如:ADD AX, CX 。
进行减法运算,使用 SUB 指令,如:SUB DX, BX 。
乘法运算使用 MUL 指令,除法运算使用 DIV 指令,并将结果存储在合适的位置。
2、逻辑运算与移位操作在源文件中使用 AND 、OR 、NOT 和 XOR 指令进行逻辑运算,例如:AND AX, BX 。
对于移位操作,使用 SHL (左移)和 SHR (右移)指令,如:SHL AX, 2 表示将 AX 的值左移 2 位。
3、分支与循环结构使用 CMP 指令比较两个值,然后根据比较结果使用 JZ (等于零跳转)、JL (小于跳转)、JG (大于跳转)等条件跳转指令实现分支结构。
对于循环结构,使用 LOOP 指令实现计数循环,例如:MOV CX, 10 ;LABEL: ;LOOP LABEL 。
汇编(循环、分支、子程序)实验报告
分别为十个成绩、成绩总个数、分段的5个区间申请内存单元,初始化数据段;将AX,BX,CX压栈,保留原始数据。选取第一个成绩,存入AX中,该数据除以10,得到商存入BX,判断商的所属区间,给所属区间加1,继续下一个,循环直到十个全部判断结束,pop出栈,得到属于各区间的成绩个数,程序结束。
2.源程序清单
2.源程序清单
datasegment
xdw 1ah
ydw 0ah
zdw 01h
maxdw ?
dataends ;数据段定义
codesegment
assume ds: data, cs: code
start:
mov ax, data
mov ds, ax ;初始化数据段
mov ax, x
cmp ax, y
《汇编语言程序设计》实验报告
实验名循环、分支、子程序设计实验室实验楼实验日期2014-06-09
一、实验目的及要求
1.熟悉命令格式,功能,加强对指令系统的理解
2.编写简单循环、选择、子程序的结构程序
3.单步跟踪调试,观察寄存器的变化和指令执行的结果
二、实验环境
硬件环境:一台微型计算机
软件环境:windows xp,debug环境,masm
2.源程序清单
datarea segment;定义数据段
buffer db 80 dup(?) ;预申请了以buffer为首地址的内存单元
flag db ?
datarea ends
prognam segment;定义编码段
main proc far
assume cs:prognam,ds:datarea
(5).初始数据段
(6).分别将AX,BX,CX,SI压栈,保留初始数据,
语言程序设计四子程序
实验参考程序2(变量传递参数):
data segment wordtemp dw 2df4h
data ends
code segment assume cs:code,ds:data
start: mov ax,data mov ds,ax
call ALdisp mov ax,4c00h
int 21h
ALdisp proc
mov ds,ax mov ax,wordtemp call ALdisp
mov ax,4c00h ;设置功能调用 AH=4C 带返回码结束
int 21h
ALdisp proc
push ax
push bx
push cx
push dx
mov bx,4
;实现al内容显示的子程序 ;过程中使用了AX、BX、CX和DX,寄存器内容压栈保护数据。
cmp dl,39h
jbe aldisp1 ; dl内的数小于等于39h转移
add dl,7
;是0Ah~0Fh,还要加上7
aldisp1:mov ah,2
;显示,ah=02表示:将dl中的内容以字符的形式输出到屏幕
int 21h
;系统功能调用,至于是那种功能调用,取决于ah里的内容
pop ax
;弹出栈,此时ax的内容为循环左移4位原数
第3页,共24页。
实验四 子程序及功能调用实验
5.实验步骤: ⑴用文件编辑器编写汇编语言程序(如:记事本),并以asm为后缀命名,
如:2.asm ⑵运行masm编译器进入dos,调入所编写的汇编程序,生成,然后用
连接文件,生成可执行文件2.exe.
⑶用DEBUG调用文件,格式为DEBUG 2.EXE
汇编语言实验
实验一汇编语言源程序的输入一、实验目的1.通过实验了解和熟悉微机系统的配置。
2.学习在DEBUG状态下输入汇编源程序的方法。
3.初步掌握调试(在DEBUG状态下)的过程。
二、实验原理1. 本实验要求在DEBUG状态下输入汇编源程序,并用DEBUG命令进行调试。
用单步跟踪的方法验证指令的功能。
2. 以下是给定的参考程序,并在实验时在每条指令的“;”符号右边按要求填写指令的执行结果。
注:⑴微机进入DEBUG状态下之后,一切立即数和地址数据均被默认为十六进制数,在输入时数的后面不加后缀“H”;⑵在DEBUG状态下执行程序时,“INT 20H”指令可使系统执行完该指令前的程序时返回到“-”提示符状态,并且恢复CS和IP寄存器原来的值。
三、实验仪器微机一台,软盘一块。
四、实验步骤1.开机和关机操作顺序开机:先打开微机外部设备电源开关,如显示器、打印机,最后打开主机电源开关。
关机:与开机相反,先关掉主机电源开关,然后关闭所有外设的电源开关。
2. 开机之后,把已准备好的PC-DOS系统软盘插入到A驱动器中,等待微机系统自检完成。
若自检无故障,计算机将自动引导A驱动器的DOS操作系统,实现DOS系统的启动,并出现提示符:A >若微机系统带有硬盘驱动器,且PC-DOS操作系统已装入硬盘,机器自检后(A驱动器门应打开),可以在硬盘上直接启动PC-DOS操作系统,此时,出现提示符:C >若计算机启动、自检出现故障,不能启动DOS系统时,可同时按下Ctrl+Alt+Del三个键,再重新启动一次(热启动),或关断主机电源重新送电一次(冷启动),若再失败,说明主机确有故障,应停止上机。
3. 装入DEBUG程序若计算机系统启动正常,可以从磁盘上调用DEBUG程序到内存。
一般C盘上或PC-DOS软盘上装有DEBUG软件,若没有,可以用COPY命令从其它盘拷贝过来,然后从装有DEBUG的磁盘上调用DEBUG程序。
例如:C > DEBUG↙(↙回车符)-(-DEBUG 提示符)或A > DEBUG-当显示器出现提示符“-”时,说明已进入DEBUG状态,这时,可用DEBUG命令进行操作。
汇编语言程序设计例子
汇编语言程序设计例子汇编语言程序设计典型案例一顺序程序设计例:从键盘输入两个数字(0-9)输出它们积。
(X1 已验证) P41CODE SEGMENTASSUME CS:CODEORG 100HMain:MOV AH,1INT 21HMOV BL,ALMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV AH,1INT 21HSUB AL,30HSUB BL,30HMUL BLMOV BL,10DIV BLADD AX,3030HMOV BX,AXMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,BLMOV AH,2INT 21HMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,BHMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND Main二分支程序1 简单分支例:已知AX中放有一个16位无符号数,BL中放有一个8位无符号数,1P50编写将它们相加结果放DX的程序。
2 两路分支例:编写将BX与DX中较大的一个无符号数放入AX中的程序。
( X2 已验证) 1P51DATA SEGMENTBUF1 DW ?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA SI,BUF1MOV BX,[SI]INC SIMOV DX,[SI]CMP BX,DXJA Lab1MOV AX,DXJMP Lab2Lab1:MOV AX,BXLab2:MOV AH,4CHINT 21HCODE ENDSEND START3 复杂条件的分支例子:从键盘读入两个一位数,并输出其积。
P52(X1 已验证)CODE SEGMENTASSUME CS:CODEORG 100HMOV AH,1;从键盘读第一个数INT 21HCMP AL,'0'JB Lab1CMP AL,'9'JA Lab1MOV BL,ALMOV AH,2MOV DL,13HINT 21HMOV DL,10HINT 21HMOV AH,1; 从键盘读第二个数INT 21HCMP AL,'0'JB Lab1CMP AL,'9'JA Lab1SUB AL,30H ;把后读入的数的ASCALL码还原为数字SUB BL,30H ;把先读入的数的ASCALL码还原为数字MUL BL ;两数相MOV BL,10 ;DIV BL ;分拆积的十位和个位ADD AX,3030H ;积转换为ASCALL码MOV BX,AXMOV AH,2MOV DL,13H ;回车INT 21HMOV DL,10H ;换行INT 21HMOV DL,BL;输出显示十位MOV AH,2INT 21HMOV DL,BH;输出显示个位INT 21HJMP Lab2Lab1:MOV AH,2MOV DL,'E'INT 21HLab2:MOV AH,4CHINT 21HCODE ENDSEND4 多路分支例3 从键盘上接收按键输入,如果按下的是小写字母则输出‘L’,是大写字母则输出‘U’,如果是数字则输出‘N‘,都不是则输出‘*’。
汇编语言——输入输出程序设计实验
实验四输入/输出实验(2学时综合性实验)1.实验目的(1) 掌握输入输出程序设计的概念和方法。
(2) 了解PC机外围芯片8259的功能。
(3)学习如何在PC机上编写具有输入输出功能的程序,包括8259芯片的使用方法。
2.实验说明本实验要求自行编写一个显示器输出处理程序,它可以完成内存中保存的一串字符在屏幕显示,因此本实验既属于输入输出实验,也属于中断实验。
3.实验内容编写一个显示器输出处理中断程序(名为NEW09),实现DOS 21H中断的9号功能,在屏幕上输出内存缓冲区BUF中以”$”结束的一串字符串。
要求:缓冲区的偏移地址采用DX寄存器进行传递。
4.实验准备(1) 预习输入输出程序设计的特点和方法。
(2) 仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。
5.实验步骤(1) 建立源文件,并通过汇编和连接,产生可执行文件。
(2) 运行程序,观察常规字符键及功能键按下时程序的反应,DATAS SEGMENTbuf db'li hongbin','$';此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSmain proc farSTART:mov al,68hmov ah,35hint 21hpush espush bxpush dsmov bx,offset bufmov dx,offset new09mov ax,seg new09mov ds,axMOV AX,DATASMOV DS,AXpop dspop bxpop esstimov al,68hmov ah,25hint 21hmain endpnew09 proc nearpush axpush bxpush dspush dxmov ax,datasmov ds,axsti compare:cmp [bx],'$'je exitmov dl,[bx]mov ah,2int 21hinc bxjmp compare exit:clipop dxpop dspop bxpop axmov ah,4chint 21hiretnew09 endp CODES ENDSEND START。
汇编语言程序设计实验报告
班级 :
二、实验内容 求 1+2+3+4+5+6+7+8+9 的和,并将和显示在屏幕上; 具体要求: 1. 利用重复宏定义实现 1、2、39 数据的定义; 2. 将单个字符显示定义成宏,利用宏调用来实现和的显示。 3. 利用 PWB 集成环境完成程序的编辑、汇编及连接,并最终生成 COM 可执行文件。
二、实验内容 P131 作业 29。
实验三子Βιβλιοθήκη 序设计实验一、实验目的 1.掌握汇编语言源程序子程序设计方法; 2.会使用 CV 软件工具。
二、实验内容 把实验二作为子程序,编写主程序来对能否构成三角形进行 10 判断。
姓名:
汇编语言程序设计实 验报告
实验四
宏汇编程序设计实验
一、实验目的 1.掌握宏汇编程序编程技术及宏调用的方法; 2. 了解 COM 文件的编程方法及特点; 2.会使用 PWB 及 CV 软件工具。
实验五
混合程序的开发实验
一、实验目的 1.了解混合调用中的参数设置; 2. 掌握混合调用的方法;
姓名:
二、实验内容 P156 第 5 题。
汇编语言程序设计实 验报告
班级 :
姓名:
汇编语言程序设计实 验报告
实验一
单指令功能测试实验
一、实验目的 1.会使用 DEBUG 软件; 2.利用 DEBUG 单步执行功能测试指令的执行。
班级 :
二、实验内容 P129,14 题
实验二
完整的汇编语言程序设计实验
一、实验目的 1.掌握完整的汇编语言源程序的设计方法; 2.掌握汇编语言源程序的执行过程。
实验五
多模块程序设计实验
一、实验目的 1.掌握汇编段的属性的含义; 2. 掌握利用 LINK 将多模块连接起来的方法; 3.掌握利用库文件将多模块连接起来的方法。
汇编语言程序设计实验报告
实验报告实验名称汇编语言程序设计||专业班级:信息安全学号:姓名:实验一汇编语言上机过程和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 文件名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
福建农林大学计算机与信息学院实验报告系:计算机专业:网工年级:10姓名:学号:20 实验室号__田513 计算机号实验时间:指导教师签字:刘庆连成绩:实验四子程序设计1.实验目的(1)学习子程序的编写,主子程序的调用;(2)不同模块间程序的调用和调试。
2.实验内容1)数据段中的3个字符,调用子程序将其逐个显示出来。
子程序的功能是显示一个字符。
单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
DATA SEGMENTMAG DB ‘ABC’DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TASTART: MOV AX, DA TAMOV DS, AXMOV SI, 0MOV CX, 3LL: MOV DL, MAG[SI]CALL MADDINC SILOOP LLMOV AH, 4CHINT 21HMADD PROCMOV AH, 02HINT 21HRETMADD ENDPCODE ENDSEND START2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。
具体步骤如下:MASM S31.ASM(分别汇编)MASM S32.ASMLINK S31 S32 (将两个文件连接成为一个文件名为S31)S31.EXE (运行)3)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。
(也可以将找到的不相等字符逐个显示,用INT 21H的02功能调用)4)编程:子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。
调用子程序将BUF1,BUF2,BUF3中的N全部用Y替代。
附源程序:NAME S31.ASM不同模块间的段间调用。
从键盘输入2位非压缩BCD数,存入AX寄存器中。
为了将其转换为二进制数,编写一个子程序TRAN。
显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。
输入数据为00时结束。
5)编一个子程序:输入一个字符,显示出来。
6)编一个子程序:输入一个字符串,显示出来。
4.算法描述及实验步骤第一题(1) 编写源程序,用记事本输入程序,并存储为源程序(2)对源程序进行汇编、连接(3)在debug提示符下输入g ,运行程序(4)运行t命令,单步执行程序(5)用d命令查看栈顶的内容第二题(1) 编写两段源程序,用记事本输入程序,并存储为源程序,分别为s31和s32(2)分别对源程序进行汇编(3)连接时,输入:link s31+s32,生成一个文件名为s31的.exe文件(4)在debug下,用g命令运行s31.exe文件第三题编写源程序DA TA SEGMENTBUF DB '?','?','$'BUF1 DB 'ABCDEFGH'BUF2 DB 'ACBDEGFH'CRLF DB 0AH,0DH,"$"DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AX-------------------------------------------子程序----------------------------------------------MOV DI,0MOV SI,0 分别将SI和DI赋值0;MOV CX,8 定义循环次数为8L: MOV BL,BUF1[SI]MOV DL,BUF2[DI] 分别将指定的值赋给BL,DL;INC SIINC DI 分别指向下一位;CALL MADD 调用子程序;LOOP LJMP L2 循环结束后跳出;L2: MOV AH,4CHINT 21H---------------------------------------------- ---------------------------------------------------MADD PROCCMP BL,DLJNE L0 相等的话跳转L0;JMP L4 不然就跳转L4;L0: MOV BUF[0],BLMOV BUF[1],DLMOV AH,9LEA DX,BUFINT 21H 将不同的字符显示出来LEA DX,CRLFMOV AH,9INT 21HL4: MOV DL, '-'RETMADD ENDPCODE ENDSEND START第四题编写源程序:DA TA SEGMENTBUF1 DB 'anananananana','$'BUF2 DB 'nbnbnbnbnbnbn','$'BUF3 DB 'cncncncncncnc','$'CRLF DB 0AH,0DH,"$"BUF DB '?','?','?','?','?','?','?','?','?','?','?','?','?','$' DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXLEA SI,BUF1CALL MADDLEA SI,BUF2CALL MADDLEA SI,BUF3CALL MADD 分别将数组赋给SI后,调用子程序;MOV AH,4CHINT 21H------------------------------------------------子程序---------------------------------------------------- MADD PROCMOV DI,0MOV CX,13L: MOV BL,[SI]CMP BL,'n' 将BL和n比较;JE L1 相同的话,跳转L1;MOV BUF[DI],BL 不然就把BL的值放入BUF数组中;INC SIINC DILOOP LJMP L2L1: MOV BUF[DI],'y' 直接把y放入BUF数组中;INC SIINC DILOOP LL2: MOV AH,9LEA DX,BUFINT 21H 把处理好的数组显示出来;LEA DX,CRLFMOV AH,9INT 21H 换行;RETMADD ENDPODE ENDSEND START第五题输入一个字符,显示出来。
STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSCSeg Segment para public 'CODE'Assume cs:CSegStart: mov ah,01int 21hmov dl,almov ah,02int 21hmov al,0mov ah,4chint 21hCSeg endsend Start第六题输入一个字符串,显示出来。
STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSDSeg Segmentmsg db 0dh,0ah,'$'buf db 20,?,20 Dup(?)DSeg endsCSeg Segment para public 'CODE'Assume cs:CSeg,ds:DSeg Start: mov ax,DSegmov ds,axlea dx,bufmov ah,0ahint 21hlea dx,msgmov ah,09int 21hlea dx,buf+2int 21hmov al,0mov ah,4chint 21hCSeg ends5.调试过程第一题汇编连接完成,无错误.第二题检查发现有语句错误,第19行”SAR AH,4”应改为”MOV CL,4 SAR AH,CL”汇编完成第三题汇编运行后结果为:字符会显示出来但是都黏在一起,难看出是那对字符不同,显示出来。
所以应该在代码中加入换行指令0AH 0DH。
第四题汇编运行后结果为:显示的字符串和定义的有所不同最后的是问号,汇编过程没有错误,仔细出来代码看出是在定义循环次数的时候定义错误,所定义的循环次数应该和字符串的长度相同。
6. 实验结果第一题G命令运行文件T 命令单步执行第二题将两个文件连接G 命令运行文件第三题第四题第五题输入字符2,运行结果为:第六题.输入字符串‘42as$’,运行结果为:7. 总结通过本次实验,学会了子程序的编写与调用,并且学会了在调用程序时,如何进行两个源程序的连接,从而对子程序调用的过程有更明确的了解.附录:第二题s31.asm代码EXTRN DISP: FARCODE SEGMENT PARA ‘CODE’ASSUME CS: CODESTART: MOV AH, 01HINT 21HMOV BL, ALINT 21HMOV AH, ALMOV AL, BLCMP AX, 3030HJE EXITCALL NEAR PTR TRANCALL FAR PTR dispJMP STARTEXIT: MOV AH, 4CHINT 21HTRAN PROC NEAR ;将输入的ASCII码转换成2进制数AND AX, 0F0FH ;将ASCII码转换成非压缩BCD码,MOV CL,4SAR AH,CL ;高位在AL中MOV BL, AHMOV CL, 10DMUL CLADD AL, BLRETTRAN ENDPCODE ENDSEND STARTNAME S32.ASMPUBLIC DISPCODE1 SEGMENT PARA ‘CODE’ASSUME CS: CODE1DISP PROC FARMOV BL, ALMOV BH, 00MOV CH, 4 ROLL: MOV CL, 4ROL BX, CLMOV DL, BLAND DL, 0FHCMP DL, 9JBE NEXT1ADD DL, 07H NEXT1: ADD DL, 30HMOV AH, 02HINT 21HDEC CHJNZ ROLLRETDISP ENDPCODE1 ENDSEND。