第4章 汇编语言程序设计_第1页
第4章 汇编语言程序设计_第2页
第4章 汇编语言程序设计_第3页
第4章 汇编语言程序设计_第4页
第4章 汇编语言程序设计_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章80x86汇编语言程序设计第一节汇编语言概述第二节汇编语言语句的组成第三节汇编语言的语句第四节宏汇编指令第五节编写完整的汇编语言程序第六节汇编语言程序设计第一节汇编语言概述DATA SEGMENTSTRING DB ‘HELLOWORLD!’,0DH,0AH,‘$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATABEGIN: MOV AX,DATA

MOV DS,AX ;初始化数据段的段地址 MOV AH,09H LEA DX,STRING;输出字符串 INT 21H MOV AH,4CH INT 21H;调用4CH号系统功能返回DOSCODE ENDS END BEGIN数据段代码段一个简单的8086系统下的汇编语言程序:第二节汇编语言语句的组成汇编语言程序的语句中包含的元素:字符集保留字与标识符常量、变量与标号表达式及运算符一、字符集允许使用的字符:字母,包括大写字母A~Z和小写字母a~z;数字,包括0~9;特殊字符,包括:+-*/=()[]<>;,‘“.—:?@$&及空格、制表符、回车、换行等。注意:除了字符串,字母都是不区分大小写一系列相连的空格、制表符效果相当于一个空格一系列相连的回车换行相当于一次回车换行分号“;”后一直到行尾的内容都是注释字符“&”若用于某行的开头,则表示该行是上一行的续行二、保留字与标识符1、保留字 在汇编语言中有特定意义的词,可分为:指令助记符及指令前缀

如:MOV、ADD、REP等寄存器名 如:AX、EBX、CL等伪指令助记符

如:DB、SEGMENT等其他保留字,包括运算符、操作符等 如:EQ、LT、OFFSET、SEG等2、标识符标识符是程序员自己起的名字,如变量名、标号、段名、过程名等标识符的命名规则:标识符必须由字母、数字和几个特殊字符(包括_@$?:)组成,而且第一个字符不能是数字(否则可能与16进制的数字混淆)标识符不能与某个保留字相同,以免混淆尽量用有意义的英文单词或缩写来命名,以增加程序的可读性三、常量、变量与标号1、常量数字常量二进制:以B结尾,如10101010B八进制:以Q结尾,如123Q,67Q十进制:以D结尾,“D”可省略,如1234D,5678十六进制:以H结尾,A~F开头的数须在前面加“0”

如:1234H,0FFFFH字符串常量用单引号或双引号引起来的一个或多个ASCII字符每个字符的值等于其ASCII码值例:‘A’=41H一个字节,‘12’=31H、32H两个字节2、变量变量是存放在存储器中的操作数可通过变量的名字来访问变量变量具有三个属性:段属性,即变量所在的段的基地址;偏移量属性,即变量相对于段的起始地址的偏移量;类型属性,包括BYTE(字节)、WORD(字)、DWORD(双字)、FWORD(6字节)、QWORD(四字)、TBYTE(10字节)等。3、标号标号是一条指令性语句的起始地址变量具有三个属性:段属性,即变量所在的段的基地址;偏移量属性,即变量相对于段的起始地址的偏移量;类型属性,包括NEAR(近程,即段内)、FAR(远程,即段间)四、表达式及运算符由常量、变量、标号和一些运算符、操作符构成的式子表达式的值在汇编的过程中就已经被汇编程序计算出来运算符的分类:算术运算符逻辑运算符关系运算符属性运算符数值返回操作符1、算术运算符五种算术运算: 加:+、减:-、乘:*、除:/、模:MOD合法地址表达式:地址-地址(处在同个段中);地址±常数ADDR1-ADDR2(假设两个地址处在同个段中)ADDR1+1ADDR2-2非法地址表达式:地址+地址;地址*地址;地址/地址;常量-地址;地址-地址(处在不同段中)ADDR1+ADDR2ADDR1*ADDR2ADDR1/2100-ADDR1SEG1_A-SEG2_B(假设两个地址处在不同段中)2、逻辑运算符五种算术运算:

与AND、或OR、异或XOR、非NOT、逻辑左移SHL、逻辑右移SHR

