二实模式程序设计汇编语言_第1页
二实模式程序设计汇编语言_第2页
二实模式程序设计汇编语言_第3页
二实模式程序设计汇编语言_第4页
二实模式程序设计汇编语言_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言源程序编制完成后,在计算机上的操作过程分为四个阶段:编辑、汇编、连接、运行调试2.3汇编语言2.3.1汇编语言程序的开发过程1.程序的编辑编辑阶段的主要任务是:

输入源程序;对源程序进行修改。2.3汇编语言2.3.1汇编语言程序的开发过程大多数的文字编辑软件都可以用来输入和修改汇编语言源程序,如记事本(Notepad)、写字板(Writer)、Word以及命令行方式下的Edit(推荐使用)。一定要用“纯文本”格式来储存源程序文件,否则无法汇编。产生的源程序文件应该以“.ASM”或“.TXT”为扩展名,最好使用“.ASM”扩展名。2.程序的汇编

汇编阶段的任务是把汇编语言源程序“翻译”成为机器代码(称为“目标”),产生二进制的“目标文件”。

2.3汇编语言2.3.1汇编语言程序的开发过程常用的汇编工具Microsoft公司的MASM(MacroAssembler,宏汇编)

Borland公司的TASM(TurboAssembler)

假设已经产生了一个汇编语言源程序文件“MYPRG1.ASM”,可以用如下命令进行汇编:TASM MYPRG1↙该命令正确执行后,将产生一个同名的目标文件MYPRG1.OBJ。3.如果汇编语言源程序文件以“.TXT”为扩展名,汇编时要使用这个文件的“全称”:TASM MYPRG1.TXT↙Errormessages:NoneWarningmessage:NoneTASM命令执行后,在屏幕上显示相关信息。说明这个程序已经顺利地通过了“汇编”,没有发现错误。**Error**EX2.ASM(14)Valueoutofrange……Errormessages:1表示汇编源程序EX2.ASM第14行有“数值超出范围”的错误,程序的错误总数为1。2.3汇编语言2.3.1汇编语言程序的开发过程4.程序的连接连接阶段主要完成的操作

把几个程序模块产生的目标文件连接成一个完整的可执行程序;把“子程序库”中的子程序连接到程序中去。连接命令行C:>LINKMYPRG1.OBJ ;生成MYPRG1.exe2.3汇编语言2.3.1汇编语言程序的开发过程5.程序的执行DOS中直接输入程序名称:MYPRG1.exe或MYPRG1一、发生以下两种情况之一的,需要对程序进行“调试”。

1、汇编语言程序不包含输出结果的相关指令,操作者无法看到程序的运行结果。2、程序能够运行,但是不能得到预想的结果。二、调试(Debug):在操作者的控制下执行这个程序,观察程序每个阶段的执行结果,或者修改参数反复运行程序,查找出程序中还存在的不正确的地方,或者验证程序的正确性。TASM5.0软件包中,用于程序调试的软件称为“TD”

(TurboDebugger):2.3汇编语言2.3.1汇编语言程序的开发过程6.程序的执行调试程序“TD”的运行界面2.3汇编语言2.3.1汇编语言程序的开发过程7.汇编语言的语句格式分类语句一般由分隔符分成的四个部分组成,它们有两种格式:执行性语句——由处理器指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中,其结构如下:2.3汇编语言2.3.2汇编语言语句的格式标号:(label)操作符(operator)操作数n(operand);注解(comment)8.汇编语言的语句格式分类

2.3汇编语言2.3.2汇编语言语句的格式每一条指令语句,使汇编程序产生一条8086/8088指令。大部分指令语句都由操作符(操作码)、操作数组成;部分要有标号、操作符、操作数、注解;个别指令语句只有操作符。AGAIN:CALLDELAY;延迟1豪秒MOVAL,DLADDAL,1DAA………JMPAGAIN

9.说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序,其结构如下:2.3汇编语言2.3.2汇编语言语句的格式名字(Name)伪操作符(Pseudo)参数列表(Parameter);注解(comment)

汇编语言程序的语句中的伪指令,不象机器语言指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序来处理的一类操作,它可以完成如数据定义、分配存储器、指示程序开始和结束等功能。10.标号和名字是一种符号地址类型:1、标号:指令符号地址2、变量:数据符号地址操作符和伪操作符操作符可以是任何一条处理器指令,也可以是一条宏指令。伪操作符主要完成一些不产生CPU动作的说明性工作,在程序执行前由汇编程序完成处理。操作数和参数处理器指令的操作数可以是立即数、寄存器和存储单元。是指定参与操作的数据。伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号隔开。2.3汇编语言2.3.2汇编语言语句的格式11.注解注释项用来说明一段程序或一条或几条指令的功能,是可有可无的。通常在编写程序时,为了增强程序的可读性。通常一般注解是以一个英文分号(;)为开头,而且不管你在何处打入此符号,汇编程序都会假设其右边的所有字符均是注解。(注解可包含任何字符,包括空白字符)。2.3汇编语言2.3.2汇编语言语句的格式12.变量和标号属性类伪指令地址操作符:地址操作符取得名字或标号的段地址和偏移地址两个属性:中括号[]:表示将括起来的表达式作为存储器地址指针;符号$:表示当前偏移地址;段前缀的冒号:也是一种地址操作符,表示采用指定段的段地址寄存器。2.3汇编语言2.3.3常用的伪操作指令13.2.2指令系统

