汇编语言补充课件.ppt

上传人:飞****2 文档编号:79052254 上传时间:2023-03-19 格式:PPT 页数:94 大小:1.25MB
返回 下载 相关 举报
汇编语言补充课件.ppt_第1页
第1页 / 共94页
汇编语言补充课件.ppt_第2页
第2页 / 共94页
点击查看更多>>
资源描述

《汇编语言补充课件.ppt》由会员分享,可在线阅读,更多相关《汇编语言补充课件.ppt(94页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1汇编语言程序设计汇编语言程序设计23.1 3.1 汇编语言基本元素汇编语言基本元素3由由汇汇编编语语言言编编写写的的源源程程序序是是由由许许多多语语句句(也也可可称称为为汇汇编编指指令令)组组成成的的。每每个个语语句句由由14个个部部分分组组成成,其格式是:其格式是:标识符标识符指令助记符指令助记符操作数操作数;注解;注解 其中用方括号括起来的部分,可以有也可以没其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格有。每部分之间用空格(至少一个至少一个)分开,一行最多分开,一行最多可有可有132个字符。个字符。3.1.1 3.1.1 汇编语言的语句格式汇编语言的语句格式4(1)标识符

2、:标识符:给指令或某一存储单元地址所起的名字。给指令或某一存储单元地址所起的名字。标识符由下列字符组成标识符由下列字符组成:(以字母或圆点开头):(以字母或圆点开头)字母字母:AZ,az;数字数字:09;特殊字符特殊字符:?._$数字不能作标识符的第一个字符,而数字不能作标识符的第一个字符,而.仅能仅能作标识符的第一个字符,标识符最长为作标识符的第一个字符,标识符最长为31个字符。个字符。标识符后跟冒号时标识符后跟冒号时表示标号表示标号,代表该行指令的起代表该行指令的起始地址始地址,标号可以被转移、调用指令直接引用。标号可以被转移、调用指令直接引用。标识符后不带冒号时标识符后不带冒号时表示变量

3、表示变量。伪指令前的标识符不加冒号。伪指令前的标识符不加冒号。5(2)指令助记符指令助记符 表示不同操作的指令表示不同操作的指令,可以是,可以是8086/8088的指令助记的指令助记符,也可以是伪指令。符,也可以是伪指令。(3)操作数操作数 是指令执行的对象。是指令执行的对象。依指令的要求,可能有一个、依指令的要求,可能有一个、两个、没有或者多个。两个、没有或者多个。例如:例如:RET;无操作数无操作数COUNT:INCCX;一个操作数一个操作数MOVCX,DI;两个操作数两个操作数ADDAX,BP十十4;第二个操作数为表达式;第二个操作数为表达式(4)注释注释 该项可有可无,是为源程序所加的

4、注解,用于提高该项可有可无,是为源程序所加的注解,用于提高程序的可读性。程序的可读性。6汇编语言运算符:汇编语言运算符:是汇编程序在汇编时计算的是汇编程序在汇编时计算的,与运算指令不同,指令是在程序运行时计算的。与运算指令不同,指令是在程序运行时计算的。1、算术运算符、逻辑运算符、关系运算符、算术运算符、逻辑运算符、关系运算符如:、如:、/、AND、OR、LT等等MOVAX,DI+BXADDAX,FIRST+1MOVAX,(choiceLT20)AND5)OR(choiceGE20)AND6)3.1.2 3.1.2 汇编语言运算符汇编语言运算符7注意:注意:算术运算符总可以用于数字操作,其结果

5、也是算术运算符总可以用于数字操作,其结果也是数字的。当应用于存储器操作数时,只有数字的。当应用于存储器操作数时,只有+,-运运算符有意义;算符有意义;逻辑运算符的操作数也必须是数字,存储器操逻辑运算符的操作数也必须是数字,存储器操作数不能进行逻辑运算;作数不能进行逻辑运算;关系运算符连接的两个操作数,必须都是数字关系运算符连接的两个操作数,必须都是数字的或是在同一段内的存储器地址。的或是在同一段内的存储器地址。82、取值运算符取值运算符1)$运算符运算符$:当前地址偏移量的值:当前地址偏移量的值BLOCKDBHELLO!NUMEQU$-BLOCKHELLO!BLOCK$;NUM为为692)SE