只用于数字表达式中例:MOVAL,10101010BAND11001100B;AL←10001000BMOVAL,10001000BOR01000100B;AL←11001100BMOVAX,1000100010001000BXOR1100110011001100B ;AX←0100010001000100BMOVAX,NOT1010101010101010B ;AX←0101010101010101B3、关系运算符六种关系运算符:EQ(Equal,相等)NE(NotEqual,不等)LT(LessThan,小于)LE(LessthanorEqual,小于或等于)GT(GreatThan,大于)GE(GreatthanorEqual,大于或等于)运算结果:关系为真,则运算结果为0FFFFH关系为假,则运算结果为0

4、属性运算符(1)型重新指定操作符PTR功能: 临时指定或修改存储器操作数的数据类型属性或地址类型属性格式:类型PTR表达式例:VAR_W DW 1234HMOVAX,VAR_W;AX←1234HMOVAL,BYTEPTRVAR_W;AL←34HPTR与EQU连用作用: 定义与表达式类型不同的新变量名或新标号,但不分配新的存储单元例:数据段定义: DATA_BDB1,2,3,4 DATA_WEQUWORDPTRDATA_B代码段:MOV AL,DATA_B;AL←1MOV AX,WORDPTRDATA_B;AL←0201HMOV AX,DATA_W;AL←0201H(第2、3条指令等价)(2)类型指定操作符THIS功能:指定或说明变量或标号的类型例1: DATA_WEQUTHISWORD DATA_BDB 1,2,3,4 MOV AL,DATA_B;AL←1 MOV AX,WORDPTRDATA_B;AL←0201H MOV AX,DATA_W;AL←0201H例2: ADDR_FEQUTHISFAR ADDR_N:MOVAX,1 JMPADDR_F;等价于:JMPFARPTRADDR_N(3)短转移操作符SHORT功能:一般用在JMP指令告诉汇编程序该JMP指令是一个短程转移指令例: JMP SHORTLAB

…… LAB:……5、数值返回操作符(1)SEG、OFFSET功能:SEG操作符用于求一个标号或变量所在段的基地址OFFSET操作符则用于求标号或变量在段中的地址偏移量例如,对于代码段中的一条指令:2000H:1234HADDR:INCCX;段地址=2000H,偏移量=1234H则有: MOVAX,SEGADDR;AX←2000H MOVAX,OFFSETADDR;AX←1234H ;与指令“LEAAX,ADDR”等价(2)TYPE、LENTH、SIZE功能:TYPE:求变量的数值类型属性,即变量具有的字节数BYTE:返回1;WORD:返回2;DWORD:返回4;FWORD:返回6;QWORD:返回8,TBYTE:返回10;NEAR:返回0FFH;FAR:返回0FEHLENGTH:求变量所占用的内存单元数用于由重复操作符DUP()定义的存储器变量对于其他变量,LENGTH的返回值都是1SIZE:计算变量所占存储器的总字节数关系:

