汇编语言及其程序设计

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

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

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

资源描述

第六章汇编语言及其程序设计6.1汇编语言程序及开发过程一、基本概念1、机器语言:指令,是CPU唯一能识别的语言,用二进制表示;2、汇编语言:是机器语言的一种助记符形式,与机器语言一一对应;3、汇编程序:把汇编语言翻译成机器语言的程序。二、汇编语言的开发过程汇编源程序.asm目标程序.obj执行程序.exe编辑汇编MASM连接LINK执行名称程序名命令行生成汇编程序MASM,TASMmasma.asm,tasm/Zia.asma.obj连接程序LINK,TLINKlinka.obj,tlink/va.obja.exe调试程序DEBUG,TD,CVdebuga.exe,tda.exe二、汇编程序实例pp.119DATASEGMENTSTRINGDB‘HelloWorld!’,‘$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETSTRINGMOVAH,9INT21HMOVAX,4C00HINT21HCODEENDSSTACKSEGMENTSTACKDB256DUP(?)STACKENDSENDSTART6.2指令格式及寻址方式一、指令格式指令:要求计算机执行各种操作的命令,一条指令对应一种基本操作;指令系统:计算机所能够执行的全部命令的集合。操作码操作数操作码:告诉计算机执行什么性质的操作;操作数:告诉计算机对什么样的对象进行操作。每条指令只有一个操作码,但可以有多个操作数,8086指令系统中,操作数的数目有0~2个。8086指令格式举例指令格式为形式2。操作码DWMODREGR/M72107520操作码:6位,表示指令的性质;D:方向位(1位),0—REG表示的寄存器为源寄存器,1—REG表示的寄存器为目的寄存器;W:字位(1位),0—字节操作,1—字操作;MOD字段:2位MOD含义MOD含义00存储器方式,无位移量01存储器方式,有8位位移量10存储器方式,有16位位移量11寄存器方式,无位移量REG字段:3位REGW=1W=0REGW=1W=0000AXAL100SPAH001CXCL101BPCH010DXDL110SIDH011BXBL111DIBHR/M字段:3位MODR/M存储器方式寄存器方式有效地址的计算公式W=0W=100011011000BX+SIBX+SI+D8BX+SI+D16ALAX001BX+DIBX+DI+D8BX+DI+D16CLCX010BP+SIBP+SI+D8BP+SI+D16DLDX011BP+DIBP+DI+D8BP+DI+D16BLBX100SISI+D8SI+D16AHSP101DIDI+D8DI+D16CHBP110D16BP+D8BP+D16DHSI111BXBX+D8BX+D16BHDIMOVAX,[BX+SI]机器码:8B00H1000101100000000操作码DWMODREGR/MD=1:REG中指出目的寄存器;W=1:16操作;MOD=00:从存储器中读,无偏移;REG=000:AX,结合D,目的为AX;R/M=000:结合MOD,[BX+SI]。MOVAX,[BX+SI+10H]机器码:8B4010H100010110100000000010000操作码DWMODREGR/M操作数MOD=01:从存储器读,8位偏移;R/M:BX*SI+操作数(8位)MOVAX,[BX+SI+1000H]机器码:8B800010H二、8086指令集数据传送指令集MOV把源操作数送给目的操作数XCHG交换两个操作数的数据PUSH,POP把操作数压入或取出堆栈PUSHF,POPF,PUSHA,POPA堆栈指令群LEA,LDS,LES取地址至寄存器XLAT(XLATB)查表指令算数运算指令ADD,ADC加法指令SUB,SBB减法指令INC,DEC加一或减一NEG取二进制补码MUL,IMUL乘法指令DIV,IDIV除法指令CBW,CWD有符号数扩展指令AAA,AAS,AAM,AAD非压BCD码运算调整指令DAA,DAS压缩BCD码调整指令位运算指令集AND,OR,XOR,NOT,TEST逻辑运算SHR,SHL,SAR,SAL移位指令ROR,ROL,RCR,RCL循环移位指令程序流程控制指令集CLC,STC,CMC设定进位标志CLD,STD设定方向标志CLI,STI设定中断标志CMP比较JMP跳往指定地址执行JXX条件转移指令LOOP循环指令LOOPE(Z)条件循环指令CALL,RET子程序调用,返回指令INT,IRET中断调用及返回指令字符串操作指令集MOVSB,MOVSW,MOVSD字符串传送指令CMPSB,CMPSW,CMPSD字符串比较指令SCASB,SCASW字符串搜索指令LODSB,LODSW,STOSB,STOSW字符串载入或存贮指令REP,REPE,REPNE重复前缀指令集三、寻址方式1、操作数寻址方式1)立即寻址:操作数存放在指令中,紧跟在操作码之后,作为指令的一部分存放在代码段中。立即寻址方式通常用来给寄存器赋初值,必须与目的寄存器的长度一致。MOVAX,3MOVBL,0B0HMOVDS,0╳MOVAL,1000H╳2)寄存器寻址:源操作数和目的操作数均为寄存器,不需要访问存储器,执行速度最快。MOVCX,BXMOVAL,BX╳以下的寻址方式都不是直接给出要访问的数据,而是给出要访问数据的内存地址,这个地址一般称为有效地址,是一个偏移地址,段地址通过默认方式得到。有效地址的计算可以用下式表示:有效地址=基址+变址+偏移量基址寄存器:BX,BP;变址寄存器:SI,DI偏移量:8位或16位数字。在一条指令中,三个部分不一定同时存在,可能只有其中的两部分或一部分,而且每一部分都可正可负,之间的加法运算为补码运算。3)直接寻址:操作数的有效地址只包含位移量一项,偏移量即为有效地址。当目的操作数为存储器,源操作数为立即数时,必须指明操作的类型。MOVDX,[1010H]MOVAX,ADDRMOVAX,[ADDR]MOVAL,ARRD[10]MOV[1010H],3╳MOVBYTEPTR[1010H],3MOVWORDPTR[1010H],34)寄存器间接寻址:可用寄存器BX,BP,SI,DI操作数的有效地址只包括基址寄存器或变址寄存器。操作数在存储器中,而操作数的地址在某个寄存器中。MOVDX,[BX]MOVCX,ES:[DI]BX,SI,DI:默认的段寄存器为DS;BP:默认的段寄存器为SS。5)寄存器相对寻址:有效地址包括基址寄存器或变址寄存器以及偏移量两部分。MOVAX,[BX+10]默认DS段MOVDX,[BP+2]默认SS段ADD[SI+4],ALMOVADDR[SI],AXMOVADDR[DI+20],BX6)基址变址寻址:基址+变址有效地址包括基址寄存器和变址寄存器两部分。MOVAX,[BX][DI]MOVBL,[BX+SI]MOVAX,[BX+BP]╳MOVDL,[SI+DI]╳7)相对基址变址寻址:有效地址包括基址寄存器、变址寄存器和偏移量三部分。MOVAX,[BX+SI+5]MOVADDR[BX][SI],DXMOVWORDPTRADDR[BX][SI][10],0A000HMOVWORDPTRADDR[BX+SI+10],0A000HMOVAX,ADDR[BX][SI]MOVAX,ADDR[BX+SI]2、程序转移寻址方式1)段内直接转移寻址:以当前IP指向的地址为基准地址,加上跟在操作码后面的相对位移量,得到转移地址的偏移地址。JMPADDR2)段内间接转移寻址:以寄存器间接寻址、变址寻址、基址寻址、基址变址寻址方式得到操作数,作为转移地址的偏移地址。JNZWORDPTR[1000]JMPWORDPTR[BX+10]JCWORDPTR[BX+DI+5]JMPBX3)段间直接转移寻址:操作数为两个16位地址,第一个为偏移地址,第二个为段地址JMP3030:10004)段间间接转移寻址:用间接寻址的方式得到两个16位地址,作为跳转地址。JMPDWORDPTR[BX+10]6.38086宏汇编语言的基本语法汇编语句可以分为两类:指令性语句和指示性语句。一.指令性语句:经过汇编之后有目标程序与之对应,是有实际操作的语句。指令性语句的格式为:[标号:][前缀]指令助记符[操作数][,操作数][;注释]例如:LLL:REPMOVSB其中的标号代表当前行在内存中的地址,可以在程序的其它地方引用。二.指示性语句:用来对汇编时的一些情况进行说明,如起始终止信息、分段情况、变量说明、内存结构等等。指示性语句不产生任何目标代码。1、段定义伪指令1)段起始和结束伪指令SEGMENT:定义数据段、代码段和堆栈段;ENDS:段结束,必须与SEGMENT相对应;格式:段名SEGMENT段名ENDS2)段寄存器与段关系说明伪指令ASSUME:用来告知汇编程序段寄存器对应哪些段,以便程序建立段内寻址。格式:ASSUME段寄存器:段名,段寄存器:段名,…其中:CS段寄存器和SS段寄存器在程序执行时已经预先设置到相应的段,而DS,ES则需要在程序中进行设定。3)程序开始和结束伪指令格式:END标号END伪指令一方面通知汇编程序结束汇编,同时指明标号语句为程序开始执行的起始地址。4)DOS程序的结束方式i.方式一MOVAH,4CHINT21Hii.方式二主程序名PROCFARPUSHDSMOVAX,0PUSHAX…RET主程序名ENDP…END主程序名2、数据定义伪指令1)常量定义格式:表达式名EQU表达式PORTEQU83HCONSTEQU256ALPHAEQU7BETAEQUALPHA-2P8EQUDS:[BP+8]2)数据定义格式:变量名(标号)数据类型定义伪指令表达式数据类型定义伪指令包括:DB1个字节,8位DW2个字节,16位DD4个字节,32位DQ8个字节,63位DT10个字节,80位举例DATA_BYTEDB10,4,10HDATA_WORDDW100,100H,-5DATA_DWDD3*20,0FFFDH0A041064000001FBFF3C000000FDFF0000DATA_BYTEDATA_WORDDATA_DW10D4D10H100D100H-5D60D0FFFDH3)重复伪指令格式:重复次数DUP(重复内容)举例ARRAY1DW2DUP(0FFH)ARRAY2DB100DUP(?)FF00FF00100字节...ARRAY1ARRAY24)变量或标号的地址定义DW和DD伪指令可以用来定义变量或标号的偏移地址和段地址。举例PAR1DB5DUP(0)PAR2DW100H,200HPARA_TABLEDWPARA1DWPARA2PARA_SEG_TABLEDDPARA1DDPARA2000000000000010002PAR2PAR100000500PARA_TABLE00003412PARA_SEG_TABLE050034121234H:0000H1234H:0005H1234H:0009H1234H:000DH5)地址计数器$:表示正在汇编的当前地址。举例ARRAYDW1,2,$+4,3,4,$+4假设ARRAY分配的偏移地址为0074H,则在存储区中保存的数据为:010002007C00030004008200STRINGDB‘THISISABOOK!’COUNTEQU$-STRINGARRAYDW1,2,3,4,5,6COUNT1EQU($-ARRAY)/23、汇编语句定位伪指令ORG语句用来定义起始位置,可以用来定位数据和程序格式:ORG表达式通常表达式为某个数值。例如:VECTORSEGMENTORG10VECT1DW47A5HORG20VECT2DW0C596HVECTORENDS4、取段址和取偏移址伪指令SEG和OFFSET格式:SEG地址标号或变量名OFFSET地址标号或变量名只能取某个内存地址的偏移和段地址,不能有下标例如

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

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

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

×
保存成功