$:为地址计数器.在汇编语言程序中经常使用地址计数器的值$来保存当前正在汇编的地址.记载下一个变量或指令在当前段中的偏移量.每处理一条指令$增加一个值.此值为该指令所需的字节数.例:ORG0100HAYDW7,$+4,8,9CNTEQU$-AYDB3,8,CNT,9,1,2…..执行:MOVAX,AY+2;AX=?MOVBX,AY+10;BX=?

2.3.3常用的伪操作指令14.2.2指令系统例:ORG0100HAYDW7,$+4,8,9CNTEQU$-AYDB3,8,CNT,9,1,2…..执行:MOVAX,AY+2;AX=?MOVBX,AY+10;BX=?

2.3.3常用的伪操作指令15.变量和标号属性类伪指令地址操作符:另外还有如下两个:SEG 变量/标号 ;返回变量或标号的段地址例:MOVAX,SEGM1MOVDS,AXM1是段名为DATA的数据段中的一个变量名。OFFSET 变量/标号 ;返回变量或标号的偏移地址例:若DA1为数据段中一个变量名MOVBX,OFFSETDA1;汇编程序将变量DA1的偏移地址送到BX中,相当于指令LEABXDA1。2.3汇编语言2.3.3常用的伪操作指令16.类型操作符类型操作符对变量或标号的类型属性进行相关的设置1、PTR格式:类型/距离PTR变量/标号对变量或标号的类型属性进行临时指定或修改存储器操作数的类型属性(保持原有的属性)功能:是将PTR左边的类型属性赋给右边的变量或标号。PTR本身并不分配存储单元,仅给已分配的存储单元临时赋予新的属性,这样可以保证运算时操作数类型的匹配,常与类型BYTE、WORD、NEAR、FAR等连用。 2.3汇编语言2.3.3常用的伪操作指令17.类型操作符1、PTR例:N1DB15H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1;使N1类型转换成字与AX类型匹配。MOVBL,BYTEPTRN2;使N2类型转换成字节与BL类型匹配。例:MOVBYTEPTR[BX],10H;[BX]←10HMOVWORDPTR[BX],10H;[BX],[BX+1]←0010H例:JMPFARPTRLO;这是用PTR改变距离属性,在JMP语句中将标号LO改为FAR,使JMP指令安排在其它代码段中也可以使用,以实现段间转移。2.3汇编语言2.3.3常用的伪操作指令18.2、THIS 格式:变量/标号EQUTHIS 类型/距离功能:THIS指定的变量或标号本身并不分配存储单元。它与紧跟其后的变量或标号只有类型不同,而段地址和偏移地址均相同。THIS的功能是将EQUTHIS右边的类型/距离属性,赋左边的变量/标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。例:DATA1EQUTHISBYTEDATA2DW1234H;DATA1、DAT2有相同段地址和偏移地址,但类型值不同。MOVAX,DATA2;AX=1234HMOVBL,DATA1;BL=34H2.3汇编语言2.3.3常用的伪操作指令19.3、SHORT

格式:SHORT标号;设定标号为短转移标号SHORT指定标号作为-128~+127字节范围内的短转移。2.3汇编语言2.3.3常用的伪操作指令20.

4、TYPE变量/标号

TYPE加在变量前,返回变量的类型属性,如表所示:

2.3汇编语言2.3.3常用的伪操作指令A1DB20H,30HA2DW0438HA3DD?L1:MOVAH,TYPEA1MOVBH,TYPEA2ADDAL,TYPEA3MOVBL,TYPEL1汇编时形成指令:MOVAH,1MOVBH,2ADDAL,4MOVBL,0FFH(-1)21.5、LENGTH、SIZELENGTH:用来计算一个存储区中的单元(单元可以是字节、字或双字)的数目。SIZE:用来计算一个存储区的字节总数。例2-3-3-5:以ABC为地址标号的存储区是用伪指令ABCDW100DUP(?)来定义的。TYPEABC等于2LENGTHABC等于100SIZEABC等于2002.3汇编语言2.3.3常用的伪操作指令22.6、LABEL格式:名称LABEL类型属性名称为LABEL语句下一行所使用的语句中的变量或标号取的别名.LABEL伪指令助记符,不可缺省.类型属性规定了所起别名的变量或标号的类型,此别名与原变量标号具有相同的段基址及偏移地址.说明:LABEL伪指令给已定义的变量或标号取另一个名字,并可重新定义它的类型属性,使同一变量或标号在不同地方被引用时,可采用不同的名字,具有不同的类型属性,提高程序的灵活性。

