8086汇编语言(一) 汇编语言源程序

汇编语言源程序

1. 汇编语言源程序结构

  一个完整的汇编语言源程序通常由若干个逻辑段(Segment)组成, 包括数据段、附加段、堆栈段和代码段,它们分别映射到存储器中的物理段上。每个逻辑段以 SEGMENT语句开始, 以 ENDS语句结束,整个源程序用END语句结尾。
  代码段中存放源程序的所有指令码, 数据、变量等则放在数据段和附加段中。程序中可以定义堆栈段,也可以直接利用系统中的堆栈段。具体一个源程序中要定义多少个段应根据实际需要来定。但一般来说,一个源程序中可以有多个代码段, 也可以有多个数据段、附加段及堆栈段, 但一个源程序模块只可以有一个代码段、一个数据段、个附加段和一个堆栈段。将源程序以分段形式组织是为了在程序汇编后,能将指令码和数据分别装入存储器的相应物理段中

2. 源程序结构框架

段名1 SEGMENT
...
段名1 ENDS
段名2 SEGMENT
...
段名2 ENDS
...
段名n SEGMENT
...
段名n ENDS

3. 语句类型和格式

(1). 指令性语句的一般格式
[标号] : [前缀] 操作码 [操作数1, 操作数2] [;注释]

“[ ]” 括起来的内容可以省略, 操作数可以有2个、1个和没有。

(2). 指示性语句的一般格式
[名字] [伪操作] 操作数1, 操作数2, ... [;注释]

“[ ]” 括起来的内容可以省略。

4. 数据项

(1). 常量
常量类型表示举例
十进制常量以字母 “D” 结尾或不加结尾52D, 52
二进制常量以字母 “B” 结尾1011B
十六进制常量以字母 “H” 结尾5CH
字符常量用单引号括起的一个或多个ASCII字符码’DD’
(2). 标号 LABLE

  指令的标号由程序员确定, 不能与指令助记符或伪指令名, 也不能由数字打头, 字符个数不能超过31个。
  标号有3种属性: 段值、偏移量和类型。

(3). 变量

  变量是存储器中的某个数据区的名字, 变量的类型有:

类型长度表示
字节8位BYTE
16位WORD
双字32位DWORD
四字64位QWORD
十节字80位TBYTE
(4). 表达式

  表达式不是指令, 本身不能执行, 在程序执行时, 表达式本身是一个有确定值的操作数。

