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

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

  一、实验目的

      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的用途

  三、实验内容

      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。源代码如下:
;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
      使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。
      

       

      结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编
      
      灵活使用t命令、p命令、g命令,对ex2.exe进行调试。
      

      

       t命令单步调试会跳到loop里执行,p命令可以跳出loop循环,结束程序。

      ex2.exm的效果:

      

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

      

 

       ex2.asm和ex1.asm,他们实现的是相同的效果,在具体的实现上,ex1直接将对应的字节输入地址,ex2利用循环和[bx],将字直接

      放入内存中,可以使代码变得简洁。   

   3. 实验任务3

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

       要求:

        • 编写汇编源程序
        • 给出运行结果截图
           
 1 ;ex3.asm
 2 assume cs:code
 3 code segment
 4     mov ax,0b800h
 5     mov ds,ax
 6 
 7     mov bx,07b8h
 8     mov ax,0237h
 9     mov cx,0010h
10 s:    mov [bx],ax
11     add bx,2
12     
13     loop s
14     mov ah,4ch
15     int 21h
16 code ends
17 end

          

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

          

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

           

           猜想:高位字节存放颜色信息,地位字节存放显示内容。

    4. 实验任务4

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

        • 综合使用[bx]和loop,编写汇编源程序
        • 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看
        • 0:200~0:23F,确认是否将0~3F传送至此段内存区域  
 1 ;ex4.asm
 2 assume cs:code
 3 code segment
 4     mov ax,0200h
 5     mov ds,ax
 6 
 7     mov bx,0h
 8     mov ax,0h
 9     mov cx,0040h
10 s:    mov [bx],al
11     inc bx
12     inc ax
13     loop s
14     mov ah,4ch
15     int 21h
16 code ends
17 end

          

           

      5. 实验任务5

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

          

           可见代码长度为17h,所以第二空填17h,最后检查存入内存的结果:

          

 

           (1)复制的是什么?从哪里到哪里?

             复制的是代码段的机器码,从0~17H,即mov ax,4c00h。

          (2)复制的是什么?有多少个字节?你如何知道要复制的字节的数量?

             复制的是代码段的机器码,一共23个字节,可以先将cx的值赋0,然后-u精确反汇编,得到代码的长度,再填入cx。

 

 

posted @ 2020-11-04 21:12  yoyoMasterLi  阅读(116)  评论(2)    收藏  举报