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

1. 实验任务1

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

 

    编写代码之后,对该文件进行汇编,链接,运行,使用debug工具调试可执行文件,结果如下:

    

    

    

    使用d命令查看程序段前缀PSP所占的256个字节,得到结果如下:

    

    由CX寄存器的值可知,程序段的空间为 076A:0000~076A:0031,使用u命令进行精确反汇编:

    

    使用g命令执行到程序退出之前,结果如下:

    

  2. 实验任务2

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

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

    使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行,结果如下:

    

    

    根据CX寄存器中的值,对ex2实行精确反汇编,得到结果如下:

    

    对ex2进行调试,得到最终结果:

    

    将代码段中的mov cx,4改为mov cx,8之后,再次汇编,链接,运行并观察结果:

    

    结论:可以发现实验任务1和实验任务2的代码实现了相同的功能,但是在具体实现上有所不同:

       实验任务1采用的是直接寻址的方式,对段空间进行写入;

       实验任务2采用的是间接寻址的方式,并采用了循环结构对段空间进行写入;

  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             mov ax,0237h
 8 s:         mov [bx],al
 9             inc bx
10             mov [bx],ah
11             inc bx
12             loop s
13             mov ax,4ch
14             int 21h
15             code ends
16 code

    汇编,链接,运行后,得到结果如下:

    

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

    

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

    

    分析与结论:

    通过上述实验,发现将0237h改为0239h后,屏幕上的字符由"7"变为"9",由此可得出低位存放的是ascll码值;

    将0237h改为0437h后,屏幕上的字符颜色由绿色变为红色,由此可得出高位存放的是颜色信息。

  4. 实验任务4

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

    代码如下: 

 1 assume cs:code
 2 code segment
 3             mov ax,0h
 4             mov ds,ax
 5             mov bx,0200h
 6              
 7             mov dx,0h
 8             mov cx,40h
 9 s:         mov ds:[bx],dl
10             add dx,1
11             add bx,1
12             loop s
13 
14             mov ax,4ch
15             int 21h
16 code ends
17 end

    综合使用[bx]和loop,编写汇编源程序 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。

    

    可见已将0~3F传送至此段内存区域。

  5. 实验任务5

    教材实验4(3)(P121)

    代码如下:

 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,16
 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

     得到结果如下,可知完成功能;

    

    由于程序的起始地址由CS:IP指定,因此 mov ax,__处填写CS;

    mov cx,__处填写0016的原因:首先在edit编辑器中编写上述代码,并汇编,链接,使用debug工具进行调试;

    使用r指令得到cx中的值为001c,并通过使用u指令精确反汇编得到mov ax,4c00h的地址为0017,由此可知要将

    mov ax,4c00h之前的指令复制到0:200中,仅需将076a:0000~076a:0016的内容复制到里面即可。因此该处填

    写0016h。

posted @ 2020-12-05 00:14  dawei99  阅读(107)  评论(0)    收藏  举报