汇编语言程序设计(七)


汇编程序设计(七)

汇编语言源程序:就是用户写的源代码
汇编程序:相当于编译器,将汇编语言翻译成机器语言

汇编语言源程序需要通过汇编程序才能翻译成机器语言目标程序

执行过程

  • 输入汇编语言源程序(EDIT) → 源文件.ASM
  • 汇编(MASM) → 目标文件.OBJ
  • 链接(LINK) → 可执行文件.EXE
  • 调试(TD) → 最终程序

汇编语言源程序

汇编语言语句类型

  • 指令性语句 → CPU执行的语句,生成目标代码
  • 指示性语句 → CPU不执行,汇编程序执行,不生成目标代码

汇编语言语句格式

指令性语句

[标号:] [前缀] 助记符 [操作数],[操作数] [;注释]

指示性语句

[名字/变量] 伪指令助记符 操作数[, 操作数, …] [;注释]

汇编语言语句的操作数

  • 寄存器
  • 存储器单元
  • 常量:数字和字符串常量
  • 变量:内存单元的符号地址
  • 表达式
    • 算数运算
    • 逻辑运算
    • 关系运算
    • *取值运算和属性运算
    • 其它运算

变量

属性

  • 段值:变量所在的段地址
  • 偏移量:变量所指单元的偏移地址
  • 类型:字节型、字型和双字型

表达式

取值运算符
OFFSET → 取得变量的偏移地址
SEG → 取得变量的段地址
属性运算符
PTR → 用于指定其后存储器操作数的类型

伪指令

指示性语句的核心就是伪指令助记符
伪指令语句不会被CPU执行,由汇编程序执行
作用

  • 定义变量
  • 分配存储区
  • 定义逻辑段
  • 指示程序开始和结束
  • 定义过程

常用伪指令

  • 数据定义伪指令
  • 符号定义伪指令
  • 段定义伪指令
  • 结束伪指令
  • 过程定义伪指令
  • 宏命令伪指令

数据定义伪指令

用来定义数据区中变量类型及其所占内存空间大小
格式
[变量名] 伪指令助记符 操作数,… [;注释]
:操作数的大小不能超过伪指令助记符所限定的范围
数据定义伪指令助记符

  • DB:定义变量为字节型
  • DW:定义变量为字类型
  • DD:定义变量为双字型
  • DQ:定义变量为4字型
  • DT:定义变量为10字型

:定义字符串必须用DB伪指令

重复操作符

当同样的操作数重复多次时,可以使用重复操作符,常用于声明一个数据区
格式
[变量] 伪指令助记符 n DUP (初值[,初值,…])

M1 DB 5 DUP (0)
意为定义一个Md1为首地址的5个字节单元,每个单元的初始值都为0

‘?’的作用

表随机值,用于预留存储空间

DW 20 DUP (?)
20个字单元,每个字单元的初值都是随机值

符号定义伪指令

用一个符号代替表达式
格式
符号名 EQU 表达式
操作:
用符号名取代表达式,不可重新定义,不占用内存空间

CONSTANT EQU 100

段定义伪指令

说明逻辑段的起始和结束,不同程序模块中同类逻辑段之间的联系形态
格式

1
2
3
段名 SEGMENT [定位类型] [组合类型] [‘类别’]
……
段名 ENDS

段名:逻辑段的段基地址
定位类型:逻辑段的起点
组合类型:装入内存时各逻辑段的组合方式
‘类别’**:链接时不同程序模块中的同类逻辑段将被装入连续存储区
**例

1
2
3
4
5
DATE SEGMENT
MEM1 DB 11H 22H
MEM2 DB 'Hello'
MEM3 DW 2 DUP (?)
DATA ENDS

设定段寄存器伪指令

说明所定义逻辑段的性质
格式:
ASSUME 段寄存器名:段名[,段寄存器名:段名,…]

结束伪指令

表示源程序结束
格式:
END [标号]

汇编语言源程序结构

1
2
3
4
5
6
7
8
9
10
11
12
13
数据段名 SEGMENT

数据段名 ENDS
附加段名 SEGMENT

附加段名 ENDS
堆栈段名 SEGMENT

堆栈段名 ENDS
代码段名 SEGMENT

代码段名 ENDS
END

过程定义伪指令

用于定义一个过程体
格式:

1
2
3
4
过程名 PROC [NEAR/FAR]
……
RET
过程名 ENDP

过程名:过程入口的符号地址

  • 若是近过程,NEAR可省略
  • 过程体的最后一条指令必须是RET

宏命令伪指令

:源程序中由汇编程序识别的具有独立功能的一段程序代码
需要多次使用同一程序段时,可以将该程序段定义为一个宏
格式:

1
2
3
宏命令名 MACRO <形式参数>
……
ENDM

调整偏移量伪指令

规定程序或变量在逻辑段中的起始地址,默认起始偏移地址为0
格式:
ORG 表达式
:表达式的值为非负常数

系统功能调用

BIOS:驻留在ROM中的基本输入/输出系统
DOS:磁盘操作系统
DOS/BIOS功能调用是调用系统内核子程序
DOS/BIOS功能都是通过中断方式调用
无论是调用DOS还是BIOS都可以简称为DOS中断BIOS中断

DOS软中断

DOS中断包括:设备管理,目录管理,文件管理,其它。
用中断类型码区分。

DOS软中断说明

  • 中断类型码固定为21H
  • 包含多个子功能的功能包
  • 各子功能用功能号区分

DOS功能调用格式

1
2
3
MOV AH,功能号
<相应参数>
INT 21H

单字符输入

从键盘输入
调用方法

1
2
MOV AH,01
INT 21H

输入的字符在AL中

字符串输入

由键盘输入一串字符,存储在字符输入缓冲区。
字符串输入功能号:
10
调用方法
AH ← 功能号
DS:DX ← 字符串在内存中的存放地址。
INT 21H

单字符显示输出

AH ← 功能号2
DL ← 待输出字符
INT 21H
例:

1
2
3
MOV AH,2
MOV DL,41H
INT 21H

字符串输出显示

AH ← 功能号09H
DS:DX ← 待输出字符串的偏移地址
INT 21H

  • 被显示的字符串必须以“$”结束
  • 所显示的内容不应出现非可见的ASCII码
  • 若考虑输出格式需要,在定义字符串后,加上回车符和换行符

返回操作系统(DOS)功能

功能号
4CH
调用格式:

1
2
MOV AH,4CH
INT 21H

功能

  • 程序执行完该2条语句后能正常返回OS
  • 常位于程序结尾处

Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC