为了更好的理解计算机的工作模式,这儿初略的介绍汇编语言,先看一段最简单的代码
.MODEL SMALL ;定义了最小模式,小模式将64kb的内存用于代码部分,另外64kb的内存用于数据部分
.STACK 64 ;堆栈段的开始,堆栈保持64个字节的存储空间
.DATA ;数据段的开始
DATA1 DB 52H ;
DATA2 DB 29H
SUM DB ?
.CODE ;代码段的开始
MAIN PROC FAR ;程序入口点
MOV AX, @DATA ;加载数据段地址
MOV DS, AX ;给DS赋值,任意段寄存器都不能被直接赋值
MOV AL, DATA1 ;得到第一个操作数
MOV BL, DATA2 ;得到第二个操作数
ADD AL, BL ;相加
MOV SUM, AL ;将结果存入sum单元
MOV AH, 4CH ;设置返回os
INT 21H
MAIN ENDP
END MAIN ;程序的出口点
看完这段代码,我们对汇编语言有了一个基本得认识,汇编语言与c语言不同在于汇编将代码段分离的很好,这样比较便于分析程序,这样也是很多程序员分析程序的时候会考虑将程序反汇编的原因。汇编的语法也非常严谨,有几点注意一下,段寄存器器不能够被直接赋值,比如我们给地址段DS赋值时是通过MOV AX, @DATA , MOV DS, AX实现的。还有代码段的结束方式与 C区别很大,比如代码段结束方式为 MOV AH, 4ch, INT 21H.
汇编语言有固定的格式
.MODEL SMALL
.STACK 64
.DATA
;定义数据
.CODE
MAIN PROC FAR ;程序的入口
MOV AX, @DATA ;加载数据段地址
MOV DS, AX ;赋值到DS
MOV AH, 4CH ;设置
INT 21H ;返回OS
MAIN ENDP
END MAIN ;程序的出口
基本按照这个模式写程序很难得出错
ORG 起始偏移,用于指定偏移地址的开始处
DB定义字节
DUP用来复制一定长度的字符
DW定义字
EQU用来定义一个不占内存位置的常量