zoukankan      html  css  js  c++  java
  • 实验1 8086汇编指令编码和调试

    一、实验目的

    1. 掌握8086CPU、寄存器、内存(包括栈空间)的基础知识

    2. 掌握汇编源程序组成与结构

    3. 理解和掌握寄存器间接寻址方式[bx]

    4. 掌握汇编指令mov, add, sub, jmp, push, pop,loop的用法,理解高级语言的表达和抽象机制

    5. 熟练掌握使用debug工具编写和调试x86汇编命令的方法

    6. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法

    二、实验准备

    1. 复习教材1-5章

    2. 准备好软件实验环境

      软件,及其安装说明文档,请从课程q群->实验文件夹下载。

    3. 熟悉工具用法

      • debug工具用法,参照:

        • 教材实验1「1 预备知识:Debug的使用」
        • 教材实验2 「1 预备知识:Debug的使用」
      • 文档「debug工具简介及用法.pdf」。可从课程q群->实验文件夹下载。

      • masm、link及运行可执行程序的方法,参照教材第4章。

    四、实验结论

    1. 实验任务1

    自行练习,掌握工具用法。此部分无需写实验结论。

    如练习中遇到、发现问题,使用搜索引擎,以及,和同学讨论后,都暂时未能得到解决或释疑,可以写

    入这一部分。共大家一起讨论。

    实验一:

    ​ 1. 使用a指令将指令写入内存中,用u查看看结果如下:

    1. 使用t命令执行如下:

    1. 求2的8次方

    1. 在内存b810:0中写入 01 01 02 02 03 03 04 04,实验结果如下:

    实验2:

    1. 输入程序:

    1. 执行结果

      见书

    2. 实验任务2

    1. 通过d命令查看ROM生产日期:,在最后的数据段,显示生成日期为1992/01/01

    1. 通过e命令修改生成日期,失败

    3. 实验任务3

    • 给出在debug中使用e命令修改内存单元的命令,及,效果截图

    • 给出在debug中使用f命令批量填充内存单元的命令,及,效果截图

    • 尝试修改内存单元,或,数据后的效果截图

    1. 使用e命令修改内存

    1. 使用f命令批量填充内存单元

    4. 实验任务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_
    

    问题1

    栈顶的物理地址是:0022fH,逻辑地址:0;

    问题2

    问题3:

    数据没有变化。

    问题4:

    数据有变换,数据的顺序颠倒了。

    5. 实验任务5

    回答问题1和问题2。

    问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?

    问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。

    问题1:

    是的,使用t命令只会执行一条命令。再次使用t命令,mov sp 30将会执行。

    问题2:

    第二处划划线的内容刚好存储的是cs,ip的地址

    6.实验任务6

    1.代码的源程序

    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
    

    2.masm,link,执行的截图

    3.debug查看PSP内容

    PSP的内容指的是程序段前面的256字节的保护空间,如下图所示,就是数据段寄存器ds中的地址和程序段地址之间的差距。

    前两个字节的内容是CD 20.


    需要复习PSP相关的知识点


    7.实验任务7

    1. 代码

    因为需要实现程序复制,根据上下文可以判断出ds指向的是复制前程序的地址,所以ds的值就是程序段的段地址cs,

    cx在循环中是循环次数,因为程序是每次复制一个字节,所以循环的次数就是程序的长度cx

    assume cs:code
    code segment
    	mov ax,cs
    	mov ds,ax
    	mov ax,20h
    	mov es,ax
    	mov bx,0
    	mov cx,cx
    s:	mov al,[bx]
    	mov es:[bx],al
    	inc bx
    	loop s
    	
    	mov ax,4c00h
    	int 21h
    code ends
    end
    

  • 相关阅读:
    字符串转数字的hash函数-布隆过滤器
    javascript实现字符查询之kmp算法
    毫秒查询9位数qq号码是否存在-BitMap算法应用
    bitMap算法将字符串映射成数字,同时可以将数字映射成字符串-javascript
    js数字格式化为千分位
    浅谈BST(二叉查找树)
    CSP2019 游记
    2019.10.20模拟赛总结
    P2827 蚯蚓
    原生js解决简单轮播图的切换
  • 原文地址:https://www.cnblogs.com/hjw201983290498/p/15435289.html
Copyright © 2011-2022 走看看