SIZE=LENGTH×TYPE例: DATA1DW1234H DATA2DB‘HELLO’ DATA3DD100DUP(0);表示定义100个值为0的双字 MOVAL,TYPE DATA1 ;AL←2 MOVAL,TYPE DATA2 ;AL←1 MOVAL,TYPE DATA3 ;AL←4 MOVBL,LENGTHDATA1 ;BL←1 MOVBL,LENGTHDATA2 ;BL←1 MOVBL,LENGTHDATA3 ;BL←100 MOVCL,SIZE DATA1 ;CL←2×1=2 MOVCL,SIZE DATA2 ;CL←1×1=1 MOVCL,SIZE DATA3 ;CL←4×100=400(3)字节分离运算符HIGH、LOW功能:HIGH:分离一个字常量或一个地址表达式的高字节LOW:分离一个字常量或一个地址表达式的低字节例:只能用于常量或结果为常量的表达式ADDR1: MOVAL,HIGH1234H ;AL←12H MOVAL,LOWADDR1 ;AL←上一指令 ;地址偏移量的低8位不能用于变量或寄存器MOVBL,HIGHAX6、运算符的优先级表达式计算顺序:先处理优先级别高的运算符对于优先级相等的运算符,则按从左至右的顺序进行处理优先级顺序:()、[](优先级最高)LENGTH、SIZEPTR、THIS、SEG、OFFSET、TYPEHIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT(优先级最低)第三节汇编语言的语句一、指示性语句格式([]里的内容可选): [名字]伪指令符操作数,操作数,……[;注释]名字:变量名、段名等,与指令地址无关,后面不能加冒号伪指令符:指定汇编程序要完成的具体操作操作数:常量、变量或表达式等注释:说明、解释当前语句的作用常用伪指令:处理器选择伪指令数据定义伪指令,包括DB、DW、DD、DF、DQ、DT符号定义伪指令,包括EQU、“=”段定义伪指令SEGMENT、ENDS段组定义伪指令GROUP假定伪指令ASSUME地址对准伪指令ORG、EVEN、ALIGN定义符号名伪指令LABEL过程定义伪指令PROC、ENDP源程序结束伪指令END高级数据结构定义伪指令1、处理器选择伪指令功能:处理器的工作模式分类:.8086:选择8086指令系统(缺省方式).286:选择80286指令系统.286P:选择80286指令系统,且系统工作在保护模式下.386:选择80386指令系统.386P:选择80386指令系统,且系统工作在保护模式下.486:选择80486指令系统.486P:选择80486指令系统,且系统工作在保护模式下.586:选择Pentium指令系统.586P:选择Pentium指令系统,且系统工作在保护模式下.8087、.287、.387:选择协处理器2、数据定义伪指令功能:为变量分配存储空间格式: [变量名]伪指令符操作数,操作数,……[;注释]六种数据定义伪指令:DB(字节定义):每个操作数占1个字节DW(字定义):每个操作数占1个字,即2个字节DD(双字定义):每个操作数的长度为双字,即4个字节DF(6字节定义):每个操作数的长度为6个字节DQ(四字定义):每个操作数的长度为四字,即8个字节DT(10字节定义):每个操作数的长度为10个字节例:可同时定义多个数据:NUMDW12H,-1;定义2个字STRINGDB‘HELLO’,0DH,0AH;定义字符串省略变量名:BUFDB1,10,100 DB1;省略变量名 ;但该数据仍可通过“BUF+3”访问无初始化数据定义:用问号“?”代替操作数BUFFERDB2,?,?,?;定义4个字节 ;其中后3个字节不初始化DUP操作符:格式: 重复的次数DUP(重复的内容)例: ARRAY DB 3DUP(1,2) ;等价于:ARRAYDB1,2,1,2,1,2 BUF_W DW 100DUP(?) ;定义100个字,但不初始化DUP的嵌套使用: ARRAY2 DB 2DUP(1,3DUP(0)) ;等价于:ARRAY2DB1,0,0,0,1,0,0,0地址表达式作为操作数:只能用DW、DD定义DW:变量/标号的偏移量DD:变量/标号的段地址和偏移量例: DATA1 DW ADDR1+1 ;把ADDR1偏移量加1后存放到DATA1对应的存储单元中 DATA2 DD DATA1 ;把DATA1的偏移量和段地址存放到DATA2对应的存储单 元中,其中偏移量放低地址,段地址放高地址。地址计数器“$” “$”:表示到目前为止该段已经使用的地址空间例1:

设VAR1地址偏移量为1000H,则:

VAR1 DB 100HDUP(?) 之后,$=1100H,因此: ADDR1 DW $ 等价于“ADDR1DW1100H”,也等价于“ADDR1DWADDR1”例2: STRINGDB‘ABC’ LEN DW$-STRING;LEN的值为STRING的长度3、符号定义伪指令(1)等价伪指令EQU格式: 符号名 EQU表达式功能: 为常量、表达式及其他各种符号定义一个别名例: NUM EQU12 ;给数值定义符号名 NUM2 EQUNUM+10 ;给12+10=22定义符号名 ADDR EQUDS:[BX+SI] ;给寻址表达式定义符号名 COUNT EQUCX ;给寄存器CX定义符号名 CLEAR EQUXORAX,AX ;给指令定义符号名(2)解除伪指令PURGE格式: PURGE 符号名,符号名,……作用: EQU伪指令不能直接对一个符号名重定义,必须先用PURGE解除例: COUNT EQU CX PURGE COUNT

COUNT EQU CL

(3)等号“=”伪指令格式: 符号名 = 表达式功能: 为常量、表达式及其他各种符号定义一个等价的符号名 允许对符号名多次重复定义,且以最后一次定义的值为准例: CONST =1 ;给数值1定义符号名CONST ADDR =[BP+DI] ;给寻址表达式定义符号名ADDR CONST =0 ;重定义CONST4、段定义伪指令SEGMENT、ENDS格式:

