欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言之基本结构

程序员文章站 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

各个部分替换内容如下:
汇编语言之基本结构

相关标签: 汇编语言 masm