实验目的:

  1. 进一步学习汇编语言基本指令使用方法;
  2. 学习DEBUG调试工具的基本使用方法;掌握debug调试命令a、u、r、d、t、g等
  3. 逐条观察程序指令的执行过程,理解指令的功能,理解程序自动、顺序地执行的概念,实践其过程(重点)。

实验题目:

  1. 编写、输入一个32位二进制数相加程序,逐条执行指令,观察指令执行情况。
  2. 使用已经过汇编和连接的小程序(t3-2.exe),将其装入内存,逐条执行指令,观察执行过程和结果。在实验过程中,使用E命令修改XXX和YYY单元中的数据,再重新计算其结果。

实验过程:
1.编写,输入一个32位的二进制数相加程序,我编写的程序如下:

DATA SEGMENTNUMH1    DW  0001H   ;被加数1的高位NUML1   DW  1234H   ;被加数1的低位NUMH2   DW  0002H   ;被加数2的高位NUML2   DW  0FFFFH  ;被加数2的低位ANSH    DW  ?   ;结果的高位ANSL  DW  ?   ;结果的低位
DATA    ENDSCODE    SEGMENTASSUME   CS:CODE,    DS:DATA
START:  MOV AX,DATAMOV  DS,AXMOV    AX,NUML1ADD AX,NUML2    ;低位相加MOV    ANSL,AX     ;存储低位结果MOV  AX,NUMH1ADC     AX,NUMH2    ;高位和CF相加,确保进位MOV ANSH,AX     ;存储高位结果MOV  AH,4CHINT       21H     ;程序结束
CODE    ENDS
END START

代码说明:因为要求的是32位的加法,但是我们用的寄存器都是16位的,所以需要我们用两个DW类型的数据来存一个32位的数据,另外在进行加法的过程中,我选择的是先ADD加低位,再ADC加高位,确保进位,之后用ANSH,ANSL来存储最后的结果的高低位。
代码流程图:

程序调试过程:
生成obj文件和exe文件

1.开始debug写好的程序(前面masm,link后面不需要加后缀,但是这里需要加EXE后缀,否则会报错,因为文件夹中存在同名文件,没有后缀无法区分)同时使用u命令将程序反汇编,观察其汇编指令的与源程序的对应关系,观察每一条指令的代码、存放地址、指令代码长度等;(重要):

2.使用r命令读出各寄存器中的数值,从CS:IP寄存器中的数值确定程序当前应执行的指令;(结合计算机硬件知识加以理解):

可以发现,CS:IP中的数值就是之前反汇编之后程序给出的地址后面的指令内容,当前执行的指令在空间中的076B:0000,内容为B86A07,即MOV AX,076A。

3.开始逐条执行程序:
使用t命令逐行执行程序:

这一步的目的是将AX的值赋给DS,结合上一步获取数据段地址,实现DATA数据段中内容的获取。
这里CS:IP的值为076B:0003 内容为8ED8 执行的操作为MOV DS,AX
在下图中看到,这里DS的值变为076A。

这一步的目的是给AX赋一个被加数的低位的值。这里选用的是NUML1,在空间中的地址为DS:[0002]。
这里CS:IP的值为076B:0005 内容为A10200 执行的操作为MOV AX,[0002]
在下图中看到,这里看到AX的值变为1234H

这一步的目的是将两个被加数的低位相加,使用的是ADD命令,因为不需要考虑进位的影响。
在下图中看到AX的数值已经改变为1234H+0FFFFH=1233H(只看低位)
这里CS:IP的值为076B:0008 内容为03060600 执行的操作为ADD AX,[0006]
另外此时的标志位出现变化,因为在执行ADD操作的时候出现了进位,所以CF标志位从NC变成CY。

这一步的目的是把上一步低位相加的结果给到我们之前在数据段中声明的ANSL,这里他的地址为DS:000A。
这里CS:IP的值为076B:000C 内容为A30A00 执行的操作为MOV [000A],AX

这一步的目的是将之前被加数1的高位赋值给到AX。
这里CS:IP的值为076B:000F 内容为A10000,执行的操作为MOV AX,[0000]
从下图中可以看到AX的内容变为0001H。没有其他变化。