段名 SEGMENT [定位方式][组合方式][使用类型][‘类名’] …… ;段中的内容 段名 ENDS功能:定义一个段例:DATA SEGMENTVAR DB ?DATA ENDS得到段地址的两种方法:MOV AX,DATAMOV AX,SEGVAR(1)定位方式作用:设置该段在存储器中的起始边界分类:BYTE:可从任意的绝对地址开始,如12345H。WORD:可从偶地址开始。如12346H。DWORD:可以任何一个双字的边界开始,如12348H。PARA(缺省方式):必须从存储器的16字节的边界开始,如12340H(最后一位为0)。PAGE:起始地址必须能被256整除,如12300H。(2)类名用单引号括起来的字符串连接定位时,具有相同类名的逻辑段会被组合在一起

(3)使用类型(386以上)USE16:缺省类型,表示该段采用16位寻址方式,段基址和段内偏移量都是16位USE32:表示该段采用32位寻址方式,段选择子为16位,段内偏移量则是32位(4)组合方式作用:指定同类名段的组合方法分类:PRIVATE(缺省方式):不组合PUBLIC:同类名段按照前后次序连接在一起COMMON:与其他模块中的同类名段有相同的起始物理地址STACK:与其他模块中的同类名段用覆盖的方式连接,从高地址开始覆盖MEMORY:该段必须放在同类名的各个段中的最后AT表达式:直接指定该段的段地址5、段组定义伪指令GROUP功能:把几个不同段名的段,合并成一个段组,并为该段组命名。段组名可代表所有成员的段地址。格式:段组名 GROUP 段名,段名,……例:定义两个数据段:DATA1 SEGMENT DATA2SEGMENTA DB ? B DB?DATA1 ENDS DATA2ENDS进行段组合:DATAGROUP GROUP DATA1,DATA2段地址初始化:MOV AX,DATAGROUP MOV DS,AX直接访问变量A和B:MOVAL,A、MOVAH,B6、假定伪指令ASSUME格式:ASSUME 段寄存器:段名[,段寄存器:段名,……]功能:告诉汇编程序段与段寄存器的对应关系例:DATA SEGMENTVAR1 DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATABEGIN: ……ASSUME指令:假定CS为代码段,DS为数据段7、地址对准伪指令(1)ORG格式:ORG 数值表达式功能:用于指定下一个指令或数据在段内的起始地址例:LAB1: PUSH AX ORG 2000HLAB2: MOV AL,34则LAB2的地址偏移量为2000H。(2)EVEN功能:使下一个指令或数据的偏移量为偶数例:ORG 0101H EVEN DATA DB 100DUP(?);起始地址为0102H(3)ALIGN功能:使下一个指令或数据的偏移量为n=2i的倍数例: ORG 0101H ALIGN 4 DATA DB 100DUP(?);起始地址为0104H“ALIGN2”

=“EVEN”8、定义符号名伪指令LABEL格式:变量名或标号LABEL类型属性功能:为当前的存储单元定义一个符号名,并指定其类型属性例:DATA_W LABEL WORDDATA_B DB 100DUP(?)则以下两个语句等效:MOV AX,DATA_WMOV AX,WORDPTRDATA_B“LABEL”=“EQUTHIS”9、过程定义伪指令PROC、ENDP功能:定义一个过程格式: 过程名 PROC [过程属性] ……

返回指令RET 过程名 ENDP过程属性:NEAR:缺省属性,表示段内调用/返回FAR:表示段间调用/返回10、源程序结束伪指令END格式:END 标号标号的地址必须是程序的入口地址,即第一条可执行语句功能:告诉汇编程序,源程序到此已经结束告诉汇编程序,源程序的入口地址是多少例:CODE SEGMENT ASSUMECS:CODEBEGIN: MOV AX,0 ;第一条指令语句……CODE ENDS END BEGIN ;源程序到此为止11、高级数据结构定义伪指令(1)结构类型数据定义伪指令STRUC/ENDS

