汇编语言之基本结构
程序员文章站
2024-02-02 15:17:04
...
本篇文章主要是对汇编中的变量定义、符号定义、段定义各个部分进行说明,同时还将通过利用伪指令对繁琐的程序结构进行简化。
变量定义
一般变量定义需要定义在数据段,即如下:
DATAS SEGMENT
DATA DB 11H,33H
NUM DB "HELLO!"
#预分配空间
DATA2 DW ?
#重复定义
DATA1 DB 20 DUP(?)
#每个字节填充为30h
DATA1 DB 20 DUP(30H)
DATAS ENDS
以DATA1 DB 20 DUP(30H)
为例说明各个部分的含义:
DATA1
:自己定义的变量名DB
:这个指的是该变量的基本单位,常见的单位有:DB(1字节)/DW(2字节)/DD(4字节)/DQ(8字节)/DT(10字节)
DT后面定义的是10字节的压缩BCD数
20 DUP(30H)
表示将定义20个重复的数据,数据内容为30H
如果定义为DUP(?)则表示其内容不确定,一般是定义为缓冲区,用作数据的存储或接收
符号定义
其实符号定义类似于C语言中的宏定义,可以用作给命令取别名或者常用数据定义(回车换行)。符号定义会在编译时将对应的符号替换为指定的字符串,一般不要将符号名定义为关键字。一般定义在程序最前面,格式如下:
CR EQU 0DH;给“回车”符的ASCII码定义一个符号名
LF EQU 0AH;给“换行”符的ASCII码定义一个符号名
DATAS SEGMENT
TEST db 'THIS IS TEST',CR,LF,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
这里需要注意的是=
和EQU
的作用比较类似,主要区别就是不能用于EQU
重复赋值,例如:
EMP=7
EMP=EMP+2 ;这里操作之后,EMP将会变为9
;不能定义为如下
EMP EQU 7
EMP EQU EMP+2 ;这个操作是非法的
段定义
一般一个汇编程序至少需要数据段
、堆栈段
、代码段
才能正常运行,可能有的程序还有附加数据段
。逻辑段
的定义如下:
段名 SEGMENT [定位类型] [组合类型] [类别]
.....
段名 ENDS
[]
表示可选项,如果定义时不给出将由编译程序自己决定。
定位类型
用于告诉汇编程序,该逻辑段起始地址需要满足什么条件。
-
PARA
说明逻辑段从一个节(16字节)的边界开始,所以段的起始地址应该能被16整除 -
BYTE
说明逻辑段从字边界开始,即可以从任意地址开始 -
WORD
段地址必须能被2整除 -
PAGE
说明段地址从页边界开始,256字节为一页
组合类型
用于告诉汇编程序,当一个逻辑段装入储存器
-
NONE
表示本段与其他逻辑段不组合 -
PUBILC
表示具有相同段名的逻辑段,汇编时组成一个更大的逻辑段 -
STACK
与PUBLIC类似,不过只用于堆栈类逻辑段 -
COMMON
表示对于不同的程序段中使用COMMON
说明的同名逻辑段,相互重叠,重叠部分是最后一个逻辑段的内容 -
MEMORY
表示几个逻辑段组合时,当前逻辑段在地址最高的地方 -
AT表达式
可以指定段地址起始位置,例如:AT 8000H
表示本段段地址为8000H
类别
相同类别的程序段会被装入连续的内存
- ’CODE’
- ’STACK’
- ’自定义’
伪指令
设定段寄存器伪指令
assume cs:code,ds:data,es:edata,ss:stack
由于每个程序段最多允许有4个逻辑段(最大64kb),assume
指令用于告诉正在使用的各段的名字
子程序定义伪指令
ADD PRO [NEAR/FAR]
...RETADD
PRO ENDP
宏命令定义伪指令
宏命令名 MACRO [参数...]....ENDM
程序开始伪指令
END [标号]
END START
表示START
后的代码为程序执行的开始地址
利用伪操作简化汇编程序定义
一般的我们的程序都是定义为如下格式:
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
通过使用伪操作之后,程序结构可变为如下:
.model small ;指定模式大端小端,一般都是小端
.stack 100h ;指定堆栈段大小
.data ;定义数据段
test db 'abcd','$'
.code ;定义代码段
.startup
;代码
.exit 0
end
各个部分替换内容如下: