第四章8086汇编语言程序设计--吴版

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

微机原理及应用第四章8086汇编语言程序设计1第四章8086汇编语言程序设计汇编语言是机器语言的一种符号表示,主要特点:机器指令的操作码和操作数用助记符来表示。存储器中的地址可以用符号表示,程序员不必具体安排。源程序:用汇编语言编写的原始程序汇编:把汇编语言源程序翻译成机器语言程序(目标程序)的过程。[例]显示并打印输出“Welcometouse8086assembler!”[定位类型][组合类型][‘类别’]STACKSEGMENTPARASTACK‘STACK’此段起始边界为节(隐含值)P40页Paragraph保证段址最低4位DB50DUP(0)地址码总是为0STACKENDS;DATASEGMENTSTRINGDB’WELCOMETOUSE8086ASSEMBLER!’DBODH,OAH,’$’DATAENDS;CR,回车的ASCII码。LF,换行的ASCII码CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK段寄存器地址说明STARTPROCFARPUSHDS**DOS将控制权转给本程序时,须将DS段值和偏移量(AX)MOVAX,0进栈保护(插:DOS交权时,在程序段前缀的开始(偏PUSHAX移地址00H)处安排了一条中断返回指令INT20H。为了在完成我们的程序后正常返回,必须先将DS进栈,同时将段内偏移量(AX中的零)进栈保护。)若不写这3句,须将程序结束时的RET语句换成MOVAX,4C00HINT21H微机运行汇编程序时,对原来的DOS相当于中断,正常返回所需的段地址和偏移地址入栈MOVAX,DATA将新的数据段的地址传送给DSMOVDS,AXMOVAH,9MOVDX,OFFSETSTRING9号调用,屏幕显示字符串,以“$”为结束标志INT21HLEABX,STRING;有效地址偏移量送BX汇编语言源程序目标程序汇编程序汇编连接可执行程序连接程序微机原理及应用第四章8086汇编语言程序设计2LOOP1:CMPBYTEPTR[BX],‘$’JELOOP2给[BX]的内容定义为字节MOVAH,5MOVDL,[BX]5号调用,打印输出字符须将ASCII码先送DL。INT21HINCBXJMPLOOP1LOOP2:RET;返回DOSSTARTENDPCODEENDSENDSTART说明:①源程序按段编写,每个段以SEGMENT语句开始,ENDS语句结束即:段名SEGMENT[段定义]…段名ENDS段有四种:代码段、数据段、堆栈段、附加段段名:程序员自定,不一定是CODE、STACK段数目:程序员自定本例中有三个段②一个独立的汇编单位称为一个模块,它以END语句结束。仅主模块的END语句中需要指明程序执行时的启动地址。而不允许其他模块的END语句给出启动地址。本例中,ENDSTART③汇编语言中用定义的过程来实现子程序的功能。过程用PROC和ENDP来定义范围。过程可以嵌套,但不能交叉。§4.18086汇编语言的程序格式源程序中的语句的种类有:指令性语句指示性语句伪指令语句宏指令语句一、指令性语句指令性语句格式:[标号:]指令助记符操作数[,操作数][;注释]例如:LOOP1:[]内可省略标号经常作为转移指令或CALL指令的一个操作数,用以表示转移地址,可以使用字母、数字或_@?,第一个不能为数字。标号可以省略。微机原理及应用第四章8086汇编语言程序设计3二、伪指令语句格式:[名字]定义符参数,…[;注释]也称关键字(或保留字),专用。如例第一句STACK…一般每句占一行,若一行写不下。可用续行符&来连接。单独的;行都为空行,与空操作不同,不占用时间。凵行标号和名字区别:标号后面跟“:”,可作为跳转。即调用指令(CALL)的一个操作数。名字可以是变量名、段名、过程名、符号名等。在同一程序段中,同样的标号和名字的定义只允许出现一次,否则汇编程序会指示出错。注:*标号和名字可以由数字、字母和下划线组合而成,但不能以数字开头。§4.28086汇编语言的运算符和操作符3种2种一.算术运算符:+、-、*、/、MOD取模即除法运算后的余数如:23/7的商是323MOD7为2对于存储器地址操作数:只能用“地址符号±数字量”来计算。如:START+2MOVDX,BLOCK+(5-1)*2;把首址为BLOCK的字数组的第5个字送到DX寄存器。二.逻辑运算符AND、OR、XOR(异或)、NOT:且又是指令助记符注意:按位操作数字运算逻辑运算符:在进行汇编时计算指令助记符:在执行程序时计算例:ANDDX,PORTAND0FEH指令助记符逻辑运算符PORTAND0FEH是在汇编时计算,产生一个立即数,第一个AND是在执行程序时,DX的内容与该立即数相“与”结果存放在DX中。三.关系运算符6种EQ、NE、LT、GT、LE、GE相等不等小于大于小于或等于大于或等于参加关系运算的操作数是:①数字微机原理及应用第四章8086汇编语言程序设计4②同一段内的存储器地址。结果为:0;关系为假时0FFFFH;关系为真时。如:MOVBX,PORTLT3若PORT为2,则汇编为:MOVBX,0FFFFHPORT为4MOVBX,0四.数值返回运算符(分析操作符)利用它可以把一个存储单元地址分解为它们的组成部分(段地址和偏移量)。它们是:SEG、OFFSET,TYPE,SIZE,LENGTH。①SEG:取存储单元地址的段地址部分例:MOVAX,SEGABCMOVDS,AX这两个语句使DS中存放对应于ABC的段地址。②OFFSET:取存储单元地址的偏移量部分。例:MOVBX,OFFSETOPER_ONE汇编时汇编程序将OPER_ONE的偏移地址作为立即数回送给指令,而在执行程序时则将该立即数所表示的的地址装入寄存器中,所以该指令等价于LEA.BX,OPER_ONE的结果。但运行过程是不同的。③TYPE:取存储器操作数的类型值。见表4-2类型返回值变量DBDWDDDQ1248标号NEARFAR-1[FFH]-2[FEH]例:KKKDB20DUP(?);定义20个字节的空单元则TYPEKKK等于1④LENGTH(长度):取存储区单元的数目(单元可以是字节、字或者双字)⑤SIZE:取存储区单元的字节数例:ABCDW100DUP(?);定义100个字单元TYPEABC等于2LENGTHABC等于100SIZEABC等于200LENGTH*TYPE=SIZE五、修改属性运算符(合成操作符)用来规定存储单元的性质,有PTR和THIS两种。①PTR:用来对存储单元规定类型,常和BYTE、WORD等配合使用。PTR的格式为:类型PTR表达式例:MOVBYTEPTR[1000],0;规定1000单元为字节单元,将其清0。微机原理及应用第四章8086汇编语言程序设计5MOVWORDPTR[1000],0;规定1000单元作为一个字的开始,将1000、1001清0.另外,PTR也用来更改一些已经规定了类型的存储单元的类型。例:XYZDW10DUP(?);XYZ开始的10个字单元的存储区。再使用下列语句:PPEQUBYTEPTRXYZ;QQEQUBYTEPTRXYZ+1;XYZ开始的两个单元又规定为字节类型。KKEQUDWORDPTRXYZ+2;XYZ+2的4个单元规定为双字类型。②THIS:也用来改变存储区的类型,与PTR类似。NEAR、FAR格式为:THIS类型(或属性)字、字节、双字希望存储区既可以作为字节类型来用,也可以作为字类型来用,则在定义类型语句之前加上THIS语句。例:XYZ_2EQUTHISBYTEXYZ_1EQUTHISBYTEXYZDW?符号XYZ2、XYZ1、XYZ具有相同的段地址和偏移量。所以,后面的程序段中,如用符号XYZ则存储单元作为字类型,如用符号XYZ1或XYZ2,则存储单元作为字节类型。属性例:STARTEQUTHISFAR;MOV指令有一个FAR属性的地址START来允许其它段的JMP直接跳到STARTMOVCX,100综合例:P99.属性和属性运算符的运用;表的内容求和,送入AXTABLEDW50DUP(?);定义TABLE开始的50个字单元。SUBAX,AX;AX清0MOVCX,LENGTHTABLE;确定循环次数MOVSI,SIZETABLE;取表的总字节数100ADD_NEXT:SUBSI,TYPETABLE;减去一个元素,第一次指向最后一个ADDAX,TABLE[SI];相加寄存器相对寻址(变址寻址)P59LOOPADD_NEXT;若cx≠0循环;AX内容为SUM六、操作符的优先级P135从高到低求记录或字段所占位数①()、〈〉(记录中用)、[]、·(结构中用)、LENGTH、SIZE、WIDTH、MASK(记录中用)②PTROFFSETSEGTYPETHIS段寄存器名:(加段前缀)微机原理及应用第四章8086汇编语言程序设计6③HIGHLOW④*/MODSHLSHR(记录中用)⑤+-⑥EQNELTLEGTGE⑦NOT⑧AND⑨ORXOR⑩SHORT§4.3伪指令伪指令又称伪操作。在对源程序进行汇编时由汇编程序处理的操作,如数据定义,分配存储区,指示程序结束等。一、数据定义语句DB:用来定义一个字节,其后的每个操作数占有一个字节。DW:字DD:双字DQ四字DT10个字节例:DATA_DWDD?;定义一个双字DAT2DB23,45;DAT2←23,DAT2+1←45LIT_CYCLEDWOFFSETCYCLE;在LIT_CYCLE单元中存放CYCLE的地址偏移量。BIG_CYCLEDDCYCLE;在BIG_CYCLE单元中存放CYCLE的地址偏移量,在BIG_CYCLE+2单元中存放CYCLE的段地址。…CYCLE:MOVBX,AX…ALL_ZERODB6DUP(0);ALL_ZERO开始的6个字节清0DUP前为重复的次数例:ZIPDB2DUP(0,3DUP(2))即ZIPDB0,2,2,2,0,2,2,2二、符号定义语句有:EQU和=1.等值语句EQU格式:符号名EQU表达式程序多次出现同一表达式时,为方便起见,可用一个符号名代替。这样,在程序的起始部分要进行定义说明。按上述格式。例BFDEQUDS:[BP+8];地址PORTEQU114;常数COUNTEQUCX;寄存器微机原理及应用第四章8086汇编语言程序设计7ABCEQUDAA;指令助记符EQU只能进行一次定义,不能重新定义。2.等号语句=可以重新定义,其它同EQUNUM=3NUM=NUM+2;NUM=5三、段定义语句①格式:段名SEGMENT[定位类型][组合类型][‘类别’]…段名ENDS起始边界表明段与段的关系定位时链接程序,可以把同样类别的段集中在一起。定位类型:表示此段的起始边界要求。分别有:PAGE:页。该段必须从页的边界开始。即段地址必须从XXX00H开始。256字节为一页。PARA:(默认)节。该段必须从小节的边界开始。即段地址必须从XXXX0H开始。WORD:字。可以从偶数地址开始。BYTE:字节。可以从任何地址开始。组合类型:用来告诉链接程序本段与其它段的关系。分别有:NONE(默认):表示本段与其它段逻辑上不发生关系。每段都有自己的基地址。PUBLIC:各模块中同名同类别的段相邻地链接在一起,指定一个共同的段基址。即连接成一个物理段。COMMON:各模块同名同类别的段相覆盖,段基址皆相同,段的长度取决于COMMON段的长度。AT表达式:连接程序把本段装在表达式的值所指定的段地址上,但不可以用于CS。STACK:与PUBLIC同样性质的堆栈段。MEMROY:链接程序把本段定位在被连接在一起的其它所有段上。对于多个MEMROY字段,则第一个为MEMROY,其余为COMMON。②ASSUME语句(段分配语句)使汇编程序得知段的类型,即DS、CS、SS、ES,除CS外,初始化时自动完成。各个段寄存器的实际值,还要用MOV指令来赋给。若SS不用该语句,就利用系统设置的堆栈。见P103~104页例子。另外**语句目的:微

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功