




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第4章章 80 x86汇编语言程序设计汇编语言程序设计n第一节第一节 汇编语言概述汇编语言概述n第二节第二节 汇编语言语句的组成汇编语言语句的组成n第三节第三节 汇编语言的语句汇编语言的语句n第四节第四节 宏汇编指令宏汇编指令n第五节第五节 编写完整的汇编语言程序编写完整的汇编语言程序n第六节第六节 汇编语言程序设计汇编语言程序设计第一节第一节 汇编语言概述汇编语言概述DATASEGMENTSTRING DBHELLO WORLD!, 0DH, 0AH, $DATAENDSCODESEGMENTASSUMECS:CODE, DS:DATABEGIN:MOVAX, DATAMOVDS, AX;
2、初始化数据段的段地址MOVAH, 09HLEADX, STRING;输出字符串INT21HMOVAH, 4CHINT21H;调用4CH号系统功能返回DOSCODEENDSENDBEGIN 数据段代码段一个简单的8086系统下的汇编语言程序:第二节第二节 汇编语言语句的组成汇编语言语句的组成汇编语言程序的语句中包含的元素 :l字符集l保留字与标识符l常量、变量与标号l表达式及运算符一、字符集一、字符集允许使用的字符:l字母,包括大写字母AZ和小写字母az;l数字,包括09;l特殊字符,包括:+ - * / =() ; , “ . :? $ & 及空格、制表符、回车、换行等。注意:l除了字
3、符串,字母都是不区分大小写l一系列相连的空格、制表符效果相当于一个空格l一系列相连的回车换行相当于一次回车换行l分号“;”后一直到行尾的内容都是注释l字符“&”若用于某行的开头,则表示该行是上一行的续行二、保留字与标识符二、保留字与标识符1、保留字、保留字在汇编语言中有特定意义的词,可分为:指令助记符及指令前缀如:MOV、ADD、REP等寄存器名如:AX、EBX、CL等伪指令助记符如: DB、SEGMENT等其他保留字,包括运算符、操作符等如: EQ、LT、OFFSET、SEG等2、标识符、标识符标识符是程序员自己起的名字,如变量名、标号、段名、过程名等标识符的命名规则:l标识符必须由
4、字母、数字和几个特殊字符(包括 _ $ ? :)组成,而且第一个字符不能是数字(否则可能与16进制的数字混淆)l标识符不能与某个保留字相同,以免混淆l尽量用有意义的英文单词或缩写来命名,以增加程序的可读性三、常量、变量与标号三、常量、变量与标号1、常量、常量数字常量l二进制:以B结尾,如10101010Bl八进制:以Q结尾,如123Q,67Ql十进制:以D结尾,“D”可省略,如1234D,5678l十六进制:以H结尾,AF开头的数须在前面加“0” 如:1234H,0FFFFH字符串常量l用单引号或双引号引起来的一个或多个ASCII字符l每个字符的值等于其ASCII码值l例:A=41H一个字节,
5、12=31H、32H两个字节2、变量、变量变量是存放在存储器中的操作数 可通过变量的名字来访问变量变量具有三个属性:l段属性,即变量所在的段的基地址;l偏移量属性,即变量相对于段的起始地址的偏移量;l类型属性,包括BYTE(字节)、WORD(字)、DWORD(双字)、FWORD(6字节)、QWORD(四字)、TBYTE(10字节)等。3、标号、标号标号是一条指令性语句的起始地址变量具有三个属性:l段属性,即变量所在的段的基地址;l偏移量属性,即变量相对于段的起始地址的偏移量;l类型属性,包括NEAR(近程,即段内)、FAR(远程,即段间)四、表达式及运算符四、表达式及运算符由常量、变量、标号和
6、一些运算符、操作符构成的式子表达式的值在汇编的过程中就已经被汇编程序计算出来运算符的分类:l算术运算符l逻辑运算符l关系运算符l属性运算符l数值返回操作符1、算术运算符、算术运算符五种算术运算:加:+、 减:-、 乘:*、 除:/、 模:MODl合法地址表达式:地址-地址(处在同个段中);地址常数ADDR1-ADDR2(假设两个地址处在同个段中)ADDR1+1ADDR2-2l非法地址表达式:地址+地址;地址*地址;地址/地址;常量-地址;地址-地址(处在不同段中)ADDR1+ADDR2ADDR1*ADDR2ADDR1/2100-ADDR1SEG1_A-SEG2_B (假设两个地址处在不同段中)
7、2、逻辑运算符、逻辑运算符五种算术运算:与AND、或OR、异或XOR、非NOT、逻辑左移SHL、逻辑右移SHR 只用于数字表达式中例:MOV AL,10101010B AND 11001100B ;AL10001000BMOV AL,10001000B OR 01000100B ;AL11001100BMOV AX,11000B XOR 11100B;AX00100BMOV AX,NOT 11010B;AX10101B3、关系运算符、关系运算符六种关系运算符:lEQ(Equal,相等)lNE(Not Equal,不等)lLT(Less Than,小于)lLE(Less than or Equa
8、l,小于或等于)lGT(Great Than,大于)lGE(Great than or Equal,大于或等于)运算结果:l关系为真,则运算结果为0FFFFHl关系为假,则运算结果为0 4、属性运算符、属性运算符(1)型重新指定操作符)型重新指定操作符PTR功能:临时指定或修改存储器操作数的数据类型属性或地址类型属性格式:类型 PTR 表达式例:VAR_WDW1234HMOV AX,VAR_W ;AX1234HMOV AL,BYTE PTR VAR_W ;AL34HPTR与EQU连用l作用:定义与表达式类型不同的新变量名或新标号,但不分配新的存储单元l例:数据段定义:DATA_B DB 1,2
9、,3,4DATA_W EQU WORD PTR DATA_B代码段:MOVAL,DATA_B ;AL1MOVAX,WORD PTR DATA_B ;AL0201HMOVAX,DATA_W ;AL0201H(第2、3条指令等价)(2)类型指定操作符)类型指定操作符THIS功能:指定或说明变量或标号的类型例1:DATA_W EQU THIS WORDDATA_B DB1,2,3,4MOVAL,DATA_B ;AL1MOVAX,WORD PTR DATA_B ;AL0201HMOVAX,DATA_W ;AL0201H例2:ADDR_F EQU THIS FARADDR_N: MOV AX,1 JMP
10、 ADDR_F ;等价于:JMP FAR PTR ADDR_N (3)短转移操作符)短转移操作符SHORT功能:l一般用在JMP指令 l告诉汇编程序该JMP指令是一个短程转移指令 例: JMP SHORT LAB LAB:5、数值返回操作符、数值返回操作符(1)SEG、OFFSET功能:lSEG操作符用于求一个标号或变量所在段的基地址lOFFSET操作符则用于求标号或变量在段中的地址偏移量例如,对于代码段中的一条指令:2000H:1234H ADDR: INC CX ;段地址=2000H,偏移量=1234H则有:MOV AX,SEG ADDR ;AX2000HMOV AX,OFFSET ADD
11、R ;AX1234H;与指令 “LEA AX,ADDR” 等价(2)TYPE、LENTH、SIZE功能:lTYPE:求变量的数值类型属性,即变量具有的字节数BYTE:返回1;WORD:返回2;DWORD :返回4;FWORD :返回6;QWORD :返回8,TBYTE :返回10;NEAR:返回0FFH;FAR:返回0FEHlLENGTH:求变量所占用的内存单元数用于由重复操作符DUP()定义的存储器变量对于其他变量,LENGTH的返回值都是1lSIZE:计算变量所占存储器的总字节数 l关系:SIZE = LENGTH TYPE例:DATA1 DW 1234HDATA2 DB HELLODAT
12、A3 DD 100 DUP(0);表示定义100个值为0的双字MOV AL,TYPEDATA1;AL2MOV AL,TYPEDATA2;AL1MOV AL,TYPEDATA3;AL4MOV BL,LENGTH DATA1;BL1MOV BL,LENGTH DATA2;BL1MOV BL,LENGTH DATA3;BL100MOV CL,SIZEDATA1;CL21=2MOV CL,SIZEDATA2;CL11=1MOV CL,SIZEDATA3;CL4100=400(3)字节分离运算符)字节分离运算符HIGH、LOW功能:lHIGH:分离一个字常量或一个地址表达式的高字节 lLOW:分离一个字
13、常量或一个地址表达式的低字节例:l只能用于常量或结果为常量的表达式ADDR1:MOV AL,HIGH 1234H;AL12HMOV AL,LOW ADDR1;AL上一指令 ;地址偏移量的低8位l不能用于变量或寄存器MOV BL,HIGH AX6、运算符的优先级、运算符的优先级表达式计算顺序:l先处理优先级别高的运算符l对于优先级相等的运算符,则按从左至右的顺序进行处理优先级顺序:l()、(优先级最高)lLENGTH、SIZElPTR、THIS、SEG、OFFSET、TYPElHIGH、LOWl*、/、MOD、SHL、SHRl+、-lEQ、NE、LT、LE、GT、GElNOTlANDlOR、XO
14、RlSHORT(优先级最低)第三节第三节 汇编语言的语句汇编语言的语句一、指示性语句一、指示性语句格式( 里的内容可选):名字 伪指令符 操作数,操作数, ;注释l名字:变量名、段名等,与指令地址无关,后面不能加冒号l伪指令符:指定汇编程序要完成的具体操作l操作数:常量、变量或表达式等l注释:说明、解释当前语句的作用常用伪指令:l处理器选择伪指令l数据定义伪指令,包括DB、DW、DD、DF、DQ、DTl符号定义伪指令,包括EQU、“=”l段定义伪指令SEGMENT、ENDSl段组定义伪指令GROUPl假定伪指令ASSUMEl地址对准伪指令ORG、EVEN、ALIGNl定义符号名伪指令LABEL
15、l过程定义伪指令PROC、ENDPl源程序结束伪指令ENDl高级数据结构定义伪指令1、处理器选择伪指令、处理器选择伪指令功能:处理器的工作模式分类:l.8086:选择8086指令系统(缺省方式)l.286 :选择80286指令系统l.286P:选择80286指令系统,且系统工作在保护模式下l.386 :选择80386指令系统l.386P:选择80386指令系统,且系统工作在保护模式下l.486 :选择80486指令系统l.486P:选择80486指令系统,且系统工作在保护模式下l.586 :选择Pentium指令系统l.586P:选择Pentium指令系统,且系统工作在保护模式下l.8087、
16、.287、.387 :选择协处理器 2、数据定义伪指令、数据定义伪指令功能:为变量分配存储空间格式:变量名 伪指令符 操作数,操作数, ;注释六种数据定义伪指令:lDB(字节定义):每个操作数占1个字节lDW(字定义):每个操作数占1个字,即2个字节lDD(双字定义):每个操作数的长度为双字,即4个字节lDF(6字节定义):每个操作数的长度为6个字节lDQ(四字定义):每个操作数的长度为四字,即8个字节lDT(10字节定义):每个操作数的长度为10个字节例:l可同时定义多个数据:NUM DW 12H,-1 ;定义2个字STRING DB HELLO,0DH,0AH;定义字符串l省略变量名:BU
17、F DB 1,10,100 DB 1 ;省略变量名 ;但该数据仍可通过“BUF+3”访问l无初始化数据定义:用问号“?”代替操作数BUFFER DB 2,?,?,? ;定义4个字节 ;其中后3个字节不初始化lDUP操作符:格式:重复的次数 DUP(重复的内容)例:ARRAYDB3 DUP(1,2);等价于:ARRAY DB 1,2,1,2,1,2BUF_WDW100 DUP(?);定义100个字,但不初始化DUP的嵌套使用:ARRAY2 DB2 DUP(1,3 DUP(0) ;等价于:ARRAY2 DB 1,0,0,0,1,0,0,0l地址表达式作为操作数:只能用DW、DD定义DW:变量/标号
18、的偏移量DD:变量/标号的段地址和偏移量例:DATA1 DWADDR1+1;把ADDR1偏移量加1后存放到DATA1对应的存储单元中DATA2 DDDATA1;把DATA1的偏移量和段地址存放到DATA2对应的存储单 元中,其中偏移量放低地址,段地址放高地址。l地址计数器“$”“$”:表示到目前为止该段已经使用的地址空间n例1:设VAR1地址偏移量为1000H,则:VAR1DB100H DUP (?)之后,$=1100H,因此:ADDR1 DW$等价于“ADDR1 DW 1100H”,也等价于“ADDR1 DW ADDR1”n例2:STRING DB ABCLEN DW $-STRING ;L
19、EN的值为STRING的长度3、符号定义伪指令、符号定义伪指令(1)等价伪指令)等价伪指令EQU格式:符号名 EQU 表达式功能:为常量、表达式及其他各种符号定义一个别名例:NUMEQU 12;给数值定义符号名NUM2EQU NUM+10;给12+10=22定义符号名ADDREQU DS:BX+SI ;给寻址表达式定义符号名COUNT EQU CX;给寄存器CX定义符号名CLEAR EQU XOR AX,AX;给指令定义符号名(2)解除伪指令)解除伪指令PURGE格式:PURGE 符号名,符号名,作用:EQU伪指令不能直接对一个符号名重定义,必须先用PURGE解除例:COUNTEQU CXPU
20、RGE COUNTCOUNTEQUCL(3)等号)等号“=”伪指令伪指令格式:符号名 =表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名 允许对符号名多次重复定义,且以最后一次定义的值为准 例:CONST = 1;给数值1定义符号名CONSTADDR= BP+DI;给寻址表达式定义符号名ADDRCONST = 0;重定义CONST4、段定义伪指令、段定义伪指令SEGMENT、ENDS格式:段名 SEGMENT定位方式组合方式使用类型类名 ;段中的内容段名 ENDS功能:定义一个段例:DATASEGMENTVAR DB?DATAENDS得到段地址的两种方法:MOVAX,DATAMOV
21、AX,SEG VAR(1)定位方式)定位方式作用:设置该段在存储器中的起始边界分类:lBYTE:可从任意的绝对地址开始,如12345H。lWORD:可从偶地址开始。如12346H。lDWORD:可以任何一个双字的边界开始,如12348H。lPARA(缺省方式):必须从存储器的16字节的边界开始,如12340H(最后一位为0)。lPAGE:起始地址必须能被256整除,如12300H。(2)类名)类名用单引号括起来的字符串连接定位时,具有相同类名的逻辑段会被组合在一起 (3)使用类型()使用类型(386以上)以上)USE16:缺省类型,表示该段采用16位寻址方式,段基址和段内偏移量都是16位USE
22、32:表示该段采用32位寻址方式,段选择子为16位,段内偏移量则是32位(4)组合方式)组合方式作用:指定同类名段的组合方法 分类:lPRIVATE(缺省方式):不组合lPUBLIC:同类名段按照前后次序连接在一起lCOMMON:与其他模块中的同类名段有相同的起始物理地址lSTACK:与其他模块中的同类名段用覆盖的方式连接,从高地址开始覆盖lMEMORY:该段必须放在同类名的各个段中的最后lAT表达式:直接指定该段的段地址5、段组定义伪指令、段组定义伪指令GROUP功能:把几个不同段名的段,合并成一个段组,并为该段组命名。段组名可代表所有成员的段地址。格式:段组名GROUP段名,段名,例:定义
23、两个数据段:DATA1SEGMENTDATA2 SEGMENTADB? B DB ?DATA1ENDS DATA2 ENDS进行段组合: DATAGROUPGROUP DATA1,DATA2段地址初始化:MOVAX,DATAGROUP MOVDS,AX直接访问变量A和B:MOV AL,A、 MOV AH,B6、假定伪指令、假定伪指令ASSUME格式:ASSUME段寄存器:段名,段寄存器:段名,功能:告诉汇编程序段与段寄存器的对应关系例:DATASEGMENTVAR1DB? DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:ASSUME指令:假定CS为代
24、码段,DS为数据段7、地址对准伪指令、地址对准伪指令(1)ORG格式:ORG数值表达式功能:用于指定下一个指令或数据在段内的起始地址例:LAB1:PUSHAXORG2000HLAB2:MOVAL,34则LAB2的地址偏移量为2000H。(2)EVEN功能:使下一个指令或数据的偏移量为偶数例:ORG0101HEVENDATADB100 DUP (?);起始地址为0102H(3)ALIGN功能:使下一个指令或数据的偏移量为n=2i 的倍数例:ORG0101HALIGN 4DATADB100 DUP (?);起始地址为0104H“ALIGN 2” = “EVEN”8、定义符号名伪指令、定义符号名伪指
25、令LABEL格式:变量名或标号 LABEL 类型属性功能:为当前的存储单元定义一个符号名,并指定其类型属性例:DATA_WLABEL WORDDATA_BDB100 DUP(?)则以下两个语句等效:MOVAX,DATA_WMOVAX,WORD PTR DATA_B“LABEL” = “EQU THIS”9、过程定义伪指令、过程定义伪指令PROC、ENDP功能:定义一个过程格式:过程名PROC过程属性返回指令RET 过程名ENDP过程属性:lNEAR:缺省属性,表示段内调用/返回lFAR:表示段间调用/返回10、源程序结束伪指令、源程序结束伪指令END格式:END标号标号的地址必须是程序的入口地
26、址,即第一条可执行语句功能:l告诉汇编程序,源程序到此已经结束l告诉汇编程序,源程序的入口地址是多少例:CODESEGMENTASSUME CS:CODEBEGIN:MOV AX,0;第一条指令语句CODEENDSEND BEGIN;源程序到此为止11、高级数据结构定义伪指令、高级数据结构定义伪指令(1)结构类型数据定义伪指令)结构类型数据定义伪指令STRUC/ENDS 结构的定义:结构名STRUC ;DB、DW之类的数据定义伪指令语句序列结构名ENDS例:DATASTRUCXDW0YDB1ZDD2DATAENDS结构定义时并没有分配存储空间结构变量的申请与赋初值结构变量名结构名 例:NEW
27、_DATADATA;申请结构变量“NEW _DATA”,其中X=0,Y=1,Z=0;缺省的初始值表示使用定义时的预设值结构的访问结构变量名.字段名例:MOVAX,NEW_DATA.XMOVBL, NEW_DATA.Y(2)记录定义伪指令)记录定义伪指令RECORD记录的定义记录名RECORD字段说明,字段说明其中,字段说明的格式是:字段名:宽度=预赋值例:RECRECORDA:8=12H, B:5=10, C:3定义了一个字,其中:A占高8位,预赋值=00010010BB占接下来5位,预赋值=10000BC占低3位,预赋值=011B记录变量的的申请与赋初值格式:记录变量名记录名 例:REC_V
28、ARREC申请了一个变量REC_VAR,其值为:00010010 00001 010 B 预赋值12H 初始化为1 初始化为2记录的访问lWIDTH操作符:求记录或记录中某个字段的宽度(即位数)。格式:WIDTH 记录名或记录字段名l记录字段名:求该字段的最低位右移到所在记录最右边所需的移位次数lMASK操作符:返回一个8位或16位二进制数,这个数中,对应于指定字段的各位均是1,其余各位均是0。格式:MASK 记录字段名例:MOVAX,REC_VAR;AX01010B MOVBL,WIDTH REC_VAR;BLREC_VAR的总宽度16 MOVBH,WIDTH A;BH字段A的宽度5 MOV
29、CL,B;CL3 MOVDX,MASK C;DX00111B二、指令性语句二、指令性语句格式:标号:指令助记符操作数,操作数,;注释l标号:标号表示机器指令语句的存放地址,其后面必须紧跟冒号“:”。l指令助记符:指令助记符表示该语句的操作类型,如数据传送、算术运算等。l操作数:操作数表示指令助记符的操作对象,不同指令的操作数个数不同。l注释:与指示性语句中的注释相同,仅用于说明、解释当前语句。1、NIL指令指令NIL指令并不属于80 x86的指令系统只用于宏汇编中 作用:保留一个空行 例:L: NIL;留下一个空行,方便以后对程序的修改LOOPL等价于:L:LOOP L(2)DOS系统功能的调
30、用系统功能的调用将调用功能所需的入口参数存入指定的寄存器或存储单元中;在寄存器AH中存放所要调用功能的功能号;执行INT 21H指令,转入中断子程序;中断子程序运行完后,从指定的寄存器或存储单元中取得出口参数。 (1)单字符显示(功能号:)单字符显示(功能号:02H)功能:将指定的字符送到显示器显示 例:MOVDL,A ;入口参数,DL存放字符的ASCII码MOVAH,02H ;02H号功能调用INT21H ;显示字符A(2)单字符输入(功能号:)单字符输入(功能号:01H、07H)功能:从键盘输入字符AL例:MOVAH,01H;01H号键盘输入功能调用INT21H;AL输入字符的ASCII码
31、,并显示字符07H号功能调用与01H号相似,但输入的字符没有在屏幕上显示(3)检测键盘状态(功能号:)检测键盘状态(功能号:0BH) 功能:检测当前时刻键盘是否有键按下。如果有,则出口参数AL=0FFH,否则AL=0。该功能不清除输入缓冲。例:循环运行程序段,直到有按键按下为止RUN:;循环运行的程序段 MOV AH,0BH;0BH号功能调用 INT 21H;检测键盘状态 CMP AL,0 JZ RUN;AL=0表示没有键按下 MOV AL,01H;没有清除缓冲,仍可读到按键 INT 21H(4)直接控制台)直接控制台I/O(功能号:(功能号:06H)功能:输入 / 输出字符:l入口参数DL=
32、0FFH:检测当前时刻键盘是否有键按下。如果有,则出口参数AL=输入的字符,ZF=0,清除输入缓冲区;如果没有,则ZF=1。l入口参数DL0FFH:将DL中的ASCII码送显示器上显示例:循环运行程序段,直到有按键按下为止RUN:;循环运行的程序段 MOV AH,06H;06H号功能调用 MOV DL,0FFH;DL=0FFH,输入功能调用 INT 21H;检测键盘状态 JZ RUN(5)字符串显示(功能号:)字符串显示(功能号:09H)功能:将数据段中的字符串输出到屏幕上l字符串的首地址DS:DX中,l字符串一定要以字符$作为结尾标志例:DATASEGMENTSTRINGDBHELLO,0D
33、H,0AH,$;需以$结尾DATAENDS代码段:MOV AX,DATAMOV DS,AX;DS字符串所在段的段地址LEA DX,STRING;DX字符串首地址的偏移量MOV AH,09H;09H号功能调用INT21H;在屏幕上显示“HELLO”(6)字符串输入(功能号:)字符串输入(功能号:0AH)功能:字符串输入,回车键结束入口参数:DS:DX:缓冲区首地址(DS:DX):允许输入的最多字符数出口参数:(DS:DX+1):实际输入的字符数(不计回车)(DS:DX+2)开始:输入的字符串(包括回车)例:BUFDB10H,100 DUP(?);输入字符数不超过16MOV AX,DATAMOV
34、DS,AX;DS缓冲区所在段的段地址LEA DX,BUF;DX缓冲区首地址的偏移量MOV AH,0AH;0AH号功能调用INT21H;输入字符串若输入“123”,则BUF中的内容为:10H,03H(输入3个字符),31H,32H,33H,0DH(回车)(7)打印输出(功能号:)打印输出(功能号:05H)功能:将DL寄存器中的字符送打印机打印例:MOVDL,A;需打印的字符AMOVAH,05H;05H号功能调用INT21H;送打印机打印(8)结束调用(功能号:)结束调用(功能号:4CH)功能:终止当前程序,并返回到DOS中 例:MOVAH,4CHINT21H第四节第四节 宏汇编指令宏汇编指令一、
35、宏操作伪指令一、宏操作伪指令宏定义伪指令宏定义伪指令 MACRO、ENDM取消宏定义伪指令取消宏定义伪指令 PURGE重复伪指令重复伪指令 REPT、IRP、IRPC局部符号伪指令局部符号伪指令 LOCAL1、宏定义伪指令、宏定义伪指令MACRO、ENDM格式:宏名MACRO形式参数1,形式参数2,;宏体ENDM;宏定义结束例1:OUTPUTMACROMOVAH,02HINT21HENDM则:OUTPUT 等价于“MOV AH,02H,INT 21H”例2:OUTPUTMACROASC;“ASC”为形式参数MOVDL,ASCMOVAH,02HINT21HENDM则:OUTPUT30H等价于:M
36、OVDL,30HMOVAH,02HINT21H2、取消宏定义伪指令、取消宏定义伪指令PURGE功能:使用MACRO定义的宏,如果不再需要,就可以用PURGE来注销格式:PURGE宏名1、宏名2,例:PURGEOUTPUT3、重复伪指令、重复伪指令REPT、IRP、IRPCREPTl格式:REPT表达式;宏体ENDMl功能:重复执行宏体中的语句,重复次数为表达式的值。l例如,下面的宏能将AL中的值逻辑左移4位:REPT4SHLAL,1ENDMIRPl格式:IRP形式参量,;宏体ENDMl功能:重复执行宏体,重复的次数是由参数的个数决定l例,把AX、BX、CX、DX都压入栈中:IRPREG,PUS
37、HREGENDMnIRPCl格式:IRPC形式参量,字符串;宏体ENDMl功能:重复执行宏体,其参数列表是字符串,一个字符为一个参数l例如:IRPCNUM,1234;“1234”表示4个参数1、2、3、4DBNUMENDM等效于:DB1,2,3,44、局部符号伪指令、局部符号伪指令LOCAL格式:LOCAL标号、变量等的列表功能:将宏中的标号定义为局部符号,避免重复例:错误:IRPREG,LAB: PUSHREGENDM展开后:LAB: PUSHAXLAB: PUSHBX(LAB重复使用,出错)正确:IRPREG,LOCAL LABLAB: PUSHREGENDM展开后:?0000:PUSHA
38、X?0001:PUSHBX二、条件汇编二、条件汇编格式:IFxx ;条件块1ELSE;条件块2ENDIF功能:根据某个表达式的真假,决定是否对指定的程序段进行编译 IF 表达式:如果表达式的值不为0,则条件满足。IFE 表达式: 如果表达式值为0,则条件满足。IF1:在汇编程序的第一次扫视期间满足条件。IF2:在汇编程序的第二次扫视期间满足条件。IFDEF 符号:如果指定的符号已经在程序中被定义,或被说明为EXTRN,则条件为真。IFNDEF 符号:如果指定的符号在程序中未被定义,且不被说明为EXTRN,则条件为真。IFB :如变量为空,则条件为真。IFNB :如变量不为空,则条件为真。IFI
39、DN ,:如字符串arg1和串arg2相同,条件为真。IFDIF ,:如字符串arg1和串arg2不相同,条件为真。第五节第五节 编写完整的汇编语言程序编写完整的汇编语言程序汇编语言程序与汇编语言程序与MS-DOS一般的汇编语言程序的整体框架一般的汇编语言程序的整体框架模块化程序设计的思想模块化程序设计的思想利用简化段定义伪指令编写完整程序利用简化段定义伪指令编写完整程序一、汇编语言程序与一、汇编语言程序与MS-DOS1、DOS的装入功能的装入功能确定用于存放程序的内存地址空间建立程序段前缀PSP(Program Segment Prefix)l100H个字节,存放程序有关信息及进程间的控制信
40、息l最开始的两个字节是一条INT 20H软中断指令在PSP后装入可执行程序:l数据段l附加段l代码段l堆栈段初始化各个相关寄存器的值:lDS、ES:PSP所在段的段地址lCS、IP:程序的入口地址入口地址 = 第一条可执行语句的段地址和偏移量这个地址是从END语句中标号的地址属性得到的lSS初始化为堆栈段的段地址lSP指向堆栈段的栈底2、DOS的返回的返回方法一:l执行PSP中的“INT 20H”指令:nCSPSP的段地址nIP0l具体过程:n程序开头:PUSH DS;开始时(DS)=PSP的段地址MOV AX,0PUSH AX;“0”入栈n程序过程,要求PUSH与POP配对n程序结束:RET
41、F ;CSPSP的段地址,IP0l例:CODESEGMENTASSUMECS:CODEMAINPROCFARBEGIN:PUSHDS;PSP的段地址入栈MOVAX,0;INT 20H的偏移量为0PUSHAX;把偏移量入栈RET;IP0,CSPSP段地址MAINENDPCODEENDSENDBEGIN方法二:l调用DOS系统的4CH 功能,实现DOS返回:MOVAH,4CHINT21Hl例:CODESEGMENTASSUMECS:CODEBEGIN:MOVAH,4CH;返回DOSINT21HCODEENDSENDBEGIN二、一般的汇编语言程序的整体框架二、一般的汇编语言程序的整体框架数据段、附
42、加段 堆栈段 ASSUME伪指令代码段END伪指令注释源程序结构框架l框架一:DATASEGMENT;数据段;定义变量、缓冲区等DATAENDSSTACKSEGMENT PARA STACK STACK ;堆栈段部分DBXXXX DUP(?);定义堆栈的长度STACKENDSCODESEGMENT;代码段部分ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATAMAINPROCFARBEGIN:PUSHDSMOVAX,0;为RET提供转移地址PUSHAX数据段堆栈段MOVAX,DATAMOVDS,AX;初始化段寄存器DS、ESMOVES,AX;程序部分RET;返回DOS
43、MAINENDPPROC_1PROCNEAR/FAR;定义其他过程RETPROC_1ENDPCODEENDSENDMAINl框架二:采用“4CH”功能返回:(代码段部分)CODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,&SS:STACK,ES:DATABEGIN:MOVAX,DATAMOVDS,AX;初始化DS、ESMOVES,AX;程序部分MOVAH,4CH;4CH号功能调用INT21H;返回DOSCODEENDSENDBEGIN三、模块化程序设计的思想三、模块化程序设计的思想1、模块命名伪指令、模块命名伪指令NAME、TITLE格式:NAME模块名TITL
44、E模块名作用:为模块命名,指示给连接程序进行连接用2、逻辑段与物理段、逻辑段与物理段编译连接时,同类逻辑段将组合成一个大的物理段3、同类名的组合方式、同类名的组合方式PRIVATE(缺省方式):不组合PUBLIC:同类名段按照前后次序连接在一起COMMON:与其他模块中的同类名段有相同的起始物理地址STACK:与其他模块中的同类名段用覆盖的方式连接,从高地址开始覆盖MEMORY:该段必须放在同类名的各个段中的最后AT表达式:直接指定该段的段地址4、模块之间的通信、模块之间的通信PUBLIC与EXTRN:l格式:PUBLIC 标识符,标识符,EXTRN 标识符:属性,标识符:属性,l功能:PUB
45、LIC:说明模块中某些标识符可以被其它模块访问EXTRN:说明本模块中哪些标识符是外部的,以及这些标 识符的属性是什么例:l模块1:NAMEMOD1PUBLICVAR1;公用标识符VAR1DATA1SEGMENT PARA PUBLIC DATAVAR1 DB ? ;字节变量VAR1DATA1ENDSl模块2:NAMEMOD2EXTRNVAR1:BYTE;说明VAR1是字节CODE2SEGMENT PARA PUBLIC CODEMOVAL,VAR1;访问MOD1中的字节变量VAR1四、简化段定义伪指令四、简化段定义伪指令1、定义内存模式伪指令、定义内存模式伪指令.MODEL格式:.MODEL
46、 存储模式 ,高级语言接口,操作系统,堆栈距离l存储模式:TINY(最小模式):代码和数据同段SMALL(小模式): 一个代码段,一个数据段MEDIUM(中模式):一个数据段,多个代码段COMPACT(压缩模式):多个数据段,一个代码段LARGE(大模式):多个代码段,多个数据段HUGE(巨模式):多个代码段,多个数据段(允许64KB)l高级语言接口:汇编程序可以作为一个过程,供其他高级语言调用可选的语言有C、BASIC、FORTRAN、PASCALl操作系统:指明程序运行的操作系统可选的操作系统:OS_DOS、OS_OS2两种默认OS_DOSl堆栈距离:指明堆栈段是否与数据段合并在同个段组中
47、。选项:NEARSTACK(与数据段同组)、FARSTACK(堆栈段单独作为一段,不与数据段合并)默认的堆栈距离为NEARSTACK 2、简化段定义伪指令、简化段定义伪指令.CODE:定义代码段.DATA:定义已初始化的数据段.DATA?:定义未初始化的数据段.FARDATA:定义远程已初始化的数据段.FARDATA?:定义远程未初始化的数据段.CONST:定义常数数据段.STACK:定义堆栈段3、等价名的概念、等价名的概念CODE:代表代码段等价的段名DATA: 代表由.DATA、.DATA?、.CONST、.STACK等所定义的段所在的段组名FARDATA:代表.FARDATA所定义的数据
48、段 FARDATA?:代表.FARDATA?所定义的数据段4、指定段序伪指令、指定段序伪指令.ALPHA:根据各个段的段名,按字母顺序排序.SEQ(缺省):按照各个段在程序中出现的顺序进行排序DOSSEG:按照DOS系统对段序的定义进行排序。其排序的规则是:l首先是类名为CODE的段;l其次是类名不是CODE,且不是段组DGROUP成员的段;l最后是属于DGROUP的段。第六节第六节 汇编语言程序设计汇编语言程序设计一、程序设计基本方法一、程序设计基本方法分析实际问题,确定基本思路及程序算法绘制程序流程图根据流程图编写程序调试程序1、流程图、流程图起止框:表示程序的开始和结束工作框:说明该步骤
49、的功能判断框:说明判断的条件调用框:说明调用过程的名字、参数等连线: 表示程序的走向功能条件?子程序 起止框 工作框 条件框 调用框 连线2、程序的基本结构形式、程序的基本结构形式顺序结构按直线顺序执行程序分支结构含判断语句,根据判断结果选择分支例:CMPAL,BLJZL1;相等L2:;不等JMPNEXTL1:NEXT:程序段1程序段2程序段3顺序结构条件?程序段1程序段2分支结构YN(3)循环结构)循环结构初始化部分循环体部分循环条件判断部分例:MOVCX,100 ;初始化部分L: ;循环体开始DECCX ;修改循环变量JNZL ;循环条件判断条件?循环体初始化循环结构YN(4)子程结构)子程结构在程序中需要多次出现的程序段,可定义为一个子程序,在主程序需要的时候就可以直接调用它l寄存器的保护与恢复 l主程序与子程序之间的参数传递 l子程序可嵌套调用 程序段1程序段2过程调用子程结构二、程序设计举例二、程序设计举例显示二进制数的显示二进制数的ASCII码形式码形式DATASEGMENTNUMDB12H,34H,0ABH,0CDH;需显示的字节COUNT EQU$-NUM;字节数AFTER DBB,0DH,0AH,$;B、回车换行DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATAMAINPROCFARPUSHDS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 期末课程汇报指南
- 作物育种技术
- 2025锅炉工劳动合同
- 2025建筑公司劳务人员合同
- 2025年版民间汽车抵押借款合同范本及关键注意事项
- 2025园林景观木材供货合同范本
- 2025年粮食订购合同范本
- 2025建筑工程公司劳动合同样本
- 2025年反担保股份质押合同范本
- 2025综合超市合作伙伴合同范本
- 职业病防护设施及管理
- 校园安全管理的问题及对策研究
- PA66ROHS无卤sgs报告环保报告
- 《送元二使安西》优秀课件
- 中国与俄罗斯渔业合作的潜力分析
- 2023年广东省高中学生化学竞赛试题与标准答案正式题(word可编辑版)
- 汽车轮胎教案
- 公司应急组织体系
- 局部解剖学:第八章 血 管
- 电子政务与电子商务的关系探讨
- 厨师菜品考核评分表201921
评论
0/150
提交评论