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


一、实验内容


 1. 实验任务1

(1)使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行

  • 使用任意一款文本编辑器,编写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

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

  • 使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。

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

  • 此时可以看到经过masm、link对ex1.asm进行汇编、链接得到ex1.obj,ex1.exe文件:

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

(2)使用debug工具对程序进行调试

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

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

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

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

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

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

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

  • 这里可以看出数据改变了但是却没有改变成现象中的0 01 02..的形式,这里通过查看资料得知:
  • 那是因为dosbox那个彩色线框的影响,它会在我们写入显存后重绘一遍彩色线框
  • 对此我们需要在debug ex1.exe时先进行清屏cls操作,在进行接下来的步骤

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

2. 实验任务2

(1)使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行

  • 使用任意一款文本编辑器,编写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

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

  • 使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。

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

(2)使用debug工具对程序进行调试。

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

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

  •  灵活使用t命令、p命令、g命令,对ex2.exe进行调试。
  • (不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)

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

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

  • 注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。
  • t命令调试指令loop,中断指令int,结果如下:

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

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

  • p命令调试指令loop和中断指令int,结果如下:

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

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

  •  结论:

    T命令:单步执行,每次只执行一条代码语句,遇到子程序后进入子程序逐条执行指令;
    P命令:类似T命令,若有子程序,直接执行完子程序全部指令而不是逐条执行指令,在遇到循环指令时,会直接执行至CX递减至0;
    G命令:多步执行,可以跟地址和断点,即格式为 G[=address] [breakpoints],运行到[breakpoints]指定位置的指令后暂停,若不加参数则从当前IP运行到程序结束。

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

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

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

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

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

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

  ex1.exe结果如下:

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

  改前ex2.exe结果如下:

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

   改后ex2.exe结果如下:

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

  • 结论:

   1、对比ex2.asm和ex1.asm,它们实现的是相同的功能和效果,只是实验二通过loop指令循环来实现,

   实验一则是一步一步赋值得到,所以相较于实验一,实验二的效率更高。

3. 实验任务3

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

  • 编写汇编源程序:
;ex3.asm
assume cs:code
code segment
  mov ax,0b800h
  mov ds,ax
  mov bx,07b8h
  mov ax ,0237h
  mov cx,16
s: mov [bx],ax
  add bx,2
  loop s
  mov ah,4ch
  int 21h
code ends
end
  •  使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex3.exe

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

  • 运行ex3.exe,结果如下:

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

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

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

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

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

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

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

  •  猜测与分析:

  从实验结果来看改变这个填充的字数据,从0237与0239的结果来看,结果没有改变颜色而是改变了图案,

而从0237与0437的结果来看,结果没有改变图案而是改变了颜色,所以可以猜想这个字数据高字节确定颜色,

低字节则确定图案,同时查看ascii表可以得出图案是与ascii的值对应,如下图:

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

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

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

 4. 实验任务4

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

  • 编写汇编源程序:
;ex4.asm
assume cs:code
code segment
  mov ax,0020h
  mov ds,ax
  mov bx,0h
  mov ax,0h
  mov cx,64
s:    mov [bx],ax
  add bx,1h
  add ax,1h
  loop s
  mov ah,4ch
  int 21h
code ends
end
  •  使用masm、link对ex4.asm进行汇编、链接,得到可执行文件ex4.exe

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

  • 使用debug工具对程序进行调试。
  • 结合可执行文件中寄存器CX的值,使用u命令对ex4.exe进行精确反汇编

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

  • 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看
    0:200~0:23F,确认是否将0~3F传送至此段内存区域。

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

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

  •  结论:从实验截图可知数据被写入到相应位置里了

(2选做)利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编

写源程序

  • 编写汇编源程序:
;ex41.asm
assume cs:code
code segment
  mov ax,0020h
  mov ss,ax
  mov sp,0040h
  mov ax,3f00h
  mov cx,64
s:  push ax
  inc sp
  dec ah
  loop s
  mov ax,4c00h
  int 21h
code ends
end
  • 灵活使用debug的t命令、g命令、p命令调试。用d命令查看

    0:200~0:23F,确认是否将0~3F传送至此段内存区域。

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

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

 5. 实验任务5

 (1)补全代码,并且调试运行回答问题。

;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

填空依据:

  第一空:程序要求把代码“mov ax,4c00h”之前的指令复制到内存,所以要使段地址指向代码开始的地方

也就是cs指向的地址。

  第二空:复制的指令是到代码“mov ax,4c00h”之前的指令,通过指令u可以看出指令是从0~17h结束,

所以填写17h

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

  • 使用masm、link对ex4.asm进行汇编、链接,得到可执行文件ex4.exe

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

  • 使用debug工具对程序进行调试。

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


二、实验总结


  • 在dosbox的虚拟DOS环境下使用masm和link工具对.asm的汇编源码文件进行汇编、链接生成EXE可执行文件的具体操作步骤。

  • t命令,p命令,g命令的使用,及了解它们之间的区别:

    • T命令:单步执行,每次只执行一条代码语句,遇到子程序后进入子程序逐条执行指令;

    • P命令:类似T命令,若有子程序,直接执行完子程序全部指令而不是逐条执行指令,在遇到循环指令时,会直接执行至CX递减至0;

    • G命令:多步执行,可以跟地址和断点,即格式为 G[=address] [breakpoints],运行到[breakpoints]指定位置的指令后暂停,若不加参数则从当前IP运行到程序结束。

  • 段寄存器DS, SS, ES, CS的了解与使用

  • 循环指令loop的使用:指令的功能是 dec cx(计数寄存器),循环指令执行为cx减为0时停止。这里要注意的是在debug中cx默认存放的是mov ah,4c00h之前指令总的字节数。所以使用它当循环计数前要记得重新赋值。

  • 在dosbox的虚拟DOS环境下在实验过程中向显存区改变数据不成功问题:对此是因为那可能是因为dosbox页面轮转了一次,使之前改变的内存数据又被覆盖了,解决方法cls清屏一下,只要保证页面一直在当前页面就行。对比下面两张图可以看出,在开始页面可以看到改变的内存数据与图案,而当指令过多,页面移动后图案消失,同时数据被覆盖。

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

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

 

上一篇:ASM管理命令行三工具:KFOD、KFED和AMDU


下一篇:CentOS7的udev的绑定规则