6、G和和OFFSETSEG:求标号或变量的段地址求标号或变量的段地址OFFSET:求标号或变量的偏移地址求标号或变量的偏移地址例如,定义:例如,定义:SLOTDW25则:则:MOVAX,SLOT;从从SLOT地址中取一个字送入地址中取一个字送入AXMOVAX,SEGSLOT;将将SLOT的段地址送入的段地址送入AXMOVAX,OFFSETSLOT;将将SLOT的段内偏移地址送的段内偏移地址送AX103)TYPE返回标号或存储器操作数的类型值返回标号或存储器操作数的类型值对对存储器操作数存储器操作数:表示占用的字节数:表示占用的字节数对标号:表示过程或指令地址的调用类型对标号:表示过程或指令地址的

7、调用类型表表3-1存储器操作数的类型属性及返回值存储器操作数的类型属性及返回值字节字节字字双字双字NEARFAR12412114)LENGTH和和SIZE(对用对用DUP定义数据的情况下)定义数据的情况下)LENGTH:返回一个与存储器操作数相联系的基本数据个数,返回一个与存储器操作数相联系的基本数据个数,SIZE:返回一个为存储器操作数分配的字节数返回一个为存储器操作数分配的字节数关系:关系:SIZE=LENGTHTYPE例如:若例如:若MULT-WORDDW50DUP(0)则则LENGTHMULT-WORD=50SIZEMULT-WORD=100TYPEMULT-WORD=2123、属性运

8、算符、属性运算符用来给指令中的操作数指定一个临时的属性,而用来给指令中的操作数指定一个临时的属性,而暂时暂时忽略操作数定义时的属性。忽略操作数定义时的属性。1)PTR定义操作数为新的类型定义操作数为新的类型一般格式:类型一般格式:类型PTR操作数操作数功能:建立一个存储器操作数,它与其后的存储器操功能:建立一个存储器操作数,它与其后的存储器操作数有相同的段地址和偏移地址,但有不同的类型。作数有相同的段地址和偏移地址,但有不同的类型。F2DW3456HMOVAL,BYTEPTRF2MOVBX,3MOVBYTEPTRBX,3;AL:56H;错,类型不明确错,类型不明确;字节传输字节传输133.1.

9、3 3.1.3 表达式表达式 是由运算符和操作数组成的序列,在汇是由运算符和操作数组成的序列,在汇编时产生一个确定的值。这个值可以仅表示编时产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的偏移一个常量,也可以表示一个存储单元的偏移地址,相应的表达式称为常量表达式和地址地址,相应的表达式称为常量表达式和地址表达式。表达式。141、常数常数二进制二进制(B),八进制八进制(Q),十六进制十六进制(H),十进制十进制(D)(默认默认),十进制浮点数,十六进制实数,字符和字符串,十进制浮点数,十六进制实数,字符和字符串10001100100B244Q64HBDThisisaclas

10、sroom.152、常量操作数、常量操作数 常量操作数是一个数值操作数,一般是常量常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符。或者是表示常量的标识符。如如:COUNTEQU10NAME=J 可以为数字常量操作数或字符串常量操作数。可以为数字常量操作数或字符串常量操作数。前者可采用二进制、八进制、十进制或十六进制前者可采用二进制、八进制、十进制或十六进制等进位计数形式;而后者所对应的常量值为相应等进位计数形式;而后者所对应的常量值为相应字符的字符的ASCII码。码。163、存储器操作数、存储器操作数 存储器操作数是一个地址操作数,代表一个存储器操作数是一个地址操作数,代表一个存

11、储单元的地址,通常以标识符的形式出现。存储单元的地址,通常以标识符的形式出现。变量:变量:代表的是某个数据在数据段、附加段或堆代表的是某个数据在数据段、附加段或堆栈段中的地址。变量所对应的存储单元内容在程栈段中的地址。变量所对应的存储单元内容在程序的运行过程中是可以改变的。序的运行过程中是可以改变的。标号:标号:代表的是某条指令代码在代码段中的地址。代表的是某条指令代码在代码段中的地址。标号通常作为转移指令或调用指令的目标操作数,标号通常作为转移指令或调用指令的目标操作数,在程序运行过程中不能改变。在程序运行过程中不能改变。17存储器操作数有三个属性存储器操作数有三个属性1)段属性段属性(SE

12、G):所对应存储单元的段地址所对应存储单元的段地址2)偏移量属性偏移量属性(OFFSET):所对于存储单元在所所对于存储单元在所在段内的偏移地址在段内的偏移地址(距段起点的字节数距段起点的字节数)3)类型属性类型属性(TYPE)变量的类型变量的类型 是占用存储单元的字节数,分为:是占用存储单元的字节数,分为:DB(1个字节个字节)DW(2个字节个字节)DD(4个字节个字节)标号标号的类型的类型 则反映了相应存储单元地址在作为则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,转移或调用指令的目标操作数时的寻址方式,可有两种情况,即可有两种情况,即NEAR和和FAR。18DAT

