计算机基础与接口技术第4章(41~44)

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

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

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

资源描述

第4章汇编语言程序设计4.1概述1.机器语言—用二进制数来表示指令和数据.B064什么意思?这就是机器语言。既不直观,又不易理解和记忆.MOVAL,64H;2.汇编语言—用助记符,符号地址以及标号等符号书写的程序。用汇编语言编写的程序叫源程序。汇编语言是面向具体计算机硬件的语言,和机器密切相关。它最大缺点是可读性差,编程效率低。高级语言—编程时不需要对机器指令系统有深入了解,稍加培训即可掌握。可读性强,功能强。为什么要用汇编语言?汇编语言编写的程序节省内存,执行速度快,并为用户直接控制对象提供了手段。故实时性要求很高的程序多采用汇编语言程序。汇编:将汇编语言源程序翻译成目标代码程序的翻译过程。汇编程序:计算机中完成汇编任务的程序被称为汇编程序。由汇编程序产生的目标模块虽然已经是属性为.OBJ的二进制文件,但它还不能直接上机运行,必须经链接程序(LINK)把目标文件与库文件以及其他目标文件连接在一起,形成属性为.EXE的可执行文件并交给DOS,由DOS装入内存执行。DOS下汇编语言程序的上机与处理过程4.2汇编语言源程序的程序结构例:打印输出字符串“THISISASAMPLEPROGRAM”;SAMPLEPROGRAMDISPLAYMESSAGE;注释行STACKSEGMENTPARASTACK‘STACK’;定义堆栈段DB1024DUP(0);建立一个堆栈区STACKENDSDATASEGMENT;定义数据段MESSAGEDB‘THISISASAMPLEPROGRAM’;DB0DH,0AH,‘$’DATAENDSCODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFAR;将程序定义为远过程PUSHDSMOVAX,0;标准序,以便返回DOS操作系统PUSHAXMOVAX,DATA;建立数据段的可寻址性MOVDS,AX;初始化DSLEABX,MESSAGE;MESSAGE地址偏移量BXLOOP1:CMPBYTEPTR[BX],‘$’JELOOP2MOVAH,5MOVDL,[BX];5号DOS功能调用打印输出字符INT21HINCBXJMPLOOP1LOOP2:RET;返回DOS操作系统STARTENDP;过程结束CODEENDS;代码段结束ENDSTART;整个程序汇编结束源程序通常由一个或几个程序模块组成,每个模块包括数据段、堆栈段和若干代码段。代码段可有若干个过程,过程中的语句分为两类:•指令性语句,其格式为:标号:(前缀)指令助记符操作数;注释•指示性语句,又叫伪指令,其格式为:变量伪指令操作数;注释1.指令语句是计算机可执行的。2.伪指令语句不能执行,用来定义变量,分配存储单元,指示程序开始和结束等。.3.宏指令语句是以某个宏名字定义的一段指令序列。汇编时,凡有宏指令语句的地方都将采用相应的指令序列的目标代码插入。4.3.1汇编语言语句的种类•指令语句的一般格式为:[标号:][前缀]指令助记符[操作数][;注释]•伪指令语句的格式为:[名字]伪指令定义符[操作数][;注释]这两种语句的差别:在形式上:带不带冒号,是否可转向它.在本质上:汇编时能否形成对应的机器码4.3.2汇编语言语句的格式4.3.3语句中的操作数操作数可分为4类:常量、寄存器、存储器及表达式。下面分别加以介绍。1.常量操作数二进制常量,以B结尾十进制常量,以D结尾或省略(汇编语言中默认无标记数为十进制数)十六进制常量,以H结尾,如0A8C6H.字符串常量用单引号引起来的字符或字符串也代表常数。例:‘A’,‘BCDE’,汇编时被翻译成对应的ASCII码41H和42H,43H,44H,45H。2.寄存器操作数3.存储器操作数存储器操作数分为标号和变量两种。标号和变量有三种属性:①段值(SEGMENT)—所在段的段地址②偏移量(OFFSET)—单元地址与段起始地址之间的位移量。③类型(TYPE)—有字节、字和双字三种。4.表达式操作数表达式由各种操作数、运算符和操作符组成。下面介绍各种运算符:①算术运算符②逻辑运算符③关系运算符④分析操作符⑤合成操作符(或称属性操作符)⑥其它运算符运算符/操作符运算结果实例类型符号名称算术运算符+-*/MODSHLSHR加法减法乘法除法模除左移右移和差乘积商余数左移后二进制数右移后二进制数3+5=88-3=53*5=1522/5=412MOD3=00010BSHL2=1000B1100BSHR1=0110B逻辑运算符NOTANDORXOR非运算与运算或运算异或运算逻辑非结果逻辑与结果逻辑或结果逻辑异或结果NOT1010B=0101B1011BAND1100B=1000B1011BOR1100B=1111B1010BXOR1100B=0110B表4-1MASM支持的运算符和操作符运算符/操作符运算结果实例类型符号名称关系运算符EQNELTLEGTGE相等不等小于不大于大于不小于结果为真输出全“1”结果为假输出全“0”5EQ11B=全‘0’5NE11B=全‘1’5LT3=全‘0’5LE101B=全‘1’5GT100B=全‘1’5GE111B=全‘0’分析运算符SEGOFFSETLENGTHTYPESIZE返回段基址返回偏移地址返回变量单元数返回元素字节数返回变量总字节数段基址偏移地址单元数字节数总字节数SEGN1=NI所在段段基址OFFSETN1=N1的偏移地址LENGTHN2=N2单元数TYPEN2=N2中元素字节数SIZEN2=N2总字节数(续表)运算符/操作符运算结果实例类型符号名称合成运算符PTRTHIS段寄存器名HIGHLOWSHORT修改类型属性指定类型属性段前缀分离高字节分离低字节短转移说明修改后类型指定后类型修改段高字节低字节BYTEPTR[BX]ALPHAEQUTHISBYTEES:[BX]HIGH3355H=33HLOW3355H=55HJMPSHORTLABEL其他运算符()[].<>MASKWIDTH圆括号方括号点运算符尖括号返回字段屏蔽码返回记录宽度改变运算符优先级下标或间接寻址连接结构与变量修改变量字段屏蔽码记录/字段位数(8-3)*3=15MOVAX,[BX]TAB.T1<,8,5>MASKCWIDTHW(续表)④分析运算符分析运算符(数值返回操作符):返回变量或标号(存储器操作数)的属性值。分析操作符把特征或存储器操作数地址分解为它的组成部分,如段地址、偏移地址。这些操作符是:SEG、OFFSET、TYPE、SIZE、LENGTH等。例:ARRAYDB100DUP(0);定义变量数组···MOVAX,SEGARRAY;将变量ARRAY的段地址→AXMOVDS,AX;AX→DSMOVBX,OFFSETARRAY;将ARRAY的偏称地址→BXMOVAL,[BX]表4-2存储器操作数的类型值存储器操作数类型属性类型值字节变量字变量双字变量标号标号BYTEWORDDWORDNEARFAR124-1-2•例:BUFFERDB100DUP(0)BUFFERDW200DUP(20H)BUFFERDD100DUP(13)LENGTHBUFFER1=100SIZEBUFFER1=100LENGTHBUFFER2=200SIZEBUFFER2=400LENGTHBUFFER3=100SIZEBUFFER3=400•例:ARRAY1DB0,1,2,3,4;定义字节变量ARRAY2DW0,1,2,3,4;定义字变量MOVBX,WORDPTRARRAY1[3];0403HBXMOVCL,BYTEPTRARRAY2[6];03HCLMOVWORDPTR[SI],4;将0004H放入SI开始的一个字单元中例:WBYTELABELWORD;为变量WBYTE定义一个字类型的数据区ARRAYDB1,2,3,4;为变量ARRAY定义一个字节类型的数据区MOVAL,ARRAY;01H→ALMOVAX,WBYTE;0201H→AX表4-3运算符和操作符的优先级优先级运算符和操作符高低1LENGTH,SIZE,WIDTH,MASK,(),[],<>,.2PTR,OFFSET,SEG,TYPE,THIS,段寄存名:(加段前缀)3HIGH、LOW(操作数高、低字节)4+,-(单目)5*,/,MOD(求模),SHL,SHR6+,-(双目)7EQ,NE,LT,LE,GT,GE8NOT9AND10OR,XOR11SHORT4.4汇编语言的伪指令语句常用的伪指令有:•数据定义伪指令•符号定义伪指令•段定义伪指令•过程定义伪指令•结束伪指令(1)数据定义语句的格式①DB——定义字节变量②DW——定义字变量,③DD——定义双字变量,④DQ——定义4个字节变量,⑤DT——定义10字节变量。X25HY42H41HZ78H56H34H12H图4-2汇编后存储器的分配情况例:XDB25HYDW4142HZDD12345678H例2:操作数可以是字符串MASTERLIDB‘HELLO’汇编后如下:48454C4C4FMASTERLI‘H’‘E’‘L’‘L’‘O’注意下面的不同DB‘AB’DW‘AB’41‘A’42‘B’42‘B’41‘A’操作数?用来保留存储空间,但不存入数据.例3:ABCDB0,1,?,?,?LPIDW?,54,?汇编后如下图示:0001╳╳╳╳╳3600╳╳ABCLPI01?????54操作数字段还可以用重复操作符DUP来缩写,如上面ABC亦可写成:ABCDB0,1,3DUP(?)又如:DO-2DB2DUP(0,1,2,?)与DO-2DB0,1,2,?,0,1,2,?等价在伪操作的操作数字段中若使用$,则表示的是地址计数器的当前值。DUP是重复数据定义操作符,它利用给出的一个初值(或一组初值)以及这些值应该重复的次数(由DUP前面的常数决定)来初始化存储器。ARRAYDB2DUP(0,3DUP(1,2),3);定义了0,1,2,1,2,1,2,3的2份考贝,共占用16个字节单元。•例:BUFFERDW3,4,$+3•设BUFFER的偏移地址为0088H,则汇编后如下图所示:030004008F00BUFFER0088H008CH+3STRING141H42HSTRING241H42H42H41H44H43HSTRING3ABBABADC图4-3对字符串的存储器初始化情况例:STRING1DB‘AB’STRING2DW‘AB’STRING3DW‘AB’,‘CD’4.4.1.2符号定义伪指令1.等值伪指令EQU格式为:符号名EQU表达式或:新符号名EQU老符号名例:CONSTANTEQU100NEW_PORTEQUPORT_VAL+1EQU伪指令在未解除前,不能重新定义。2.等号(=)伪指令与EQU类似,但允许重新定义例:┇EMP=7;值为7┇EMP=EMP+1;值为84.4.1.3段定义伪指令因8086/8088CPU的存储器是分段的,这就需要有段定义语句。与段有关的伪指令有:SEGMENT、ENDS、ASSUME、ORG段定义伪指令的格式如下:段名SEGMENT[定位类型][组合类型][‘类别’]┇段名ENDS方括号中为可选项,规定了逻辑段的一些其他特性;分别为:1.定位类型(Align)说明如何确定逻辑段的边界。定位类型有四种:PARA(节):表示段的起始地址必须为16的倍数(XXXX0H),若语句中没有给出定位类型,则默认为PARA。PAGE(页):表示段的起始地址必须为256的倍数(XXX00H),也就是页的起点上。WORD(字):表示段的起始地址必须为偶数,它最适合于安排类型为字的数据段。BYTE(字节):表示该段可以从任意地址开始伪指令ORG规定了段内的起始地址或偏移地址,其格式为:ORG表达式表达式的值即为段内的起始地址或偏移地址,从此地址起连续存放程序或数据。2.段寻址伪指令ASSUMEASSUME段寄存器名:段名[,段寄存器名:段名[,...]]ASSUMECS:CODE,DS:DATA,ES:DATA2告诉汇编程序用SEGMENT伪操作定义过的段的

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

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

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

×
保存成功