汇编程序设计中RET的工作原理

dail178 2003-10-24 05:18:24
偶抄了一段冒泡法的程序.原程序可以运行,而且能达到目的.但通过单步调试发现程序将运行完了之前在RET处要执行好几条指令
jo 03h
ADD AH,DH
ADD [BX+DI],AL
ADD AH,DH
ADD [BX+DI],AL
ADD AH,DH
ADD [BX+DI],AL
ADD AH,DH
ADD b.[BH+DI],00H
HLT
执行完这几条指令后程序结束.但是buf内存中的第一个值却莫明其妙的被改了.且为一个事先不能预料的值.这是为什么?RET到底是怎么工作的.谢谢!!

源程序
DSEG SEGMENT 'DATA'
BUF DW 10,25,16,17,18,19,20,21,22,23,24 ;10为数组的个数,数组第一个数为25
DSEG ENDS

SSEG SEGMENT STACK 'STACK'
SA DB 100 DUP(?)
SSEG ENDS

CSEG SEGMENT 'CODE'
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DSEG
MOV DS, AX
MOV AX,SSEG
MOV SS,AX
MOV BX,0
MOV CX,BUF[BX]
DEC CX
L1: MOV DX,CX
MOV BUF[0],0
L2: ADD BX,2
MOV AX,BUF[BX]
CMP AX,BUF[BX+2]
JBE CONT1
XCHG AX,BUF[BX+2]
MOV BUF[BX],AX
MOV BUF[0],1
CONT1: LOOP L2
MOV BX,0
CMP BUF[0],0
JE STOP
MOV CX,DX
LOOP L1
STOP: RET
START ENDP
CSEG ENDS
END START
...全文
49 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
【内容简介】 汇编语言是各种CPU所提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作。汇编语言是很多相关课程(如:数据结构、操作系统、微机原理等)的重要基础。为了更好地引导、帮助读者学习汇编语言,作者以循序渐进的方式精心创作了这本书。本书具有如下特点:采用全新的结构对课程的内容进行了组织,对知识进行最小化分割,为读者构造了循序渐进的学习线索;在深入本质的层面上对汇编语言进行讲解;对关键环节进行深入的剖析。 本书可用作大学计算机专业本科生的汇编教材及希望深入学习计算机科学的读者的自学教材。 【目录信息】 第1章基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储器的读写 1.8 地址总线 1.9 数据总线 1.10 控制总线 1.11 内存地址空间(概述) 1.12 主板 1.13 接口卡 1.14 各类存储器芯片 1.15 内存地址空间 第2章寄存器(CPU工作原理) 2.1 通用寄存器 2.2 字在寄存器的存储 2.3 几条汇编指令 2.4 物理地址 2.5 16位结构的CPU 2.6 8086CPU给出物理地址的方法 2.7 "段地址x16+偏移地址=物理地址"的本质含义 2.8 段的概念 2.9 段寄存器 2.10 CS和IP 2.11 修改CS.IP的指令 2.12 代码段 实验1 查看CPU和内存,用机器指令和汇编指令编程 第3章寄存器(内存访问) 3.1 内存字的存储 3.2 DS和[address] 3.3 字的传送 3.4 mov.add.sub指令 3.5 数据段 3.6 栈 3.7 CPU提供的栈机制 3.8 栈顶超界的问题 3.9 push.pop指令 3.10 栈段 实验2 用机器指令和汇编指令编程 第4章第1个程序 4.1 一个源程序从写出到执行的过程 4.2 源程序 4.3 编辑源程序 4.4 编译 4.5 连接 4.6 以简化的方式进行编译和连接 4.7 1.exe的执行 4.8 可执行文件的程序装入内存并运行的原理 4.9 程序执行过程的跟踪 实验3 编程.编译.连接.跟踪 第5章[bx]和loop指令 5.1 [bx] 5.2 Loop指令 5.3 在Debug跟踪用loop指令实现的循环程序 5.4 Debug和汇编编译器Masm对指令的不同处理 5.5 loop和[bx]的联合应用 5.6 段前缀 5.7 一段安全的空间 5.8 段前缀的使用 实验4 [bx]和loop的使用 第6章包含多个段的程序 6.1 在代码段使用数据 6.2 在代码段使用栈 6.3 将数据.c代码.c栈放入不同的段 实验5 编写,调试具有多个段的程序 第7章更灵活的定位内存地址的方法 7.1 and和or指令 7.2 关于ASCII码 7.3 以字符形式给出的数据 7.4 大小写转换的问题 7.5 [bx+idata] 7.6 用[bx+idata]的方式进行数组的处理 7.7 SI和DI 7.8 [bx+si]和[bx+di] 7.9 [bx+si+idata]和[bx+di+idata] 7.10 不同的寻址方式的灵活应用 实验6 实践课程的程序 第8章数据处理的两个基本问题 8.1 bx,si,di,bp 8.2 机器指令处理的数据所在位置 8.3 汇编语言数据位置的表达 8.4 寻址方式 8.5 指令要处理的数据有多长? 8.6 寻址方式的综合应用 8.7 div指令 8.8 伪指令dd 8.9 dup 实验7寻址方式在结构化数据访问的应用 第9章转移指令的原理 9.1 操作符offset 9.2 jmp指令 9.3 依据位移进行转移的jmp指令 9.4 转移的目的地址在指令的jmp指令 9.5 转移地址在寄存器的jmp指令 9.6 转移地址在内存的jmp指令 9.7 jcxz指令 9.8 loop指令 9.9 根据位移进行转移的意义 9.10 编译器对转移位移超界的检测 实验8 分析一个奇怪的程序 实验9 根据材料编程 第10章call和ret指令 10.1 ret和retf 10.2 call指令 10.3 依据位移进行转移的call指令 10.4 转移的目的地址在指令的call指令 10.5 转移地址在寄存器的call指令 10.6 转移地址在内存的call指令 10.7 all和ret的配合使用 10.8 mul指令 10.9 模块化程序设计 10.10 参数和结果传递的问题 10.11 批量数据的传递 10.12 寄存器冲突的问题 实验10 编写子程序 课程设计1 第11章标志寄存器 11.1 ZF标志 11.2 PF标志 11.3 SF标志 11.4 CF标志 11.5 OF标志 11.6 adc指令 11.7 sbb指令 11.8 cmp指令 11.9 检测比较结果的条件转移指令 11.10 DF标志和串传送指令 11.11 pushf和popf 11.12 标志寄存器在Debug的表示 实验11 编写子程序 第12章内断 12.1 内断的产生 12.2 断处理程序 12.3 断向量表 12.4 断过程 12.5 断处理程序 12.6 除法错误断的处理 12.7 编程处理0号断 12.8 安装 12.9 do0 12.10 设置断向量 12.11 单步断 12.12 响应断的特殊情况 实验12 编写0号断的处理程序 第13章int指令 13.1 int指令 13.2 编写供应用程序调用的断例程 13.3 对int iret和栈的深入理解 13.4 BIOS和DOS所提供的断例程 13.5 BIOS和DOS断例程的安装过程 13.6 BIOS断例程应用 13.7 DOS断例程应用 实验13 编写应用断例程 第14章端口 14.1 端口的读写 14.2 CMOS RAM芯片 14.3 shl和shr指令 14.4 CMOS RAM存储的时间信息 实验14访问CMOS 第15章外断 15.1 接口芯片和端口 15.2 外断信息 15.3 PC机键盘的处理过程 15.4 编写int 9断例程 15.5 安装新的int 9断例程 实验15 安装新的int 9断例程指令系统总结 第16章直接定址表 16.1 描述了单元长度的标号 16.2 在其他段使用数据标号 16.3 直接定址表 16.4 程序入口地址的直接定址表 实验16 编写包含多个功能子程序的断例程 第17章使用BIOS进行键盘输入和磁盘读写 17.1 int 9断例程对键盘输入的处理 17.2 使用int 16h断例程读取键盘缓冲区 17.3 字符串的输入 17.4 应用int 13h断例程对磁盘进行读写 实验17 编写包含多个功能子程序的断例程 课程设计2
目 录 第1篇 序 幕 单片机是什么?单片机有何用?如何系统学习单片机?单片机系统设计的流程是怎样的,需要掌握哪些辅助软件?本篇将针对这些问题一一阐述,为读者掀开单片机完全学习与应用的华丽序幕。 第1章 单片机在哪里 1.1 ■寻找单片机 1.1.1 电磁炉与单片机 1.1.2 MP3播放机与单片机 1.1.3 更多单片机 1.2 ■学习单片机 1.2.1 掌握单片机基础知识 1.2.2 理解单片机系统 1.2.3 成为单片机系统设计师 1.3 ■单片机之家 1.3.1 Intel 8051单片机 1.3.2 PIC单片机 1.3.3 AVR单片机 1.3.4 其他单片机 1.4 ■应用体验——数字温度计 1.4.1 数字温度计工作原理 1.4.2 体验数字温度计 1.5 ■实例解读——装小球系统 1.5.1 需求分析 1.5.2 系统框架 第2章 如何成为单片机系统设计师 2.1 ■需要准备哪些 2.1.1 综合素质 2.1.2 软件工具 2.1.3 硬件工具之一:面包板 2.1.4 硬件工具之二:万用板和 印制电路板 2.1.5 焊接工具 2.1.6 焊接方法 2.2 ■单片机系统设计流程 2.2.1 需求分析 2.2.2 电路设计 2.2.3 程序设计 2.2.4 系统调试 2.3 ■应用体验——单片机控制下的 发光二极管 2.3.1 发光二极管工作原理 2.3.2 单片机的控制 2.3.3 体验单片机控制发光二极管 2.4 ■实例解读——反应时间测试仪 2.4.1 需求分析 2.4.2 电路设计 2.4.3 程序设计 第3章 单片机系统登场 3.1 ■单片机系统组成 3.1.1 单片机本身 3.1.2 系统的构成 3.2 ■单片机系统抽丝剥茧 3.2.1 AT89S51单片机的“外衣” 3.2.2 AT89S51单片机的管脚 3.2.3 常见外设 3.3 ■元器件插曲之一:变压器 3.3.1 变压器基础知识 3.3.2 电源变压器 3.4 ■元器件插曲之二:二极管与整流 3.4.1 二极管基础知识 3.4.2 整流 3.4.3 整流全桥 3.5 ■元器件插曲之三:电容 3.5.1 电容基础知识 3.5.2 电容的种类 3.5.3 电源滤波 3.6 ■元器件插曲之四:三端稳压与 单片机系统电源 3.6.1 三端稳压基础知识 3.6.2 单片机系统电源方案一: 自制直流稳压电源 3.6.3 单片机系统电源方案二: 电源适配器 3.6.4 单片机系统电源方案三: USB口供电 3.7 ■元器件插曲之五:晶振与振荡器 3.7.1 晶振基础知识 3.7.2 振荡器 3.8 ■诠释单片机最简系统 3.8.1 单片机最简系统 3.8.2 电源端(VCC、GND) 3.8.3 时钟信号端(XTAL1、 XTAL2) 3.8.4 复位端(RST) 3.8.5 外部程序存储器访问控制端 ( ) 3.8.6 从最简系统出发 3.9 ■元器件插曲之六:电阻 3.9.1 电阻基础知识 3.9.2 电阻的参数和种类 3.9.3 电阻的分压、限流、上拉作用 3.10 ■从单片机最简系统开始设计 3.10.1 发光二极管交替发光 3.10.2 程序设计 3.10.3 初见汇编语言 3.10.4 初识指令 3.10.5 立即数 3.11 ■应用体验——发光二极管的交替 发光 3.11.1 控制交替发光的原理 3.11.2 体验交替发光 3.12 ■元器件插曲之七:开关 3.12.1 开关基础知识 3.12.2 常用开关 3.13 ■实例解读——与发光二极管的 交互 3.13.1 需求分析 3.13.2 电路设计 3.13.3 程序设计 3.13.4 延时子程序 第4章 单片机系统设计辅助软件 4.1 ■Proteus单片机系统仿真软件 4.1.1 Proteus软件界面 4.1.2 用Proteus仿真 Vision单片机程序开发4.2 ■ Vision软件界面4.2.1 4.2.2 新建和保存项目 4.2.3 向项目添加文件 4.2.4 汇编程序,生成执行代码 4.2.5 生成下载到单片机的执行 代码HEX文件 Vision的调试及仿真功能4.3 ■ 4.3.1 调试界面 4.3.2 虚拟逻辑分析仪 4.4 ■应用体验——把程序下载到 单片机里 4.4.1 下载器与单片机 4.4.2 体验下载过程 4.5 ■实例解读——流水灯 4.5.1 需求分析 4.5.2 电路设计 4.5.3 软件设计 第2篇 揭 密 单片机的内部结构是怎样的?单片机开发经常会用到哪些电子技术和元器件知识?还有那困扰了很多人的单片机编程语言……本篇将生动地通过诸多实例带出单片机的基础知识,在遇到相关模拟电路、数字电路、元器件知识时会有及时的补充说明,带领读者一点点揭开单片机的神秘面纱。 第5章 单片机的触角——I/O口 5.1 ■何谓I/O口 5.1.1 I/O口的功能 5.1.2 I/O口与单片机的关系 5.1.3 I/O口的操作 5.2 ■元器件插曲之八:场效应管 5.2.1 JFET 5.2.2 MOSFET 5.3 ■元器件插曲之九:逻辑门 5.3.1 非门 5.3.2 或门 5.3.3 或非门 5.3.4 与门 5.3.5 与非门 5.3.6 异或门 5.3.7 缓冲器 5.4 ■元器件插曲之十:锁存器与触发器 5.4.1 门控D锁存器 5.4.2 边沿D触发器 5.5 ■I/O口结构探密 5.5.1 P1口 5.5.2 P3口 5.5.3 P0口 5.5.4 P2口 5.5.5 I/O口小结 5.6 ■应用体验——控制流水灯 5.6.1 功能与电路 5.6.2 体验控制流水灯 5.7 ■实例解读——晃晃灯 5.7.1 原理分析 5.7.2 需求分析 5.7.3 电路设计 5.7.4 软件设计 第6章 七段数码管显示 6.1 ■二进制与数据 6.1.1 二进制与数字 6.1.2 二进制与语音 6.1.3 二进制与图像 6.2 ■元器件插曲之十一:七段数码管 6.2.1 七段数码管原理 6.2.2 七段数码管显示数字 6.3 ■应用体验——计时器 6.3.1 功能与电路 6.3.2 体验计时器 6.4 ■元器件插曲之十二:蜂鸣器 6.4.1 蜂鸣器 6.4.2 蜂鸣器如何工作 6.5 ■元器件插曲之十三:三极管及 三极管开关 6.5.1 三极管基础 6.5.2 三极管的直流放大特性 6.5.3 三极管的直流增益 6.5.4 三极管的电流关系式 6.5.5 三极管开关 6.6 ■实例解读——带声音提示的秒表 6.6.1 需求分析 6.6.2 电路设计 6.6.3 开关抖动的处理 6.6.4 计时数字的增加 6.6.5 软件设计 第7章 解剖单片机 7.1 ■单片机的功耗 7.1.1 运行功耗 7.1.2 I/O口驱动功耗 7.1.3 空闲模式 7.1.4 待机模式 7.2 ■单片机内部结构 7.2.1 从I/O口到内部结构 7.2.2 数据在内部交换 7.2.3 算术逻辑单元(ALU) Vision观察寄存器7.2.4 在 7.3 ■单片机的程序存储器 7.3.1 整体结构 7.3.2 程序下载到哪里 7.3.3 片内程序存储器 7.3.4 程序计数器PC 7.3.5 是片内还是片外程序存储器 Vision观察程序存储器7.3.6 在 7.4 ■单片机的数据存储器 7.4.1 片内数据存储器 7.4.2 工作寄存器区(00H~1FH) 7.4.3 位寻址区(20H~2FH) 7.4.4 开放区(30H~7FH) Vision观察数据存储器7.4.5 在 7.5 ■单片机的特殊功能寄存器 7.5.1 特殊功能寄存器分布图 7.5.2 特殊功能寄存器的功能 7.5.3 特殊功能寄存器的字节操作 7.5.4 特殊功能寄存器的位操作 Vision观察特殊功能7.5.5 在 寄存器 7.6 ■应用体验——用取表方式实现 流水灯 7.6.1 取表法 7.6.2 取表法小结 7.6.3 体验流水灯 7.7 ■实例解读——直接驱动七段 数码管 7.7.1 需求分析 7.7.2 电路设计 7.7.3 软件设计 第8章 单片机与汇编指令 8.1 ■汇编语言真面目 8.1.1 汇编语言与高级语言 8.1.2 从汇编程序到执行代码 8.1.3 伪指令 8.2 ■指令的执行 8.2.1 振荡周期、机器周期、指令 周期 8.2.2 指令的执行 8.3 ■寻址方式 8.3.1 直接寻址 8.3.2 间接寻址 8.3.3 寄存器寻址 8.3.4 寄存器特征寻址 8.3.5 立即寻址 8.3.6 变址寻址 8.4 ■指令分类 8.4.1 指令概述 8.4.2 指令的长度 8.5 ■算术运算指令 8.5.1 加法指令——ADD A, <src-byte> 8.5.2 带进位的加法指令——ADDC A, <src-byte> 8.5.3 带借位的减法指令——SUBB A,<src-byte> 8.5.4 自增/自减指令——INC <byte> / DEC <byte> 8.5.5 乘法指令——MUL AB 8.5.6 除法指令——DIV AB 8.5.7 十进制调整指令——DA A 8.6 ■逻辑运算指令 8.6.1 与操作——ANL <dest-byte>,<src-byte> 8.6.2 或操作——ORL <dest-byte>,<src-byte> 8.6.3 异或操作——XRL <dest-byte>, <src-byte> 8.6.4 累加器A清0操作——CLR A 8.6.5 累加器A取反操作——CPL A 8.6.6 累加器A位移动操作——RL、 RLC、RR、RRC 8.6.7 累加器A高低位交换操作 ——SWAP A 8.7 ■数据装载指令 8.7.1 片内数据装载指令——MOV   <dest>, <src> 8.7.2 数据指针DPTR装载指令 ——MOV DPTR, #data16 8.7.3 堆栈指令——PUSH、POP 8.7.4 数据交换指令——XCH、 XCHD 8.7.5 片外数据装载指令——MOVX   <dest>, <src> 8.7.6 查表指令——MOVC  <dest>, <src> 8.8 ■布尔指令 8.8.1 清0、置1、取反操作——CLR、 SETB、CPL 8.8.2 布尔逻辑运算指令——ANL、 ORL 8.8.3 位数据装载指令——MOV <dest-bit>,<src-bit> 8.8.4 布尔跳转指令——JC、JNC、 JB、JNB、JBC 8.9 ■调用子程序指令 8.9.1 长调用指令——LCALL 8.9.2 绝对调用指令——ACALL 8.9.3 返回指令——RET、RETI 8.10 ■跳转与循环指令 8.10.1 无条件跳转指令——LJMP、 AJMP、SJMP、JMP 8.10.2 条件跳转指令——JZ、JNZ 8.10.3 比较跳转指令——CJNE <dest-byte>, <src-byte>, rel 8.10.4 循环指令——DJNZ <byte>,<rel-addr> 8.10.5 无操作指令——NOP 8.11 ■应用体验——七段数码管的串行 控制技术 8.11.1 串行与并行传输 8.11.2 串行控制七段数码管 8.11.3 程序设计 8.12 ■实例解读——指令应用(程序) 实例 8.12.1 数据求和 8.12.2 减法与二进制的二补数 8.12.3 异或操作指令XRL用于比较 寄存器数值 8.12.4 利用布尔指令产生矩形波 信号 8.12.5 布尔指令应用于控制

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