第四章汇编语言程序设计汇编语言程序设计概述汇编语言基本语法汇编语言程序设计BIOS及DOS功能调用汇编语言程序设计实 例3.汇编语言(AssemblyLanguage)汇编语言是一种面向机器的语言,它采用助记符来表示机器指令,助记符通 常是一组英文缩写,可以较方便地进行程序编写、阅读和修改。(2)字符型常量:用于表示单个字符或符号串,常用引号括起来。引号中的每 个符号都是以ASCII码的形式表示,并占用一个字节存储空间。单字符用单引号,多字符用双引号。如: hello DB "HELLO WORLD!" ch DB ''Y'',''N'',12H digital DB "123456"格式:[变量名]DB/DW /DD/DQ/DT表达式功能:为变量分配1字节/字/双字/四字/五字的存储单元,并给它们赋值。说明:使用这些伪指令可以定 义数值、字符串、数组等。如:汇编语言程序设计概述程序设计语言1.机器语言(MachineLanguage) 机器语言是一种用二进制表示的、能够被计算机直接识别的程序设计语言。2.高级语言(HighLevelLanguage) 高级语言是一种较接近自然语言的英文语句和数字表达式表示的编程语言。4.宏汇编语言(MacroAssemblyLan guage)增加伪指令、宏指令等语句构成的汇编语言。汇编语言源程序汇编语言源程序是用汇编语言语句编写的程序文本,通 常以.ASM作为扩展文件名汇编语言源程序为分段式程序结构,由若干段(Segment)组成汇编语言程序中的段是一个逻辑上的段,与 CPU管理的物理内存段有一定区别,但又有很紧密的联系有两种不同的段定义形式:完整段定义和简化段定义。写法不同,实质一样完整段 程序结构STACK_SEG SEGMENT ;堆栈段,段名为STACK_SEG DW 256 DUP(?) ;分配堆 栈段的大小为256个字 TOP LABEL WORD ;堆栈栈顶位置STACK_SEG ENDSDATA_SEG SEGMENT ;数据段,段名为DATA_SEG STRINGDB''LetMEhaveatry!'',''$'' ;定义字符串数据DATA_SEG ENDSCODE_SEG SEGMENT ;代码段,段名为CODE_SEG ASS UMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGSTART:MOV AX,DATA_SE G ;程序执行起始点 MOV DS,AX ;将段寄存器指向用户数据段 MOV AX,STACK_SEG MOV SS,AX ;将堆栈指针指向用户定义堆栈 MOV SP,OFFSETTOP LEA DX,STRING M OV AH,9 ;系统功能调用,在CRT显示字符串 INT 21H MOV AH,4CH ;系统功能调用,程序结束 返回操作系统 INT 21HCODE_SEG ENDSEND START ;汇编结束,程序起始点为START 堆栈段数据段代码段完整段程序结构DATA SEGMENT…DATA ENDSEXD SEGMENT …EXD ENDSSTACK1SEGMENTSTACK…STACK1ENDS几个段构成,可由数据 段、代码段、堆栈段或附加数据段组成,至少要有代码段。代码段必须有汇编起始标号(START),程序结束伪指令END。LINK能正 确地设置CS和IP值、SS和SP值LINK不设置DS和ES值。START:MOV AX,DATA ;入口 MOV DS,A X;段寄存器初始化 …… MOV AX,EXD MOV ES,AX CODE SEGMENTASSUME CS:CODE,DS:DATAASSUMEES:EXD,SS:STACK1…… MOV AH,4CH INT 21H ;出口CODE ENDS END START ;程序结束【例】将两个4字节的十六进制数相加,其结果保存到第三个4字 节数中。DATA SEGMENT ;定义一个名为DATA的段 X DB 34H,89H,0FH,02H Y DB 88H,96H,0DFH,75H Z DB 4DUP(?)DATA ENDS ;DATA 段定义结束STAK SEGMENT STACK ;定义一个名为STACK的段 DW 100DUP(?)S TAK ENDS ;STACK段定义结束CODE SEGMENT ;定义一个名为CODE的段 ASSUMEC S:CODE,DS:DATA,SS:STAK;分配段寄存器 START: MOV AX,DATA ;初始化段寄存器地址开始 MOV DS,AX MOV AX,STAK MOV SS,AX ;初始化段寄存器地址结束 MOV CX,4 LEA BX,X LEA SI,Y LEA DI,Z CLC LOOP1: MOV AL,[BX] ADC AL,[SI] MOV [DI],AL INC BX INC SI INC DI LOOP LOOP1 MOV AH,4CH ;返回DOS操作系统 INT 2 1H CODE ENDS ;CODE段定义结束 END START ;程序结束简化段程序结构引入 简化段的主要目的是简化源程序中段描述指令,提高程序编写效率,它与完整段程序只是描述形式不同。.MODEL模式名 ;定义程序 模式(SMALL、LARGE等).DATA ;数据段定义开始 …… ;变量定义及数据空间预置.STACK 20 48 ;堆栈段定义(默认1KB空间,可自己定义大小).CODE ;代码段定义开始.STARTUP ;代码段入口标志 …… ;程序代码内容.EXIT ;返回DOS操作系统 …… ;子程序定义END ;程序结束简化段程序中需要 声明使用的存储模式,以便生成合适的可执行文件;完整段程序无此设置,但需要通过各段定义时选择参数来描述段的特性。简化段程序中所有段 定义都使用了专用的保留字伪指令直接标识,不再由用户逐一描述。简化段程序中程序的起始位置由.STARTUP伪指令指明。简化段程序 中不需要对段寄存器进行分配。简化段程序中不需要对段寄存器进行初始化设置。简化段程序返回DOS操作系统使用.EXIT伪指令,不需 要使用INT21H指令。简化段程序结束只需要使用END伪指令即可。简化段程序与完整段程序的主要区别【例】将前例中的程序改 写为简化段程序代码如下:.MODELSMALL ;声明存储模式为SMALL.DATA ;定义数据段 X DB 34H,89H,0FH,02H Y DB 88H,96H,0DFH,75H Z DB 4DUP(? ).STACK ;定义堆栈段(默认1KB大小).CODE ;定义代码段.STARTUP ;程序入口 MOV CX,4 LEA BX,X LEA SI,Y LEA DI,Z CLCLOOP1: MOV AL ,[BX] ADC AL,[SI] MOV [DI],AL INC BX INC SI INC DI LOOP LOOP1.EXIT ;返回DOS操作系统 END ;程序结束汇编语言程序开发过程汇编语 言程序是一种符号化的语言程序,不能直接提供给计算机执行,需要经过汇编以后才能够转换成机器语言。另外由于操作系统加载的需要,还要通过 连接完成相关文件结构和重定位信息的生成,才能供计算机执行。①编辑②汇编③连接④调试运行用编 辑工具软件编写汇编语言源程序代码(.ASM文件)用汇编程序MASM对编写好的源程序代码进行汇编,转换成机器指令,生成.OBJ目标 文件用连接工具LINK对已转换的目标文件进行连接,生成可执行.EXE文件执行程序,观察运行结果。如果发现不正确则重复步骤①~ ④进行调试,直到得到正确结果EXAM.ASMASCII源程序EXAM.OBJ可选EXAM.LSTEXAM.CRF机 器码目标程序MASM.EXE汇编汇编程序EXAM.EXEEXAM.COMLINK.EXE连接连接程序可执行程 序指令性语句——由指令构成 [标号:] 操作码 [操作数] [;注释] 如: START: MOV AX,DATA指示 性语句——由命令(伪指令)构成 [名字] 伪指令 [参数] [;注释] 如: DATA SEGMENTAT 2000 H DATA ENDS汇编语言的基本语法汇编语言语句类型及格式当存储单元中的数据在程序运行中随时可以修改时,这个 数据就可以用变量来定义。为了便于对这个变量的访问,要给这个变量取一个名字,称为变量名。定义变量可以使用数据定义伪指令,格式如下: 变量名变量定义伪指令表达式1,表达式2,……【例】 VARl DB 12H,34H VAR2 DW 1234H,56 78H VAR3 DD 12345678H VAR4 DQ 1122334455667788H VAR5 DT 001122 33445566778899H汇编语言的变量、常量、标号和表达式变量变量具有三个属性:字节 DB (8位)一个字节存 贮单元字 DW (16位)二个连续字节存贮单元双字 DD (32位)四个连续字节存贮单元四字 DQ (64位)八个连续 字节存贮单元五字 DT (80位)十个连续字节存贮单元段属性:段地址,内存地址由段地址加偏移地址构成。因此,存放在内存中 的程序或数据都必须属于某个段才能够被访问。偏移地址:段内地址,在定义变量时使用的变量名,就是变量在段中的起始地址。 变量类 型:变量所在存贮单元的类型,由伪指令指定。(1)数值常量:直接用数字进行表示的常量。 二进制:10000100B、111100 01020100B 十进制:12356D 十六进制:12ABH、0F56AH(字母打头前面必须补0)如: MOV AX ,100D MOV BL,0FAH MOV CL,10101000B常量(3)符号常量:用标识符(常量名)表示的常量 ,可以被看作是被命名了的一个数值或其他标识符。命名规则: 1~31个ASCII码字符 A~Z、a~z、0~9、?、@、$及下 划线构成。 ?不能单独作为标识符。 不能是独立的保留字或运算符。 数字不能作为第一个字符。合法标识符: STA_124$ MOV_? @103非法标识符: STA+124$ MOV ?常量符号常量定义格式: 常量名= /EQU表达式【例】 R = 30 PAI EQU 3.1415 CC EQU 1000101 0B 在程序中,可以在任何需要使用圆周率的位置使用PAI这个符号常量来代替3.1415,用R来代替圆的半径。当需要修改 程序中圆半径或圆周率精度时只需要修改R和PAI的常量定义语句即可,从而改善程序的可读性,便于程序修改和调试。常量= 可重复定义EQU不可重复定义标号是指令性语句存放地址的符号表示。标号也有三个属性,即段地址、偏移地址和距离。 常用于指令的转移和子程序调用。标号定义格式:【例】 MOV CX,10HLOOP1: MOV AL,[SI] ;定义LO OP1标号 MOV [DI],AL INC SI INC DI LOOP LOOP1 ;循环执行到LOOP1 标号名称: 汇编指令语句标号(标识符)距离属性有NEAR和FAR两种,可通过LABEL定义: 标号名称 LABEL距离表达式是操作数的常见形式。表达式由常量、变量、标号及连接它们的运算符组成。表达式不会出现在最终的程 序代码中。MASM汇编程序可以使用两种表达式,即数值表达式和地址表达式。(1)数值表达式:一般由运算符连接各种常量构 成。MASM支持的常量运算符包括算术运算符、逻辑运算符和关系运算符。表达式①算术运算符包括加(+)、减(-)、 乘()、除(/)、取模(MOD,求余数)、左移(SHL,相当于乘法),右移(SHR,相当于除法)等7种运算符。如: num DW 08H,32H+(55HSHR2) MOV DX,1234HMOD1000H②逻辑运算符包括与(AN D)、或(OR)、非(NOT)和异或(XOR)等4种运算符。●逻辑运算符只能对常数(或相当于常数,如数值表达式)进行运算。如 : MOVCX,AXAND10H ;错误指令 MOVBX,NOT55H ;正确指令●逻辑运算 符与逻辑运算指令的操作符相同,但出现在指令中的位置不同。逻辑运算指令的操作符出现在指令的助记符部分,而逻辑运算符出现在指令的操作数 部分。如: ANDDL,7FHAND80H XOR AH,(10HXOR0AAH)OR(32HAN D55H)表达式③关系运算符包括相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大 于或等于(GE)等6种运算符。●关系运算符只能对常数(或相当于常数,如数值表达式)进行运算,参加运算的两个数是无符号数。● 当关系成立时,其结果为全1,否则为全0。如: MOV DX,10LT100由于10小于100成立,因此,该指 令汇编后得到的代码为 MOVDX,0FFFFH●关系运算符可以和逻辑运算符组合起来使用。如: MOV BX,(( VALUELT5)AND20)OR((VALUEGE5)AND30)表达式(2)地址表达式地址表达 式的结果是一个存储单元的地址。当某个标号表示的地址中存放的是数据时,称为变量;当该标号表示的地址中存放的是指令时,则称为程序标号。 如果指令中的操作数需要用到地址表达式时,应注意其物理意义。比如将两个地址作乘/除操作就没有意义,对不同段数据的地址相加减当然也没有 意义。常用的地址表达式是“标号+/-数字”的形式。如: MOVAX,VAR+4;VAR+4为地址表达式,表示VA R后面4处的地址值表达式表达式中可以使用的运算符有6类,它们是算术运算符、逻辑运算符、关系运算符、分析运算符、合成 运算符、其它运算符等。当多种运算符同时出现于一个表达式中时,这些运算符将按照一定的优先级由高向低排列执行。表达式高 优先级低1括号()和[]2LENGTH,SIZE,WIDTH,MASK3PTR,OFFSET,SEG ,TYPE,THIS4,/,MOD5+,-6EQ,NE,LT,LE,GT,GE7NOT8AN D9OR,XORVARB DB 12H ;定义字节变量VARB为12HVARW DW 1234H ;定义字 变量VARW为1234HVARD DD 12345678H ;定义双字变量VARD为1345678H汇编语言程序伪指令( 指示性语句)变量定义和属性伪指令变量定义伪指令12H起始地址+634H起始地址+556H起始地址+478H 起始地址+3VARD12H起始地址+234H起始地址+1VARW12H起始地址+0VARB还可以用变量定义字符 串等数据,如: STRINGA DB “HELLOWORLD!” DATAW DW “AB”,“CD” DATAD DD “WXYZ”‘W’起始地址+19‘L’起始地址+9‘X’起始地址+18‘R’起始地址+8‘Y’起始地址+ 17‘O’起始地址+7‘Z’(DATAD)起始地址+16‘W’起始地址+6‘C’起始地址+15‘’起始地址+ 5‘D’起始地址+14‘O’起始地址+4‘A’起始地址+13‘L’起始地址+3‘B’(DATAW)起始地址+1 2‘L’起始地址+2‘!’起始地址+11‘E’起始地址+1‘D’起始地址+10‘H’(STRINGA)起始地址 +0格式:重复次数DUP(重复定义的内容)功能:与变量定义指令配合,用于重复定义数据。说明:重复次数用于说明需要定 义多少次括号中的重复定义的内容,常用于为变量预留存储空间。如:ST1DB10DUP(0) ;定义ST1为10 个值为0的字节ST2DW2,2DUP(?) ;定义ST2为1个值2和2个不确定数值的字ST3DB2DUP(0,1,2,3) ;定义ST3为0,1,2,3,0,1,2,3共8个字节DUP重复子句伪指令ST100??00??00??00??00ST30000010002000300000001ST202020003在数据定义中变量具有5种属性,可以用伪指令来获得变量的相关属性信息。①段属性 格式:SEG变量 功能:获得该变量所在的段地址值。 如:MOVBX,SEGvar1②偏移地址属性 格式:OFFSET变量 功能:获得变量所在段中的偏移地址值。 如:MOVCX,OFFSETvar2③类型属性 格式:TYPE变量 功能:获得变量定义的类型。类型以字节的整数倍表示,字节型TYPE结果为1,字型TYPE结果为2,双字型TYPE结果为4,8字节型TYPE结果为8,10字节型TYPE结果为10。NEAR型TYPE结果为FFFFH,FAR型TYPE结果为FFFEH变量属性伪指令 |
|