2.3汇编语言2.3.3常用的伪操作指令23.6、LABEL例1、DATBLABELBYTEDATWDW3031H,3233HMOVAL,DATB;31HALMOVBX,DATW;3031HBX堆栈段中经常这样使用LABEL例2、SSTACKSEGMENTSTACK‘STACK’DW100DUP(?)TOPLABELWORDSSTACKENDS此处定义100个字的堆栈,TOP为栈底的名,类型为字。

MOVSP,OFFSETTOP

2.3汇编语言2.3.3常用的伪操作指令24.例3、DISFLABELFARDISN:MOVAX,[SI]

DISF与DISN指向同一条指令,DISF是DISN的别名,但距离属性改为FAR,其它代码段可调用。2.3汇编语言2.3.3常用的伪操作指令25.EQU(标号赋值语句)格式:名称EQU表达式说明:EQU伪操作用于定义一个数值。在程序指令中,则用该数值取代所定义的名称。实例: VALUE EQU 10 COUNT EQU VALUE经过以上定义后,在程序中若写VALUE则代表10,若你写COUNT,则是代表VALUE,在此例是10。2.3汇编语言2.3.3数据的定义26.=格式:名称=表达式说明:“=”伪操作与EQU类似,但EQU可以定义文字(例COUNTEQUVALUE)和数值,而“=”只能用以定义数值;并且“=”伪操作中的名称允许重复定义,而EQU不允许重复定义。实例: COUNT=18 COUNT=COUNT+12.3汇编语言2.3.3数据的定义27.数据定义及存储空间分配伪操作DB、DW、DD、DQ和DT格式1:[变量名称]伪操作助记符 操作数,操作数…;注释格式2:[变量名称]伪操作助记符nDUP(操作数,操作数…);注释功能:将操作数存入变量名指定的存储单元中,或者只分配存储空间不存入数据。1、变量名:它用符号表示,可以省略,作用与指令语句中的标号相同。但后面不跟冒号“:”。汇编时将此变量的助记符后的第一个字节的偏移地址作为它的符号地址。2.3汇编语言2.3.3数据的定义28.数据定义及存储空间分配伪操作DB、DW、DD、DQ和DT2、格式中的伪操作助记符共有以下5种:DB(DefineByte):定义字节数据,分配1个字节存储空间;DW(DefineWord):定义字数据,分配2个字节存储空间;DD(DefineDoubleword):定义双字,4个字节;DQ(DefineQuadword):定义四个字,8个字节;DT(DefineTenbytes):定义十个字节,10个字节。3、操作数:操作数可以是常数,字符串,变量,标号,表达式等,,多个操作数之间必须用逗号分开。在格式2中,用nDUP()表示时,n必须是正整数,表示括号中的操作数的重复次数,DUP后面必须带括号。4、注释:说明伪指令的功能,可以省略,注释前必须带分号“;”。2.3汇编语言2.3.3数据的定义29.例2-3-4-1:操作数是常数或表达式DA1DB10H,52H;变量DA1中装入10H,52HDA2DW1122H,34H;变量DA2中装入22H,11H,34H,00HDA3DD5*20H,0FFEEH;变量DA3中装入000000A0H,0000FFEEH汇编后数据在存储器中存放格式如图所示:2.3汇编语言2.3.3数据的定义30.例2-3-4-2:操作数是字符串FIRSTDB‘HELLO’;将字符串‘HELLO’的ASCII码装入FIRST单元开始的存储单元SECONDDW‘OK’;将字符串‘OK’的ASCII码装入SECOND开始的存储单元2.3汇编语言2.3.3数据的定义31.例2-3-4-3:操作数用?定义不确定值的变量,用作保留存储空间,以便存放运算结果。M1DB?;定义变量M1为不确定字节,;保留一个字节空间。M2DW0D55H,?;定义变量M2第二个字为不确定,;保留两个字节空间。2.3汇编语言2.3.3数据的定义32.例2-3-4-4:操作数用DUP来定义重复变量ONEDB5DUP(0);重复5个0存入ONE起始的存储单元。TWODW10DUP(?);重复10次,保留10个字的存储单元空间。THREEDB4DUP(1,2DUP(20H));DUP嵌套

2.3汇编语言2.3.3数据的定义33.当定义的数据为2字节及以上时,数据在内存中的存放顺序是:“低字节存放在低地址,高字节存放在高地址”。例: DATA1 DB 08H DB 10H DATA2 DW 0011H DATA3 DD 11223344H假设DATA1的起始地址是20200H,则编译成机器代码,相对应内存内容如图2-12所示

2.3汇编语言2.3.3数据的定义变量内存地址内存内容…低地址DATA120200H08H↓20201H10H↓DATA220202H11H↓20203H00H↓DATA320204H44H↓20205H33H↓20206H22H↓20207H11H↓…高地址34.例:2-3-4-5用逗号隔开的常数DATADB45H,45H,45H,45H,45H复制形式的运算符DATADB5DUP(45H)字符串STRINGDB‘Reg16?’

2.3汇编语言2.3.3数据的定义…45H45H45H45H45H…DATA3FH…52H65H67H36H31H20HSTRINGR的ASCII码eg16空格?的ASCII码35.ORG

