版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章汇编语言程序设计7/10/20241第4章汇编语言程序设计4.18086汇编语言的语句4.28086汇编语言中常数、标号、变量及表达式4.3汇编语言源程序结构4.4汇编语言程序设计4.5宏定义与宏调用4.6汇编语言程序的上机过程7/10/20242概念汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用标号或符号代表地址、常量或变量汇编语言源程序与其经过汇编所产生的目标代码程序之间有明显的一一对应关系,故也称汇编语言为符号语言用汇编语言编写程序能够直接利用硬件系统的特性占用内存空间少,执行速度快;源程序和所要解决问题的数学模型之间的关系不够直观,程序设计需要较多的软件开发时间,也增加了程序设计过程中出错的可能性7/10/20243汇编程序的功能图4-1汇编程序的功能示意图7/10/20244汇编语言源程序翻译成机器语言程序任务根据用户的要求自动分配存储区域(包括程序区、数据区、暂存区等);自动地把各种进位制数转换成二进制数,把字符转换成ASCII码;计算表达式的值等;自动对源程序进行检查,给出错误信息(如非法格式,未定义的助记符、标号,漏掉操作数等)等。允许在源程序中把一个指令序列定义为一条宏指令的汇编程序,增加了宏指令、结构、记录等高级汇编语言功能。7/10/202454.18086汇编语言的语句指令可由汇编程序翻译成机器语言指令,汇编语言中的指令与机器语言指令基本上是一一对应的,由CPU执行的语句,称为指令性语句;伪指令则不汇编成机器语言指令,仅仅在汇编过程中告诉汇编程序应如何汇编,称为指示性语句;宏指令是使用者利用上述基本语句自己定义的新的指令。
7/10/202464.1.1指令性语句格式:[标号:]操作码[操作数1,][操作数2][;注释]标号:是指令语句的标识符操作码:指令助记符。指令规定的符号操作数:操作数可以根据指令的功能需要,可不带操作数,带1个操作数或2个操作数注释:是为方便程序人员阅读程序而加的说明7/10/202474.1.2指示性语句格式:[标识符(名字)]指示符(伪指令)表达式标识符:是一个用字母、数字或加上下划线表示的一个符号,标识符定义的性质由伪指令指定指示符:指示符又称为伪指令,是汇编程序规定并执行的命令表达式:是常数、寄存器、标号、变量与一些操作符相结合的序列,可有数字表达式和地址表达式两种注释:同指令性语句7/10/20248伪指令伪指令(指示性语句)。是给汇编程序的命令,在汇编过程中由汇编程序进行处理7/10/20249伪指令分类数据定义伪指令符号定义伪指令段定义伪指令过程定义伪指令宏处理伪指令模块定义与连接伪指令处理器选择伪指令条件伪指令列表伪指令其他伪指令7/10/2024104.1.3有关属性段值属性。指存储器操作数的段起始地址,此值必须在一个段寄存器中,标号的段则总在CS寄存器中。段内偏移量。16位无符号数,表示从段起始地址到该操作数所在位置之间的字节数。在当前段内给出变量的偏移量等于当前地址计数器的值,当前计数器的值可用“$”来表示。类型属性。标号的属性用来指出该标号在本段内引用还是在其他段中引用,段内引用,为NEAR,指针长度为2字节;段间引用,为FAR,指针长度为4字节。变量的类型属性用来指出该变量所保留的字节数,主要有BYTE(字节型)、WORD(字型(2字节))或DWORD(双字型(4字节))等。7/10/2024114.28086汇编语言中常数、标号、变量及表达式4.2.1常数、标号和变量4.2.2符号定义伪指令语句4.2.3表达式7/10/2024124.2.1常数、标号和变量汇编语言中数据项有常量、标号和变量3种类型7/10/2024131.常数常数就是指令中出现的那些固定值数值常数字符串常数7/10/202414数值常数
B:表示二进制数。例如,10110011B。
D:表示十进制数。例如,179D或179。
O:表示八进制数。例如,263O。
H:表示十六进制数。例如,B3H。汇编语句中的数值常数的第一位必须是数字,否则汇编时将被看成是标识符例如:常数B3H在语句中应写成0B3H
7/10/202415字符串常数是由单引号‘’括起来的一串字符
例如:‘ABCDEFG’和‘179’。单引号内的字符在汇编时都以ASCII的代码形式存放在存储单元中。其ASCII代码分别为41H、42H、43H、44H,…,4BH和31H、37H、39H。字符串最长允许有255个字符7/10/2024162.标号是用符号表示的地址,用以指示此指令语句所在的地址3个属性:段地址:是指标号对应的指令首字节所在的段地址偏移地址:是指标号对应的指令首字节所在段内的偏移地址类型:NEAR和FAR类型。标号如定义成NEAR类型,表示标号仅在本段内被引用;如定义成FAR类型,表示标号可以在段间使用。在转移和调用指令中常将标号作为转移目标地址使用。基本定义方法:是在指令的操作助记符前加上标识符和冒号,该标识符就是我们所要定义的标号
例如:START:PUSHDS
7/10/2024173.变量是与一个数据项的第一字节相对应的标识符,它表示该数据项第一字节在现行段中的偏移量变量的值在程序运行期间可随时修改汇编语言中的变量是通过伪指令定义的7/10/2024181)变量定义变量名DB表达式;定义字节变量变量名DW表达式;定义字变量变量名DD表达式;定义双字变量变量名DQ表达式;定义长字变量变量名DT表达式;定义一个十字节变量7/10/202419伪指令格式中的表达式一个或多个常数或某个运算公式(其值应为常数)带引号的字符串。字符串必须用单引号括住,字符串的字符不超过255个用问号作为表达式。不带引号的问号是一个保留字,它可用作数据类型伪指令DB、DW、DD语句中的表达式带DUP(重复方式)表达式。DUP是表达式中的一个操作符。表达式的格式:重复次数DUP(表达式)
地址表达式(只能用于DW或DD)。操作数为地址表达式时,应遵循下列规则:当用DW定义地址表达式时,地址表达式中的变量名称表示该变量的第一个存储单元的偏移地址,地址表达式中的标号表示它所代表的指令(或伪指令)的第一个字节的偏移地址;当用DD定义地址表达式时,低位字用于预置偏移地址,高位字用于预置段地址,这些数值都是在定位时装入的;地址表达式中的变量或标号可与常数值相加减。对于变量来说,运算结果的类型不变;对标号来说,运算结果仍表示原标号所在段中的偏移地址;变量或标号不能与变量或标号相加,但可相减,结果是没有属性的纯数值。7/10/2024202)变量属性段地址(SEG):变量所在段的段地址;偏移地址(OFFSET):变量所在段内的偏移地址;类型(TYPE):变量的类型是所定义的每个变量所占据的字节数。对于DB、DW、DD、DQ、DT定义的变量其类型分别为1、2、4、8、10。长度(LENGTH):变量定义时,一个变量名所定义的变量个数。在含有DUP操作符的变量定义中,变量名所定义的变量个数为定义格式中的重复次数。在其它各种变量定义中,每个变量名所定义的变量个数均为1。大小(SIZE):变量定义语句中,分配给同一变量名的所有变量的总的字节数;大小(SIZE)=变量类型(TYPE)×变量长度(LENGTH)。7/10/2024213)举例DATA1DB20HDATA2DW0204H,100HDATA3DB(-1*3),(15/3)DATA4DD12345HDATA5DB′0123′DATA6DW′AB′,′C′,′D′DATA7DB?DATA8DD?DATA9DB5DUP(00)DATA10DW3DUP(?)7/10/202422各变量在内存中分配的单元图4-2各变量在内存中分配的单元7/10/202423表4.1部分变量的属性变量名段地址(SEG)偏移地址(OFFSET)类型(TYPE)长度(LENGTH)大小(SIZE)DATA20100H0001H212DATA30100H0005H111DATA40100H0007H414DATA50100H000BH111DATA60100H000FH212DATA80100H0016H414DATA100100H001FH2367/10/202424举例【例4-2】定义地址表达式。A1DWVALUE;定义变量A1为变量VALUE的偏移地址。A2DWVALUE+5;定义变量A2为变量VALUE第6个字节的偏移地址。A3DWVALUE-3;定义变量A3为变量VALUE前3个字节的偏移地址。A4DDVALUE;高位字为变量VALUE所在段的段地址,低位字为变量VALUE的偏移地址。
7/10/2024254.2.2符号定义伪指令语句符号定义伪指令的用途是给一个符号重新命名,或定义新的类型属性等符号包括汇编语言的变量名、标号名、过程名、寄存器名以及指令助记符等。常用的符号定义伪指令有EQU、=(等号)和LABLE7/10/2024261.EQU语句格式:名称EQU表达式功能:是为格式中的表达式赋了一个名称,在编写源程序时,当某个表达式被多次引用时,用到表达式或表达式值的地方都可以用名称来代替
EQU伪指令不允许对同一符号重复定义
7/10/202427举例ABCEQU2000H;表示名称ABC就是等价于数值2000H。XYZEQU[BP+5];名称XYZ就代表地址表达式[BP+5]。ECONEQUE7HMOD10;ECON是代表取模运算后的余数7/10/2024282.=(赋值)语句格式: 名字=表达式功能:与EQU伪指令基本相同,主要区别在于它可以对同一个名字重复定义7/10/202429举例COUNT=100MOVCX,COUNT;(CX)←100 ……COUNT = COUNT−10MOVBX,COUNT;(BX)←907/10/2024303.LABLE语句格式: 名字LABLE类型用途:是定义标号或变量的类型。变量的类型可以是BYTE、WORD、DWORD等;标号的类型可以是NEAR或FAR。LABLE伪指令并不占内存单元应用:LABEL伪指令可使同一个数据区兼有BYTE和WORD两种属性LABEL伪指令也可将一个属性已经定义为NEAR或者后面跟有冒号(隐含属性为NEAR) 的标号再定义为FAR7/10/202431举例ARRAY1LABELBYTEARRAY2DW10DUP(?)AGAIN1LABELFAR ;定义标号AGAIN1的属性为FARAGAIN:PUSHAX;定义标号AGAIN的属性为NEAR7/10/2024324.2.3表达式表达式由操作数和操作符组成,操作数可以是常数或标识符,也可以是子表达式;表达式中的标识符可以是变量名也可以是标号操作符可分为算术操作符、逻辑操作符、关系操作符、分析操作符和综合符汇编语言中的表达式不能构成单独语句,只能是语句的一个部分。语句中表达式的求值不是在执行指令时完成的,而是在对源程序进行汇编连接时完成的7/10/2024331.算术运算符加(+)、减(-)、乘(×)、除(/)和取模运算(MOD)。取模运算是取两数相除的余数,但两操作数必须为正整数例如:
82MOD16;结果为2(相当于取低4位的值)。
B5HMOD20H;结果为21(相当于取低5位的值)。7/10/2024342.逻辑运算符与(AND)、或(OR)、非(NOT)和异或(XOR)。逻辑运算的两个操作数的值也应为数字。例如:11001100BAND11100000B;结果为11000000B。11001100BOR11100000B;结果为11101100B。
NOT7FH;结果为80H。11001100BXOR11100000B;结果为00101100B。7/10/202435注意逻辑操作符与逻辑运算指令的操作助记符不同例如:ANDAL,0CHOR53H;(AL)←(AL)∧(0CH∨53H)
7/10/2024363.关系运算符相等EQ(Equal)、不等NE(NoEqual)、小于LT(LessThan)、大于GT(GreaterThan)、小于或等于LE(LessthanorEqual)、大于或等于GE(GreaterthanorEqual)。关系运算的两个操作数必须都是操作数或者是同一段中的存储单元地址,结果总是一个数值。当关系成立时,其结果为全1,当关系不成立时,其结果为全0例如:MOVBX,PORTLT87/10/2024374.分析运算符带分析运算符的表达式表达式的意义OFFSET变量名或标号取出变量名或标号所在段的偏移地址SEG变量名或标号取出变量名或标号所在段的段地址TYPE变量名或标号取出变量名或标号的类型SIZE变量名取出变量的大小LENGTH变量名取出变量的长度7/10/202438举例例如变量如【例4-1】定义可以有:
MOVAX,SIZEDATA9;将DATA9所占的字节数送AXMOVAX,SEGDATA1;将DATA1的段地址送AXMOVBL,TYPEDATA9;将DATA9的类型送BL7/10/2024395.综合运算符综合运算符可以规定存储单元的性质7/10/2024401)PTR运算符格式:类型PTR表达式类型可以是:BYTE、WORD、DWORD、NEAR和FAR。前三个类型为变量类型,后两个为标号类型。格式中的表达式可以是变量名、标号或其它地址表达式功能:是用来重新定义已定义的变量或标号的类型7/10/202441举例
MOVBYTEPTR[4000H],0MOVWORDPRT[4000H],0已定义变量DATA是字节变量,用PTR操作来重新定义其类型MOVWORDPTRDATA,AX7/10/2024422)THIS运算符用来改变存储区的类型,称类型指定运算符THIS运算符的运算对象是类型(BYTE、WORD、DWORD)或距离(NEAR、FAR),用于规定所指变量或标号类型属性或距离属性7/10/202443举例
DATEQUTHISBYTE语句功能:是把字节类型BYTE属性赋予变量DAT。等效于下述表达式:
BYTEPTRDATTHIS可提高访问标号的灵活性,如:NEXTEQUTHISFAR此语句的功能是把段间距离属性FAR赋予标号NEXT。7/10/2024446.运算符的优先级别圆括号,LENGTH,SIZE;PTR,OFFSET,SEG,TYPE,THIS;×,/,MOD;+,—;EQ,NE,LT,LE,GT,GE;NOT;AND;OR,XOR。7/10/2024454.3汇编语言源程序结构4.3.1汇编语言源程序的段定义4.3.2汇编语言的过程定义4.3.3标准程序返回方式4.3.4汇编结束语句END4.3.5汇编语言源程序结构7/10/2024464.3.1汇编语言源程序的段定义
1.段定义语句格式:
段名SEGMENT[定位类型][组合类型][′类别′]
…指令语句或伪指令语句段名ENDS7/10/2024471)段名是所定义的段的名称,是标识符,同一段的SEGMENT/ENDS伪指令前的段名必须一致有段地址、偏移地址、定位类型、组合类型和类别的属性格式中定位类型、组合类型和类别外面的方括号不是语法符号,它表示该项是可以省略的。如果有,三者的顺序必须符合格式中的规定一个段一经定义,其中指令的标号、变量等在段内的偏移地址就已排定,它们都在同一个段地址控制之下,整个段占用的存储空间大小也就确定由SEGMENT/ENDS伪指令所定义的段,通常小于64K单元,而且经过汇编和连接,定义的各段不互相覆盖7/10/2024482)定位类型PAGE=××××××××××××00000000PARA=××××××××××××××××0000WORD=×××××××××××××××××××0BYTE=
××××××××××××××××××××
它们的边界地址(20位地址)应分别可以被256、16、2、1除尽,分别称为以页、节、字、字节为边界7/10/202449举例【例4-3】SEGMENT伪指令定义符的定位类型应用举例。STACK SEGMENTSTACK ;STACK段,定位类型缺省DB100DUP(?) ;保留100个字节STACK ENDS ;STACK段结束DATA1 SEGMENTBYTE ;DATA1段,定位类型BYTESTRINGDB'Thisisanexample!' ;长度为19个字节DATA1 ENDS ;DTAT1段结束DATA2 SEGMENTWORD ;DATA2段,定位类型WORDBUFFERDW40DUP(0) ;40个字内容为0DATA2ENDS ;DATA2段结束CODE1 SEGMENTPAGE ;CODE1段,定位类型PAGE…… ;假设CODE1段长度为m(m<100H)个字节CODE1 ENDS ;CODE1段结束CODE2 SEGMENTPAGE ;CODE2段,定位类型PAGE START:MOVAX,STACKMOVSS,AX…… ;假设CODE2段长度为n个字节CODE2 ENDS ;CODE2段结束ENDSTART ;源程序结束7/10/202450表4.3例4-3各逻辑段的起始地址和结束地址段
名定位类型字节数起始地址结束地址STACKPARA100(64H)00000H00063HDATA1BYTE19(13H)00064H00076HDATA2WORD80(50H)00078H000C7HCODE1PAGEm00100H00100H+mH-1CODE2PAGEn00200H00200H+nH-17/10/2024512)组合类型组合类型在模块式程序设计中表示该段和其它同名段间的组合连接方法5种选择:PUBLIC:表示该段可与模块连接时所遇到的其它同名段在满足定位类型的前提下依次连接起来。连接的顺序由连接程序LINK确定。COMMON:表示该段与别的模块中的所有其它同名同类别段共享相同的存储空间。即各段都是从相同的地址开始,具有同样的段地址,且互相覆盖。连接后,段的长度等于最长的COMMON段的长度。AT表达式:表示相应段定位在由表达式求值得到的节(PARA)边界地址上。表达式也可以是一个常数。例如,AT1234H表示该段定位在实际物理地址12340H处。STACK:与PUBLIC组合类型的处理方式相同,即把不同模块中带有STACK组合类型的同名段连接起来,使这些同名段都从同一基地址开始。但STACK组合方式仅用于堆栈段。MEMORY:表示在连接时,本段应装在被连接的其它段之上,即在同名段中具有最高的地址。若连接时具有MEMORY组合类型的段不止一个,则只有第一段才当成MEMORY组合类型来处理,其它的段将重叠,即按COMMON组合类型来处理。7/10/2024523) '类别'类别必须放在单引号内作用:是在连接时决定各逻辑段的装入顺序。当几个程序模块进行连接时,其中具有相同类别名的逻辑段被装入连续的内存区,类别名相同的逻辑段,按出现的先后顺序排列。没有类别名的逻辑段,与其他无类别名的逻辑段一起连续装入内存。7/10/2024532.ASSUME语句伪指令告诉汇编程序,将某一个段寄存器设置为存放某一个逻辑段的段地址,即明确指出源程序中的逻辑段与物理段之间的关系格式:
ASSUME段寄存器名:段名[,段寄存器名:段名,……]段寄存器:CS、DS、ES、SS名称有下面几种情况:由SEGMENT伪指令定义的段名。如上面程序例子中的DATA1、CODE1等,可以有:ASSUMECS1:CODE1,DS:DATA1;表达式:SEG变量名或SEG标号。如上面程序例子中的变量STRING,那么SEGSTRING可作为名称,从而可以有:ASSUMEDS:SEGSTRING;GROUP伪指令定义的段组名。例如,若GCODE为段组名,那么ASSUMECS:GCODE将使CS指向该段组的组头。格式中方括号中的内容表示可以省略,所以ASSUME伪指令既可以同时说明4个段寄存器,也可以只说明一个或两个段寄存器7/10/2024543.ORG伪指令格式:ORG表达式表达式:是一个其值为2字节的无符号数。ORG伪指令的功能是指明该语句下面的程序在段内的起始地址的例如:ORG0100H
7/10/202455地址计数器$任何时候在使用存储器时,先要给出存储单元地址汇编程序在汇编时给出一个隐含的地址计数器,$是地址计数器的值,也就是当前所使用的存储单元的偏移地址7/10/2024564.PUBLIC和EXTRN伪指令当一个程序由多个模块组成时,必须通过命令将各模块连接成一个完整的、可执行的程序EXTRN伪指令:表示本模块引用了在其他模块中定义的信息PUBLIC伪指令:表示本模块提供被其他模块使用的信息7/10/2024571)PUBLIC伪指令说明本模块中的某些符号是公共的,即这些符号可以提供给将被连接在一起的其他模块使用。格式为:
PUBLIC符号[,…]其中的符号可以是本模块中定义的变量、标号或数值的名字,包括用PROC伪指令定义的过程名等。PUBLIC伪指令可以安排在源程序的任何地方7/10/202458
2)EXTEN伪指令说明本模块中所用的某些符号是外部的,即这些符号在将被连接在一起的其他模块中定义(在定义这些符号的模块中还必须用PUBLIC伪指令说明)。格式为:
EXTEN名字:类型[,…]其中的名字必须是其他模块中定义的符号;类型必须与定义这些符号的模块中的类型说明一致。如为变量,类型可以是BYTE、WORD或DWORD等;如为标号和过程,类型可以是NEAR或FAR,等等7/10/2024594.3.2汇编语言的过程定义定义格式:过程名PROC[类型]
……RET
过程名ENDP过程名:是用户给过程起的名称。它是提供给其它程序调用时用的,过程名是不能省略的过程名具有与语句标号相同的属性,即具有段地址、偏移地址和类型三个属性类型:NEAR和FAR两种,类型为FAR表示过程与调用程序可以不在同一段内,类型为NEAR表示过程与调用程序在同一段内。类型可以省略,当缺省时,表示为NEAR类型。PROC和ENDP是过程定义的关键字,且成对出现。当一个程序段被定义为过程后,程序中其他地方就可以用CALL指令调用这个过程。调用一个过程的格式为:
CALL过程名RET是过程的返回指令,是段内返回还是段间返回由格式中的类型决定。RET指令控制返回到原来调用指令(CALL)的下一条指令7/10/2024604.3.3标准程序返回方式用户程序结束后一般应该返回DOS,这一过程称为程序终结一般有两大类方式:中断和功能调用7/10/2024611.使用中断调用20HDOS加载一个外部(EXE)文件时,首先要建立一个PSP(程序段前缀,ProgramSegmentPrefix),并且让DS指向该段,DS:0000H处有一条指令INT
20H,它可以正确返回DOS,但前提是执行该指令时CS必须指向PSP段执行INT20H指令是把控制返回给DOS的传统方法。在DOS环境下运行一个程序时,自然要求当程序运行结束时,控制返回DOSDOS的装入程序在加载一个程序时把DS和ES定位在PSP的起点上,应在程序一开始通过下面3条指令把PSP的起点地址压入堆栈:PUSHDSSUBAX,AXPUSHAX7/10/2024622.使用DOS的功能调用在用户程序结束后插入以下语句:MOVAH,4CHINT21H7/10/2024634.3.4汇编结束语句END伪指令END用来表明END语句处是源程序的终结。格式:
END表达式表达式通常就是程序第一条要执行指令的语句标号7/10/2024644.3.5汇编语言源程序结构EXE程序:汇编语言的源程序最多可以由4个段组成,通常包括代码段、数据段和堆栈段COM程序:COM程序必须位于一个64K的段中,所以COM文件的大小不能超过65,024(64K减去用于PSP的256字节和用于一个起始堆栈的至少256字节)只有一个用户使用,也无需与外部的其他模块进行装配,则可以把代码段、数据段和堆栈段都包括在代码段内ASSUME只有一个数据项,即CS:CODEDOS的装入程序在加载这种COM程序时,把4个段寄存器都初始化在PSP的起点上,把IP初始化在0100H,SP初始化在整个段的高端7/10/202465COM程序被装入内存后的初始设置图4-3COM程序被装入内存后的初始设置7/10/202466PSP组成部分供进程调用的DOS入口PSP+0,+2,+5,+50H和+2CH字段;供进程使用的传递参数PSP+5CH,+6CH和+80H字段;为DOS保存的中断向量PSP+0AH,+0EH和+12H字段;由DOS专用的保留区域PSP+16H~2BH和2EH~37H字段PSP的某些关键字段涉及到系统内部管理,使用者不得更改7/10/202467加载.EXE文件后,各寄存器的初值设置DS和ES指向PSP的段地址;CS指向代码段的绝对段址;SS指向堆栈段的绝对段址;IP指向代码段入口时,第一条指令的偏移地址;SP指向堆栈段入口时深度,此值由文件头位移10H的字域决定;BX,CX是加载程序的字节长度。7/10/202468加载.COM文件后,各寄存器的初值设置CS,DS,ES和SS指向PSP的段地址;IP固定为100H;SP位FFFEH,并在栈顶处压入一全0字;BX,CX是COM文件的字节长度。7/10/2024694.4汇编语言程序设计明确任务,确定算法。画流程图。根据流程图编写汇编语言程序。上机调试程序。图4-4标准流程图符号7/10/2024704.4.1顺序程序图4-5顺序结构流程图7/10/202471举例【例4-4】求两个数的平均值。这两个数分别放在x单元和y单元中,而平均值放在z单元中。源程序如下:
DATASEGMENT xDB95
yDB87zDB?DATAENDSCODESEGMENT
MAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDS SUB AX,AX PUSHAX MOV AX,DATA ;装填数据段寄存器DSMOV DS,AX MOV AL,x ;第一个数送入ALADD AL,y ;两数相加,结果送AL MOV AH,0 ADCAH,0 ;带进位加法,进位送AH MOV BL,2 ;除数2送BL DIVBL ;求平均值送AL MOV z,AL ;结果送入z单元
RETMAINENDPCODEENDS ENDSTART7/10/202472采用INT21H返回CODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA ;装填数据段寄存器DS MOVDS,AX MOVAL,x ;第一个数送入ALADDAL,y ;两数相加,结果送AL MOVAH,0 ADCAH,0 ;带进位加法,进位送AH MOVBL,2 ;除数2送BL DIVBL ;求平均值送AL MOVz,AL ;结果送入z单元
MOVAH,4CHINT21HCODEENDS ENDSTART7/10/202473举例【例4-5】用查表的方法将一位十六进制数转换成与它相应的ASCII码。建立一个表TABLE。在表中按照十六进制数从小到大的顺序放入它们对应的ASCII码值某一位十六进制数X转换成它的ASCII码值在表中的偏移量,然后将偏移量加上该表在内存的首地址,就可查得数X的ASCII码值了表在内存的首地址为TABLE,便可通过下式计算出在内存中存放数X的ASCII码值的偏移地址ADR:
ADR=TABLE+(X-0)×17/10/202474源程序DATASEGMENTTABLEDB30H,31H,32H,33H,34H,35H,36H,37H DB38H,39H,41H,42H,43H,44H,45H,46H
HEXDB4RESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXLEABX,TABLE MOVAH,0MOVAL,HEXADDBX,AXMOVAL,[BX]
MOVRESULT,ALMOVAH,4CHINT21HCODEENDSENDSTART7/10/2024754.4.2分支程序图4-6分支程序的结构形式7/10/202476分支程序设计正确选择判定条件和相应的条件转移指令;在编程时必须保证每条分支都能有完整的结果;在检查和调试时必须逐条分支进行,因为一条或其中几条分支正确还不足以说明整个程序正确。7/10/202477举例【例4-6】求数X的补码,并送回原处。求X的补码,即要求完成下面的运算:
X≥0X<07/10/202478流程图图4-7求数X补码的流程图7/10/202479源程序STACKSEGMENTSTACKDB256DUP(?) ;定义堆栈段,预留256个单元
TOPLABLEWORDSTACKENDSDATASEGMENTXADRDW1234H;设X=1234HDATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACKSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATA;将数段段址送DS。
MOVDS,AXMOVAX,STACK;将堆栈段段址送SS。
MOVSS,AXMOVSP,OFFSETTOP;设置栈指针,使其指向栈底地址。
MOVAX,XADR;取X到AX。
ANDAX,AX;设置标志位。
JNSDONE;若x≥0,转DONE。
NEGAX;若x<0,求补得到[X]补。
MOVXADR,AX;将[X]补送回原处。
DONE:RET;返回DOS状态。
MAINENDPCODEENDS ENDSTART7/10/202480举例【例4-7】给定以下符号函数:任意给定x值,存放在x单元,函数值y存放在y单元,根据x的值确定函数y的值。7/10/202481程序流程图图4-8实现符号函数程序的流程图7/10/202482源程序DATASEGMENT xDB36 yDB?DATAENDSCODESEGMENTMAINPROCFAR
ASSUMECS:CODE,DS:DATASTART:PUSH DS SUBAX,AX PUSH AX MOVAX,DATA MOVDS,AX MOVAL,x ;AL←x CMPAL,0 JGE LOOP1 ;x≥0时转LOOP1 MOVy,0FFH ;y←−1 RETLOOP1:JELOOP2 ;x=0时转LOOP2 MOVy,1;y←1 RETLOOP2:MOV y,0;y←0 RETMAINENDPCODEENDSENDSTART7/10/202483举例【例4-8】利用跳转表实现下面要求:若有一组选择项,当N选择不同值时则应作不同处理。设该组选择项及其对应的处理为:
N=1时,显示信息(DISPL);
N=2时,传送信息(TRAN);
N=3时,处理信息(PROC1);
N=4时,打印信息(PRIN);
N=5时,结束程序(EXIT)。7/10/202484流程图图4-9多分支程序流程图7/10/202485分析根据给定的N值计算出对应的转向地址在JADT表中的位移量DISP,然后用一条间接转移指令就可以实现所需的转移了若转移属于段内转移,那么表中存放的是16位段内偏移地址,位移量与N的关系为:
DISP=(N-1)×2可通过下式计算出N与在内存中存放转向地址的偏移地址ADR:
ADR=JADT+(N-1)×27/10/202486源程序DATASEGMENTJADTDWDISPL;跳转表
DWTRANDWPROC1DWPRINDWEXITDATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXAGAIN:MOVAH,01;读入一个字符送ALINT21HSUBAL,30H;AL内容转换成数字
CMPAL,01;AL内容在1~5之内吗?JBAGAINCMPAL,05JAAGAIN;不是,转AGAINSHLAL,01CBWMOVDI,AXJMPJADT[DI-2]
DISPL:……JMPAGAINTRAN:……JMPAGAINPROC1:……JMPAGAINPRIN:……JMPAGAIN
EXIT:RETMAINENDPCODEENDSENDSTART
7/10/2024874.4.3循环程序图4-10典型的循环程序结构7/10/202488循环程序结构初始化部分:建立循环初始值。如设置地址指针、计数器、其他循环参数的起始值等;循环工作部分:在循环过程中所要完成的具体操作,是循环程序的主要部分。这部分视具体情况而定。它可以是一个顺序程序、一个分支程序或另一个循环程序;循环调整部分:为执行下一个循环而修改某些参数。如修改地址指针、其他循环参数等;结束处理部分:对循环结束进行适当处理,如存储结果等。有的循环程序可以没有这部分。7/10/202489举例【例4-9】求某数组中负数的个数。设数组中第1个元素是数组中数据的个数,第2个元素用来存放结果,即数组中负数的个数,数组中的数据从第3个元素开始存放。数组中的每个元素占一个字节。7/10/202490程序流程图图4-11求数组中负数的个数程序流程图7/10/202491源程序DATASEGMENTARRAYDB200DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEADI,ARRAY;DI,SI指向数组
MOVSI,DI;首地址
MOVCL,[DI];数据个数→CL;XORCH,CH;0→CH;MOVBL,CH;0→BL;INCDI;指针指向第一个数据
INCDIAGAIN:TESTBYTEPTR[DI],80H
JZPOSI
INCBL
POSI:INCDILOOPAGAINMOV[SI+1],BLRETMAINENDPCODEENDSENDSTART7/10/202492举例【例4-10】从ARRAY单元开始的N个连续单元中存放有N个无符号数,从中找出最大者送入RESULT单元中。7/10/202493分析把ARRAY单元第一个数先送入AL寄存器,将AL中的数与后面的N-1个数逐个进行比较如果AL中的数较小,则两数交换位置;如果AL中的数大于等于相比较的数,则两数不交换位置在比较过程中,AL中始终保持较大的数,比较N-1次,则最大者必在AL中最后把AL中的数(最大者)送入RESULT单元7/10/202494程序流程图图4-12求最大数的程序流程图7/10/202495源程序DATASEGMENT ARRAYDBNDUP(?)
RESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:PUSHDS SUBAX,AX PUSHAX MOVAX,DATA MOVDS,AX LEASI,ARRAY MOVAL,[SI] MOVCX,LENGTHARRAYLOOP1:INC SI CMPAL,[SI]JAE LOOP2 XCHGAL,[SI]LOOP2:LOOPLOOP1 MOVRESUILT,AL RETMAINENDPCODEENDS ENDSTART7/10/202496举例【例4-11】求一字符串的长度,并要求滤去第一个非空格字符之前的所有空格。字符串以‘#’结束。7/10/202497分析例题中有两个要求,第一是要找到第1个非空格字符,第二是由第1个非空格字符开始求出字符串的长度程序包括两个循环,第1个循环的结束条件为非空格字符,第2个循环的结束条件为字符‘#’7/10/202498流程图图4-13例4-11程序流程图7/10/202499源程序DATASEGMENTSTRINGDBNDUP(?)DB′#′SLENDW?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEASI,STRINGXORBX,BXAGAIN1:MOVAL,[SI];取一个字符
INCSI;指针修正
CMPAL,′′;(AL)=′′?JEAGAIN1;是,转AGAIN1AGAIN2:CMPAL,′#′;(AL)=′#′?JEDONE;是,转DONE;INCBX;不是,个数加1MOVAL,[SI]INCSIJMPAGAIN2DONE:MOVSLEN,BXRETMAINENDPCODEENDSENDSTART7/10/20241004.4.4子程序子程序是完成确定功能的独立的程序段,它可以被其它程序调用,在完成确定功能后,又可自动返回到调用程序处多次重复地书写这些程序,节省了内存子程序的调用和返回需要占用时间7/10/20241011.子程序结构格式如下: 过程名PROC[NEAR/FAR]
…… RET
过程名ENDP“过程名”是子程序入口的符号地址;NEAR或FAR是过程的类型属性,其确定原则为:调用程序和过程若在同一代码段中,则使用NEAR属性;调用程序和过程若不在同一代码段中,则使用FAR属性;主程序应定义为FAR属性(使用标准方式返回DOS时)。因为我们把程序的主过程看作DOS调用的一个子程序,而DOS对主过程的调用和返回都是FAR属性。过程定义允许嵌套,即在一个过程定义中允许包含多个过程定义7/10/2024102过程的调用采用CALL指令,其寻址方式可以是直接寻址方式,也可以是间接寻址方式;可以是段内调用,也可以是段间调用过程执行完毕返回主程序时,靠过程体最后RET指令的执行来保证7/10/2024103调用程序和子程序在同一代码段中CODE SEGMENT ……MAINPROCFAR ……CALLPR …… RETMAINENDPPRPROCNEAR……RET PRENDP CODEENDS7/10/2024104调用程序和子程序不在同一代码段CODE1SEGMENT …… CALLPC ……CODE1ENDSCODE2SEGMENT …… PCPROCFAR …… RET PCENDPCODE2ENDS7/10/20241052.主程序与子程序之间的参数传递主程序在调用子程序之前需将某些初始数据提交给子程序,而子程序运行结束也需将结果返回给主程序,这就是两者之间的参数传递将主程序给子程序提供的初始数据或获得初始数据的信息称为子程序的入口参数,而子程序返回给主程序的结果称为子程序的出口参数主程序与子程序之间的参数传递主要有3种方式7/10/20241061)寄存器传递参数方式寄存器传递参数方式是指子程序的入口参数和出口参数是通过寄存器传递的7/10/2024107举例【例4-12】编写统计一个字中“1”的个数程序。7/10/2024108源程序STACKSEGMENTSTACKDB256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENT
DTWDW5A69HDTWSDW?DATAENDS
CODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACKSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAX,DTWCALLBCNT;调BCNT1子程序
PUSHBXMOVAL,AHCALLBCNTPOPAX;从栈中弹出第一次结果
ADDAX,BX;两次结果相加
MOVDTWS,AXRETMAINENDPBCNTPROCNEAR;BCNT子程序,统计AL中1个数
MOVBX,0;结果送BXMOVCX,08BLOOP1:ROLAL,01JNCBLOOP2INCBXBLOOP2:LOOPBLOOP1RETBCNTENDPCODEENDSENDSTART7/10/20241092)指定内存单元传递参数方式参数不通过寄存器传递,而是直接通过内存某些指定单元传递主程序在调用前应将子程序中所用的数据送入指定区,所需的结果也从指定区中取出进入子程序后,子程序则直接从指定区中取数据和存放结果子程序必须指出它所用的指定内存区的段及有关变量7/10/2024110举例【例4-13】编写一程序,完成对ARRAY数组中N个元素求和。7/10/2024111源程序DATASEGMENTARRAYDW30DUP(?)COUNTDW30
SUMDW2DUP(?)DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXCALLPADDRETMAINENDPPADDPROCNEARPUSHAXPUSHCXPUSHDXPUSHSILEASI,ARRAYMOVCX,COUNTXORAX,AXMOVDX,AXAGAIN:ADDAX,[SI];累加N个元素的低位字
JNCNEXTINCDX;若有进位,则和的高位字加1NEXT:INCSIINCSILOOPAGAIN MOVSUM,AXMOVSUM+2,DXPOPSIPOPDXPOPCXPOPAX
RETPADDENDPCODEENDS
ENDSTART7/10/20241123)堆栈传递参数方式堆栈传递参数方式是指子程序的入口参数和出口参数通过堆栈传递主程序在调用子程序之前应将需传送给子程序的参数压入堆栈,子程序则从堆栈中取出参数,经过运算后,将运算结果也压入堆栈返回后,主程序再从堆栈中取出结果主程序压入参数的顺序以及子程序传递结果的方式必须事先约定7/10/2024113举例【例4-14】编写一程序,完成将一组BCD数转换成16位二进制数。假设一组BCD数以分离BCD数的方式存于内存的某个区,并且BCD数据的高位存于高地址端,低位存于低地址端。7/10/2024114源程序STACKSEGMENTSTACKDB256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTBCDDB5DUP(?)LENGDW?RESULTDW?DATAENDSCODE1SEGMENTMAINPROCFARASSUMECS:CODE1,DS:DATA,SS:STACK,ES:DATASTART:PUSHDSSUBAX,AXPUSHAX MOVAX,DATA MOVES,AX MOVDS,AX MOVAX,STACK MOVSS,AX LEASP,TOP PUSHDS;将参数3送入堆栈
LEAAX,BCD PUSHAX;将参数2送入堆栈
MOVCX,LENG PUSHCX;将参数1送入堆栈
CALLFARPTRBCD-16B POPAX;从堆栈顶取结果
MOVRESULT,AX;将结果送入RESULT单元
RETMAINENDPCODE1ENDS7/10/2024115CODE2SEGMENTASSUMECS:CODESBCD-16BPROCFAR PUSHBP MOVBP,SP PUSHES PUSHSI PUSHCX PUSHBX PUSHAX MOVCX,[BP+6];从堆栈取第1个参数
MOVSI,[BP+8];从堆栈取第2个参数
MOVES,[BP+0AH];从堆栈取第3个参数 ADDSI,CX DECSI MOVDX,0BCDL:PUSHCX MOVAL,ES:[SI]
DECSI ANDAL,0FH CBW MOVBX,AX MOVAX,DX MOVCX,10 MULCX MOVDX,AX ADDDX,BX POPCX LOOPBCDL MOV[BP+0AH],DX;将结果送入堆栈 POPAX POPBX POPCX POPSIPOPESPOPBP
RET
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 皮革制品行业的市场调查与消费需求分析考核试卷
- 海水养殖的食品安全控制考核试卷
- 创业空间的共享单车企业项目考核试卷
- 医药制造业危险废物处理方案考核试卷
- 废弃资源综合利用的供需平衡与市场竞争分析考核试卷
- 印刷行业的安全与环境保护考核试卷
- 构建安全企业推进安全生产培训考核试卷
- 城市公共设施管理的城市发展案例研究考核试卷
- DB11T 765.3-2010 档案数字化规范 第3部分:微缩胶片档案数字化加工
- 教学课件获奖教学课件
- 陕西省汉中市勉县第二中学2024-2025学年高二上学期11月期中考试政治试题
- 期中模拟检测(试题) 2024-2025学年五年级上册数学北师大版
- 统编版(2024新版)七年级上册历史第三单元 秦汉时期:复习课件
- 体格检查神经系统检查课件
- 【核心素养目标】13.3.1.2 等腰三角形的判定教案人教版数学八年级上册
- 北京版小学英语1至6年级词汇
- 泵闸工程施工组织设计(技术标)
- 5.3 善用法律 课件-2024-2025学年统编版道德与法治八年级上册
- 琉璃瓦安装施工合同
- 济南版中考生物二轮复习:重难点基础知识复习提纲
- 心脏心内膜肉瘤的药物治疗进展与展望
评论
0/150
提交评论