这一步的目的是将两个被加数的高位和CF一起相加,完成32位加法的同时实现了进位。因为需要CF参与计算,所以这里使用的是ADC指令。
这里CS:IP的值为076B:0012 内容为13060400 执行的操作为ADC AX,[0004]
从下图可以看出,AX的数值为0001+0002+CF(1)=0004H。
此时CF标志位使用过后从CY变回NC。

这一步的目的是把高位相加的结果给到数据段中已经声明了的ANSH中,这里他的地址为DS:0008。
这里CS:IP的值为076B:0016 内容为A30800 执行的操作为MOV [0008],AX

程序执行到MOV AH,4CH,程序结束。
4.调用D命令,查看最后的结果:

其中ANSH的地址为DS:0008,也就是0004H
ANSL的地址为DS:000A,也就是1233H
程序实现了32位数加法:00011234H+0002FFFFH=00041233H

2.使用已经过汇编和连接的小程序(t3-2.exe),将其装入内存,逐条执行指令,观察执行过程和结果。在实验过程中,使用E命令修改XXX和YYY单元中的数据,再重新计算其结果。

装入内存:

逐条执行指令:

第一条指令的状态需要使用r命令来观察,这里的目的是将数据段的地址赋值给AX。
这里CS:IP的值为076B:0000 内容为B86A07 执行的操作为MOV AX,076A
下图中可以看到AX的数据变为了076A。

这一步的目的是将AX的值赋给DS,结合上一步获取数据段地址,实现DATA数据段中内容的获取。
这里CS:IP的值为076B:0003 内容为8ED8 执行的操作为MOV DS,AX
在下图中看到,这里DS的值变为076A。

这一步的目的是将XXX的值赋给AX,在空间中XXX的地址为DS:0000
这里CS:IP的值为076B:0005 内容为A10000 执行的操作为MOV AX,[0000]
在下图中看到,这里AX的数值变为1234H

这一步的目的是将DX清零,所以选择的是DX和自己做异或操作。
这里CS:IP的值为076B:0008 内容为33D2 执行的操作为XOR DX,DX
因为初始时候DX的数值就是0000,所以没有发生变化。如果DX之前的状态数值非0,这一步后会清零。这里标志位也发生变化,ZF标志位变为ZR,PF标志位变为PE,这是因为标志位看运算的结果,DX为0000,这两个标志位对应结果。

这一步的目的是实现AX+AX->AX的操作,将AX的数值大小扩大二倍。
这里CS:IP的值为076B:000A 内容为03C0 执行的操作为ADD AX,AX
在下图中看到,这里AX的值变为2468H。

这一步的目的是将判断上一步AX*2的操作是否出现了进位,使用ADC指令进行DX+0+CF的操作,如果进位的话DX加一,如果没有DX不变。
这里CS:IP的值为076B:000C 内容为83D200 执行的操作为ADC DX,+00
上一步的操作没有出现进位,所以在下图中DX的数值没有发生改变。

这一步的目的是实现AX+AX->AX的操作,将AX的数值大小扩大二倍。
这里CS:IP的值为076B:000F 内容为03C0 执行的操作为ADD AX,AX
在下图中看到,这里AX的值变为48D0H。

这一步的目的是将判断上一步AX*2的操作是否出现了进位,使用ADC指令进行DX+0+CF的操作,如果进位的话DX加一,如果没有DX不变。
这里CS:IP的值为076B:0011 内容为83D200 执行的操作为ADC DX,+00
上一步的操作没有出现进位,所以在下图中DX的数值没有发生改变。

这一步的目的是实现AX+AX->AX的操作,将AX的数值大小扩大二倍。
这里CS:IP的值为076B:0014 内容为03C0 执行的操作为ADD AX,AX
在下图中看到,这里AX的值变为91A0H。

这一步的目的是将判断上一步AX*2的操作是否出现了进位,使用ADC指令进行DX+0+CF的操作,如果进位的话DX加一,如果没有DX不变。
这里CS:IP的值为076B:0016 内容为83D200 执行的操作为ADC DX,+00
上一步的操作没有出现进位,所以在下图中DX的数值没有发生改变。

这一步的目的是实现AX+AX->AX的操作,将AX的数值大小扩大二倍。
这里CS:IP的值为076B:0019 内容为03C0 执行的操作为ADD AX,AX
在下图中看到,这里AX的值变为2340H。出现进位的情况,标志位中的CF标志位从NC变为了CY

