首页 > 其他 > 详细

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

时间:2020-11-03 21:21:08      阅读:31      评论:0      收藏:0      [点我收藏+]

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

一、实验目的

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

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

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

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

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

二、实验准备

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

  2、复习第三章栈的知识

  3、结合第四章课件,复习完整汇编语言源程序编写->汇编->链接->调试的方法

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

三、实验内容

  1、实验任务1

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

;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进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。
    使用debug工具对程序进行调试
      使用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

  要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,使用debug工具调试可执行文件。

    使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。
    使用debug工具对程序进行调试。
      结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编
      灵活使用t命令、p命令、g命令,对ex2.exe进行调试。(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)
      注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。
    把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。
    结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?

  3、实验任务3

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

  要求:
    编写汇编源程序
    给出运行结果截图
    如程序编写正确,预期结果如图所示。(运行前先使用 cls 命令清屏,更便于观察运行结果)

    技术分享图片 

    把填充的字数据,从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传送至此段内存区域。

  5、实验任务5
  教材实验4(3)(P121)

四、实验结论

   1、实验任务1

    ex1.asm源代码如下

;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

    ex1.asm汇编截图如下

    技术分享图片

    ex1.obj链接截图如下

    技术分享图片

 

 

    debug调试截图如下

    技术分享图片

 

 

     u命令反汇编截图如下

    技术分享图片

 

 

     查看PSP截图如下

    技术分享图片

    使用g命令执行到line16截图

    技术分享图片

 

 

    此时并没有将数据写入相应的内存当中去,而直接执行ex1.exe的时候,屏幕上会出现一些符号

    技术分享图片

  2、实验任务2

    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

    ex2.asm汇编截图如下

    技术分享图片

 

 

     ex2.obj链接截图如下

    技术分享图片

 

 

     debug调试ex2.exe截图如下

    技术分享图片

 

 

     使用u命令反汇编截图如下

    技术分享图片

    使用g命令调试截图如下

    技术分享图片

    直接运行ex2.exe的结果如下

    技术分享图片

    首先在本机的环境下,使用debug工具均无法出现实验所想要的结果,但是,直接运行ex1.exe和ex2.exe可以实现相同的效果。在实现方式上两者有所不同,在ex1中 采用了直接

    输入的方法来实现对显存数据的写入,但是重复的步骤较多,ex2中采用loop的方式来写入显存数据,能够减少大量重复的代码的书写。

  3、实验任务3

    ex3.asm的源代码如下

;ex3.asm
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和0437H的运行结果如下

    技术分享图片

    技术分享图片

    猜测,这个字数据中高位存放的是符号的ASCII码所对应的字符的十六进制表示形式,低位字节存放的是颜色信息

  4、实验任务4

    ex4.asm的源代码如下

;ex4.asm
assume cs:code
code segment
    mov ax,0h
    mov ds,ax
    mov bx,0200h
    mov dx,0h
    mov cx,40h
s:    mov [bx],dl
    inc dx
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end

    debug使用g命令调试过程如图所示

    技术分享图片

    技术分享图片

    使用d命令查看内存结果如下

    技术分享图片

 

   5、实验任务5

    源代码如下

;ex5.asm
assume cs:code
code segment
        mov ax,cs
        mov ds,ax
        mov ax,0020h
        mov es,ax
        mov bx,0
        mov cx,17h
s:      mov al,[bx]
        mov es:[bx],al
        inc bx
        loop s
        mov ax,4c00h
        int 21h
code ends
end

    运行结果如下

    技术分享图片

 

    技术分享图片

 

    从反汇编的机器码和内存在0:200之后的机器码我们可以看到,成功的将代码复制到内存之中

    因为是将指令复制到内存之中,所以要先找到当前程序的开始位置,因此将CS的值赋值给AX之后,在赋值到DS当中

    CX代表程序段的长度,由于是赋值mov ax,4c00h之前的代码,因此CX的的值只是程序到达这个指令的长度。

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

原文:https://www.cnblogs.com/Sunnynight/p/13921287.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!