您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章汇编语言程序设计1
第四章汇编语言程序设计(assemblylanguageprogramming)§4.1汇编语言(assemblylanguage)一.概述汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应汇编:把汇编语言源程序翻译成机器语言目标程序的过程汇编语言源程序手工汇编或汇编程序机器语言目标程序汇编程序:用来完成汇编工作的程序,有小汇编ASM宏汇编MASM动态调试程序DEBUG二.汇编语言的语句格式:[名称]指令助记符[操作数][;注释]带方括号的项有时可没有,注释项完全可以没有每个部分用空格分开每行最多可有132个字符,但最好不要超过屏宽80语句可分成指令性语句和指示性语句(伪指令语句)指令性语句汇编后可生成机器码[标号:]指令助记符[操作数][;注释]指示性语句指示汇编程序处理一些工作[名称]伪指令(指示符)[操作数][;注释]1.名称(或称标识符)给指令或存储单元地址起的名字,由字母、数字、字符组成字母:A~Z,a~z数字:0~9字符:可打印+-*/=()[]〈〉;.'’,_:?@$&(非打印空格制表符TAB回车换行)(界符:,;:.()[]〈〉+-*/=?_@&$'’界符用来表示某个标志的结束)数字不能作名称的第一个字符,圆点.仅能作第一个字符保留字不能作标识符名称最长为31个字符当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号冒号隐含NEAR属性,例:供段内调用写成OUTPUT:OUTDX,AL供段间调用写成OUTPUTOUTDX,AL2.指令助记符8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开3.操作数指令执行的对象,可能有一、二个或没有名称指令助记符操作数注释RET;返回(无操作数)COUNT:INCCX;CX加1(1个操作数)MOVAL,BL;ALBL(2个操作数)伪指令可有多个操作数COSTDB3,4,5,6,7,8;(6个操作数,用逗号分开)操作数可以是常数、寄存器名、标号、变量、表达式,MOVAX,[BP+4];(第二个操作数为表达式)4.注释可选项,使程序易读,汇编时不作处理注释前面要加分号,它可位于操作数之后,也可位于行首三.常量与变量1.常量,也叫常数,没有属性的纯数,汇编时已确定的值·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号例:‘A’,“ABC”,汇编后变成41H,414243H2.变量,用于表达数值(或串)的标识符,有三个属性①段属性(SEGMENT)②偏移地址属性(OFFSET)③类型属性(TYPE),用DB、DW、DD定义§4.2伪指令(pseudo-instruction)一.符号定义伪指令1.等值EQU格式:符号名EQU表达式用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次DATAEQU1234;代表一个数XYZEQUALPHA[SI];代表一个地址2.等号=格式:符号名=表达式意义与EQU一样,但程序中可重新定义符号的值EMP=6;EMP代表6EMP=EMP+1;EMP现在代表73.解除PURGE格式:PURGE符号名(符号1,符号2,……,符号n)用于解除所定义的符号使该符号在以后的定义中有效例:原定义TABEQU5可用PURGETAB来解除然后可重新定义TABEQU10二.数据定义伪指令用于预置存储器或定义变量1.定义字节DB格式:[变量名称]DB表达式例:DATA1DB2,3,4,5;从DATA1单元开始存放4字节数据2.定义字DW格式:[变量名称]DW表达式例:TABDW1234H;TAB单元内容为34H,TAB+1单元内容为12H3.定义双字DD格式:[变量名称]DD表达式每个数据二字(四字节)低位部分在低地址,高位部分在高地址·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行DB/DW/DD用法1SUMDB?;给SUM单元分配一个字节,内容未定2TABDB20DUP(0);给TAB开始单元分配20字节,内容为03TIMEDW100DUP(?);给TIME开始单元分配100字,内容未定4ADDRDDTABLE;TABLE的地址(双字)给ADDR例:DATASEGMENTORG100HTABLEDB1,2,3,4ADDRDDTABLEDATAENDS假设汇编后DS=13A2H(如果ADDR用DW定义,只得偏移量)(如果TABLE是变量,ADDR得地址,是常量,ADDR得数值)5LETTERDB‘ABCDEFG’;将字符串以ASCII码形式填入LETTER开始的内存6HISDB3DUP(‘WELCOME!’,0DH,0AH);从HIS单元开始重复3次存放WELCOME!和回车换行符4.标号LABEL格式:标号名LEBEL类型标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用标号有三个属性段属性偏移量属性距离属性(即格式中的类型):NEAR(近程)和FAR(远程)NEAR:本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段FAR:本标号为段间标号,调用本标号提供偏移地址和段基址一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含如AGAINLABELNEARXORAX,BUFF[BX]可写成AGAIN:XORAX,BUFF[BX]例:ROOTLABELNEAR;以下程序所用的ROOT标号是段内属性100H01101H02102H03103H04104H00105H01106HA2107H13┇COMPPROCNEAR;以下程序所用的过程下的标号是段内属性TIMEPROCFAR;以下程序所用的过程下的标号是段间属性三.运算符1.算术运算符+、-、*、/、MOD即加、减、乘、除、除法取余数(如19MOD7=5)操作数是数字,结果也是数字存储器地址运算时只有加减,例TAB+2、BETA-5等2.逻辑运算符AND、OR、XOR、NOT即与、或、异或、非操作数是数字,结果也是数字例:ANDBX,DATAND0FEH3.关系算符EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于等于若关系是假结果为0,若关系是真结果为0FFFFH例:MOVBX,PADLT3则PAD的值小于3时,汇编成MOVBX,0FFFFH否则,汇编成MOVBX,04.分析运算符可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型5.合成算符由已存在的存储器生成一个段值与偏移量相同,而类型不同的新的存储器操作数以下讨论分析算符和合成算符1.取段基址SEG它加于一个变量或标号之前,回送段基址,例:ASSUMECS:SEGBEGIN;令CS为BEGIN程序段段基址MOVAX,SEGVARN;将VARN的段基址送AX2.取偏移量OFFSET它加于一个变量或标号之前,取其偏移量,例:MOVBX,OFFSETSUM;将SUM的段内偏移量存入BX3.取类型码TYPE它加于一个变量或标号之前,取其类型代码DBDWDDDQDTNEARFAR124810-1-2例:NG1DB‘A’,‘D’,3NG2DW88,265……MOVAL,TYPENG1;NG1定义字节,AL1MOVAL,TYPENG2;NG2定义字,AL24.取长度LENGTH它加于一个变量之前,取分配给变量的项数例:TABDB150DUP(?);150项,150字节FUMDW150DUP(?);150项,300字节则,MOVCX,LENGTHTAB;CX150MOVAX,LENGTHFUM;AX150·注意:LENGTH返回的存储区必须用DUP()来定义,否则返回为15.取字节数SIZE它加于一个变量之前,取回变量所占字节总数,有SIZE=LENGTH*TYPE由上例,LENGTHTAB=150,TYPETAB=1LENGTHFUM=150,TYPEFUM=2可知:SIZETAB=150SIZEFUM=300以上5个叫数值返回算符6.类型指示PTR格式:类型PTR地址表达式表示PTR右边的(存储器)操作数是左边的类型,有:BYTE、WORD、DWORD、NEAR、FAR例:INCBYTEPTR[BX];将BX指向的单元字节加1MOVWORDPTR[DI],99;立即数99送DI指向的字中JMPNEARPTRFOK;以近程方式跳转到FOK(只取FOK偏移地址)7.指定符THIS(合成算符)用于定义当前所指单元中的类型格式:THIS类型/距离经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性,例:FOOBEQUTHISBYTE;下面的字类型变量FOOW在这里指定为字节型FOOBFOOWDW120DUP(?)定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型访问FOOB时为字节操作,访问FOOW时为字操作FOOB/FOOWFOOB+3FOOW+4ADDAL,FOOB[3];将数组第四字节与AL相加MOVAX,FOOW[4]将数组第五六字节组成的字送AX也可以这样来构成FOOB:FOOBEQUBYTEPTRFOOW又例:DATAFEQUTHISFARDATAN:MOVAX,FOO这时JMPDATAN为近程转移JMPDATAF为远程转移8.段修改符:用于对某一地址表达式指定临时段基址,如MOVAX,ES:[BX];指定ES为BX的段基址,对当前指令有效9.短程符SHORT与NEAR、FAR功能类似,位移量一字节范围-128~+127,对应一条短转移指令例:JMPSHORTLAB;转移到标号LAB的地址10.方括号[]表示操作数(加方括号)是一个地址偏移量,不是数值格式:[表达式]或者[表达式][]例:MOV[BX],AX;将AX内容送BX所指单元MOV[BX+7],AX;将AX内容送BX+7所指单元MOVAX,[BX][SI];将BX+SI所指单元内容送AX11.取高/低字节HIGH/LOW用来分离常量的高/低字节,对存储器操作数无效例:DATAEQU789AHMOVAL,HIGHDATA;AL=78HMOVAL,LOWDATA;AL=9AH四.段定义伪指令1.SEGMENT—ENDS格式:[段名]SEGMENT[定位类型][联合类型][‘组名’]┇[段名]ENDS·段名·定位类型,给出实际段地点的种类或段长度的信息1PARA段起始地址从一个节(paragraph)的边界开始2BYTE段地址可从任意绝对地址开始3WORD段地址从任意一个字的边界开始4PAGE段地址从某一页的边界开始(一页等于256字节)5INPAG段长度小于一页·联合类型,程序中各程序段的连接和定位方法1PUBLIC将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖2COMMON将段名相同的程序段连接,各段都从同一地址开始3AT表达式段定位在由表达式(结果必须是常数)所指定的节的边界上例:AT1234H,则段地址被定位在物理地址为12340H处如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG5AT不能向前引用4STACK表示这个段是运行期间的堆栈段5MEMORY该段是相互连接的几个段中地址最高的段若没有说明联合类型,则本段与其他段无关,即NONE,不和别的段连接·‘组名’(classname),也叫类别名,加单引号,汇编后组名相同的程序段代码集中在一起定位,形成一个统一的物理段,组名可自定,约定的有CODE(代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等2.AS
本文标题:第4章汇编语言程序设计1
链接地址:https://www.777doc.com/doc-2195026 .html