1§3.3汇编语言基础(P111)西安电子科技大学冯育长序言——计算机语言发展简介一﹑常量及其数制二、汇编语言语句格式三、伪指令***(重点﹑难点)2硬件机器语言汇编语言硬件机器语言汇编语言硬件机器语言汇编语言高级语言硬件机器语言汇编语言高级语言继续计算机语言发展简介7汇编语言与机器语言的关系用汇编语言编写的程序称为汇编语言源程序MASM.EXE系统软件汇编程序汇编语言源程序——.ASM机器语言目标程序汇编语言的两种语句类型1.CPU指令CPU执行的语句,如MOV,ADD等能够生成目标代码2.伪指令(指示性语句)CPU不执行,而由汇编程序执行的语句,不生成目标代码.定义逻辑段、指示程序开始和结束等.8一、汇编语言的常量及其数制B二进制数D(或缺省)十进制数H十六进制数‘A’单引号表示ASCII码(字符串常量)用后缀表示常数的数制等价如:MOVAL,01100100BMOVAL,64HMOVAL,100MOVAL,‘1’;(AL)=31HMOVAL,0ABH以A~F开头的数,加前导09允许使用一些简单的常量表达式等价如:MOVAL,3+5MOVAL,16/2MOVAL,810二、汇编语言语句格式[标号:]助记符[操作数][,操作数][;注释][]表示可选项指令的符号地址,标号后要有冒号注释前加分号根据不同的指令可有可无,可多可少操作码不可缺省1.CPU指令语句格式:如L1:MOVAL,BL;数据传送11标号由下列字符组成:1.A~Z或a~z2.@?_.3.0~9但0~9不能作为第一个字符L1:MOVAL,BL字母数字串,大小写不分,不要用保留字合法的标号L1:L2—1:NEXT:LOOP2:EXITagain:非法的标号1L:2—1L:$NEXT:LOOP:12[变量名]助记符[操作数][,操作数][;注释]变量的符号地址,后无冒号伪指令助记符不可缺省2.伪指令语句格式:指示汇编程序要完成的操作。用来定义变量,分配存储单元,指示程序开始和结束等汇编程序汇编语言源程序——.ASM机器语言目标程序MASM.EXE1.CPU指令语句格式:13三、伪指令CPU不执行,而由汇编程序执行的语句指示汇编程序(MASM.EXE)要完成的操作。用于定义变量、分配存储区、定义逻辑段、指示程序开始和结束等汇编程序汇编语言源程序——.ASM机器语言目标程序141、定义段的伪指令2、定义数据的伪指令3、变量的属性及属性操作符4、定义字符串5、问号?及DUP在DB和DW的应用重点掌握:伪指令的格式及实现的操作伪指令的应用151、定义段的伪指令段名SEGMENT[定位类型][组合类型][‘类别’]┇段名ENDS说明段的起始位置,缺省,则起始地址为××××0H(段的起始地址能被16整除)说明不同模块中同名段的连接方式缺省,不组合(同名段在逻辑上相互独立)说明段的结束‘类别’相同者,组合时连续存放,不组合时应缺省162、定义数据的伪指令用于定义数据区中变量的类型①DB定义字节数据DefinByte指令格式:[变量名]DB数1[,数2…][;注释]可省略可选可有多个数据项17定义数据段DATA,其中包含3个变量M,N和SUMDATASEGMENTMDB10HNDB25HSUMDB0DATAENDS例1由系统自动为段分配内存,且起始地址一定为××××0HX0内存空着不用设系统占用1FFF1HDATA是程序员指定的数据段段名;SEGMENT段的定义伪指令段名可以是:DATA2D1D2等定义字节变量ENDS数据段结束00000H1FFF2H数据由此开始!!!1FFFFH20000H20001H20002H18定义数据段DATA,其中包含3个变量M,N和SUMDATASEGMENTMDB10HNDB25HSUMDB0DATAENDS例1由系统自动为段分配内存空间,且起始地址一定为××××0HX0内存M10HN25HSUM00H段的起始地址能被16整除每个段最大为64KB最小视需要而定要点:2000H:0001H2000H:0002H2000H:0003H2000H:000FH2001H:0000H2000H:0000H设系统占用1FFF1H00000H1FFF2H1FFFFH19CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,MADDAL,NMOVSUM,AL…CODEENDSENDSTART定义代码段CODE,实现M+N→SUMDATASEGMENTMDB10HNDB25HSUMDB0DATAENDS数据段由此开始25H002000H:0001H2000H:0002H2000H:0003H2000H:000FH10H2000H:0000HMNSUMCODE是程序员指定的代码段段名;SEGMENT段的定义伪指令在代码段开头必须用ASSUME指定各段的段寄存器:CS代码段段寄存器,DS数据段段寄存器,ES附加段段寄存器,SS堆栈段段寄存器,注意语法格式ENDS代码段结束END源程序结束一般在END之后是第一条指令的标号段名DATA代表数据段的段地址值,用户应完成DS的初始化,方法固定。变量名表征变量的偏移地址引用变量名访问变量——直接寻址方式20CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,MADDAL,NMOVSUM,AL…CODEENDSENDSTART定义代码段CODE,实现M+N→SUMDATASEGMENTMDB10HNDB25HSUMDB0DATAENDS数据段由此开始25H002000H:0001H2000H:0002H2000H:0003H2000H:000FH10H2000H:0000HMNSUMCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,2000HMOVDS,AXMOVAL,[0000H]ADDAL,[0001H]MOV[0002H],AL…CODEENDSENDSTART设已知地址如图示,则等价于:由于地址是由系统自动分配的,故:一律用段名代表段地址值,完成DS的初始化用变量名访问变量——直接寻址方式21CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,MADDAL,NMOVSUM,AL…CODEENDSENDSTART定义代码段CODE,实现M+N→SUMDATASEGMENTMDB10HNDB25HSUMDB0DATAENDS请问:数据段由此开始代码段的起始地址?25H002000H:0001H2000H:0002H2000H:0003H2000H:000FH10H2000H:0000HMNSUM2001H:0000HOP00H20HCS:IP会自动初始化2001H:0000H2225H002000H:0001H2000H:0002H2000H:0003H2000H:000FH2001H:0000H10H2000H:0000HMNSUMOP00H20H35H分析程序的运行结果?DATASEGMENTMDB10HNDB25HSUMDB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,MADDAL,NMOVSUM,AL…CODEENDSENDSTARTSUM=?231、定义段的伪指令段名SEGMENT┇段名ENDS要点归纳:定义段的伪指令,必须成对出现必须有段名ASSUMECS:CODE,DS:DATA;用在代码段首行,指定段寄存器段的起始地址由系统自动安排段的起始地址能被16整除(段的起始地址一定为××××0H)CS:IP会自动初始化用户应完成其它段寄存器和偏移地址寄存器的初始化242、定义数据的伪指令DB定义字节数据DefinByte归纳:一般格式:DB定义字节数据DefinByte,一个数据占1个字节DW定义字数据DefinWord,一个数据占2个字节DD定义双字数据DefinDoubleword,一个数据占4个字节DQ定义的数据为4字型(8字节)DT定义的数据为10字节型[变量名]DB数1[,数2,…][;注释]其它几个定义数据的伪指令:25****H:0001H0002H0003H内存****H:0000H0004H0005H画出变量在内存中的存放示意图D1SEGMENTM1DB1,2M2DW3456H,7D1ENDS例2M1不再关心段地址的具体数值01M20256H34H07H00H第一个变量的偏移地址一定是0000H其他数据按顺序分配内存26****H:0001H0002H0003H内存****H:0000H0004H0005H画出变量在内存中的存放示意图D1SEGMENTM1DB1,2M2DW3456H,7D1ENDS例2M1不再关心段地址的具体数值01M20256H34H07H00H请问:变量M1的字节长度=?2设DS已初始化,写出指令把M1的第一个数据元素存入ALMOVAL,M1;直接寻址方式写出指令把M1的第二个数据元素存入BHMOVBH,M1+1;直接寻址,M1+1称为地址表达式27****H:0001H0002H0003H内存****H:0000H0004H0005H画出变量在内存中的存放示意图D1SEGMENTM1DB1,2M2DW3456H,7D1ENDS例2M1不再关心段地址的具体数值01M20256H34H07H00H请问:变量M2的字节长度=?4写出指令把M2的第一个数据元素存入AXMOVAX,M2;直接寻址方式写出指令把M2的第二个数据元素存入BXMOVBX,M2+2;直接寻址,M2+2称为地址表达式28****H:0001H0002H0003H内存****H:0000H0004H0005H画出变量在内存中的存放示意图D1SEGMENTM1DB1,2M2DW3456H,7D1ENDSM1不再关心段地址的具体数值01M20256H34H07H00H写出指令把DL的中的数据存入M1的首单元MOVM1,DL写出指令把DX中的数据存入M2的首单元MOVM2,DXDLDLDH29画出下列变量占用内存空间的示意图。D1SEGMENTDATA_BYTEDB10,10H,2*16,255DATA_WORDDW100,250HD1ENDS****H:0001H0002H0003H内存****H:0000H0004H0005H0006H0007H课堂作业1~~~30画出下列变量占用内存空间的示意图。D1SEGMENTDATA_BYTEDB10,10H,2*16,255DATA_WORDDW100,250HD1ENDS****H:0001H0002H0003H内存****H:0000H0004H0005H0006H0007HDATA_BYTE0AH10H20HFFHDATA_WORD64H00H50H02H课堂作业131分析程序的功能课堂作业2DATASEGMENTXDB5,1,6,3,4,5,6,0,8,9DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,0MOVCX,10MOVBX,0000HL1:ADDAL,[BX];(AL)←(AL)+((BX))INCBX;(BX)←(BX)+1DECCX;(CX)←(CX)-1JNZL1;若(CX)≠0则转向L1HLT;暂停~~~(AL)=X0+X1+…+X932~~~数据段的段名为D2,该段中字节变量VAR1中的数据为5,10,-2,11。该段中字变量VAR2中的数据为5678H,100。请写出数据段的程序代码。D2SEGMENTVAR1DB5,10,-2,11VAR2DW5678H,100D2ENDS课堂作业3;或D2SEGMENTVAR1DB5,10DB-2