结构的定义:结构名 STRUC…… ;DB、DW之类的数据定义伪指令语句序列结构名 ENDS 例:DATA STRUCX DW 0Y DB 1Z DD 2DATA ENDS 结构定义时并没有分配存储空间结构变量的申请与赋初值结构变量名 结构名 <初始值表>例:NEW_DATA DATA <,,0>;申请结构变量“NEW_DATA”,其中X=0,Y=1,Z=0;缺省的初始值表示使用定义时的预设值结构的访问结构变量名.字段名例:MOV AX,NEW_DATA.XMOV BL,NEW_DATA.Y(2)记录定义伪指令RECORD记录的定义 记录名 RECORD 字段说明,字段说明……其中,字段说明的格式是: 字段名:宽度 [=预赋值]例: REC RECORD A:8=12H,B:5=10,C:3定义了一个字,其中:A占高8位,预赋值=00010010BB占接下来5位,预赋值=10000BC占低3位,预赋值=011B记录变量的的申请与赋初值格式:记录变量名 记录名 <初始值表>例: REC_VAR REC <,1,2>申请了一个变量REC_VAR,其值为:

0001001000001010B

预赋值12H初始化为1初始化为2记录的访问WIDTH操作符: 求记录或记录中某个字段的宽度(即位数)。格式: WIDTH 记录名或记录字段名记录字段名: 求该字段的最低位右移到所在记录最右边所需的移位次数MASK操作符: 返回一个8位或16位二进制数,这个数中,对应于指定字段的各位均是1,其余各位均是0。格式: MASK 记录字段名例:MOV AX,REC_VAR ;AX←0001001000001010BMOV BL,WIDTHREC_VAR ;BL←REC_VAR的总宽度16MOV BH,WIDTHA ;BH←字段A的宽度5MOV CL,B ;CL←3MOV DX,MASKC ;DX←0000000000000111B二、指令性语句格式: [标号:] 指令助记符 操作数,操作数,…… [;注释]标号:标号表示机器指令语句的存放地址,其后面必须紧跟冒号“:”。指令助记符:指令助记符表示该语句的操作类型,如数据传送、算术运算等。操作数:操作数表示指令助记符的操作对象,不同指令的操作数个数不同。注释:与指示性语句中的注释相同,仅用于说明、解释当前语句。1、NIL指令NIL指令并不属于80x86的指令系统只用于宏汇编中作用:保留一个空行

例:L: NIL ;留下一个空行,方便以后对程序的修改 LOOP L 等价于:L:LOOPL(2)DOS系统功能的调用将调用功能所需的入口参数存入指定的寄存器或存储单元中;在寄存器AH中存放所要调用功能的功能号;执行INT21H指令,转入中断子程序;中断子程序运行完后,从指定的寄存器或存储单元中取得出口参数。

(1)单字符显示(功能号:02H)功能:将指定的字符送到显示器显示例:MOV DL,‘A’ ;入口参数,DL存放字符的ASCII码MOV AH,02H;02H号功能调用INT 21H ;显示字符‘A’(2)单字符输入(功能号:01H、07H)功能:从键盘输入字符→AL例:MOV AH,01H;01H号键盘输入功能调用INT 21H ;AL←输入字符的ASCII码,并显示字符07H号功能调用与01H号相似,但输入的字符没有在屏幕上显示(3)检测键盘状态(功能号:0BH)

功能: 检测当前时刻键盘是否有键按下。如果有,则出口参数AL=0FFH,否则AL=0。该功能不清除输入缓冲。 例:循环运行程序段,直到有按键按下为止RUN:…… ;循环运行的程序段 …… MOVAH,0BH ;0BH号功能调用 INT 21H ;检测键盘状态 CMPAL,0 JZRUN ;AL=0表示没有键按下 MOVAL,01H ;没有清除缓冲,仍可读到按键 INT 21H(4)直接控制台I/O(功能号:06H)功能:输入/输出字符:入口参数DL=0FFH:检测当前时刻键盘是否有键按下。如果有,则出口参数AL=输入的字符,ZF=0,清除输入缓冲区;如果没有,则ZF=1。入口参数DL≠0FFH:将DL中的ASCII码送显示器上显示例:循环运行程序段,直到有按键按下为止RUN:…… ;循环运行的程序段 …… MOVAH,06H ;06H号功能调用 MOVDL,0FFH ;DL=0FFH,输入功能调用 INT 21H ;检测键盘状态 JZ RUN(5)字符串显示(功能号:09H)功能: 将数据段中的字符串输出到屏幕上字符串的首地址→DS:DX中,字符串一定要以字符‘$’作为结尾标志例:DATA SEGMENTSTRING DB ‘HELLO’,0DH,0AH,‘$’;需以‘$’结尾DATA ENDS代码段:MOV AX,DATAMOV DS,AX ;DS←字符串所在段的段地址LEA DX,STRING ;DX←字符串首地址的偏移量MOV AH,09H ;09H号功能调用INT 21H ;在屏幕上显示“HELLO”(6)字符串输入(功能号:0AH)功能:字符串输入,回车键结束入口参数: DS:DX:缓冲区首地址 (DS:DX):允许输入的最多字符数出口参数:

(DS:DX+1):实际输入的字符数(不计回车)

(DS:DX+2)开始:输入的字符串(包括回车)例:BUF DB 10H,100DUP(?);输入字符数不超过16MOV AX,DATAMOV DS,AX ;DS←缓冲区所在段的段地址LEA DX,BUF ;DX←缓冲区首地址的偏移量MOV AH,0AH ;0AH号功能调用INT 21H ;输入字符串若输入“123”,则BUF中的内容为:10H,03H(输入3个字符),31H,32H,33H,0DH(回车)(7)打印输出(功能号:05H)功能:将DL寄存器中的字符送打印机打印例:

MOV DL,‘A’ ;需打印的字符‘A’ MOV AH,05H ;05H号功能调用 INT 21H ;送打印机打印(8)结束调用(功能号:4CH)功能:终止当前程序,并返回到DOS中例: MOV AH,4CH INT 21H第四节宏汇编指令一、宏操作伪指令宏定义伪指令MACRO、ENDM取消宏定义伪指令PURGE重复伪指令REPT、IRP、IRPC局部符号伪指令LOCAL1、宏定义伪指令MACRO、ENDM格式: 宏名 MACRO [形式参数1,形式参数2,……] …… ;宏体

ENDM ;宏定义结束例1: OUTPUT MACRO MOV AH,02H INT 21H ENDM 则: OUTPUT等价于 “MOVAH,02H,INT21H”例2:OUTPUT MACRO ASC ;“ASC”为形式参数

MOV DL,ASC MOV AH,02H INT 21H ENDM则:OUTPUT 30H等价于: MOV DL,30H MOV AH,02H INT 21H2、取消宏定义伪指令PURGE功能: 使用MACRO定义的宏,如果不再需要,就可以用PURGE来注销格式: PURGE 宏名1、宏名2,……例: PURGE OUTPUT3、重复伪指令REPT、IRP、IRPCREPT格式:REPT 表达式…… ;宏体ENDM功能: 重复执行宏体中的语句,重复次数为表达式的值。例如,下面的宏能将AL中的值逻辑左移4位:REPT 4SHL AL,1ENDMIRP格式:IRP 形式参量,<参数,参数,……>…… ;宏体ENDM功能: 重复执行宏体,重复的次数是由参数的个数决定例,把AX、BX、CX、DX都压入栈中:IRP REG,<AX,BX,CX,DX>PUSH REGENDMIRPC格式:IRPC 形式参量,字符串…… ;宏体ENDM功能: 重复执行宏体,其参数列表是字符串,一个字符为一个参数例如:IRPC NUM,1234 ;“1234”表示4个参数1、2、3、4DB NUMENDM 等效于:DB 1,2,3,44、局部符号伪指令LOCAL格式: LOCAL 标号、变量等的列表功能: 将宏中的标号定义为局部符号,避免重复例:错误:IRP REG,<AX,BX>LAB: PUSH REGENDM展开后:LAB: PUSH AXLAB: PUSH BX(LAB重复使用,出错)正确:IRP REG,<AX,BX>LOCAL LABLAB: PUSH REGENDM展开后:??0000: PUSH AX??0001: PUSH BX二、条件汇编格式:

IFxx<条件表达式> …… ;条件块1 [ELSE] …… ;条件块2 ENDIF功能: 根据某个表达式的真假,决定是否对指定的程序段进行编译IF表达式: 如果表达式的值不为0,则条件满足。IFE表达式: 如果表达式值为0,则条件满足。IF1: 在汇编程序的第一次扫视期间满足条件。IF2: 在汇编程序的第二次扫视期间满足条件。IFDEF符号: 如果指定的符号已经在程序中被定义,或被说明为EXTRN,则条件为真。IFNDEF符号:

如果指定的符号在程序中未被定义,且不被说明为EXTRN,则条件为真。IFB<变量>:如变量为空,则条件为真。IFNB<变量>:如变量不为空,则条件为真。IFIDN<arg1>,<arg2>:如字符串arg1和串arg2相同,条件为真。IFDIF<arg1>,<arg2>:如字符串arg1和串arg2不相同,条件为真。第五节编写完整的汇编语言程序汇编语言程序与MS-DOS一般的汇编语言程序的整体框架模块化程序设计的思想利用简化段定义伪指令编写完整程序一、汇编语言程序与MS-DOS1、DOS的装入功能确定用于存放程序的内存地址空间建立程序段前缀PSP(ProgramSegmentPrefix)100H个字节,存放程序有关信息及进程间的控制信息最开始的两个字节是一条INT20H软中断指令在PSP后装入可执行程序:数据段附加段代码段堆栈段初始化各个相关寄存器的值:DS、ES:PSP所在段的段地址CS、IP:程序的入口地址入口地址=第一条可执行语句的段地址和偏移量这个地址是从END语句中标号的地址属性得到的SS初始化为堆栈段的段地址SP指向堆栈段的栈底2、DOS的返回方法一:执行PSP中的“INT20H”指令:CS←PSP的段地址IP←0具体过程:程序开头:PUSHDS ;开始时(DS)=PSP的段地址MOVAX,0PUSHAX ;“0”入栈程序过程,要求PUSH与POP配对程序结束:RETF ;CS←PSP的段地址,IP←0例: CODE SEGMENT ASSUME CS:CODE MAIN PROC FAR BEGIN: PUSH DS ;PSP的段地址入栈

MOV AX,0 ;INT20H的偏移量为0 PUSH AX ;把偏移量入栈

……

RET ;IP←0,CS←PSP段地址 MAIN ENDP CODE ENDS END BEGIN方法二:调用DOS系统的4CH功能,实现DOS返回: MOV AH,4CH INT 21H例:CODE SEGMENT ASSUME CS:CODEBEGIN: …… …… MOV AH,4CH ;返回DOS INT 21HCODE ENDS END BEGIN二、一般的汇编语言程序的整体框架数据段、附加段堆栈段ASSUME伪指令代码段END伪指令注释源程序结构框架框架一: DATA SEGMENT ;数据段

…… ;定义变量、缓冲区等 DATA ENDS STACK SEGMENTPARASTACK‘STACK’;堆栈段部分

DB XXXXDUP(?) ;定义堆栈的长度 STACK ENDS CODE SEGMENT ;代码段部分

ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATA MAIN PROC FAR BEGIN: PUSH DS MOV AX,0 ;为RET提供转移地址

PUSH AX 数据段堆栈段 MOV AX,DATA MOV DS,AX ;初始化段寄存器DS、ES

MOV ES,AX …… ;程序部分

RET ;返回DOS MAIN ENDP PROC_1 PROC NEAR/FAR …… ;定义其他过程 RET PROC_1 ENDP CODE ENDS END MAIN框架二: 采用“4CH”功能返回:(代码段部分) CODE SEGMENT ;代码段

ASSUME CS:CODE,DS:DATA, & SS:STACK,ES:DATA BEGIN: MOV AX,DATA MOV DS,AX ;初始化DS、ES MOV ES,AX …… ;程序部分

MOV AH,4CH ;4CH号功能调用

INT 21H ;返回DOS