13、ASEGMENTXDB5,4YDW40HZDD2030HDATAENDS05H04H40H00H30H20H00H00HDS:0000HXYZX,Y,Z分别都有三个属性:分别都有三个属性:段地址,偏移地址和类型值,段地址,偏移地址和类型值,这三个属性都有固定的值。这三个属性都有固定的值。194、常量表达式、常量表达式 由由常常量量操操作作数数及及运运算算符符构构成成,在在汇汇编编时时产产生生一个常量。一个常量。如如PORT、VAL十十1、OFFSETSUM、SEGSUM、TYPECYCLE等。等。205、地址表达式、地址表达式 由存储器操作数与运算符构成,但由存储器操作由存储器操作数与运算符构

14、成,但由存储器操作数构成地址表达式时,必须有明确的物理意义。数构成地址表达式时,必须有明确的物理意义。例如例如 SUM2、CYCLE5 表达式表达式SUMSUM2 2、CYCLECYCLE5 5的值仍然是一个存储的值仍然是一个存储器操作数,该存储器操作数的段地址与类型属性分器操作数,该存储器操作数的段地址与类型属性分别与存储器操作数别与存储器操作数SUMSUM及及CYCLECYCLE相同,但偏移地址分相同,但偏移地址分别比别比SUMSUM及及CYCLECYCLE大大2 2或小或小5 5。表达式是在汇编时计算。表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可以改的,而变量单元的内容在

15、程序的运行过程中可以改变。变。213.1.4 3.1.4 汇编语言程序汇编步骤汇编语言程序汇编步骤22.ASM.OBJ.EXE汇编汇编连接连接宏汇编程序:宏汇编程序:MASM.EXE连接程序:连接程序:LINK.EXE编编辑辑程程序序源源程程序序连连接接程程序序汇汇编编程程序序目目标标程程序序执执行行程程序序步骤:步骤:1)编写源程序;编写源程序;2)汇编;汇编;3)连接;连接;4)调试。调试。23用户编写程序,程序在计算机中运行,用户编写程序,程序在计算机中运行,计算机的控制由操作系统交给用户程序,运计算机的控制由操作系统交给用户程序,运行用户程序,当用户程序运行结束后,应再行用户程序,当用

16、户程序运行结束后,应再将控制权交回操作系统,所以,在程序中应将控制权交回操作系统,所以,在程序中应该有返回该有返回DOS的操作。在计算机中,返回的操作。在计算机中,返回DOS的操作由操作系统中的一个子程序来实的操作由操作系统中的一个子程序来实现,用户使用时调用这个子程序即可。现,用户使用时调用这个子程序即可。24每当一个用户的可执行文件每当一个用户的可执行文件.EXE装入内存后,存储器的分装入内存后,存储器的分配情况如图:配情况如图:系统占用系统占用程序段前缀程序段前缀用户数据区用户数据区用户堆栈区用户堆栈区用户代码段用户代码段系统和系统和ROM占用占用00000HDS,ES100个字节个字节

17、SS用户程序空间用户程序空间FFFFFHCS25系统占用系统占用INT20H程序段前缀程序段前缀用户数据区用户数据区用户堆栈区用户堆栈区用户代码段用户代码段系统和系统和ROM占用占用无论用户程序有几段,也无论这些段无论用户程序有几段,也无论这些段的排列顺序如何,用户程序的代码前的排列顺序如何,用户程序的代码前一定有一定有100个字节的个字节的程序段前缀程序段前缀(ProgramSegmentPrefix,简称简称PSP),PSP给出了用户的可执行文件给出了用户的可执行文件(.EXE)的若干控制信息。其中的若干控制信息。其中PSP的开始处的开始处(第第1,2字节字节)有一条中断指令有一条中断指令

18、INT20H的代码,通过它可以的代码,通过它可以结束用户程结束用户程序,返回操作系统序,返回操作系统。在用户程序执行。在用户程序执行完以后,通过执行该条指令就可以返完以后,通过执行该条指令就可以返回回DOS。26如何使用户程序执行完后返回来执行这条指令?如何使用户程序执行完后返回来执行这条指令?系统占用系统占用INT20H程序段前缀程序段前缀用户数据区用户数据区用户堆栈区用户堆栈区用户代码段用户代码段RET系统和系统和ROM占用占用DS,ESSSCS首先将用户程序定义为一个首先将用户程序定义为一个远过程远过程,当,当可执行文件装入内存后,可执行文件装入内存后,DS,ES两个段两个段寄存器被寄存