给汇编程序设置位置指针,用来指明该语句下面的程序段在段内的起始地址。格式:ORG 表达式其中:ORG是伪指令助记符。表达式给定的偏移地址值,表达式的计算结果必须是正整数。一般情况下,段定义语句(SEGMENT)指出了段的起点,偏移地址为0。当用户要求指定某条指令或数据为某个指定地址时,可用ORG语句来改变,ORG可以放在程序的任何位置。2.3汇编语言2.3.3常用的伪操作指令36.ORG例2-3-3-1用ORG指定代码段地址。CODESEGMENTORG100HASSUMECS:CODE,DS:DATA….START:MOVAX,DATA;此代码段起始地址偏移100H...CODEENDS2.3汇编语言2.3.3常用的伪操作指令37.ORG例2-3-3-2用ORG指定数据段地址。DATASEGMENTORG100HA1DB10H,20H,30H;A1偏移地址为100HORG200HA2DW303H,3233H;A2偏移地址为200HDATAENDS2.3汇编语言2.3.3常用的伪操作指令38.END用来指明整个程序的结束。格式:END标号名END是伪指令助记符,不可缺省,放在源程序的最后一行。标号名是该程序中第一条可执行语句的标号名,可缺省。说明:ENDS、ENDP与END的区别:ENDS指令是用来标明一个段(Segment)的结束;ENDP是用来指示一个过程(Procedure)的结束;END指明整个程序的结束。2.3汇编语言2.3.3常用的伪操作指令例2-3-3-2CODESEGMENTASSUMECS:CODESTART:...SUB1PROCNEAR...SUB1ENDPCODEENDSENDSTART39.EVEN格式:EVEN ;使他后面的数据或指令从偶地址开始说明:EVEN直接放在某一语句前,汇编程序汇编时就会完成将地址调整在偶地址上。XDATASEGMENTORG100HX1DB0DHEVENX2DW100DUP(?)XDATAENDS2.3汇编语言2.3.3常用的伪操作指令若X1的偏移地址是100H。则X2的100个字从偏移地址102H开始。每个字从偶地址开始存放。40.ALIGN格式:ALIGNn ;使他后面的数据或指令 ;从n的整数倍地址开始说明:ALIGN伪指令是将当前偏移地址指针指向n(n是2的乘方即2、4、8、16等)的整数倍的地址。如果下一个地址正好能被n整除,那么,该伪指令不起作用。否则,汇编程序将空出若干个字节,直到下一个地址能被n整除为止。2.3汇编语言2.3.3常用的伪操作指令B1DB12HALIGN2W1DW4567HB1DB12HEVENW1DW4567H41.SEGMENT和ENDS段定义伪指令,是用来定义段的组合。指令格式: 段名 SEGMENT[定位类型][组合类型][‘类别’]………… ;指令语句或伪指令语句 ……段名 ENDS2.3汇编语言2.3.3常用的伪操作指令42.SEGMENT和ENDS段定义伪指令,是用来定义段的组合。指令功能:定义段名,段属性段名是逻辑段的标识符,不可省略,它确定了逻辑段在存储器中的地址(指明段基址),SEGMENT和ENDS前的段名必须相同。SEGMENT…ENDS是段定义的伪指令助记符,任何一个逻辑段必须以SEGMENT开始,ENDS结束,不可省略,并需成对出现,两者之间是本逻辑段的内容。2.3汇编语言2.3.3常用的伪操作指令43.SEGMENT和ENDS段定义伪指令,是用来定义段的组合。指令格式: 段名 SEGMENT[定位类型][组合类型][‘类别’]………… ;指令语句或伪指令语句 ……段名 ENDS[定位类型]、[组合类型]、[‘类别’]这三个参数用来增加类型及属性说明,一般可以省略,如果需要用连接程序把本程序相连时,需要用到这些参数2.3汇编语言2.3.3常用的伪操作指令44.SEGMENT和ENDS1、定位类型:此参数是对段起始地址定位.汇编程序对源程序汇编后生成的是目标代码文件(.OBJ),其中的段地址和偏移地址都未最后确定,还需要用链接程序(LINK)把各个模块链接起来.定位类型参数用于告诉LINK程序,链接时本段首地址的边界定位方式.四种类型的边界地址要求:PAGE=xxxxxxxxxxxx00000000;以256字节为边界段起始地址必须是256的倍数地址。地址低8位为0,一页的起点。PARA=xxxxxxxxxxxxxxxx0000;以16字节为边界段起始地址必须是16的倍数地址。地址低4位为0。(默认)WORD=xxxxxxxxxxxxxxxxxxx0;以2字节为边界段起始地址必须是偶地址。地址低1位为0。BYTE=xxxxxxxxxxxxxxxxxxxx;以1字节为边界段起始地址可以定位在存储单元的任何地址。2.3汇编语言2.3.3常用的伪操作指令45.

