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

1. 实验任务1

使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:

 1 ;ex1.asm
 2 assume cs:code
 3 code segment
 4     mov ax, 0b810h
 5     mov ds, ax
 6     
 7     mov byte ptr ds:[0], 1
 8     mov byte ptr ds:[1], 1
 9     mov byte ptr ds:[2], 2
10     mov byte ptr ds:[3], 2
11     mov byte ptr ds:[4], 3
12     mov byte ptr ds:[5], 3
13     mov byte ptr ds:[6], 4
14     mov byte ptr ds:[7], 4
15 
16     mov ah, 4ch
17     int 21h
18 code ends
19 end

使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,然后运行该文件。

使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。

结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编。

使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。

 

2. 实验任务2

使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:

 1 ; ex2.asm 
 2 assume cs:code 
 3 code segment 
 4     mov ax, 0b810h 
 5     mov ds, ax 
 6 
 7     mov bx, 0 
 8     mov ax, 101H 
 9     mov cx, 4
10 s:     mov [bx], ax 
11     add bx, 2 
12     add ax, 101H
13     loop s
14 
15     mov ah, 4ch
16     int 21h
17 code ends
18 end

使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex2.exe,然后运行该文件。

结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编。

灵活使用t命令、p命令、g命令,对ex2.exe进行调试。

    首先用g命令执行到loop指令,而后再使用t命令进行单步调试,发现下一条是int指令时使用p命令,即步过中断指令。

  第二次尝试使用t命令进入loop循环,一次循环结束之后用p命令直接执行完loop,并尝试用t命令跟踪INT 21h命令,发现下一指令为STI。通过查阅资料了解到该指令全称为Set Interupt,作用是允许中断发生。在STI起效之后,所有外部中断都被恢复,这样可以打破被保护代码的运行,允许硬件中断转而处理中断的作用。

把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。

结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同? 

  二者实现了相同的功能,都是向b810:0000开始的连续8个字节依次填充1 1 2 2 3 3 4 4,在具体实现上ex1.asm是一条一条指令将数据送入,而ex2.asm是采取循环的方式。

 

3. 实验任务3

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

 1 assume cs:code
 2 code segment
 3     mov ax,0b800h
 4     mov ds,ax
 5     mov bx,07b8h
 6     mov cx,16
 7 s:    mov [bx],0437h
 8     add bx,2
 9     loop s
10     mov ah,4ch
11     int 21h
12 code ends
13 end

运行结果如下,和预期一致。

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。

把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。

猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。

  通过对比以上的三张图片,不难发现第一张与第二张显示的数字不同,第一张与第三张显示的颜色不同,故此猜想高位字节存放的是颜色信息,低位存放的是字符信息。

 

4. 实验任务4

综合使用[bx]和loop,编写汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。

 1 assume cs:code
 2 code segment
 3     mov ax,0020h
 4     mov ds,ax
 5     mov cx,64
 6     mov bx,0
 7 s:    mov [bx],bl
 8     add bx,1
 9     add al,1
10     loop s
11     mov ah,4ch
12     int 21h
13 code ends
14 end

汇编、链接无误后,灵活使用debug的t命令、g命令、p命令调试。

  结合实验任务2中所得结论,采用下图的调试方式。

在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。

  根据下图的结果,可以确定已经成功将0~3F传送至0:200~0:23F。

 

5. 实验任务5

详见教材实验4(3),完成汇编源程序,实现将“mov ax,4c00h"之前的指令复制到内存0:200处。

 1 assume cs:code
 2 code segment
 3     mov ax,cs
 4     mov ds,ax
 5     mov ax,0020h
 6     mov es,ax
 7     mov bx,0
 8     mov cx,17h
 9 s:    mov al,[bx]
10     mov es:[bx],al
11     inc bx
12     loop s
13     mov ax,4c00h
14     int 21h
15 code ends
16 end

  line3和line4的功能是给到程序一个源地址,故填入csline8的功能是设置循环次数,可以先随便填入一个数字,我试验时填入了7,然后用u命令查看得到mov ax,4c00h之前的指令一共需要多少字节。通过下图可知,一共需要从0到16h的17个字节,故填入17。

汇编连接后,灵活使用debug的t命令、g命令、p命令调试。

  本次直接使用g命令调试整段程序。


 用d命令查看0:200之后的若干字节,观察是否将mov ax, 4c00h之前的指令复制到指定内存。

  使用d命令可以得到如下的结果。

   使用u命令进行反汇编,确定此时mov ax, 4c00h之前的指令已经复制到指定位置。

posted @ 2020-11-04 22:07  奈克瑟斯  阅读(222)  评论(2编辑  收藏  举报