19、器被CPU自动设置为指向自动设置为指向PSP的首的首址,所以一般程序的开始指令为:址,所以一般程序的开始指令为:PUSHDSMOVAX,0PUSHAX即将即将DS的内容和的内容和0000H压入堆栈,程序压入堆栈,程序结束时的最后一条语句为结束时的最后一条语句为RET,就把压就把压入堆栈的入堆栈的PSP段的段地址和偏移地址段的段地址和偏移地址0000H弹出并送入弹出并送入CS和和IP,转而执行返转而执行返回回DOS的指令的指令INT20H。00H00HPSPLPSPH堆栈堆栈情况情况27返回操作系统的另一个办法是通过系统调用返回操作系统的另一个办法是通过系统调用(调用号是(调用号是4CH)。这时

20、,这时,在用户程序结束在用户程序结束时,用下面两条指令:时,用下面两条指令:MOVAH,4CHINT21H即可实现返回即可实现返回DOS。283.2 3.2 伪指令伪指令29伪指令:伪指令不是伪指令:伪指令不是CPU运行的指令,而是运行的指令,而是程序员给程序员给汇编程序汇编程序下达的命令。是在汇编源下达的命令。是在汇编源程序期间由程序期间由汇编程序执行的命令汇编程序执行的命令。伪指令用来对汇编程序进行控制,对程伪指令用来对汇编程序进行控制,对程序中的数据进行存储空间分配、实现条件汇序中的数据进行存储空间分配、实现条件汇编、列表等处理,其格式和汇编指令一样,编、列表等处理,其格式和汇编指令一样

21、,但但不产生目标代码不产生目标代码,即不直接命令即不直接命令CPU去执去执行什么操作。行什么操作。303.2.1数据定义伪指令数据定义伪指令DB:定义字节,其后的每个操作数占有一个存储定义字节,其后的每个操作数占有一个存储单元,连续存放;单元,连续存放;BUFFERDB2,3STRINGDBNOON03H02HBUFFERDW:定义字,其后的每个操作数占有两个字节;定义字,其后的每个操作数占有两个字节;BUFDW2,3,505H00H00H03H00H02HBUFSTRINGDD:定义双字,其后每个操作定义双字,其后每个操作数占数占4个字节;个字节;还有还有DQ(4个字长)、个字长)、DT(1

22、0个字节长)个字节长)31若仅保留单元,不初始化,用若仅保留单元,不初始化,用?代替初值;代替初值;若数据重复,用若数据重复,用nDUP()代替,代替,n为重复次数。为重复次数。ARRAYDB100DUP(?)保留保留100个字节,首地址为个字节,首地址为ARRAY,不初始化,不初始化,即即100个字节内均为随机值个字节内均为随机值DATA1DB100DUP(AB)初始化初始化200个字节,内有个字节,内有100个个41H,42H(即(即41H42H41H42H41H42H)32例:有如下数据定义伪指令:例:有如下数据定义伪指令:VALDB1,4DUP(5,2DUP(FFH,0)则在则在VAL

23、存储区前存储区前10个字节单元的数据是:个字节单元的数据是:1,5,FFH,0,FFH,0,5,FFH,0,FFH若定义若定义DW1,2,5DUP(YES,2DUP(3),则在存则在存储区的数据是什么?储区的数据是什么?333.2.2符号定义伪指令符号定义伪指令标识符标识符EQU表达式表达式标识符标识符=表达式表达式给标识符定义一个值或其他符号名或一条可执行语句,给标识符定义一个值或其他符号名或一条可执行语句,汇编时,凡是出现该标识符的地方就用定义的数据替代。汇编时,凡是出现该标识符的地方就用定义的数据替代。注意:注意:用用EQU赋值的名字不能重新赋值,需用赋值的名字不能重新赋值,需用PURG

24、E释释放后重新定义。如:放后重新定义。如:PURGETIMESTIMESEQU100TIMESEQU50BUFDBTIMESDUP(?)等效于:等效于:BUFDB50DUP(?)BETA=TIMES-2BETA=TIMES+5;重新赋值重新赋值34DATASEGMENTADW3BDW4LEQUB-ADATAENDS03H00H04H00HDS:0000H数据段数据段L为常量,不占空间,值为为常量,不占空间,值为2353.2.3段定义伪指令段定义伪指令SEGMENT和和ENDS一般的源程序分为一般的源程序分为4个段:代码段个段:代码段Code、数据段数据段Data、堆栈段堆栈段Stack、附加段

25、附加段Extra。各个段从段定义语句开始,到段结束语句各个段从段定义语句开始,到段结束语句ENDS结束。结束。段名段名SEGMENT定位类型定位类型组合类型组合类型类别类别段体段体段名段名ENDS用户指定用户指定可任选定义可任选定义361)段名必须是合法的标识符。段名必须是合法的标识符。2)定位类型:定位类型:表示本段起始地址位于何处表示本段起始地址位于何处内存可以看成是一本书内存可以看成是一本书,将其将其分成分成页页,段段,字字,和字节和字节。每每256个地址为一页个地址为一页(PAGE),每页的起始地址为二进制:每页的起始地址为二进制:*0000000016进制:进制:*00H第一页第一页

26、(256个地址个地址)第二页第二页(256个地址个地址)00000H000FFH00100H00200H001FFH37每每16个地址为一段个地址为一段(PARA),每段的起始地址为二进制:每段的起始地址为二进制:*000016进制:进制:*0H第一段第一段(16个地址个地址)第二段第二段(16个地址个地址)*00H*0FH*10H*1FH*20H段段(节节)是默认的定位类是默认的定位类型。型。38每每2个地址为一个字个地址为一个字(WORD),每个字的起始地址为每个字的起始地址为偶数偶数;最基本的类型是字节最基本的类型是字节(BYTE),每个每个字节只包含一个地址字节只包含一个地址,可以是内

27、存的任何空间。可以是内存的任何空间。定位类型表示所定义的段存放在内存空间时,段首定位类型表示所定义的段存放在内存空间时,段首地址对内存空间的要求地址对内存空间的要求,即段起始点是放在一页的,即段起始点是放在一页的起点上起点上(PAGE)还是一段的起点上还是一段的起点上(PARA)等,如果不等,如果不定义定位类型,编译程序将默认其为段类型,即将定义定位类型,编译程序将默认其为段类型,即将段首地址放在从段首地址放在从*0H开始的内存空间。开始的内存空间。BYTE:表示本段起始单元可以从任一地址开始;表示本段起始单元可以从任一地址开始;WORD:表示本段起始单元从一个偶地址开始表示本段起始单元从一个

28、偶地址开始;PARA:表示本段起始单元从一个段的边界开始表示本段起始单元从一个段的边界开始(默认默认);PAGE:表示本段起始单元从一个页的边界开始。表示本段起始单元从一个页的边界开始。393)组合类型组合类型告诉汇编程序,所定义的段与其他段的关系,即告诉汇编程序,所定义的段与其他段的关系,即将该段存放内存时,是否将该段与其他段在物理将该段存放内存时,是否将该段与其他段在物理上或逻辑上放在一起。上或逻辑上放在一起。NONE:表示本段与其他段不发生任何关系,该表示本段与其他段不发生任何关系,该段有自己的段基址,段有自己的段基址,是默认的组合关系。是默认的组合关系。PUBLIC:在满足定位类型的前