SEGMENT和ENDS2、组合类型:表示本段与其它段之间,具有相同段名的各段的组合关系,为连接程序提供信息。六种不同的组合类型:NONE:该段与其它同名段不进行连接,各段独立存储器中,隐含为NONE类型。(默认)PUBLIC:该段与其它模块中的同名段连接时,由低地址到高地址连接起来,组成一个逻辑段,连接次序由连接命令指定。COMMON:连接时该段与其他同名分段有相同的起始地址,采用覆盖的方式在存储器存放。连接长度为各分段中最大长度。2.3汇编语言2.3.3常用的伪操作指令46.

SEGMENT和ENDS2、组合类型:AT表达式:使段的起始地址是表达式所计算的16位段地址上,AT不能用来定义代码段STACK:指定该段作为堆栈段。此参数在堆栈中不可省略,多个模块只需设置一个堆栈段,各模块中的堆栈采用覆盖方式组合,自动初始化SS、SP。如果在定义堆栈段时没有将其说明为STACK类型,那么就需要在程序中用指令设置SS和SP寄存器的值,此时LINK程序将会给出一个警告信息。MEMORY:功能类似COMMON,区别是指定该段将分配在所有其他连接在一起的段的最上层。2.3汇编语言2.3.3常用的伪操作指令47.

SEGMENT和ENDS3、类别:可以是任何合法的名称,但是必须用单引号括起来。连接时,把不同模块中的相同类别的各段在物理上相邻地连接在一起。说明:段定义时,段名是不能省略的,定位类型、组合类型和类别均可以省略,若不省略,它们的书写顺序不能随意更改。定位类型若被省略,默认为PARA类型。段定义必须以ENDS伪指令结束,在同一段定义中,SEGMENT与ENDS前的段名必须一致。同一个程序中可以出现多个段,这是通过多次段定义来实现的。可以嵌套设置,但不允许交叉设置。2.3汇编语言2.3.3常用的伪操作指令48.段分配语句ASSUME格式:ASSUME段寄存器:名称[,段寄存器:名称,……]实例:ASSUMECS:CODE,DS:DATA,SS:sSTACK说明:格式中的段寄存器可以为CS,DS,ES,SS。ASSUME伪指令可以同时说明四个段寄存器,也可以只说明一个或者两个段寄存器。程序中没有用到寄存器可以省略不写。ASSUME协助汇编程序,将各个段标号(例:CODE,DATA,STACK)翻译成实际地址,但它并不意味着汇编后这些段地址已经装入了相应段寄存器中,段寄存器中的内容除了CS以外,仍需要用程序来装入。2.3汇编语言2.3.3常用的伪操作指令49.例2-3-3-42.3汇编语言2.3.3常用的伪操作指令假设有2个数据段定义如下:DATA SEGMENT A DB 55DATA ENDSDSEG SEGMENT X DB 10DSEG ENDSCODESEGMENTASSUMEDS:DATA,ES:DSEG,CS:CODE MOV AX,DATA MOV DS,AX;装入段基址 MOV AX,DSEG MOV ES,AX设变量A和X的偏移地址都是0000H。指令MOVAL,A自动按照MOVAL,DS:[0000H]的格式

汇编,执行后(AL)=55,结果正确。指令MOVDL,X自动按照MOVDL,ES:[0000H]的格式

汇编,执行后(DL)=10,结果正确。50.例2-3-3-42.3汇编语言2.3.3常用的伪操作指令如果这样来取数据:MOVSI,OFFSETA;A的偏移地址装入SIMOVDI,OFFSETX;X的偏移地址装入DIMOVAL,[SI] ;取A的值送ALMOVDL,[DI] ;取X的值送DL执行的结果:(AL)=55正确,(DL)=55 错误。为了得到正确结果,上面第4条指令改写为:MOV DL,ES:[DI] ;执行后(DL)=10,结果正确,这条指令,指定了段基址,汇编出来的的机器指令比MOVDL,[DI]多1个字节,称为段跨越前缀. 51.SEGMENT和ENDS

80x86/Pentium完整段定义的扩充。(为了表示32位微处理器的功能)指令格式:

段名 SEGMENT[定位类型][组合类型][字长选择][‘类别’]………… ;(段体) ……段名 ENDS与前述段定义格式比较,主要区别是增加了字长选择项,该项用于定义段的寻址方式,共有两种选择:USE16—对应8086/8088实地址方式,段基址16位,偏移量16位,最大段长64K.USE32—对应保护方式,段基址16位,偏移量32位,最大段长4GB

字长选择项只有在源程序开始时使用了.386、.486、.586或(.386P、.486P、.586P)方式选择的情况下有效。(默认为USE32)2.3汇编语言2.3.3常用的伪操作指令52.SEGMENT和ENDS

80x86/Pentium完整段定义的扩充。(为了表示32位微处理器的功能)指令格式:

段名 SEGMENT[定位类型][组合类型][字长选择][‘类别’]………… ;(段体) ……段名 ENDSUSE16—对应8086/8088实地址方式,段基址16位,偏移量16位,最大段长64K.USE32—对应保护方式,段基址16位,偏移量32位,最大段长4GB

