汇编语言程序设计实验一:8086汇编指令编码和调试


8086汇编指令编码和调试

实验任务2

  • 在debug中,使用D命令加上起始地址进行生产日期的查找,实验截图如下:

  • 然后用E命令对生产时期所在的内存单元内容进行修改,修改后再用D命令进行查看

实验结论

最终并不能修改生产时期所在的内存单元,其值仍为最初值不变,这是由于日期所在内存单元的存储权限为只读,故不能进行修改。

实验任务3

  • 在debug中,使用e命令,从b800:0开始的内存单元开始,依次写入十六进制数据04 03,重复写5次,实验代码及效果截图如下:

  • 使用f命令,向内存单元区间b800:0f00 ~ b800:0f9f的连续160个字节依次重复填充十六进制数据03 04,实验代码及效果截图如下:

  • 其他关于修改内存地址或数据的尝试代码及截图如下:


实验任务4

  • 在debug中按顺序录入代码,内容如下图:

  • 填空

-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 执行后,寄存器(sp) = 2e
push [2] ; 执行后,寄存器(sp) = 2c
push [4] ; 执行后,寄存器(sp) = 2a
push [6] ; 执行后,寄存器(sp) = 28
pop [6] ; 执行后,寄存器(sp) = 2a
pop [4] ; 执行后,寄存器(sp) = 2c
pop [2] ; 执行后,寄存器(sp) = 2e
pop [0] ; 执行后,寄存器(sp) = 30
  • 回答问题

    • 指令mov ss,ax和mov sp,30执行后,栈顶的逻辑地址为0020:0030H,物理地址为00230H。

    • 单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此
      时栈空间数据,实验截图如下:

    • 汇编指令 pop [0] 执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据,发现并无变化,实验截图如下:

    • 把最后四条指令的顺序更改,最终代码如下图:


      pop [6] 指令执行结束后,使用d命令 d 20:0 7查看此时数据空间内的数据,发现数据有变化,实验截图如下:

实验任务5

  • 实践内容如下图:

  • 观察并思考

    • 问题1:单步执行完mov ss,ax之后指令并没有暂停,后面那条指令也是随即立即执行了。debug的单步调试是一种中断,但由于CPU在执行期间不响应中断请求,所以debug显示的是CPU执行完栈段和栈顶指针分配后的情况。

    • 问题2:08 01是偏移地址,3F 07是程序段地址,因为在单步调试,所以存在中断,需要暂存程序现在的入口。

实验任务6

  • 用任意一款编辑器编写8086汇编程序源码如下:

      assume cs:code
      code segment
       start:
          mov cx, 10
          mov dl, '0'
          s: mov ah, 2
          int 21h
          add dl, 1
          loop s
          mov ah, 4ch
          int 21h
      code ends
      end start
    
  • 对程序汇编链接截图(需注意在链接时需通过设置将生成可执行文件指定为task5),如下图:

  • 对task6.asm生成的可执行文件task5.exe运行及结果截图:

  • 使用d命令,查看task5.exe的程序段前缀,观察这256个字节的内容如下图,并成功验证前两个字节是CD 20

实验任务7

  • 补全代码如下:
  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
  • 填写依据:首先,程序代码段地址是cs,要将寄存器cs中的内容赋值给ax,然后再存入段地址ds;其次,先赋值给cx进行debug,r命令得到cx是21h,故cx=21h-5h=17h。

  • 补全程序后生成可执行文件task7如下图:


    继续在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令对0:200h开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间。如下图:

实验总结

  • 实验需要细心,在审题及编写代码及运行测试时需要踏实的一步一步操作,才能事半功倍
  • 书本知识有限,我自己掌握的也不够牢固,以后需要多通过书籍、网络等途径强化巩固知识并扩展知识面,才能做好每一次实验
  • 这次实验也巩固了之前所学,对复习与巩固有积极作用


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM