汇编语⾔程序设计实验2汇编源程序编写与汇编、调试
汇编语⾔程序设计实验2 汇编源程序编写与汇编、调试
⼀、实验⽬的
1. 理解并掌握汇编源程序组成与结构
2. 掌握汇编语⾔源程序编写→汇编→链接→调试的⼯具和⽅法
3. 理解汇编源程序中地址表⽰、段寄存器的⽤法
4. 理解和掌握寄存器间接寻址⽅式[bx]
5. 通过汇编指令loop的使⽤理解编程语⾔中循环的本质
⼆、实验内容及结果
(⼀)实验任务⼀
使⽤任意⼀款⽂本编辑器,编写8086汇编源程序ex1.asm。源代码如下:
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov byte ptr ds:[0], 1
mov byte ptr ds:[1], 1
mov byte ptr ds:[2], 2
mov byte ptr ds:[3], 2
mov byte ptr ds:[4], 3
mov byte ptr ds:[5], 3
mov byte ptr ds:[6], 4
mov byte ptr ds:[7], 4
mov ah, 4ch
int 21h
code ends
end
要求:使⽤8086汇编程序编写、汇编、链接、运⾏、调试⽅法,对ex1.asm进⾏汇编、链接、运⾏,使⽤debug⼯具调试可执⾏⽂件。
使⽤masm、link对ex1.asm进⾏汇编、链接,得到可执⾏⽂件,运⾏并观察结果。
使⽤debug⼯具对程序进⾏调试
使⽤debug加载可执⾏⽂件后,使⽤d命令查看程序段前缀PSP所占的256个字节。
结合可执⾏⽂件中寄存器CX的值,使⽤u命令对进⾏精确反汇编
使⽤g命令执⾏到程序退出执⾏之前(即源码⽂件中line16之前),观察结果。
1、⾸先使⽤masm对*.asm⽂件进⾏编译,⽣成包含机器代码的⽬标⽂件(*.obj)
编译后没有问题(截图中能看到提⽰说:0 Warning Errors和0 Severe Errors)这时候再返回到⽂件夹中就会发现多了⼀个.obj⽂件
对 *.obj ⽬标⽂件进⾏连接,得到可执⾏⽂件(.exe⽂件)。运⾏link后,⾸先显⽰⼀些版本信息,然后提⽰输⼊将要被连接的⽬标⽂件的名称。注意,“[.OBJ]”提⽰我们,默认的⽂件扩展名是obj,**⽐如要连接的⽬标⽂件名是“xxx.obj”,只要在这⾥输⼊“xxx”即可。**可如果⽂件不是以 obj 为扩展名,就要输⼊它的全名。⽐如⽬标⽂件名为“ xxx.bin ”,就要输⼊全名。
最后⼀⾏有提⽰信息:no stack segment,在⽹上查了意思,得知是:程序中没有安排堆栈段。这个警告可以忽略,程序能够运⾏,并且得到正确的结果。
在这⾥即可运⾏⽂件,得到结果:
2、使⽤debug⼯具对程序进⾏调试
⾸先使⽤d命令查看程序段前缀PSP所占的256个字节,结果如下图所⽰:
再使⽤u命令对进⾏精确反汇编,⾸先可以借助r命令:
故u命令应为:
-u 076A:030
结果如下:
由上述结果可以观察到,若要使⽤g命令执⾏到程序退出执⾏之前(即源码⽂件中line16之前),代码为:
-g 0028
结果如下所⽰:
(⼆)实验任务⼆
使⽤任意⼀款⽂本编辑器,编写8086汇编源程序ex2.asm。源代码如下:
汇编指令有多少个assume cs:code
code segment
mov ax,0b810h
mov ds,ax
mov bx,0
mov ax,101H
mov cx,4
s: mov [bx],ax
add bx,2
add ax,101H
loop s
mov ah,4ch
int 21h
code ends
end
要求:使⽤8086汇编程序编写、汇编、链接、运⾏、调试⽅法,对ex2.asm进⾏汇编、链接、运⾏,使⽤debug⼯具调试可执⾏⽂件。
使⽤masm、link对ex2.asm进⾏汇编、链接,得到可执⾏⽂件,运⾏并观察结果。
使⽤debug⼯具对程序进⾏调试。
结合可执⾏⽂件中寄存器CX的值,使⽤u命令对进⾏精确反汇编
灵活使⽤t命令、p命令、g命令,对进⾏调试。(不⼀定要单步,有些地⽅可以⽤g命令,⼀次执⾏多⾏汇编指令)
注意:单步调试时,对于循环指令loop, 中断指令int,使⽤t命令和p命令单步调试的区别。
把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运⾏并观察结果。
结合上述实验和观察,分析、对⽐ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
1、与实验任务⼀中的操作步骤类似,同样可以对ex2.asm进⾏汇编、链接,得到可执⾏⽂件,结果如下:
2、使⽤debug⼯具对程序进⾏调试
⾸先可以结合可执⾏⽂件中寄存器CX的值,使⽤u命令对进⾏精确反汇编,和之前的操作步骤⼀样,先使⽤r命令查看相关信息:
故可以得到u命令为:
-u 076A:0 001B
运⾏结果如下所⽰:
再可以灵活使⽤t命令、p命令、g命令,对进⾏调试,在这⾥关于如何使⽤这些命令,想法是:⼤部分命令都使⽤t命令单步执⾏来调试,但是遇到INT命令或者LOOP命令的时候,使⽤p命令来调试,因为INT命令类似于⾼级语⾔中的函数,如果这个时候还使⽤t命令的话,会相当于进⼊到函数内部,但是内部的调试过程不是我们想看到的,故在这⾥可以使⽤p命令来调试,⽽LOOP命令则是循环,我们不需要看到循环的过程,故也使⽤p命令。调试结果如下所⽰:
把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运⾏并观察结果(由于前⾯的汇编链接运⾏过程存在重复内容,故这⾥不再赘述,只展⽰最后的结果)
⼩结:
对⽐ex2.asm和ex1.asm实现的是相同的功能,都是再屏幕上打印图案。但是在具体实现上有所不同。具体体现在循环次数,结果也很好的显⽰了这⼀效果,修改前是四个图案,修改后则打印输出了8个图案。
(三)实验任务三
综合使⽤loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。
要求:
编写汇编源程序
给出运⾏结果截图
代码为:
assume cs:code
code segment
mov ax, 0b800h
mov ds, ax
mov bx, 07b8h
mov cx, 000fh
s: mov [bx], 0237h
inc bx
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
运⾏过程为:
最后的运⾏结果为:
可以看出,与预期结果完全⼀致。接下来把填充的字数据,从0237H 改成0239H,运⾏结果为:
把填充的字数据,从0237H 改成0437H后的结果为:
由上述结果对⽐可以看出:bx中前两个字节控制颜⾊,后两个字节控制形状(不知道对不对0.0
(四)实验任务四
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
1、必做部分
综合使⽤[bx]和loop,编写汇编源程序
灵活使⽤debug的t命令、g命令、p命令调试。在程序退出前,⽤d命令查看0:200~0:23F,确认是否将0~3F传送⾄此段内存区域。代码如下所⽰:
assume cs:code
code segment
mov ax, 20h
mov ds, ax
mov bx, 0
mov cx, 40h
mov al, 0
s:mov [bx], al
inc al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
运⾏结果如下所⽰:
2、选做部分
利⽤栈的特性,综合使⽤loop,push实现(限定仅使⽤8086中已学过指令实现),编写源程序
灵活使⽤debug的t命令、g命令、p命令调试。在程序退出前,⽤d命令查看0:200~0:23F,确认是否将0~3F传送⾄此段内存区域。代码如下所⽰:
assume cs:code
code segment
mov ax,0020h
mov ss,ax
mov sp,0040h
mov bx,3f3eh
mov cx,64
s: push bx
sub bh,2
sub bl,2
loop s
mov ax,4c00h
int 21h
code ends
end
运⾏结果如下所⽰:
(五)实验任务五
补全后的代码为:
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,0015h
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
运⾏结果如下所⽰:
在这⾥,第⼀个空中:cs:ip表⽰cpu执⾏指令的地址。所有,只要mov ax,cs 就能把该程序在内存⾥的⾸地址mov到ax了。
第⼆个空:cx的值,也就是要求loop循环执⾏多少次。当程序运⾏到第8⾏,也就是mov cx,__ 时,cs:ip是该指令的地址。也就是说,从程序开始IP=0,到第8⾏,IP的值可以⽤来表⽰该程序指令占多少字节。
(六)实验任务六
实验过程中⼀直出现
error: parser: instruction expected
在互联⽹上查了好多资料也不知道怎么解决,先放着等有时间再来看看
三、实验总结
等搞定了任务六再来⼀起写
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论