方式选择伪指令如:.386、.486、.586或(.386P、.486P、.586P)等,是80x866/Pentium扩展伪指令。方式选择伪指令能确定微处理器的工作方式和当前指令集,它告诉汇编程序当前的源程序是针对哪种CPU而执行的。(默认为8086/8088指令集)2.3汇编语言2.3.3常用的伪操作指令53.SEGMENT和ENDS

80x86/Pentium完整段定义的扩充。(为了表示32位微处理器的功能)

.486;80486方式DATASEGMENTUSE16;数据段以16位寻址DA1DD……..DA2DD……..DATAENDSFSEGSEGMENTUSE16;附加数据段以16位寻址REDD?FSEGENDSsSTACKSEGMENTSTACKUSE16;堆栈段以16位寻址DB100DUP(?)sSTACKENDSCODESEGMENTUSE16;代码段以16位寻址ASSUMECS:CODE,DS:DATA,FS:FSEG,SS:sSTACK………..CODEENDSEND2.3汇编语言2.3.3常用的伪操作指令54.PAGE和TITLE用来控制汇编列表的格式。PAGE:一般用在程序的开头,用此指令指明每一页中所要打印的行数,及以行中最多的字符个数。格式:PAGE 60,132;设定每页有60行,每行132个字符说明:每页的行数范围是10~255行,而每行的字符数为60~132。若我们省略PAGE的叙述,汇编程序将会自动设定PAGE60,80。TITLE:让一个程序标题印在每一页的上面。格式:TITLE文本名;将文本名赋给源程序目标模块作名字。2.3汇编语言2.3.3常用的伪操作指令55.NAME格式:NAME程序名说明:为源程序目标模块赋名字。NAME放在程序开始,在输出汇编语言源程序列表文件时,将在每一页的开头打印出该程序名。若源程序中省略NAME伪指令,汇编程序将源文件名作目标模块的名字。2.3汇编语言2.3.3常用的伪操作指令56.PROC和ENDP过程定义伪指令格式:过程名 PROC[类型]…… RET过程名 ENDP2.3汇编语言2.3.3常用的伪操作指令过程名:是给过程起的名子。不可缺少,它是主程序调用(CALL指令)的目标操作数,即子程序入口的符号地址。像标号一样过程名具有三个属性。1、段属性:为该过程所在段的段基址。2、偏移地址属性:指该过程第一个字节与段首址之间距离字节。3、距离属性:为NEAR或FAR。即格式中的[类型]。PROC…ENDP:过程定义伪指令。两者前面有相同的过程名。RET:为过程内部的返回指令。返回指令属于段内返回还是段间返回与过程的类型决定。57.在汇编语言程序设计中,有的程序段要多次使用,除了过程调用的方法外,还可以用宏汇编的方法实现,尤其是子程序段本身较短,而传递的参数较多的情况下,使用宏汇编更加有效。宏是源程序中一段独立的程序段,首先对它进行定义,然后就可以用宏指令语句多次调用它了。2.3汇编语言2.3.3宏指令58.宏定义格式:宏指令名 MACRO <形式参数> … … ;宏体 … ENDM宏指令名:宏定义的名字,不可缺省,宏调用时要使用它,第一个符号必须是字母,其后可以是字母或数字.MACRO…ENDM:宏定义的伪指令助记符,不可缺省.它们成对出现,表示宏定义的开始和结束,ENDM前不带宏指令名.宏体:一段有独立功能的程序代码段。形式参数:可以为“空”(没有),也可以有多个,用逗号分隔。宏体由指令、伪指令和前面已经定义的宏指令组成。2.3汇编语言2.3.3宏指令59.宏调用

经宏定义后的宏指令可以在源程序中调用,宏调用格式:

宏指令名实参,实参…宏调用只需要有宏指令名,若宏定义中有形式参数,那么宏调用时必须带有实际参数来代替形式参数,实际参数的个数,顺序,类型与形式参数原则上是一一对应,各参数用逗号分开。汇编程序不要求它们必须相等,若实参个数大于形参,则多余的实参不予考虑,若实参个数小于形参,则多余的形参作“空”处理。2.3汇编语言2.3.3宏指令60.宏展开

汇编程序在对源程序汇编时,对每个宏调用作宏展开,即用宏定义中的宏体取代宏指令名,并用实参一一对应代替形参,每条插入的宏体指令前带上加号“+”。

