您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章8086汇编语言程序设计
第四章8086汇编语言程序设计汇编伪指令语句2汇编语言中的数据3汇编程序的执行过程4汇编语言格式1汇编语言的语句类型指令语句由CPU执行,可产生机器代码,CPU根据这些代码才能执行相应的操作。伪指令语句由编译器处理,为编译和连接提供控制信息,不产生机器代码。宏指令语句以一个宏名定义的一段指令序列,在汇编中凡是出现宏指令语句的地方,都会有相应的指令语句序列的目标代码插入。汇编语言格式指令语句[标号:]指令助记符[操作数,操作数][;注释]例如:movcx,8;2操作数指令s:nop;0操作数指令(nop空操作)loops;1操作数指令伪指令语句[名字]伪指令助记符参数,参数…[;注释]例如:data1db0,1,2;数据定义伪指令DB,在内存中定义;3个连续的字节单元,初值是0,1,2;data1表示第一个数据0的偏移地址DATASEGMENT;定义数据段DATA1DW1234H;定义被加数DATA2DW5678H;定义加数DATAENDS;数据段结束ESEGSEGMENT;定义附加段SUMDW2DUP(?);定义存放结果区ESEGENDS;附加段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,ES:ESEGSTART:MOVAX,DATA;START为程序的启动标号MOVDS,AX;初始化DSMOVAX,ESEGMOVES,AX;初始化ESLEASI,SUM;存放结果的偏移地址送SIMOVAX,DATA1;取被加数ADDAX,DATA2;两数相加MOVES:[SI],AX;和送附加段的SUM单元中MOVAH,4CHINT21HCODEENDS;代码段结束ENDSTART;源程序结束定义数据段定义附加段定义代码段程序结束汇编伪指令语句1.段定义伪指令(segment与ends)格式:段名segment[定位][组合][段字][‘类别’]….段名ends段的起始地址PAGEPARA(默认)WORDBYTE段间关系NONE(默认)PUBLICSTACK多个’类别’连续存放STACKCODEDATA在程序中,段名就代表段地址定位默认para,段起始地址低4位是0,所以默认情况下数据段的偏移地址从0开始初学者暂不考虑后面的参数,会定义段就可以了汇编伪指令语句2.指定段寄存器伪指令(assume)格式:assume段寄存器:段名[,段寄存器:段名...]功能:设定段寄存器与段名之间的对应关系。例如:codesegmentassumecs:code….codeends本例中用assumecs:code将用作代码段的段code和cpu中的段寄存器cs联系起来书本p81,更正segment与ends成对出现段寄存器的装入伪指令assumecs:code,ds:data,ss:stack只是将cs、ds、ss和code、data、stack相连,并没有给cs、ds、ss赋相应的段地址CS的装入源程序结束定义伪指令:END标号每个源程序都必须以END伪指令结束例如:start:…endstartend后面的标号start说明了程序的入口,cpu的cs:ip将被设置指向这个入口。段寄存器的装入DS与ES的装入①用ASSUME将DS/ES与相应的段建立联系②用数据传送指令mov装入段地址MOVAX,段名MOVDS/ES,AXSS的装入(两种办法)第⑴种:在定义段时,用组合类型STACK说明STACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGEMNTASSUMECS:CODE,SS:STACK1……段寄存器的装入第(2)种:SS的装入(类似于DS/ES的方法)STACK1SEGMENTDW40HDUP(0)TOPLABELWORDSTACK1ENDS……CODESEGEMNTASSUMECS:CODE,SS:STACK1……MOVAX,STACK1MOVSS,AXMOVSP,OFFSETTOP;SP=80H……汇编伪指令语句3.过程定义伪指令(proc和endp)格式:过程名procnear/far….ret过程名endp功能:定义过程(子程序)段供其他程序调用near可以被同一代码段中的其他程序调用,far可以被不用代码段中的程序调用,缺省为near把具有独立功能的程序段定义为子程序,便于程序的阅读和调试。p82,例4.10汇编伪指令语句4.模块通信伪指令(1)格式:public符号[,…]功能:当一个符号允许被其他模块调用应该用public声明。这里的符号可以是常量、变量、标号、过程名(2)格式:extrn符号:类型[,…]功能:指明符号是由其他模块用public定义的,该符号在本模块中被引用。p83例4.11汇编伪指令语句5.数据定义伪指令(定义变量)格式:[变量名]DB/DW/DD初值表功能:定义一个变量,并给它赋初值。例如:DATASEGMENTADB0,?,3BDW100,1200H,-5CDB‘A’,‘XY’DDW‘XY’EDW3,4466H,2DUP(1,0)DW1123H,0015HFDWCDATAENDS重复分配操作符重复次数重复数据列表相当于1,0,1,0汇编伪指令语句6.符号定义伪指令格式:符号名EQU表达式(常量.变量.标号.寄存器.内存单元)符号名=表达式(数值)功能:“=”作用等同于EQU。①“=”的表达式只能是数值表达式②用=,EQU定义的不占内存空间例如:DATASEGMENTADB0,?,3B=1CEQUB+1DEQU[SI+2]EEQU25DATAENDS汇编伪指令语句7.地址计数器和ORG伪指令(1)地址计数器($表示当前地址计数器的值)例:DATASEGMENTADW66BDB18DUP(?)CEQU$-ADATAENDS定位默认para,A的偏移地址为0,$=0014H所以,C=0014H-0000H=14H=20D实际上,就是计算C到A内存单位的个数如果换成CEQU$-B则C=18D汇编伪指令语句(2)ORG伪指令(origin起始)格式:ORGn功能:设置当前地址计数器的值例:DATASEGMENTADW66ORG30HCDB2,4,6DATAENDS这个时候,C的偏移地址就不再是0002H,而是0030H。即从偏移地址0030H开始存放2,4,6汇编伪指令语句8.源程序结束伪指令END格式:END标号功能:该语句标志整个程序的结束,是源程序的最后一条语句。汇编语言中的数据在指令中,操作数可以是立即数(常数)、寄存器、存储单元,标号,变量,数值表达式、地址表达式例:movax,0010hmovbx,axmovax,[2012h]jmpnearptrsaddax,bxs:movbx,ax汇编语言中的数据1.常量数值常量、字符串常量、符号常量2.变量例:用数据定义伪指令DB、DW、DD定义变量DATASEGMENTDA1DB12H;定义一个字节数据DA2DD0FEDCBA90H;定义一个双字数据DA3DW5678H;定义一个字数据DATAENDS3.标号标号是一条指令的符号地址。在无条件转移指令、条件转移指令、循环指令和子程序调用指令的操作数位置上,通常用标号作为程序转移指令的目标地址。汇编语言中的数据4.数值表达式数值表达式可以出现在指令和伪指令语句中,数值表达式由编译器负责计算。Cpu执行指令的时候已经是一个数值了例1:逻辑运算符的应用MOVAL,NOT10101010B;(AL)←01010101BMOVAL,11110000BAND10111101B;(AL)←10110000BMOVAL,10100000BOR00000101B;(AL)←10100101B例2:关系运算符的应用MOVAX,5EQ101B;(AX)←0FFFFHMOVBH,10HGT16;(BH)←0例3:算术运算符的应用MOVAX,5*(7-3);(AX)←20MOVBH,1SHL3;(BH)←8算术运算符:+,-,*,/,mod,shl,shr逻辑运算符:and,or,xor,not关系运算符:eq(等于),ne,gt,lt,ge,le若关系成立,即结果为真,返回0ffffh若关系不成立,即结果为假,返回0000h运算符的优先顺序p74汇编语言中的数据5.特殊运算符①强制类型运算符PTR例:PTR运算符的应用N1DB3,6,9MOVAX,WORDPTRN1;临时指定N1为;字类型,(AX)←0603H②定义类型运算符THIS例:THIS运算符的应用ABCEQUTHISBYTE;从本语句开始变量ABC的类型属性指定为字节,不管它原来的类型是什么汇编语言中的数据5.特殊运算符③短取代运算符SHORT例:SHORT运算符的应用JMPSHORTS段转移范围-128~+127④数值返回操作符OFFSET变量或标号;返回偏移地址SEG变量或标号;返回段地址TYPE变量或标号;返回类型(db=1,dw=2,dd=4)LENGTH变量;长度(仅对DUP语句有效,其他=1)SIZE变量;LENGTH*TYPE汇编语言中的数据④数值返回操作符例4.3:BUF的段地址是0500H,偏移地址为0015H,BUF为字类型变量。BUFDW1111H,2255H,3333HBUF1DB9DUP(1)求下列指令执行后寄存器的值?MOVSI,OFFSETBUF;SI=0015HMOVBX,SEGBUF;BX=0500HMOVDI,TYPEBUF;DI=2MOVCX,LENGTHBUF1;CX=9MOVDX,SIZEBUF1;DX=9标识符由字母、数字、专用符号?-$@约定:最长31个字符第一个字符不能是数字?-$@可出现在标号的任意位置,但?$不能单独使用.不能出现在起始位置一个程序中,每个标识符的定义是唯一的,且不能与任何保留字相同错误的命名oMov;指令保留字MOV、ADDoDb;伪指令保留字DB、EQUoOffset;操作符OFFSET、PTRoCs;寄存器AX、CSo@data;预定义符号@datao5sd;第一个字符不能是数字现在我们就可以写一段简单的程序啦~一个完整的程序程序名:hello.asm功能:显示信息“helloworld!”DATASEGMENTMESSDB‘helloworld!’,‘$‘;程序在屏幕上显示hello,world!以$结束DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;ds的装入,告诉cpu数据段的段地址MOVDX,OFFSETMESSMOVAH,9INT21H;显示字符串MOVAH,0INT16H;等待MOVAH,4CHINT21H;返回dosP139CODEENDSENDSTART程序返回DOS的方式1CODESEGMENTASSUMECS:CODEBEGIN:MOVAX,DATAMOVDS,AX….MOVAH,4CHINT21H;返回到DOSCODEENDSENDBEGIN程序返回DOS的方式2CODESEGMENTASSUMECS:CODEBEGINPROCFARPUSHDS;将PSP的段基值压入堆栈MOVAX,0PUSHAX;将psp起始单元偏移量压入堆栈MOVAX,DATAMOVDS,AX….RET;popippopcs(返回dos)BEGINENDPCODEENDSEND程序段前缀PSPPSP(programsegmentprefix)每个应用程序在加载到内存之前,Dos操作系统为程序生成一个256字节的段前缀,放在程序段前面。DOS要利用PSP来和被加载的程序进行通信。PSP是一个程序控制块,第1、第2字节是指令int20h,该指令结束,正常返回DOS.汇编程序的执行过程为了运行汇编语言程序,在磁盘上需要有:编辑程序,如EDIT.EXE汇编程序,如MASM.EXE连接程序,如LINK.EXE调试程序,如DEBUG.COM汇编采用masm5
本文标题:第4章8086汇编语言程序设计
链接地址:https://www.777doc.com/doc-3257595 .html