查看CPU和内存.doc_第1页
查看CPU和内存.doc_第2页
查看CPU和内存.doc_第3页
查看CPU和内存.doc_第4页
查看CPU和内存.doc_第5页
免费预览已结束,剩余25页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录实验1 查看CPU和内存,用机器指令和汇编指令编程1实验2 用机器指令和汇编指令编程4实验三 汇编语言程序的调试与运行6实验四 bx和loop指令的联合使用8实验五 编写、调试具有多个段的程序10实验六 不同寻址方式的灵活应用14实验七 寻址方式在结构化数据访问中的应用15实验八 转移指令的原理17实验九 编写子程序18实验十 编写子程序21实验十一 编写0号中断的处理程序22实验十二 编写、应用中断例程23实验十三 访问CMOS RAM25实验十四 安装新的int 9 中断例程26实验十五 编写包含多个功能子程序的中断例程27实验十六 编写包含多个功能子程序的中断例程281实验一 查看CPU和内存,用机器指令和汇编指令编程一实验目的:掌握DEBUG 的基本命令及其功能二实验内容:1.预备知识:Debug的使用(1)什么是Debug?Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。(2)我们用到的Debug功能l 用Debug的R命令查看、改变CPU寄存器的内容;l 用Debug的D命令查看内存中的内容;l 用Debug的E命令改写内存中的内容;l 用Debug的U命令将内存中的机器指令翻译成汇编指令;l 用Debug的T命令执行一条机器指令;l 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。(3)进入DebugDebug是在DOS方式下使用的程序。我们在进入Debug前,应先进入到DOS方式。用以下方式可以进入DOS:重新启动计算机,进入DOS方式,此时进入的是实模式的DOS。在Windows中进入DOS方式,此时进入的是虚拟8086模式的DOS。 (4)用R命令查看、改变CPU寄存器的内容1)显示CPU内部所有寄存器内容和标志位状态;格式为:-R2)显示和修改某个指定寄存器内容,格式为:-R 寄存器名若要修改一个寄存器中的值,比如AX中的值,可用R命令后加寄存器名来进行,输入“r ax”后按Enter键,将出现“:”作为输入提示,在后面输入要写入的数据后按Enter键,即完成了对AX中内容的修改。若想看一下修改的结果,可再用R命令查看(5)用Debug的D命令查看内存中的内容1)格式:-d 段地址:偏移地址,Debug将列出从指定内存单元开始的128个内存单元的内容。使用D命令,Debug将输出3部分内容,如图2.34所示。中间是部分从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。左边是每行的起始地址。右边是每个内存单元中的数据对应的可显示的ASCII码字符。2)格式:-d 段地址:起始偏移地址 结尾偏移地址,Debug将列出指定范围的内存单元的内容。(6) 用Debug的E命令改写内存中的内容,有两种格式:1)格式:-e 起始地址 数据 数据 数据,如要将1000:0开始的10个内存单元修改为09,可以用”-e 1000:0 0 1 2 3 4 5 6 7 8 9”2)格式:-e起始地址,逐个单元相继地修改。如:-e 1000:10 1000:0010 6D.0 61.1 72.2 6B.1c输入e 1000:10 ,Debug 显示起始地址1000:0010,和1000:0010单元的原始内容:6D,然后光标停在“.”的后面提示输入想要写入数据,输入数据0,然后按空格键,即用输入的数据0改写了当前的内存单元。当前单元处理完成后,Debug将接着显示下一个内存单元的原始内容,并提示读者进行修改,可以用同样的方法处理。改写完毕后,按Enter键,E命令操作结束。可以用E命令向内存中写入字符,比如:用E命令从内存1000:0开始写入:数值1、字符“a”,数值2,字符“b”,数值3,字符“c”,可以用:“-e 1000:0 1 a 2 b 3 c”修改的结果是,向1000:0、1000:2、1000:4单元中写入数值1、2、3,向1000:1、1000:3、1000: 5单元中写入字符“a”、“b”、“c”的ASCII码值:61H、62H、63H。也可以用E命令向内存中写入字符串,比如:用E命令从内存1000:0开始写入:数值1、字符串“a+b”、数值2、字符串“c+”、字符3、字符串“IBM”。 可以用:-e 1000:0 1 “a+b” 2 “c+” 3 “IBM” 。可以用E命令向内存中写入机器码比如要从内存1000:0单元开始写入这样一段机器码:机器码 对应的汇编指令b80100 mov ax,0001b90200 mov cx,000201c8 add ax, cx可用:”-e 1000:0 b8 01 00 b9 02 00 01 c8”(7) 用U命令查看写入的或内存中原有的机器码所对应的汇编指令1)-U 段地址:偏移地址该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。2)-U地址范围该命令对指定范围的内存单元进行反汇编 (8)使用T命令,可以执行CS:IP指向的指令,格式:-t,指令执行后,Debug显示输出CPU中寄存器的状态。(9)用Debug的A命令以汇编指令的形式在内存中写入机器指令。格式:-A 段地址:偏移地址该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。三.实验任务(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。机器码 汇编指令b8 20 4e mov ax,4E20H05 16 14 add ax,1416Hbb 00 20 mov bx,2000H01 d8 add ax,bx89 c3 mov bx,ax01 d8 add ax,bxb8 1a 00 mov ax,001AHbb 26 00 mov bx,0026H00 d8 add al,bl00 dc add ah,bl00 c7 add bh,alb4 00 mov ah,000 d8 add al,bl04 9c add al,9CH提示:可用E命令和A命令以两种方式将指令写入内存。注意用T命令执行时,CS:IP的指向。(2)将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。mov ax,1add ax,axjmp 2000:0003(3)查看内存中的内容PC机主板上的ROM中写有一个生产日期,在内存FFF00HFFFFFH的某几个单元中,请找到这个生产日期并试图改变它。(4)向内存从B8100H开始的单元中填写数据,如:-e B810:0000 01 01 02 02 03 03 04 04请读者:先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。四实验报告写出在DEBUG状态下编写、运行程序的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。29实验二 用机器指令和汇编指令编程一实验目的掌握DEBUG 的几个补充的命令及其功能二实验内容1.预备知识:Debug命令的补充(1)在D命令中使用段寄存器格式:“d 段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据。以下是4个例子:-r ds:1000-d ds:0 ;查看从1000:0开始的内存区间中的内容-r ds:1000-d ds:10 18 ;查看1000:101000:18中的内容-d cs:0 ;查看当前代码段中的指令代码-d ss:0 ;查看当前栈段中的内容(2)在E、A、U命令中使用段寄存器在E、A、U这些可以带有内存单元地址的命令中,也可以同D命令一样,用段寄存器表示内存单元的段地址。以下是3个例子:-r ds:1000-e ds:0 11 22 33 44 55 66 ;在从1000:0开始的内存区间中写入数据-u cs:0 ;以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址-r ds:1000-a ds:0 ;以汇编指令的形式,向从1000:0开始的内存单元中写入指令(3)下一条指令执行了吗? 在Debug中,用A命令写一段程序:mov ax,2000mov ss,axmov sp,10 ;安排2000:00002000:000F 为栈空间,初始化栈顶。mov ax,3123 push axmov ax,3366push ax ;在栈中压入两个数据。在用T命令单步执行mov ax,2000后,显示出当前CPU各个寄存器的状态和下一步要执行的指令:mov ss,ax;在用T命令单步执行mov ss,ax后,下一条指令应该是mov sp,10,却变成了mov ax,3123?注意,在用T命令单步执行mov ss,ax 前,ax=0000,ss=0b39,sp=ffee,而执行后 ss=2000,sp=0010。ss变为2000是正常的,这正是mov ss,ax的执行结果。而能够将sp设为0010的只有指令mov sp,10,看来,mov sp,10一定是得到了执行。在用T命令执行mov ss,ax的时候,它的下一条指令mov sp,10也紧接着执行了。整理一下我们分析的结果:在用T命令执行mov ss,ax的时候,它的下一条指令mov sp,10也紧接着执行了。一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器的状态和下一步要执行的指令,但T命令执行mov ss,ax的时候,没有做到这一点。不单是mov ss,ax,对于如:mov ss,bx,mov ss,0,pop ss等指令都会发生上面的情况,这些指令有哪些共性呢?它们都是修改栈段寄存器SS的指令。结论:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。三实验任务(1)使用Debug,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。mov ax,ffffmov ds,axmov ax,2200mov ss,axmov sp,0100mov ax,0 ;ax= add ax,2;ax= mov bx,4 ;bx= add bx,6;bx= push ax ;sp= ;修改的内存单元的地址是 内容为 push bx ;sp= ;修改的内存单元的地址是 内容为 pop ax ;sp= ;ax= pop bx ;sp= ;bx= push 4;sp= ;修改的内存单元的地址是 内容为 push 6 ;sp= ;修改的内存单元的地址是 内容为 (2)仔细观察下图中的实验过程,然后分析:为什么2000:02000:f中的内容会发生改变?用Debug进行实验的示例四实验报告写出在DEBUG状态下编写、运行程序的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。实验三 汇编语言程序的调试与运行一实验目的1熟练掌握编写汇编语言原程序的基本框架2熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。二实验内容一个汇编语言程序从写出到最终执行的简要过程如下:1) 编辑可以用任意的文本编辑器来编辑源程序,只要最终将其存储为纯文本文件即可。一般保存为*.asm文件。2) 编译上机过程中,我们采用微软的masm5.0汇编编译器,文件名为masm.exe。我们的编译器在C:masm5目录下,可以按照下面的过程来进行源程序的编译,以C:1.asm为例:进入DOS方式,进入C:masm5目录,运行masm.exe,首先显示一些版本信息,然后提示输入将要被编译的源程序文件名。在输入源程序文件名时一定要指明路径,如果文件在当前路径下,只要输入文件名就可以,否则要输入全路径。在此,我们输入C:1.asm.输入源程序文件名后,程序继续提示我们输入要编译出的目标文件名,因为我们已经输入了源程序文件名为1.asm,则编译程序默认要输出的目标文件名为1.obj,所以我们可以不必另行指定文件名,直接按回车,编译程序将在当前目录下,生出1.obj文件。我们也可以指定生成的目标文件所在的目录,如想在“C:windowsdesktop”下生成目标文件1.obj,则可以输入“C:windowsdesktop1”确定了目标文件名称后,编译程序提示输入列表文件名称和交叉引用文件名称,这些时编译器将源程序编译为目标文件过程中产生的中间结果,我们直接按回车键忽略。对源程序编译结束,编译器输出的最后两行告诉我们源程序是否有警告错误和必须要改正的错误。3) 链接对源程序进行编译得到目标文件后,需要对目标文件进行链接得到可执行文件。我们使用微软的Overlay Linker3.6连接器,文件名为link.exe,假设连接器在C:masm5目录下,我们按照下面的过程来进行程序的链接,以C:masm51.obj为例进入DOS方式,进入C:masm5目录,运行link.exe,首先显示一些版本信息,然后提示输入将要被连接的目标文件名。此处我们输入”1”,按回车.程序继续提示我们输入要生成的可执行文件的名称,这是我们对一个程序进行连接要得到的最终结果。这里我们不必另行指定文件名,直接按回车,链接程序将在当前目录下,生成1.exe文件。确定了可执行文件的名称后,连接程序提示输入映像文件的名称和库文件的连接,我们直接按回车键忽略即可。最后对目标文件的连接结束,连接程序输出的最后一行告诉我们源程序是否有错误。如果尽出现一个警告错误:“没有栈段”,我们可以不理会。4) 执行和调试 将生成的可执行文件执行:C:masm51.exe,看不到任何结果,因为我们的程序没有向显示器输出信息。 为了观察程序的运行过程,使用Debug的相关命令来单步执行程序,查看每一条指令的运行结果。进入C:masm5后,我们输入“Debug 1.exe”,按Enter键,Debug将程序从1.exe中加载到内存,进行相关的初始化后设置CS:IP指向程序的入口。使用R命令查看各个寄存器的设置情况,使用U命令来查看我们写入的指令,使用T命令单步执行程序中的每一条指令,到达int 21,使用P命令执行,执行后,显示“Program terminated normally”,返回到Debug,表示程序正常结束。注意:在DOS中运行程序时,是Command将程序加载到内存,所以程序运行结束后返回到command中,而在这里是debug将程序加载到内存,所以程序运行结束后返回到debug中。三实验任务1. 将下面的程序保存为t1.asm文件,生成可执行文件t1.exe;assume cs:codesgcodesg segmentmov ax,2000hmov ss,axmov sp,0add sp,4pop axpop bxpush axpush bxpop axpop bxmov ax,4c00hint 21hcodesg endsend2. 用Debug跟踪t1.exe的执行过程,写出每一步执行后相关寄存器中的内容3. PSP的前两个字节是CD 20,用Debug加载t1.exe,查看PSP的内容四实验报告调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。实验四 bx和loop指令的联合使用一实验目的1、熟练掌握编写汇编语言原程序的基本方法和基本框架。2、掌握bx访问内存的方法和loop循环指令。3、熟练使用DEBUG调试程序跟踪循环指令的执行。二实验内容1. 编程:向内存0:2000:23F依次传送数据0632. 编程:向内存0:2000:23F依次传送数据063,程序中只能使用9条指令(包括程序的2条返回语句)3. 下面程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。assume cs:codecode segment mov ax, mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx, s: mov al,bx mov es:bx,al inc bx loop s mov ax,4c00h int 21hcode endsend三编程提示对于实验任务3,有如下说明:因为题目的要求是把代码段内的指令当作数据,复制到目的地址。所以要确定要复制的数据的位置和长度。1.因为要复制的数据是代码段的一部分指令,那么要复制的数据的段地址就和代码段的段地址相同。2. 因为要复制的数据是代码段的一部分指令,所以要复制的数据的长度,就是要复制的指令的长度,可以先假设要复制8位1h0ffh数据的字节数(如:10h),把程序补全,以便通过编译。将程序补充完整并将其编译、连接、运行,接着进行DEBUG,在DEBUG时我们可以算出该程序的长度。然后得到正确的值后重新将程序补充完整。四实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等五实验报告1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、写出源程序清单和执行结果实验五 编写、调试具有多个段的程序一实验目的1、熟练掌握编写汇编语言源程序的基本方法和基本框架。2、掌握编写具有多个段的程序。二实验内容1. 将下面的程序编译链接,用Debug加载、跟踪,然后回答问题:assume cs:code,ds:data,ss:stackdata segment dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hdata endsstack segment dw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:0 push ds:2 pop ds:2 pop ds:0 mov ax,4c00h int 21hcode endsend start CPU执行程序,程序返回前,data段中的数据为多少? CPU执行程序,程序返回前,cs=_、ss=_、ds=_. 该程序加载后,code段的段地址为X,则data段的段地址为_,stack段的段地址为_。2.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题:assume cs:code,ds:data,ss:stackdata segment dw 0123H,0456Hdata endsstack segment dw 0,0stack endscode segmentstart: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:0 push ds:2 pop ds:2 pop ds:0 mov ax,4c00h int 21hcode endsend start CPU执行程序,程序返回前,data段中的数据为多少? CPU执行程序,程序返回前,cs=_、ss=_、ds=_. 该程序加载后,code段的段地址为X,则data段的段地址为_,stack段的段地址为_。 对于如下定义的段:name segmentname ends如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为_。3. 将下面的程序编译连接,用Debug加载、跟踪,然后回答问题:assume cs:code,ds:data,ss:stackcode segmentstart: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:0 push ds:2 pop ds:2 pop ds:0 mov ax,4c00h int 21hcode endsdata segment dw 0123H,0456Hdata endsstack segment dw 0,0stack endsend start CPU执行程序,程序返回前,data段中的数据为多少? CPU执行程序,程序返回前,cs=_、ss=_、ds=_. 设程序加载后,code段的段地址为X,则data段的段地址为_,stack段的段地址为_。4.若将1,2,3题中的最后一条伪指令“end start“改为“end”,则那个程序仍然可以正确执行?请说明原因。5.程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。assume cs:codea segment db 1,2,3,4,5,6,7,8a endsb segment db 1,2,3,4,5,6,7,8b endsc segment db 0,0,0,0,0,0,0,0c endscode segment start: ?code endsend start6. 程序如下,编写code段中的代码,用push指令将a段中的word数据,逆序存储到b段中。assume cs codea segment dw 1,2,3,4,5,6,7,8a endsb segment dw 0,0,0,0,0,0,0,0b endscode segmentstart: ?code endsend start三编程提示对于实验任务4,有如下说明:当未给编译器预先的通知,要求其从哪开始执行程序时,编译器就自动以至上向下的顺序进行编译执行源程序。对于实验任务5,可以通过先把a段的数据加到c段,然后再把b段的数据加到c段来实现。对于实验任务6,把a段当作数据段,把b段当作栈段,然后通过入栈操作可以实现逆序。四实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等五实验报告1、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。2、写出源程序清单和执行结果实验六 不同寻址方式的灵活应用一实验目的1.熟练掌握使用多种不同的寻址方式。2.掌握二重循环问题的处理。二实验内容编程:将datasg段中每个单词的前4个字母改为大写。assume cs:codesg,ss:stacksg,ds:datasgstacksg segment dw 0,0,0,0,0,0,0,0stacksg endsdatasg segment db 1. display db 2. brows db 3. replace db 4. modify datasg endscodesg segment start:codesg endsend start三编程提示因为在datasg段中的4个字符串是连续存放的,可以看成是一个4行16列的二维数组,按照要求,需要修改每个单词的前四个字母,即二维数组的每一行的3-6列。 需要进行4*4次的二重循环,用变量R定义行,常量3定义每行要修改的起始列,变量C定位相对于起始列的要修改的列,外层循环按行来进行,内存按列来进行。首先用R定位第一行,循环修改R行的3+C列(0=C=3);然后再用R定位到下一行,再次循环修改R行的3+C列,直至所有数据修改完毕。四实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等五实验报告1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、写出源程序清单和执行结果。实验七 寻址方式在结构化数据访问中的应用一实验目的1.掌握寻址方式在结构化数据访问中的应用。2.熟练使用汇编语言的知识和编程的技巧二实验内容下面的程序中已经定义好了这些数据:assume cs:codesgdata segment db 1975,1976,1977,1978,1980,1980,1981,1982,1983 db 1984,1985,1986,1987,1988,1989,1990,1991,1992 db 1993,1994,1995 ;以上是表示21年的21个字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收入的21个dword型数据 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 ;以上是表示21年公司雇员人数的21个word型数据。data endstable segmentdb 21 dup(year summ ne ? ) table endscodesg segment start:codesg endsend start编程:将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下表所示的格式保存在table段中。三编程提示 可将data段中的数据看成是多个数组,而将table中的数据看成是一个结构型数据的数组,每个结构型数据中包含多个数据项。可用bx定位每个结构型数据,用idata定位数据项,用si定位数据项中每个元素,对于table中的数据的访问可以采用bx.idata和bx.idatasi的寻址方式。四实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等五实验报告1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、写出源程序清单和执行结果。实验八 转移指令的原理一实验目的1.熟练掌握各种转移指令。2.深入理解转移指令的原理。二实验内容1. 分析下面的程序,在运行前思考:这个程序可以正确返回吗?运行后再思考:为什么是这种结果?assume cs:codesgcodesg segment mov ax,4c00h int 21hstart: mov ax,0s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:si mov cs:di,axs0: jmp short ss1: mov ax,0 int 21h mov ax,0s2: jmp short s1 nopcodesg endsend start2.根据相关材料编程:材料详见书上175页编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 welcome to masm!三编程提示实验任务2的提示: 3种颜色属性对应的值为:02h,24h,71h 屏幕12行的中间的位置的段的起始地址为b872h 使用栈来保存中间要用到的寄存器的值。四实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等五实验报告1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、写出源程序清单和执行结果。实验九 编写子程序一实验目的熟练掌握编写子程序的方法和标准框架。二实验内容编写3个子程序:1. 显示字符串:编写一个通用的子程序来实现显示字符串的功能。子程序描述:名称:show_str功能:在指定的位置用指定的颜色,显示一个用0结束的字符串。参数:(dh)=行号(取值范围0-24), (dl)=列号(取值范围0-79) (cl)=颜色,ds:si指向字符串的首地址返回:无如:在屏幕的8行3列,用绿色显示data段中的字符串data segment db Welcome to masm!,0data endscode segment assume cs:code,ds:datastart: mov dh,8 ;dh装行号(范围:1-25) mov dl,3 ;dl装列号(范围:1-80)注:每超过80等于行号自动加1 mov cl,2 ;cl中存放颜色属性 mov ax,data mov ds,ax mov si,0 call show_str mov ax,4c00h int 21hshow_str: : : :code endsend start2. 解决除法溢出问题:编写子程序避免除法溢出问题子程序描述:名称:divdw功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。参数:(ax)=dword型数据的低16位,(dx)= dword型数据的高16位,(cx)=除数返回:(dx)= 结果的高16位,(ax)=结果的低16位, (cx)=余数应用举例:计算1000000/10(F4240H/0AH),结果:(dx)=0001H,(ax)=86A0H,(cx)=03. 数值显示:将二进制数据用十进制显示到屏幕子程序描述:名称:dtoc功能:将word型数据转变为表示十进制的字符串,字符串以0结尾。参数:(ax)=word型数据 ds:si指向字符串的首地址返回:无应用举例:编程将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。assume cs:codedata segment db 10 dup(0)data endscode segment start: mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc mov dh,8 ;dh装行号(范围:1-25) mov dl,3 ;dl装列号(范围:1-80)注:每超过80等于行号自动加1 mov cl,2 ;cl中存放颜色属性 call show_str : :code endsend start三编程提示实验任务1的提示: l 子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将他们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系;l 注意保存子程序中用到的相关寄存器;l 这个子程序的内部处理和显存结构密切相关,但是向外提供了与显存结构无关的接口,通过调用该子程序,进行字符串的显示时可以不必了解显存的结构,为编程提供方便。实验任务2的提示:给出一个公式:X:被除数,范围:0,FFFFFFFFN:除数,范围:0,FFFFH:X高16位,范围:0,FFFFL:X低16位,范围:0,FFFFint():描述性运算符,取商,比如int(38/10)=3rem():描述性运算符,取余,比如rem(38/10)=8公式:X/N=int(H/N)*65536+rem(H/N)*65536+L/N这个公式将可能产生溢出的除法运算,X/N,转变为多个不会产生溢出的除法运算。实验任务3的提示:处理过程如下:用12666除以10,循环5次,记下每次的余数;将每次的余数分别加30H,得到表示十进制数的ASCII码串。如果不知道要处理的数据时,即不能确定循环次数,只要除到商为0,使用jcxz指令即可实现相关功能。四实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等五实验报告1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、写出源程序清单和执行结果。实验十 编写子程序一实验目的1.掌握标志寄存器和相关指令。2.掌握子程序的编写。二实验内容编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转换成大写字母。子程序描述如下: 名称:letterc 功能:将以以0结尾的字符串中的小写字母转换成大写字母 参数:ds:si指向字符串首地址应用举例:assume cs:codesgdatasg segment db Beginners All-purpose Symbolic Instruction Code.,0datasg endscodesg segmentbegin:mov ax,datasg mov ds,ax mov si,0 call letterc mov ax,4c00h int 21hletterc: :codesg endsend begin三编程提示1.相当于将字符串中的每个字符在闭区间a,z内进行比较;2.欲显示相关字符串,可调用实验9的显示子程序(属第十章内容),在调用时注意相关参数的传递。四实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等五实验报告1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、写出源程序清单和执行结果。实验十一 编写0号中断的处理程序一实验目的1.深入理解中断的过程和原理2.掌握中断处理程序的编写方法二实验内容编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串”divide error!”。然后返回到DOS三实验要求实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等四实验报告1、写出调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。2、写出源程序清单和执行结果实验十二 编写、应用中断例程一实验目的1.深入理解中断的过程和原理2.掌握中断例程的编写方法和安装二实验内容(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其要注意观察int、iret指令执行前后CS、IP和栈中的状态。assume cs:codedata segment db welcome to masm!,0data endscode segmentstart: mov dh,10 ;行号 mov dl,10 ;列号 mov cl,2 ;颜色属性 mov ax,data mov ds,ax mov si,0 int 7ch ;调用中断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论