这一步的目的是将判断上一步AX*2的操作是否出现了进位,使用ADC指令进行DX+0+CF的操作,如果进位的话DX加一,如果没有DX不变。
这里CS:IP的值为076B:001B 内容为83D200 执行的操作为ADC DX,+00
上一步的操作出现了进位,CF=1,所以在下图中DX的数值变为了0001H。

这一步的目的是实现AX+YYY->AX的操作。
这里CS:IP的值为076B:001E 内容为03060200 执行的操作为ADD AX,[0002]
在下图中看到,这里AX的值变为79B8H。

这一步的目的是将判断上一步AX+YYY->AX的操作是否出现了进位,使用ADC指令进行DX+0+CF的操作,如果进位的话DX加一,如果没有DX不变。
这里CS:IP的值为076B:0022 内容为83D200 执行的操作为ADC DX,+00
上一步的操作没有出现进位,所以在下图中DX的数值没有发生改变。

这一步的目的是将计算结果的低位存到数据段定义的ZZZ的低位中,ZZZ在空间中的地址为:DS:0004
这里CS:IP的值为076B:0025 内容为A30400,执行的操作为MOV [0004],AX

这一步的目的是将计算结果的高位存到数据段定义的ZZZ的高位中,也就是ZZZ+2,在空间中的地址为:DS:0006。
这里CS:IP的值为076B:0028 内容为89160600,执行的操作为MOV [0006],AX

到这里程序结束。
调用D命令查看最后的结果:

T3-2程序的功能为:
XXX乘以2的四次方+YYY的结果赋值给ZZZ,最后的结果为000179B8H

使用E命令修改XXX和YYY单元中的数据,再重新计算其结果。

需要注意的是,这里需要先使用t命令进行两步,把数据段的地址给到DS之后再进行这样的操作。这里我们把XXX的数值改为1111,YYY的数值改为2222,t3-2程序所计算的结果就是1111*16+2222,最后计算的结果为:00013332H

这里红框里的就是修改过的XXX的数值,黄框里的是修改过的YYY的数值,蓝框里的是最后运算的结果。

思考题

  1. 程序中的指令、数据是如何在存储器中存储的?
  2. 如何理解程序执行过程的顺序性?
  3. 如何理解标志位寄存器中的数据?
    答:1.对于指令的存储,可以通过u指令来进行反汇编查看指令的存储地址以及相应的机器码。可以看到在该程序中代码段地址为076BH,并且从偏移地址0000H开始存储代码段的命令。其中第三列就是每一个指令的机器码。

另外,可以通过D命令对机器码进行查看。

数据存储在DS段,数据高低字节分别存储在高低地址。

2.程序执行过程在代码通过masm编译之后就已经在CS段中确定了,我们通过u命令将程序反汇编之后可以观察到程序执行的汇编指令所在的空间地址,按照地址顺序执行程序。

3.标志位寄存器的值遵循以下表格:

标志位寄存器再本次实验中所祈祷的作用是用来存储相关指令的某些执行结果,比如在两个代码中都涉及到的先ADD再ADC,就是利用了标志位寄存器中的CF实现了进位。其它标志位例如PF和ZF同样发生了变化,表明低八位的1的个数发生了变化或者一次运算的结果是0000,但是在该汇编程序中并没有起到具体切实的作用。

