汇编实验5

本次实验深入探讨了汇编语言中数据、代码、栈分别位于不同段的程序编写与调试,通过实验理解了多段汇编源程序在目标程序执行时的内存分配方式。实验包括了对教材内容的复习、实验程序框架的使用、debug调试过程的记录与分析,以及实验结论的总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的
1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
1. 结合第 6 章教材和课件,复习第 6 章内容
2. 复习第 3 章「栈」的知识
三、实验内容
教材 133 实验 5
ps:
1. 实验 5 相关提示见本文档最后一部分 「附:实验 5 提示&说明」 」
2. 为提高实验效率,我已将实验 5 的程序框架准备好,可以从课程公邮→文件中心→
实验文件夹,下载实验 5 程序框架。
四、实验结论
实验任务(1)~(4),直接在教材上填写实验后通过运行、调试观察到的结果,以及由此得
到的结论,以拍照或直接在博客中录入方式,给出填写的结论。对结论得出的过程及调试过
程的检查,采用随机抽点现场操作演示并回答的方式检查。
实验任务(5),要求在博客中给出如下内容:

1.过程:

debug:

结果:

可得data:23 01 56 89 07 bc 0a ef 0d ed 0f ba 0c 87 09

                  cs=076c, ss=076b,ds=076a

data段地址: x-2    stack段地址: x-1


2.主要步骤与实验一相同

debug过程:

结果:

data:23 01 56 04

cs=076c ss=076b ds=076a

data段段地址:x-2,stack段段地址:x-1

实际占有的空间为:((N+15)/16)*16

3.

过程:(可能是我操作不当?g命令老崩溃)

结果:

data:23 01 56 04

cs=076a ss=076e ds=076d

data段段地址:x+3,stack段段地址:x+4

4.

只有3能正确执行。因为1,2前端都是数据段,不指明开始段时会被当作代码段。

5.

源码:

过程:

前后对比,成功相加。

 6.

源码:

 

结果:

 

五、总结与体会

这次实验更多,更复杂,我遇到的问题比以往都多,也学习了不少。

转载于:https://www.cnblogs.com/-scp507/p/10016232.html

### 关于 Keil5汇编实验的教程与示例代码 #### 使用 Keil5 进行 51 单片机汇编编程的基础 为了在 Keil5 开发环境中完成基于 51 单片机的汇编语言实验,需先掌握基本的操作流程。这包括创建项目、配置目标设备以及编写和调试汇编程序。 以下是具体的内容说明: --- #### 创建并配置 Keil5 工程 要开始一个汇编实验,在 Keil5 中需要按照以下方式设置工程: - **新建项目**:启动 Keil µVision 并选择 `Project -> New Project` 来创建一个新的工程项目。 - **选择目标芯片**:在弹出的目标器件列表中选择对应的 51 系列单片机型号(如 AT89C51)。这一过程决定了开发环境中的寄存器定义和其他硬件特性[^1]。 - **添加源文件**:右键点击项目的 Source Group 文件夹,选择 Add Existing Files to Group... 添加扩展名为 `.asm` 的汇编源码文件。 --- #### 数据传输实验案例 对于数据从外部存储器传送到内部 RAM 的场景,可以通过如下方法实现: ```assembly ; 定义外部地址和内部RAM地址 MOV DPTR, #0x7FFF ; 设置DPTR指向外部ROM起始位置 (假设为0x7FFF) MOV R0, #0x30 ; 设定R0作为内部RAM指针,初始值为0x30H单元 MOV R7, #10 ; 循环次数设为10次 LOOP: MOVX A, @DPTR ; 将外部ROM的数据读入累加器A INC DPTR ; 增加外部ROM地址 MOV @R0, A ; 把累加器A里的数值写入由R0指定的内部RAM地址 INC R0 ; 移动到下一个内部RAM地址 DJNZ R7, LOOP ; 如果循环计数未减至零,则跳回执行LOOP部分 END ; 结束指令 ``` 上述代码展示了如何利用 MOVX 和其他相关指令来处理内外部存储之间的数据交换。 --- #### 定时/计数器应用实例 针对定时/计数器的功能演示,下面给出一段简单例子用于产生固定延时效果: ```assembly ORG 0h ; 程序入口地址设定为0H处 START: MOV TMOD, #01H ; 配置模式控制字TMOD,选用工作模式1(16位自动重装载) SETB TR0 ; 启动T0运行状态标志位 WAIT: JNB TF0,WAIT ; 当TF0溢出标记被触发前保持等待 CLR TF0 ; 清除该中断请求信号以防干扰后续操作 SJMP START ; 返回重新进入循环结构 END ; 整体结束语句 ``` 这段代码实现了通过 TCON 寄存器开启定时器 0,并持续监测其溢出情况直到满足条件才继续下一步动作[^2]。 --- #### 调试技巧提示 当遇到问题无法正常运行时可尝试以下几种解决办法: - 检查是否正确设置了仿真模型; - 查看是否有语法错误或者逻辑缺陷存在; - 利用断点逐步跟踪变量变化轨迹找出潜在漏洞所在之处; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值