29、提下与其他模块在满足定位类型的前提下与其他模块的同名段连接在一起,形成一个新的逻辑段,的同名段连接在一起,形成一个新的逻辑段,共共用一个段基址用一个段基址。40COMMON:表示产生一个覆盖段。连接时,把本表示产生一个覆盖段。连接时,把本段与其他段与其他也用也用COMMON说明的同名段说明的同名段置成相同的置成相同的起始地址,重叠在一起,共享相同的存储区,其段起始地址,重叠在一起,共享相同的存储区,其段长度由最长的段确定。长度由最长的段确定。STACK:在每个汇编程序中,只能必须有一个堆栈在每个汇编程序中,只能必须有一个堆栈段,连接时,将本段与其他段,连接时,将本段与其他也用也用STACK说明

30、的同说明的同名段名段连接成一个连续的连接成一个连续的STACK段,段,编译程序自动编译程序自动初始化初始化SS和和SP寄存器寄存器,使,使SS的内容为该连续段的的内容为该连续段的段基址,段基址,SP指向堆栈底部加指向堆栈底部加1的存储单元。的存储单元。41MEMORY:表示本段在存储器中应定位在所表示本段在存储器中应定位在所有其他段的最高地址。有其他段的最高地址。AT:表示本段从表达式指定的地址处表示本段从表达式指定的地址处开始装入,这样,在程序中用户就可以直接定开始装入,这样,在程序中用户就可以直接定义段地址,这种方式不适用于代码段。义段地址,这种方式不适用于代码段。424)类别类别是用单引

31、号括起来的字符串,以表明该段的是用单引号括起来的字符串,以表明该段的类别,如代码段类别,如代码段(CODE)、数据段数据段(DATA)、堆栈堆栈段段(STACK)等。当然也允许用户在类别中用其他等。当然也允许用户在类别中用其他的名,这样进行连接时,连接程序便将同类别的名,这样进行连接时,连接程序便将同类别的段的段(但不一定同名但不一定同名)放在连续的存储区内。放在连续的存储区内。433.2.4设定段寄存器伪指令设定段寄存器伪指令ASSUME一般格式:一般格式:ASSUME段寄存器段寄存器:段名段名,段寄存器段寄存器:段名,段名,功能:功能:通知汇编程序,哪一个段寄存器是该段的通知汇编程序,哪一

32、个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。正确的目的代码。例如,例如,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK44注意:注意:当程序运行时,由于当程序运行时,由于DOSDOS的装入程序负责把的装入程序负责把CSCS初始初始化成正确的代码段地址,化成正确的代码段地址,SSSS初始化为正确的堆栈段地址,初始化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装入程序中因此用户在程序中就不必设置。但是,在装入程序中DSDS寄存器由于被用作其它用途,因此,在用户程序中必须寄存器由

33、于被用作其它用途,因此,在用户程序中必须用两条指令对用两条指令对DSDS进行初始化,以装入用户的数据段段地进行初始化,以装入用户的数据段段地址。当使用附加段时,也要用址。当使用附加段时,也要用MOVMOV指令给指令给ESES赋段地址。赋段地址。例如,例如,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATA;DATA段值送段值送AXMOVDS,AX;AX内容送内容送DS,DS才有实际段值才有实际段值CODEENDS453.2.5过程定义伪指令过程定义伪指令PROC和和ENDP 在程序设计中,可将具有一定功能的程序段看成为在程序设计中,可将具有一

34、定功能的程序段看成为一个过程一个过程(相当于一个子程序相当于一个子程序),它可以被别的程序调用。,它可以被别的程序调用。要求先定义后使用。要求先定义后使用。一个过程由伪指令一个过程由伪指令PROC和和ENDP来定义,其格式为来定义,其格式为:过程名过程名PROC类型类型过程体过程体RET过程名过程名ENDP注意:注意:PROC和和ENDP要成对出现。要成对出现。过过程程名名是是为为过过程程所所起起的的名名称称,不能省略不能省略类类型型由由FARFAR(远远过过程程,为为段段间间调调用用)和和NEARNEAR(近近过过程程,为为段段内内调调用用)来来确确定定,如如果果缺缺省省类类型型,则则该该过

35、过程程就就默默认认为近过程。为近过程。过程体内至少有一条过程体内至少有一条RETRET指令指令 46一个码段中可以包含一个或许多过程。一个码段中可以包含一个或许多过程。过程可以过程可以嵌套调用,可以递归调用,但不可以嵌套定义。嵌套调用,可以递归调用,但不可以嵌套定义。MYCODESEGMENTASSUMECS:MYCODESUB1PROCFARRETSUB1ENDPSUB2PROCNEARRETSUB2ENDPCALLSUB2MYCODEENDSFAR:该过程为远过程,调用该过程为远过程,调用该过程时为段间调用,即该过程时为段间调用,即CS和和IP均要重新赋值;均要重新赋值;NEAR:该过程为

36、近过程,调该过程为近过程,调用该过程时为段内调用,只用该过程时为段内调用,只修改修改IP。(默认默认)CALL:调用过程调用过程SUB2,到此到此处才真正去执行子程序。处才真正去执行子程序。47例:延时例:延时100ms的子程序,编程定义如下:的子程序,编程定义如下:DELAYPROCMOVBL,10AGAIN:MOVCX,2801HWAIT1:LOOPWAIT1DECBLJNZAGAINRETDELAYENDP任何一个过程都要求先定义,后调用。调用时才任何一个过程都要求先定义,后调用。调用时才真正执行该过程。一个过程产生一段目标代码。真正执行该过程。一个过程产生一段目标代码。48在汇编语言书

37、写的源程序中,有的程序在汇编语言书写的源程序中,有的程序段要多次使用,为了简化书写,段要多次使用,为了简化书写,该程序段可该程序段可以用一条特殊的指令来代替以用一条特殊的指令来代替,这个特殊的指,这个特殊的指令就是宏指令。令就是宏指令。宏指令只是为了方便书写,当汇编程序宏指令只是为了方便书写,当汇编程序汇编生成目标代码时,汇编生成目标代码时,在引用宏指令处仍会在引用宏指令处仍会产生原来程序段应生成的目标代码,引用一产生原来程序段应生成的目标代码,引用一次生成一次。次生成一次。3.2.6宏指令宏指令491)宏指令定义格式:宏指令定义格式:宏指令名宏指令名MACRO汇编程序段汇编程序段(宏体宏体)

