实验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。源代码如下:

;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之前),观察结果。

编辑源程序:

 

编译:

 

 连接:

 

 运行:

 

 使用d命令查看程序段前缀PSP所占的256个字节:

 

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

先用t命令单步执行到最后一条指令,查看ip值

 

 使用u命令进行反汇编:

 

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

 

 

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,它们实现的是否是相同的功能和效果?在 具体实现上有什么不同?

 编辑源代码:

 

 编译:

 

连接:

 

执行:

 

 出现了四个图案

 

 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图:

cx的值为001c,因此反汇编到001b

 

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

 

 

 

 

 

 t命令在遇到loop指令时会执行每一条循环指令,而p命令遇到循环指令时,会直接执行至CX递减至0。

 

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

 

 

 

 

 

 

 

 

 可以看到,运行时出现了八个图案,可以猜想图案的多少代表着循环次数。

 

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

 ex1.asm采用顺序结构,将指令一条条送入内存,后者采用循环结构,对于开发者而言代码书写效率高。

 

3. 实验任务3

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

要求: 编写汇编源程序 给出运行结果截图

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

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

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

 

 

编辑源程序:

 

 运行后:

 

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

 源代码:

 

 使用t命令、p命令调试

 

 

 

 

 

 使用d命令查看:

 

 

5. 实验任务5

教材实验4(3)(P121)

先随意补全

第一空应该是将段寄存器cs中的值送给ax,所以应该填cs

 

 可以看到 mov ax,4c00所对应的内存单元为0017,要复制之前的内容,应将0017送给cx,所以第二空填0017

 

 

 

反汇编后:

 

 

 确认复制成功。

 

posted @ 2020-11-04 17:47  敲代码了吗  阅读(167)  评论(3编辑  收藏  举报