实例:例2-3-5-1不带参数的的宏定义,用宏指令来实现AL中内容右移4位。2.3汇编语言2.3.3宏指令宏定义:SHIFTMACROMOVCL,4SARAL,CLENDM宏调用:SHIFT宏展开:将下段程序插入宏调用语句位置。+MOVCL,4+SARAL,CL61.实例例2-3-5-2:宏定义带1个参数,用宏指令实现将AL中的内容右移任意次(小于256)。2.3汇编语言2.3.3宏指令宏定义:SHIFTMACRONMOVCL,NSARAL,CLENDM宏调用1:SHIFT4宏展开1:将下段程序插入宏调用语句位置。+MOVCL,4;AL中内容算术右移4次。+SARAL,CL宏调用2:SHIFT7宏展开2:将下段程序插入宏调用语句位置。+MOVCL,7;AL中内容算术右移7次。+SARAL,CL62.实例例2-3-5-3:宏定义带2个参数,用宏指令实现将任意寄存器的内容右移任意次(小于256)。2.3汇编语言2.3.3宏指令宏定义:SHIFTMACRON,MMOVCL,NSARM,CLENDM宏调用1:SHIFT4,AL宏展开1:将下段程序插入宏调用语句位置。+MOVCL,4;AL中内容算术右移4次。+SARAL,CL宏调用2:SHIFT6,DI宏展开2:将下段程序插入宏调用语句位置。+MOVCL,6;DI中内容算术右移6次。+SARDI,CL63.实例例2-3-5-4:宏定义带3个参数,参数可为操作码,用宏指令实现对寄存器的内容左移或右移任意次。2.3汇编语言2.3.3宏指令宏定义:SHIFTMACRON,M,PMOVCL,NS&PM,CLENDM宏调用1:SHIFT3,AX,HR宏展开1:将下段程序插入宏调用语句位置。+MOVCL,3;AX中内容逻辑右移3次。+SHRAX,CL宏调用2:SHIFT5,BH,AL宏展开2:将下段程序插入宏调用语句位置。+MOVCL,5;BH中内容算术左移5次。+SALBH,CL宏定义可用部分操作码作参数,但在宏定义体中必须用“&”作分隔符,“&”是一个操作符,是形参的前缀,可以将&前后两个符号合并成一个符号.64.宏定义中的标号与变量当宏定义中出现了标号或变量的定义时,若该宏指令被程序多次调用,那么在宏展开后程序中会出现多个相同的标号(或变量),这在汇编过程中会给出重复定义的错误。为了解决这类问题,宏定义中采用局部标号或变量。局部标号或变量有LOCAL为指令定义。格式:LOCAL 参数表说明:格式中的参数就是宏体中要用到的标号或变量。伪指令LOCAL应是宏体中的第一条语句。汇编时,当汇编到这些标号或变量时,汇编语言将用??0000、??0001、??0002等依次代替程序中出现的各个标号。2.3汇编语言2.3.3宏指令65.宏定义中的标号与变量例2-3-5-5定义一个延时程序的宏指令DELAT并且在同一个主程序中两次被调用的扩展情况。DELAYMACRO;宏定义LOCALLOPMOVCX,2801;延时宏指令LOP:LOOPLOPENDM2.3汇编语言2.3.3宏指令66.宏定义中的标号与变量DELAY;宏调用DELAY;宏调用宏展开:

DELAY;宏调用+MOVCX,2801+??0000:LOOP??0000

DELAY;宏调用+MOVCX,2801+??0001:LOOP??00012.3汇编语言2.3.3宏指令67.宏指令和子程序的区别:宏指令实际上就代表了它对应的一组指令。对程序中出现的宏指令进行汇编时,这条宏指令被它对应的一组指令所代替。如果程序中多次使用宏指令,就等于多次重复拷贝了这个指令组,占用的内存随之增加。调用子程序通过执行CALL指令实现,存在从“主程序”与“子程序”之间的两次控制转移。使用宏指令不存在控制转移的过程。使用子程序和宏指令都可以提高编程效率。子程序占用固定大小的存储空间,被主程序调用时,空间不会随调用次数而增加。但是,宏指令占用存储空间会随着使用次数的增加而增加。2.3汇编语言2.3.3宏指令68.程序开始结束语句PAGE,TITLE,ORG,END,EVEN,ALING段定义语句SEGMENT…ENDS段分配语句ASSUME过程定义语句PROC…ENDP变量和标号属性类伪指令数据定义语句DB,DW,DD,DQ和DT赋值语句EQU,=这些语句经常使用,没有这些伪指令,汇编程序不能得到正确的汇编结果。2.3汇编语言2.3.3常用的伪操作指令69.2.3.4完整汇编源程序框架代码段DATA SEGMENT ;定义数据段(数据定义)DATA ENDSEXTRA SEGMENT ;定义附加段(数据定义)EXTRA ENDSsSTACK SEGMENT PARASTACK‘STACK’ ; 堆栈区间预留字节数定义TOP EQU THIS WORDsSTACK ENDS70.CODE SEGMENT ;定义代码段ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:sSTACKSTART:MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV AX,sSTACK MOV SS,AX MOV SP,OFFSETTOP …… MOV AH,4CH INT 21H

