8086 汇编学习 Part 3

汇编语言程序

用汇编语言编写程序的工作过程

汇编指令对应有机器码的指令,可以被编译为机器指令,最终被 CPU 执行。
伪指令是没有对应的机器码的指令,最终不被 CPU 所执行。
伪指令由编译器来执行,编译器根据伪指令来进行相关的编译工作。
汇编程序是包含汇编指令和伪指令的文本。
程序返回是程序结束运行后,将 CPU 的控制权交还给它得以运行的程序(常为DOS系统)

伪指令的种类

段定义

  • 一个汇编程序是由多个段组成的,这些段被用来存放代码和数据或当作栈空间来使用
  • 一个有意义的汇编程序至少要有一个段,这个段用来存放代码。
  • 定义程序中的段,每个段都需要有段名
  段名 segment ;段的开始
  段名 ends ;段的结束

END

汇编程序的结束标记。若程序结尾处不加 end ,编译器在编译程序时,无法知道程序在何处结束。

ASSUME (假设)

含义是假设某一段寄存器和程序中的某一个用 SEGMENT ... ENDS 定义的段相关联
ASSUME CS:CODESG 指 CS 寄存器与 CODESG 关联,将定义的 CODESG 当作程序的代码段使用。

源程序编译

源程序文件经过工具软件编译连接后,生成可执行文件包含指令机器码和描述程序有关整体特征的数据。

汇编程序的结构

  1. 在 Debug 中直接写入指令编写的汇编程序
    • 适用于功能简单、短小精悍的程序
    • 只需要包含汇编指令即可
  2. 单独编写成源文件后再编译为可执行文件的程序
    • 适用于编写大程序
    • 需要包括汇编指令,还要有指导编译器工作的伪指令
    • 源文件由一些段构成,这些段存放代码、数据,或将某个段作为栈空间

从源程序到可执行文件

  1. 文本编辑源程序文件 (.asm)
  2. 编译生成目标文件(.obj) 目标文件是我们对一个源程序进行编译要得到的最终结果,此过程也会生成列表文件(.lst)和交叉引用文件(.crf)
  3. 连接形成包含相关的描述信息和二进制代码的可执行文件(.exe)

使用 Debug 跟踪程序的执行

程序加载后,DS 中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0,则程序所在的内存区的地址为 DS:0。
这个内存区的前 256 个字节存程序段前缀 PSP 作为数据区,DOS 用来和程序进行通信,从 256 字节处向后的空间存放的是程序。
代码段寄存器 CS 的值为 \(DS+10H\),CX 中存放代码的长度(字节)

继续命令P(proceed)

类似于 T 命令,逐条执行指令、显示结果。但遇到子程序、中断等时,直接执行,然后显示结果

运行命令G(Go)

从指令地址处开始运行程序,直到遇到断点或者程序正常结束。

程序执行的不同方式

DOS 中执行

  1. DOS 启动后,计算机由“命令解释器”(程序 command.com)控制
  2. 运行可执行程序时,command 将程序加载入内存,设置 CPU 的 CS:IP 指向程序的第一条指令(即程序的入口),使程序得以运行。
  3. 程序运行结束后,返回到“命令解释器”, CPU 继续运行 command。

在 Debug 中执行

运行 Debug 时,command 程序加载 Debug.exe,debug 将程序加载入内存,程序运行结束后要返回到 Debug 中,使用 Q 命令推出 Debug,将返回到 command 中。

[] 和 ()

汇编语法规定 [] 表示一个内存单元,默认在 DS 中,偏移地址是 [] 中所包含的内容所代表的值。
约定 () 表示一个内存单元或寄存器中的内容,不能使用 "(段地址:偏移地址)" 的格式。
例如:\((ax) = 0010H (21000H) = 0010H\)

常量

约定符号 idata 表示常量

posted @ 2024-04-07 00:12  AlwaysBeShine  阅读(3)  评论(0编辑  收藏  举报