8086 汇编学习 Part 3
汇编语言程序
用汇编语言编写程序的工作过程
汇编指令对应有机器码的指令,可以被编译为机器指令,最终被 CPU 执行。
伪指令是没有对应的机器码的指令,最终不被 CPU 所执行。
伪指令由编译器来执行,编译器根据伪指令来进行相关的编译工作。
汇编程序是包含汇编指令和伪指令的文本。
程序返回是程序结束运行后,将 CPU 的控制权交还给它得以运行的程序(常为DOS系统)
伪指令的种类
段定义
- 一个汇编程序是由多个段组成的,这些段被用来存放代码和数据或当作栈空间来使用
- 一个有意义的汇编程序至少要有一个段,这个段用来存放代码。
- 定义程序中的段,每个段都需要有段名
段名 segment ;段的开始
段名 ends ;段的结束
END
汇编程序的结束标记。若程序结尾处不加 end ,编译器在编译程序时,无法知道程序在何处结束。
ASSUME (假设)
含义是假设某一段寄存器和程序中的某一个用 SEGMENT ... ENDS
定义的段相关联
ASSUME CS:CODESG
指 CS 寄存器与 CODESG 关联,将定义的 CODESG 当作程序的代码段使用。
源程序编译
源程序文件经过工具软件编译连接后,生成可执行文件包含指令机器码和描述程序有关整体特征的数据。
汇编程序的结构
- 在 Debug 中直接写入指令编写的汇编程序
- 适用于功能简单、短小精悍的程序
- 只需要包含汇编指令即可
- 单独编写成源文件后再编译为可执行文件的程序
- 适用于编写大程序
- 需要包括汇编指令,还要有指导编译器工作的伪指令
- 源文件由一些段构成,这些段存放代码、数据,或将某个段作为栈空间
从源程序到可执行文件
- 文本编辑源程序文件 (.asm)
- 编译生成目标文件(.obj) 目标文件是我们对一个源程序进行编译要得到的最终结果,此过程也会生成列表文件(.lst)和交叉引用文件(.crf)
- 连接形成包含相关的描述信息和二进制代码的可执行文件(.exe)
使用 Debug 跟踪程序的执行
程序加载后,DS 中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0,则程序所在的内存区的地址为 DS:0。
这个内存区的前 256 个字节存程序段前缀 PSP 作为数据区,DOS 用来和程序进行通信,从 256 字节处向后的空间存放的是程序。
代码段寄存器 CS 的值为
继续命令P(proceed)
类似于 T 命令,逐条执行指令、显示结果。但遇到子程序、中断等时,直接执行,然后显示结果
运行命令G(Go)
从指令地址处开始运行程序,直到遇到断点或者程序正常结束。
程序执行的不同方式
DOS 中执行
- DOS 启动后,计算机由“命令解释器”(程序 command.com)控制
- 运行可执行程序时,command 将程序加载入内存,设置 CPU 的 CS:IP 指向程序的第一条指令(即程序的入口),使程序得以运行。
- 程序运行结束后,返回到“命令解释器”, CPU 继续运行 command。
在 Debug 中执行
运行 Debug 时,command 程序加载 Debug.exe,debug 将程序加载入内存,程序运行结束后要返回到 Debug 中,使用 Q 命令推出 Debug,将返回到 command 中。
[] 和 ()
汇编语法规定 [] 表示一个内存单元,默认在 DS 中,偏移地址是 [] 中所包含的内容所代表的值。
约定 () 表示一个内存单元或寄存器中的内容,不能使用 "(段地址:偏移地址)" 的格式。
例如:
常量
约定符号 idata 表示常量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现