CODE ENDS END START71.一、源程序的结构特点(5)1.源程序由若干个逻辑段组成,各逻辑段都有一个段名;2.每个逻辑段由若干行汇编语句组成,整个源程序必须以end语句来结束,它通知汇编程序停止汇编(end后的标号start表示该程序执行时的起始地址)。3.每条语句最多由4个字段组成执行性指令包括::伪指令包括:标号:(label)操作符(operator)操作数n(operand);注解(comment)名字(Name)伪操作符(Pseudo)参数列表(Parameter);注解(comment)72.4.代码段的起始处,用assume命令说明各个段寄存器与逻辑段的关系。并由用户自已设置各段寄存器的初值(cs除外),以建立这些逻辑段的可寻址性。5.每个源程序在代码段中都必须含有返回到DOS操作系统的指令语句,以保证程序执行完毕后自动回到DOS状态。73.二、执行完程序,返回DOS,有两种方法:1标准序:将主程序定义成远(FAR)过程,最后一条指令为RET,在程序开始,用下列指令设置堆栈段MAINPROCFAR PUSH DS MOV AX,0 PUSH AX……RETMAINENDP74.由于开始执行程序的时候,DS、ES并未指向相对应的逻辑段,因此,还要设置DS及ES的值MOV AX,DATAMOV DS,AXMOV ES,AX75.MAINPROCFAR PUSH DS MOV AX,0 PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX……RETMAINENDP76.2非标准序:代替标准序部分,在代码段结束之前增加两条语句MOV AX,4C00H(或MOVAH,4CH)INT 21H77.2.3汇编语言DOS功能调用概述DOS系统功能调用通常指类型号为21H的软件中断。因为在21H类型所对应的中断处理程序中包含了一系列最常用的功能子程序,所以21H类型中断几乎包括了整个的功能,由此也被称为系统功能调用。DOS功能调用的一般步骤装入入口参数到规定的寄存器;装入功能号到AH中;装入子功能号到AL中;调用DOS相应功能的中断(这里一般指INT21H);取出返回结果或出错信息。2.3.5DOS功能调用78.2.3汇编语言DOS功能调用分类DOS软中断(INT20H-INT27H)指令2.3.5DOS功能调用软中断功能入口参数出口参数INT20H程序正常退出INT21H系统功能调用AH=功能号功能调用相应的入口参数功能调用相应的出口参数INT22H结束退出INT23HCTRL-BREAK退出INT24H出错退出INT25H读盘CX=读出扇区数DX=起始逻辑扇区DS:BX=缓冲区地址AL=盘号CF=1出错79.2.3汇编语言DOS功能调用分类DOS软中断(INT20H-INT27H)指令2.3.5DOS功能调用软中断功能入口参数出口参数INT26H写盘CX=写扇区数DX=起始逻辑扇区DS:BX=缓冲区地址AL=盘号CF=1出错INT27H驻留退出INT28H~INT2FHDOS专用80.DOS系统功能调用(INT21H)INT21H功能调用服务程序具有00H~62H个不同的功能。INT2lH功能大致可以分为四个方面:设备管理、目录管理、文件管理和其它;如:键盘输入、显示器(CRT)输出、打印机输出、磁盘文件管理、传统文件管理、扩充文件管理方法等。2.3.5

DOS功能调用81.AH入口参数出口参数功能01H

AL=输入字符从键盘输入一个字符,并在屏幕上显示,检查Ctrl-Break键06H输入DL=0FFH输出DL

0FFHAL=输入字符

直接键盘输入/出字符,不检查Ctrl-Break键07H

AL=输入字符直接键盘输入/出字符,不检查Ctrl-Break键,无回显08H

AL=输入字符键盘输入一个字符,无回显0AHDS:DX=缓冲区首址

输入字符串到内存缓冲区0BH

AL=FFH有键入AL=00H无键入检查键盘输入状态表2-4DOS键盘功能调用

82.AH入口参数功能2DL=显示字符显示一个字符,检验Ctrl-Break6DL=显示字符显示一个字符,不检验Ctrl-Break9DS:DX=串首地址显示字符串,字符串以‘$’结束表2-5DOS显示功能调用

83.(1)01H号功能:功能:从键盘输入一个字符并显示输出出口参数:AL放输入字符的ASCII码。调用方式:MOV AH,1 ;功能号=1INT 21H84.(2)02H号功能:功能:将单个字符显示在当前光标处。入口参数:DL放待输出字符的ASCII码调用方式:MOV AH,2 ;功能号=2MOV DL,<要显示字符的ASCII码>INT 21H85.(3)09H号功能:显示字符串入口参数:DS:DX指向字符串首地址。调用方式:MOV AH,9 ;功能号=9LEA DX,<字符串>INT 21H注意:被显示的字符串必须以’$’结束。86.例:编写一完整的汇编语言程序,实现以下功能: 接收从键盘上输入的字符,根据输入的字符确定要显示的字符串。1、若输入的字符是“g”,显示字符串“good”2、若输入的字符是“h”,显示字符串“happy”3、若输入的字符是“e”,显示字符串“error,again”87.DATASEGMENTmseg1DB‘good$’mesg2DB‘happy$’mesg3DB‘error,again$’DATAENDSCODESEGMENTASSUMEcs:code,ds:datastart:MOVAX,DATAMOVDS,AXagain:MOVAH,01H INT21H CMPAL,’g’ JZL1 CMPAL,’h’ JZL288. CMPAL,’e’ JZL3 JMPexitL1: LEADX,mesg1 MOVAH,09H INT

温馨提示

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

评论

0/150

提交评论