实验二 汇编源程序编写与汇编、调试

一、实验目的

1. 理解并掌握汇编源程序组成与结构

2. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法

3. 理解汇编源程序中地址表示、段寄存器的用法

4. 理解和掌握寄存器间接寻址方式[bx]

5. 通过汇编指令loop的使用理解编程语言中循环的本质

二、实验准备

1. 学习/复习第5章使用[bx]和loop实现循环的编程应用示例(教材5.5节,5.8节)

2. 复习第3章「栈」的知识

3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法

4. 复习8086汇编中内存单元地址的表示,以及段寄存器DS, SS, ES, CS的用途

三、实验内容

实验任务一.

将如下的源代码写入文本编辑器:

;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

然后masm,link对ex1.asm汇编,链接,然后得到文件:

 

 

 使用d命令查看psp占用的256个字节:

 

 

 

 

 使用u命令对ex1.exe进行精确反汇编:

 

 使用g命令执行到程序退出之前:

这里本来应该在屏幕上显示出几个标记,但是这里由于显存显示在了最上面,无法直观看出,但效果和直接执行ex1.exe一致:

 

实验任务二:

和实验任务一类似,也是编写代码:

; 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 endss
end

 

 然后使用masm,link进行汇编,链接得到ex2.exe

u命令对其进行反汇编:

 

 然后使用t,p,g命令调试:

 

 上面的p命令的使用方式是用来退出循环,否则一直使用t命令会一直到循环结束才退出。

然后改变mov cx,4为mov cx,8,对比更改前后:

mov cx,4,此处汇编执行的结果和ex1.asm一致:

mov cx,8:

在实现上,ex1.asm使用顺序结构,需要提前计算好要执行几次,并把每一次执行的重复代码写上,很繁杂,而ex2.asm则不是,由于采用了循环结构,可以省掉很多存储空间,并且更有利于代码书写,两者执行结果完全一致。

实验任务3;

综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H.

编写汇编代码如下:

 

 这里cx的值依据的是向16个重复单元填充数据得来的,程序执行次数就是cx的值。

然后跟前面代码一致的操作之后,运行结果:

 

 然后修改0237h为0239h:

 

  然后修改0237h为0437h:

 

 

 第一次改变的是低位的字节,然后显示的值改变了,第二次改变了高位的字节,然后显示数字的颜色改变了,那么可以推测高位字节代表的是颜色而低位字节代表了显示数字的值。

实验任务4:

编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。

编写代码如下:

 

 这里要注意的是最后一个部分的代码,就是结束代码 mov ah,4ch,我因为写成了mov ax,4ch,所以导致我一直找不到问题在哪,无法执行程序,这里的结束符不正确会导致程序中断无法执行。

然后对他进行debug:

 

 

然后在程序结束时查看内存单元数据:

可以看到0:200-0:023f所有内存单元都被赋值了

实验任务5:

代码填空

这题需要做的是把前面输入的代码拷贝到相应的系统内存单元中,因为不知道怎么填,所以先尝试填值并且运行,使用u命令反汇编查看命令位置:

 

u命令:

 

 

 图截的部分是mov ax,4c00这句代码的内存位置,0018,所以,可以依据这个得到需要获取的数据量是17h,一开始保存的代码的起始地址是076A:0000,所以ax存储的值就是076A,也就是CS的值,然后修改代码:

然后执行代码,并且使用t,p,g命令执行:

  

然后查看内存单元是否复制成功:

可以看到指定的内存单元已经存储完成。

实验总结

在本次实验中,我一开始对编写代码这个部分是一知半解的,因为实验中涉及到了很多的内存单元的操作,也帮助我理解了ds,ax等等寄存器的作用,此外还有使用loop代替顺序执行的代码,实验帮助我强化了loop的相关使用,例如使用loop去对代码进行复制,从一开始的尝试理解代码到之后尝试去使用loop去做更复杂的操作。此外,我在实验中还认识到,需要注意程序结束时代码的书写,4ch和4c00h区别很大,容易造成程序中断无法执行。

 

posted @ 2020-11-05 22:03  月shang  阅读(211)  评论(1)    收藏  举报