38、ENDMMACRO与与ENDM必须成对出现,先定义后引用必须成对出现,先定义后引用SHIFTMACROMOVCL,4SALAL,CLENDM宏名宏名程序段程序段:将将AL左移左移4位位(乘乘16)INAL,5FHSHIFTOUT5FH,AL在程序中引用宏指令如下:在程序中引用宏指令如下:50宏指令也可以接收参数,如对宏指令也可以接收参数,如对X左移左移Y位。位。SHIFTMACROX,YMOVCL,YSALX,CLENDM形参列表形参列表MOVBX,WORDPTRBUFSHIFTBX,4MOVWORDPTRBUF,BX在程序中引用宏指令如下:在程序中引用宏指令如下:功能:功能:BX的值左移的值

39、左移4位。位。BXX4Y实参形参一一对应实参形参一一对应513.2.7定位伪指令定位伪指令格式:格式:ORG表达式表达式功能:指定在其后的指令或数据存放的偏移地址。功能:指定在其后的指令或数据存放的偏移地址。CODESEGMENTORG0100HMOVAX,0CODEENDS指定指定MOV指令放在指令放在代码段中偏移地址为代码段中偏移地址为0100H开始的位置。开始的位置。DATASEGMENTORG2000HNUMDB0,5DATAENDS指定指定NUM指向数据段中指向数据段中偏移地址为偏移地址为2000H开始开始的位置。的位置。523.2.8汇编结束伪指令汇编结束伪指令END汇编程序在汇编

40、时遇到汇编程序在汇编时遇到END,便知源程序已便知源程序已经结束。经结束。一般格式:一般格式:END表达式表达式表达式为可执行程序运行的起始位置。一般是表达式为可执行程序运行的起始位置。一般是一个标号。一个标号。53完整结构完整结构1DATASEGMENTXDB3YDB5DATAENDSSTACKSEGMENTSTACKSTACKDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAH,4CHINT21HCODEENDSENDBEGIN设置设置DS段寄段寄存器内容存器内容

41、源程序结束,第源程序结束,第一条指令的地址一条指令的地址分配段寄存器分配段寄存器首指令位置首指令位置数据段数据段堆栈段堆栈段(可略)可略)返回返回DOS54完整结构完整结构2DATASEGMENTXDB3YDB5DATAENDSSTACKSEGMENTSTACKSTACKDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGINPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXRETBEGINENDPCODEENDSENDBEGIN将将PSP首址压栈,首址压栈,以便返回以便返回DO

42、S。设置设置DS段寄存器内容段寄存器内容源程序结束,第源程序结束,第一条指令的地址一条指令的地址分配段寄存器分配段寄存器主过程名主过程名数据段数据段堆栈段堆栈段(可略)可略)返回返回DOS553.3 3.3 汇编程序设计汇编程序设计56汇编语言编写的程序也跟高级语言类似,程序汇编语言编写的程序也跟高级语言类似,程序结构分三种:顺序、分支、循环;较复杂的程结构分三种:顺序、分支、循环;较复杂的程序也应该是由众多子程序组成的,每个子程序序也应该是由众多子程序组成的,每个子程序是一个过程,在程序中被显式地调用。变量等是一个过程,在程序中被显式地调用。变量等数据部分被定义在数据段,所有程序都要显式数据

43、部分被定义在数据段,所有程序都要显式地定义堆栈段。汇编程序的每一条指令都与机地定义堆栈段。汇编程序的每一条指令都与机器语言一一对应,因此,汇编生成的可执行文器语言一一对应,因此,汇编生成的可执行文件代码少,适合于实时控制,但由于语法成分件代码少,适合于实时控制,但由于语法成分很少,不适合于复杂的算法、运算。很少,不适合于复杂的算法、运算。汇编程序汇编程序主要的调试环境是主要的调试环境是DOS系统下的系统下的DEBUG程序。程序。57一、一、顺序程序设计顺序程序设计顺顺序序程程序序设设计计是是没没有有分分支支,没没有有循循环环的的直直线线运运行行程程序序,程程序序执执行行按按照照IP内内容容自自

44、动动增增加的顺序进行。加的顺序进行。58例例1 1 利用查表法计算平方值。已知利用查表法计算平方值。已知0 0 9 9的平方值连续存在以的平方值连续存在以SQTABSQTAB开始的存储开始的存储区域中,求区域中,求SURSUR单元内容单元内容X X的平方值,并的平方值,并放在放在DISDIS单元中。假定单元中。假定00X 9X 9且为整数。且为整数。分析:解这个问题,关键在两方面,分析:解这个问题,关键在两方面,一是了解平方表的存放位置;一是了解平方表的存放位置;二是根据二是根据X X的值,找到的值,找到X X对应对应X X2 2在表在表中位置,在这里为表的首地址加上中位置,在这里为表的首地址