汇编与接口技术课程总结1——汇编程序debug调试相关推荐

  1. 【汇编】微机原理与接口技术课程设计

    本文是微机原理与接口技术课程设计 完整的程序和实验报告开源在我的Github上: https://github.com/zstar1003/XDU_Homework/tree/main/%E5%BE% ...

  2. 微型计算机接口技术论文,(微机原理与接口技术课程论文.doc

    (微机原理与接口技术课程论文 <微机原理与接口技术> 论 文 学院: 班级: 姓名: 学号: 微机原理与接口技术论文 内容摘要: 微型计算机原理与接口技术是计算机科学与技术专业重要的专业基 ...

  3. 太原理工大学微型计算机接口技术,微机原理与接口技术课程设计 太原理工大学.doc...

    微机原理与接口技术课程设计 太原理工大学.doc 还剩 18页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 1 ...

  4. 微型计算机接口与技术的交通灯,微机原理及接口技术课程设计交通灯

    微机原理及接口技术课程设计交通灯 序言 十字道口的红绿灯是交通法规的无声命令,是司机和行人的行为准则.十字道 口的交通红绿灯控制是保证交通安全和道路畅通的关键.当前,国内大多数城市正在 采用" ...

  5. 微型计算机接口与技术的交通灯,微机原理与接口技术课程设计——交通灯设计.doc...

    微机原理与接口技术课程设计--交通灯设计.doc 1 任务及要求 1.1设计任务 交通信号灯的控制: (1)通过8255A并口来控制LED发光二极管的亮灭. (2)A口控制红灯,B口控制黄灯,C口控制 ...

  6. 微型计算机k80,微型计算机原理与接口技术课程设计报告智能交通灯控制系统设计(15页)-原创力文档...

    微型计算机原理与接口技术课程设计报告智能交通灯控制系统设计 摘 要 根据十字路口交通灯的控制要求,采用PLC 设计实现正常交通的时序控制,通过传感器完成对交通异常状况的智能判别及处理.在系统的设计中, ...

  7. 计算机微机原理与接口技术课程设计课题,微机原理与接口技术课程设计报告

    <微机原理与接口技术课程设计报告>由会员分享,可在线阅读,更多相关<微机原理与接口技术课程设计报告(12页珍藏版)>请在人人文库网上搜索. 1.微机原理与接口技术课程设计设计题 ...

  8. 微型计算机接口技术4732,自考微型计算机及接口技术课程考试说明

    <微型计算机及接口技术>(课程代码:4732)是计算机类专业的一门重要专业课程.按照<高等教育自学考试课程命题工作手册>的要求以及全国统一命题的有关规定,特制定本说明. 一.命 ...

  9. 电子信息工程专业打工人的单片机原理与接口技术课程笔记

    文章目录 前言 一.单片机 二.时钟频率 三.单片机电路 1.时钟引脚 2.P3口 3.控制引脚 4.内部结构 四.C51编程语言基础 1.基本了解 2.具体实际 3.LCD1602 五.实际应用 总 ...

最新文章

  1. Android P 电量管理,Android P亮点汇总:更智能 更简单
  2. 一般来说,神经网络的架构可以分为哪三类?
  3. 几个有用的word小技巧,保准提升效率~
  4. Linux启动nacos成功日志_微服务系列之Nacos配置中心
  5. 【你会用代码画年兽吗】20行代码使用JS实现虎年春节倒计时 —— 红红火火过虎年
  6. 云效Codeup代码评审中的代码协同
  7. tomcat处理html流程,Tomcat 简单配置使用,基本工作原理(流程图)
  8. 【报告分享】5G时代新型基础设施建设白皮书.pdf
  9. 远程办公 4 大坑,坑坑“致命”!
  10. 解析mysqlbinlog日志_关于mysql-binlog日志解析框架
  11. 配置Typescript+Node环境
  12. linux nvme 驱动 版本,Linux 上的 NVMe
  13. Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结
  14. (Android-RTC-8)分析HardwareVideoEncoder—BitrateAdjuster
  15. 考上一级建造师很牛吗?让我从一个屌丝技术员到项目经理
  16. 蓝牙技术谈之跳频技术(一)
  17. 设置Node.js脚本开机自启动
  18. 一分钟轻松掌握 !Java 高级数据结构 -- 原生 BitSet 源码刨析
  19. tfs java_TFS (Team Foundation Server) 2013集成Maven构建
  20. windows server 2003 IE升级方法

热门文章

  1. 基于STM32的简易RTOS分析-时间片轮转调度
  2. 图文详解YUV420/YUV422数据格式(转)
  3. 汽车芯片玩家如何分类?有哪些呢?
  4. 查看数据库的版本命令
  5. 【数理统计】学习笔记05:区间估计
  6. 视觉系统(CCD)光轴校正-项目实践
  7. 点击pv转化率_点击转化率缩写
  8. VMWare快照原理(写时复制)?快照保护、快照克隆的作用?
  9. SQLyog安装过程
  10. 积米浏览器下载|积米浏览器免费下载