第二章 汇编语言与汇编程序§ 2.1 机器语言与汇编语言一.机器语言——机器只能识别二进制编码• 机器指令——机器能直接执行的一组二进制代码(命令)——该二进制代码称为机器码(Machine Code).如: 40HINC AX 01D8HADD AX,BX• 指令通常由两部分组成:操作码和操作数• 操作码——该指令的功能,即执行什么操作• 操作数——指令操作对象,指明参加操作的数或操作数的地址• 机器指令的集合 机器语言 用机器语言编写的程序 机器语言程序 二、汇编语言机器语言编写程序烦琐,难记忆,不易理解,易出错用一些助记符来表示指令的操作码,操作数亦用一些符号来表示符号指令如上:40HINC AX 01D8HADD AX, BX• 符号指令与机器指令一一对应• 符号指令的集合符号语言,又称汇编语言 用汇编语言编写的程序 汇编语言程序不能由计算机直接执行,必须将它翻译成机器语言程序翻译过程称汇编翻译程序为汇编程序• 汇编语言源程序 汇编 目标程序三、宏汇编程序MASM允许把一串指令定义为一条宏指令,有宏汇编功能。
如MASM系统程序宏汇编语言有三类基本指令:符号指令,伪指令,宏指令§2.2 常用伪指令与常用算符• 每一种计算机语言都规定了自己的符号系统及语法规则汇编语言也是如此,除符号指令外,还必须正确使用各种符号汇编中的各种符号由伪指令定义,或为汇编的保留字一、汇编语言源程序结构——单模块程序结构• 参见教材P、60一般 程序由三个段组成教材中程序的小写字母部分均为程序结构STACK SEGMENT STACKDW 32 DUP(?)STACK ENDSDATA SEGMENT:DATA ENDSCODE SEGMENTBEGIN PROC FARASSUME CS:CODE,SS:STACK,DS:DATAPUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AX:RETBEGIN ENDPCODE ENDSEND BEGIN• 因为连接程序为每一个用户程序建立了一个程序段前缀PSP,在PSP的开始处安排了一条INT 20H指令,执行该指令结束当前程序返回调用程序。
• 而PSP的地址,其段地址寄存在DS和ES中;偏移地址为0,将DS:0000地址进栈,即PSP地址进栈• PSP的长度为256个字节,即100H个单元,主要存放了装入程序与DOS连接的信息• 结束用户程序返回DOS有两种方法:其一:MOV AH ,4CH ;返回DOSINT 21H 其二:INT 20H ;返回调用程序,便于调试它的机器码是CD20H,当用DEBUG调用EXE文件时,在DS:0000单元中便可看到该指令• DOS在转移控制权时,将CS指向EXE程序的代码段,SS指向堆栈段,但DS和ES并不指向用户程序的数据段和附加数据段,而是指向PSP二 、 常用伪指令(P58)伪指令不产生机器代码,CPU也不会产生某种操作,它主要告诉汇编程序哪些是数据,哪些是指令,符号约定,程序从何处开始,何处结束,即为汇编控制命令伪指令很多,下面主要介绍段定义,过程定义1、段定义伪指令定义一个存储段,一个程序模块可由若干段组成格式:〈段名〉 SEGMENT [定位方式][组合方式][‘类别名’]…… 伪指令或指令〈段名〉 ENDS功能: 定义一个以“段名”为名称的存储段。
• 定位方式,组合方式,‘类别名’赋给段名的属性,三个可选项主要用于多模块化程序设计,以告诉LINK程序各模块间段如何定位,段与段如何组合,还可连接在一起一般单模块程序可省略• 段名给段取名,用来指出汇编程序为该段分配的存储区的起始地址,即段地址,为一常数,用SEG运算符取得• 定位方式相邻两段间应如何衔接,即对该段的起始地址所提出的要求定位方式有四种选择:(1)[PARA](节)规定段的起始地址总是16的整数倍,即低四位为零,省略时,系统隐含为此方式,教材中均默认为PARA方式2)WORD (字)规定段的起始地址总是2的整数倍,即低1位为零3) Byte(字节)规定段的起始地址总是1的整数倍,即能被1整除,任何地址可为段地址,不留空隙4)Page( 页)规定段的起始地址总是256的整数倍,即低8位为零• 组合方式——提供本段同其他段的组合关系,有6种选择方式1)[NONE]不选择表示本段与其他逻辑上不发生关系,尽管物理上可能相邻,但每段都有自己的段首址系统隐含该组合方式,单模块程序,各段之间不发生关系,采用不选择方式,教材中多数例题的数据段,代码段均为不选择方式。
2)PUBLIC公共将同段名,同类别名的段顺序相拼,是否留有空隙取决与定位方式3)STACK堆栈将同段名,同类名的段顺序相拼,不留空隙,长度相加,构成堆栈段一个程序模块中至少有一个段为STACK组合方式的段4)COMMON公用将同名段,同类别名的段相互覆盖,长度取决于最长的段5)AT表达式段地址为表达式的值6)MEMORY表示将本段定位在其他段的上面(即最高地址)• 类别名用单引号括起来的字符串,连接时将同类别名的所有段(段名可不同)存放在连续的存储区单模块程序可省略类别名2、假定伪指令格式:ASSUME〈段寄存器:段名〉,……功能:告诉汇编程序各段名与段寄存器的对应关系,一般在代码段中因为,存储器分段管理,程序中的存储单元用逻辑地址的偏移地址来寻址,而段地址一般默认,所以,代码段一开始就要对段 寄存器与段之间的关系做假定3、源程序结束伪指令格式:END [表达式]功能:源程序的最后一个语句,标志整个程序结束,即告诉汇编程序,汇编到此结束• 表达式为可选项,必须是存储器地址,即程序的启动地址,常为标号• 不带表达式的END结束的模块不能单独运行,为子模快4、子程序定义伪指令格式:〈子程序名〉PROC [NEAR]或FAR:RET〈子程序名〉ENDP• PROC……ENDP必须配对使用。
• 子程序名有标号属性,一般段内调用为NEAR或省略,段间调用为FAR• RET为子程序返回指令,返回调用主程序:段内:[SP] ↑ →IP,SP+2 →SP 段间:[SP] ↑ →IP,[SP+2] ↑ →cs,SP+4→SPSTACK SEGMENT STACKDW 32 DUP(?)STACK ENDSDATA SEGMENT:DATA ENDSCODE SEGMENTBEGIN PROC FARASSUME CS:CODE,SS:STACK,DS:DATAPUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AX:RETBEGIN ENDPCODE ENDSEND BEGIN三、常量(P34)1、常量 — 常数和符号常量—主要给变量赋初值或指令中立即数等• 常数—汇编中允许的常数有二进制,十进制,十六进制,字符串(ASCII码字符,用单引号表示,如:’ ABC’)• 符号常量—程序中可以给常数取名用EQU或“=“伪指令定义格式:〈标识符〉EQU〈表达式〉→数值表达式〈标识符〉=〈表达式〉例: AA EQU 10BB EQU 2*AA+3CC = 66MOV AX,AA ;AX=10MOV AX, BB ;AX=23MOV AX, CC ;AX=66注:AA,BB,CC为立即数。
2、 数值表达式—由常量与运算符组成的有意义的式子,结果为数值在MASM中允许对常量进行三种类型的运算:(1)算术运算—+,-,*,/,MOD(求余),SHR(右移),SHL(左移)如:AA EQU 10,则表达式→AA * 3+2 →32,可以作为操作数2)逻辑运算—AND,OR,XOR,NOT,按位运算· 注意:将运算符与指令相区别例:X EQU 0FFFFHMOV AX,5555HAND AX,X AND 0FFH; AX=0055H(3)关系运算—EQ(=),NE(≠),LT(<),GT(>),LE(≤),GE(≥)• 关系运算的结果为两个特殊常量0FFFFH(TURE),0(FALSE)四 、变量(P34)—变量是存储器中的数据或数据区的符号地址表示,即给存储单元取名1、变量的三个属性—∵存储器分段,变量有三个属性1)段属性—定义变量所在段的段首地址(一般为DS)2)偏移地址—变量偏离段首址的字节数,即段首址到变量定义语句的字节距离3)类型属性—存取该变量中的数据所需要的字节数类型:字节,字,双字,四字,十字节类型,一个数据分别占1,2,4,8,10个单元,其类型由定义的伪指令确定。
2 、变量的定义—一般在数据段或附加数据段中用伪指令定义格式:〈变量名〉DB〈表达式〉;定义BYTE字节变量〈变量名〉DW〈表达式〉;定义WORD字变量〈变量名〉DD〈表达式〉;定义DWORD双字变量〈变量名〉DQ〈表达式〉;定义QWORD四字变量〈变量名〉DT〈表达式〉;定义TBYTE十字节变量• EQU伪指令不分配存储单元,但变量定义伪指令要分配存储单元• 表达式确定了变量的初值· 表达式可以有以下几种形式:(1)常量或数值表达式存入数值2)ASCII字符串(若串长 ≥2,只能用DB定义,)存入ASCII码值3)?分配一个空单元,无确定值4)重复子句,格式:N DUP(〈表达式〉)重复N次,其值由表达式确定5)地址表达式→由常量,变量,标号,间址寄存器([BP],[BX],[SI],[DI])的内容和运算符等组成有意义的式子如一个变量名就是一个地址表达式可用DW或DD定义,若用DW则取它的偏移地址来初始化变量;若用DD则其偏移地址和段地址来初始化其变量• 若有多个表达式,用逗号分隔例:DATA SEGMENT ;段定义DT1 DB 10,3*20DT2 DB ’ ABC’,44H,45HDT3 DW 100H,-5DT4 DD 0FFFFHDT5 DB 0,?,?,?,0AA EQU $-DT1; $—汇编地址计数器, 记录当前汇编地址为14H。
DT6 DB 2 DUP(0,2 DUP(2,3))DT7 DW DT2DT8 DD DT4DATA ENDS存放示意:DT1 DT2 DT3 DT40A 3C 41 42 43 44 45 00 01 FB FF FF FF 00 00DT5 DT600 XX XX XX 00 00 02 03 02 03 00 02 03 02 03DT7 DT802 00 0B 00 DATAL DATAH• 从变量中取数据属于直接寻址方式,注意与符号常量区别例:MOV AX,AA ;立即寻址,AX=0014HMOV AX,DT3 ;直接寻址,AX=0100HMOV AL,DT2+2 。