运算符符号
+
-
*****
/
取余MOD
AND
OR
NOT
异或XOR
等于EQ
不等于NE
小于LT
大于GT
小于等于LE
大于等于GE
(5). 运算符
名字运算符作用例子
取偏移地址运算符OFFSET取标号或变量的偏移地址MOV SI, OFFSET DATA1
取段地址运算符SEG取标号或变量的段地址MOV AX, SEG DATA1
属性运算符PTR指定其后面存储器操作数的类型MOV AL, BYTE PTR [SI]
方括号运算符[ ]表示存储器操作数, 括号中的内容表示操作数的偏移地址
段重设运算符:用来指定一个存储器操作数的段属性而不管原来隐含的段MOV AX, ES:[SI]
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - **面向特定体系结构**:汇编语言是为特定计算机体系结构(如x86、ARM、MIPS等)设计的,每种体系结构都有其专属的汇编语言。这意味着汇编程序通常不能直接在不同类型的处理器上运行,不具备源代码级别的可移植性。 2. **指令与操作码**: - **助记符表示**:汇编语言使用助记符(mnemonics)来代表特定的机器指令,这些助记符往往与指令的功能相关,如`MOV`(移动数据)、`ADD`(加法)、`JMP`(跳转)等。每个助记符对应一个特定的二进制操作码。 3. **低级操作**: - **直接硬件控制**:汇编语言允许程序员直接操控硬件资源,如寄存器、内存地址、I/O端口等,这使得它非常适合编写对时间和空间效率要求极高、需要精确控制硬件的程序,如设备驱动、实时系统内核、性能关键算法等。 4. **代码效率**: - **紧凑的代码**:汇编程序生成的目标代码通常比高级语言编译后的代码更为紧凑,占用内存较少。 - **快速执行**:由于直接对应于机器指令,汇编程序在执行时无需经过复杂的解释或编译过程,能够快速、高效地被执行。 5. **编写与调试难度**: - **复杂性高**:编写汇编程序需要深入了解计算机体系结构和指令集细节,即使是简单的任务也可能需要大量的指令。此外,程序逻辑的表述不如高级语言直观,容易出错且难以阅读和维护。 - **调试挑战**:由于代码高度依赖具体的硬件状态,调试汇编程序可能非常困难,尤其是在处理复杂的控制流、数据依赖性和异常处理时。 6. **工具支持**: - **汇编器**:汇编语言代码通过汇编器(assembler)转换成机器语言(机器码或二进制码),汇编器负责将助记符和符号地址解析为具体的机器指令和物理地址。 - **链接器**:生成的机器码通常需要链接器(linker)进行链接,将多个目标文件合并为一个可执行文件,同时解决外部符号引用。 ### 应用场景与优势 汇编语言主要应用于以下几个方面: - **系统级编程**:操作系统内核、设备驱动、中断服务程序等底层软件开发,这些领域要求对硬件有精细控制,且性能要求高。 - **性能优化**:在高级语言编写的程序中,对性能敏感的部分可以用汇编重写以提升效率。 - **反病毒与安全研究**:理解和编写汇编代码有助于分析恶意软件行为、逆向工程及编写防病毒软件。 - **教学与理解计算机原理**:学习汇编语言有助于深入理解计算机体系结构、指令集、内存管理和硬件接口等基础概念。 ### 编程特点与挑战 - **手动管理内存**:程序员需要手动分配和释放内存,跟踪数据在内存中的位置,处理堆栈、堆和静态内存区域。 - **无高级抽象**:缺乏高级语言中的类、对象、函数库等高级抽象概念,所有编程结构如循环、条件分支等都需要手工实现。 - **依赖特定硬件**:汇编程序直接依赖于特定处理器的指令集、寄存器组织和寻址模式,更换硬件平台通常意味着重新编写代码。 尽管汇编语言具有上述挑战,但它在特定场景下提供了无可比拟的优势,如极高的执行效率、对硬件资源的精确控制以及在安全和反病毒领域的应用。随着编译器技术的进步,许多高级语言也能生成高效的目标代码,但在某些对性能和硬件控制有严格要求的情况下,汇编语言仍然是不可或缺的工具。
8086汇编中显示系统时间,需要使用DOS中断来获取系统时间。具体步骤如下: 1. 定义一个日期时间结构体: ``` ;日期时间结构体 DATETIME STRUCT year db ? month db ? day db ? hour db ? minute db ? second db ? DATETIME ENDS ``` 2. 使用DOS中断21h来获取系统时间,将获取到的日期时间信息存储到结构体中: ``` ;获取日期时间 MOV AH, 02CH ;DOS中断21h的功能号 INT 21H ;调用DOS中断 MOV DATETIME.year, CH MOV DATETIME.month, CL MOV DATETIME.day, DH MOV DATETIME.hour, AL MOV DATETIME.minute, AH MOV DATETIME.second, DL ``` 3. 将日期时间信息转换为可读的字符串格式: ``` ;转换日期时间为字符串格式 MOV AH, 2 ;DOS中断21h的功能号 MOV DL, DATETIME.second INT 21H ;将秒数转换为两个ASCII码字符 MOV BYTE PTR [TIME_STR+7], DL MOV DL, DATETIME.second / 10 ADD DL, 30H MOV BYTE PTR [TIME_STR+6], DL MOV DL, DATETIME.minute INT 21H ;将分钟数转换为两个ASCII码字符 MOV BYTE PTR [TIME_STR+4], DL MOV DL, DATETIME.minute / 10 ADD DL, 30H MOV BYTE PTR [TIME_STR+3], DL MOV DL, DATETIME.hour INT 21H ;将小时数转换为两个ASCII码字符 MOV BYTE PTR [TIME_STR+1], DL MOV DL, DATETIME.hour / 10 ADD DL, 30H MOV BYTE PTR [TIME_STR], DL ``` 4. 最后将生成的时间字符串输出到屏幕上: ``` ;输出时间字符串 MOV AH, 09H ;DOS中断21h的功能号 MOV DX, OFFSET TIME_STR INT 21H ;输出时间字符串 ``` 完整代码如下: ``` ;8086汇编显示系统时间 .MODEL SMALL .STACK 100H ;日期时间结构体 DATETIME STRUCT year db ? month db ? day db ? hour db ? minute db ? second db ? DATETIME ENDS .DATA TIME_STR DB " : : ",0 .CODE MAIN PROC ;获取日期时间 MOV AH, 02CH ;DOS中断21h的功能号 INT 21H ;调用DOS中断 MOV DATETIME.year, CH MOV DATETIME.month, CL MOV DATETIME.day, DH MOV DATETIME.hour, AL MOV DATETIME.minute, AH MOV DATETIME.second, DL ;转换日期时间为字符串格式 MOV AH, 2 ;DOS中断21h的功能号 MOV DL, DATETIME.second INT 21H ;将秒数转换为两个ASCII码字符 MOV BYTE PTR [TIME_STR+7], DL MOV DL, DATETIME.second / 10 ADD DL, 30H MOV BYTE PTR [TIME_STR+6], DL MOV DL, DATETIME.minute INT 21H ;将分钟数转换为两个ASCII码字符 MOV BYTE PTR [TIME_STR+4], DL MOV DL, DATETIME.minute / 10 ADD DL, 30H MOV BYTE PTR [TIME_STR+3], DL MOV DL, DATETIME.hour INT 21H ;将小时数转换为两个ASCII码字符 MOV BYTE PTR [TIME_STR+1], DL MOV DL, DATETIME.hour / 10 ADD DL, 30H MOV BYTE PTR [TIME_STR], DL ;输出时间字符串 MOV AH, 09H ;DOS中断21h的功能号 MOV DX, OFFSET TIME_STR INT 21H ;输出时间字符串 MOV AH, 4CH ;DOS中断21h的功能号 INT 21H ;程序结束 MAIN ENDP END MAIN ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值