CODE ENDS END BEGIN三、模块化程序设计的思想1、模块命名伪指令NAME、TITLE格式: NAME 模块名 TITLE 模块名作用:为模块命名,指示给连接程序进行连接用2、逻辑段与物理段 编译连接时,同类逻辑段将组合成一个大的物理段3、同类名的组合方式PRIVATE(缺省方式):不组合PUBLIC:同类名段按照前后次序连接在一起COMMON:与其他模块中的同类名段有相同的起始物理地址STACK:与其他模块中的同类名段用覆盖的方式连接,从高地址开始覆盖MEMORY:该段必须放在同类名的各个段中的最后AT表达式:直接指定该段的段地址4、模块之间的通信PUBLIC与EXTRN:格式: PUBLIC标识符,标识符,…… EXTRN标识符:属性,标识符:属性,……功能: PUBLIC:说明模块中某些标识符可以被其它模块访问 EXTRN:说明本模块中哪些标识符是外部的,以及这些标 识符的属性是什么例:模块1: NAME MOD1 PUBLIC VAR1 ;公用标识符VAR1 DATA1 SEGMENTPARAPUBLIC‘DATA’ VAR1DB? ;字节变量VAR1 DATA1 ENDS模块2: NAME MOD2 EXTRN VAR1:BYTE ;说明VAR1是字节 CODE2 SEGMENTPARAPUBLIC‘CODE’ …… MOV AL,VAR1 ;访问MOD1中的字节变量VAR1 ……四、简化段定义伪指令1、定义内存模式伪指令.MODEL格式: .MODEL存储模式[,高级语言接口,操作系统,堆栈距离]存储模式:TINY(最小模式):代码和数据同段SMALL(小模式):一个代码段,一个数据段MEDIUM(中模式):一个数据段,多个代码段COMPACT(压缩模式):多个数据段,一个代码段LARGE(大模式):多个代码段,多个数据段HUGE(巨模式):多个代码段,多个数据段(允许>64KB)高级语言接口:汇编程序可以作为一个过程,供其他高级语言调用可选的语言有C、BASIC、FORTRAN、PASCAL操作系统:指明程序运行的操作系统可选的操作系统:OS_DOS、OS_OS2两种默认OS_DOS堆栈距离:指明堆栈段是否与数据段合并在同个段组中。选项:NEARSTACK(与数据段同组)、FARSTACK(堆栈段单独作为一段,不与数据段合并)默认的堆栈距离为NEARSTACK2、简化段定义伪指令.CODE:定义代码段.DATA:定义已初始化的数据段

.DATA?:定义未初始化的数据段.FARDATA:定义远程已初始化的数据段.FARDATA?:定义远程未初始化的数据段.CONST:定义常数数据段.STACK:定义堆栈段3、等价名的概念@CODE:代表代码段等价的段名@DATA:代表由.DATA、.DATA?、.CONST、.STACK等所定义的段所在的段组名@FARDATA:代表.FARDATA所定义的数据段@FARDATA?:代表.FARDATA?所定义的数据段4、指定段序伪指令.ALPHA:根据各个段的段名,按字母顺序排序.SEQ(缺省):按照各个段在程序中出现的顺序进行排序DOSSEG:按照DOS系统对段序的定义进行排序。其排序的规则是:首先是类名为‘CODE’的段;其次是类名不是‘CODE’,且不是段组DGROUP成员的段;最后是属于DGROUP的段。第六节汇编语言程序设计一、程序设计基本方法分析实际问题,确定基本思路及程序算法绘制程序流程图根据流程图编写程序调试程序1、流程图起止框:表示程序的开始和结束工作框:说明该步骤的功能判断框:说明判断的条件调用框:说明调用过程的名字、参数等连线:表示程序的走向功能条件?子程序起止框

工作框

条件框

调用框

连线2、程序的基本结构形式顺序结构按直线顺序执行程序分支结构含判断语句,根据判断结果选择分支例: CMP AL,BL JZ L1 ;相等L2: …… ;不等 JMP NEXTL1: ……NEXT:……程序段1程序段2程序段3顺序结构条件?程序段1程序段2分支结构YN(3)循环结构初始化部分循环体部分循环条件判断部分例: MOV CX,100;初始化部分L: …… ;循环体开始 …… DEC CX ;修改循环变量 JNZ L ;循环条件判断条件?循环体初始化循环结构YN(4)子程结构在程序中需要多次出现的程序段,可定义为一个子程序,在主程序需要的时候就可以直接调用它寄存器的保护与恢复主程序与子程序之间的参数传递子程序可嵌套调用程序段1程序段2过程调用子程结构二、程序设计举例显示二进制数的ASCII码形式DATA SEGMENTNUM DB 12H,34H,0ABH,0CDH ;需显示的字节COUNT EQU $-NUM ;字节数AFTER DB 'B',0DH,0AH,'$' ;‘B’、回车换行DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA SI,NUM ;数据的地址 MOV CX,COUNT ;字节数AGAIN: MOV BH,[SI] ;需显示的数←BH MOV BL,8 ;左移8次PRINT: MOV DL,30H

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论