45、加上 X X单元的内容。也可以用查表指令。单元的内容。也可以用查表指令。59例例2 2 已知已知 Z=(X+Y)-(W+Z)Z=(X+Y)-(W+Z),其中其中X X,Y Y,Z Z,WW均为用压缩均为用压缩BCDBCD码表示的数,码表示的数,写出程序段。写出程序段。分析:注意是压缩分析:注意是压缩BCD码相加减,因此码相加减,因此正常运算完要进行相应的十进制正常运算完要进行相应的十进制调整。调整。60二、二、分支程序设计分支程序设计 分分支支程程序序的的基基本本思思想想是是根根据据逻逻辑辑判判断断的的结结果果来来形形成成程程序序的的分分支支,如如图图,若若条条件件A成成立立,则执行则执行P1

46、;否则执行否则执行P2。一一般般情情况况下下,两两个个分支仅选其一执行。分支仅选其一执行。61例例1 1 试编写完整程序,实现符号函试编写完整程序,实现符号函数。变量数。变量X X的符号函数可表示为:的符号函数可表示为:1 1 X0X0Y=0 X=0Y=0 X=0 -1 X0 -1 X0、0的数据个数。的数据个数。循环控制变量初值为原始数据个数循环控制变量初值为原始数据个数。69例例5 要求从要求从0FFH端口输入一组端口输入一组100个字符,若个字符,若该字符是数字,则转换成数值后以非压缩该字符是数字,则转换成数值后以非压缩BCD码的形式存放在以码的形式存放在以DATA开始的存区,开始的存区

47、,并统计输入的数字的个数,存放在并统计输入的数字的个数,存放在NUM单元中。单元中。分析:分析:如何确定输入的是数字?如何确定输入的是数字?判别:判别:0 0 X X 9 9 如何将如何将数字的数字的ASCIIASCII码转换成非压缩码转换成非压缩BCDBCD码?码?XAND0FHX或或X30HX即可即可设置设置BX为地址指针,初值指向为地址指针,初值指向DATA,DH为为计数器进行统计。循环进行计数器进行统计。循环进行N次。次。循环控制变量初值为循环控制变量初值为100。70思考:思考:1、若题目没有明确告知输入的字符个数,、若题目没有明确告知输入的字符个数,仅以仅以$表示输入结束,程序如何

48、修改表示输入结束,程序如何修改?2、若题目要求以压缩、若题目要求以压缩BCD码形式存放,码形式存放,程序又该如何修改?程序又该如何修改?71DATASEGMENTORG1000HADDRDW?COUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORCX,CXMOVAX,ADDRREPEAT:TESTAX,0FFFFHJZEXITSHRAX,1JNCNEXTINCCXNEXT:JMPREPEATEXIT:MOVCOUNT,CXMOVAX,4C00HINT21HCODEENDSENDSTART例例6阅读此

49、程序,指出阅读此程序,指出该程序完成了什么工作?该程序完成了什么工作?统计在数据段统计在数据段1000H单元单元(ADDR)开始存放的开始存放的16位数据中位数据中1的个数,并将的个数,并将统计结果存放在统计结果存放在COUNT单元中。单元中。72例例7在当前数据段从偏移地址在当前数据段从偏移地址BUFFER开始开始顺序存放着顺序存放着100个无符号个无符号16位数,现要编位数,现要编写程序将这写程序将这100个字数据从大到小排序。个字数据从大到小排序。分析:分析:排序的方法有很多,我们采用冒泡法实现。排序的方法有很多,我们采用冒泡法实现。这时,需要两重循环。外循环控制变量这时,需要两重循环。

50、外循环控制变量BL的的初值为初值为99,每次减,每次减1,而内循环控制变量,而内循环控制变量CL每每次的初值等于当时次的初值等于当时BL的值。的值。设置设置DI为基本地址指针,初值指向为基本地址指针,初值指向BUFFER,另一个地址指针另一个地址指针SI的初值每次总同的初值每次总同DI的值,也的值,也就是说,内循环总是从第一个数据开始。就是说,内循环总是从第一个数据开始。73DS_SEGSEGMENTCOUNTDB4BLK1DB96H,74H,32H,16HBLK2DB65H,94H,87H,29HBLK3DB4DUP(?)DS_SEGENDSCS_SEGSEGMENTASSUMECS:CS_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