首页 > 其他 > 详细

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

时间:2020-11-05 17:53:27      阅读:28      评论:0      收藏:0      [点我收藏+]

1. 实验任务1

使用任意一款文本编辑器,编写8086汇编源程序ex1.asm

 1 assume cs:code
 2 code segment
 3 mov ax, 0b810h
 4 mov ds, ax
 5 mov byte ptr ds:[0], 1
 6 mov byte ptr ds:[1], 1
 7 mov byte ptr ds:[2], 2
 8 mov byte ptr ds:[3], 2
 9 mov byte ptr ds:[4], 3
10 mov byte ptr ds:[5], 3
11 mov byte ptr ds:[6], 4
12 mov byte ptr ds:[7], 4
13 mov ah, 4ch
14 int 21h
15 code ends


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

技术分享图片

 

 

 技术分享图片

 

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

 

 技术分享图片

 

结合可执行文件中寄存器CX的值,使用u命令ex1.exe进行精确反汇编使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。

 

 技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 

 2. 实验任务2

使用任意一款文本编辑器,编写8086汇编源程序ex2.asm

 

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

 

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

 

技术分享图片

技术分享图片

 

 

 

 

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

技术分享图片

 技术分享图片

 

 

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

技术分享图片

 

 

 技术分享图片

 

在debug模式下,由于单步调试上滚所以显存刷新没有被显示出来。退出之后执行程序。

技术分享图片

 

改变的cx寄存器改变了循环的次数,第一次循环4次,改变后循环八次。增加了写进显存的数据

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

两个实验实现的是相同的功能和效果。但在具体是实现上实验一是直接写入,而实验二使用了loop循环的方式,简化了重复代码。

 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, 10h
 7 s: mov [bx],0237h
 8 add bx,2
 9 loop s
10 mov ah,4ch
11 int 21h
12 code ends
13 end

 在汇编,链接之后,运行:

技术分享图片

 

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

技术分享图片

 

 

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

技术分享图片

 

 

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

猜测低位字节存放的的是显示的文字内容,高位字节存放的是字体格式颜色等附加的信息。

4. 实验任务4

  • 编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)
  • 综合使用[bx]loop,编写汇编源程序
  • 灵活使用debugt命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域

 

 1 assume cs:code
 2 code segment
 3 mov ax,0h
 4 mov ds,ax
 5 mov bx,200h
 6 mov cx,40h
 7 s:    mov ds:[bx],bl
 8     inc bx
 9     loop s
10     mov ah,4ch
11     int 21h
12 code ends
13 end

 

进行汇编,链接

 

技术分享图片

使用debug命令之后反汇编

 技术分享图片

 使用g命令调试,使用d命令查看0:200~23F是否准确传送数据:

技术分享图片

  • 选做*
  • 利用栈的特性,综合使用looppush实现(限定仅使用8086中已学过指令实现),编写源程序
  • 灵活使用debugt命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域

 

 1 assume cs:code
 2 code segment
 3 mov ax,20h
 4 mov ss,ax
 5 mov sp,40h
 6 mov bh,3fh
 7 mov bl,3eh
 8 mov cx,20h
 9 s:push bx
10 sub bh,2
11 sub bl,2
12 loop s
13 mov ah,4ch
14 int 21h
15 code ends
16 end

 

编写程序结束,进行汇编链接调试

 

技术分享图片

 

 

 技术分享图片

查看内存写入数据是否正确:

 

 

 技术分享图片

 

 

  1.  由于8086的栈按字读入,一次入栈两个数据,所以我把两个数据分别存在寄存器中的高位和低位。
  2. 由于入栈操作时从高地址到低地址,所以数字从大到小存储。

5. 实验任务5

教材实验4(3)P121

将mov ax,4c00h之前的指令复制到内存0:200处,补全程序。

 

 1 assume cs:code
 2 code segment
 3     mov ax,cs
 4     mov ds,ax
 5     mov ax,20h
 6     mov es,ax
 7     mov bx,0
 8     mov cx,17
 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

 

 

 

技术分享图片

 

 

 根据mov ah,4ch之前的偏移量是17, 说面前面的指令长度是17-0=17,可知代码中应该填17。复制的循环次数17。

技术分享图片

 

 和上图对比,发现对于内存中存储的数据反汇编后得到和代码反汇编的结果一样,证明复制成功!

 五、实验总结

本次实验了解并且可以熟练操作对于程序的编译连接调试,可以灵活的运用debug调试功能。单步调试t命令是详细的,单步调试p命令是不进入子程序,g命令可以多步调试。在程序中,如果代码有大段重复的可以考虑使用loop循环来简化代码,cx寄存器中存储的是循环的次数,每循环一次,cx减一。

 

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

原文:https://www.cnblogs.com/zzzzero/p/13929378.html

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