ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-11-05 15:02:37  阅读:158  来源: 互联网

标签:汇编 code mov 指令 调试 ax 源程序 asm



一、实验内容


 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  •  结论:

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

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

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

  ex1.exe结果如下:

  改前ex2.exe结果如下:

   改后ex2.exe结果如下:

  • 结论:

   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

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

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

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

  •  猜测与分析:

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

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

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

 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

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

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

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

(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传送至此段内存区域。

 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

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

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


二、实验总结


  • 在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清屏一下,只要保证页面一直在当前页面就行。对比下面两张图可以看出,在开始页面可以看到改变的内存数据与图案,而当指令过多,页面移动后图案消失,同时数据被覆盖。

 

标签:汇编,code,mov,指令,调试,ax,源程序,asm
来源: https://www.cnblogs.com/Quyoking/p/13909392.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有