首页 汇编语言及伪指令打印5章

汇编语言及伪指令打印5章

举报
开通vip

汇编语言及伪指令打印5章第五章汇编语言及伪指令教学要求:本章以微软宏汇编程序MASM5.x为蓝本,学习汇编语言源程序的格式、常用伪指令与操作符;同时,介绍汇编语言源程序的汇编、连接、运行过程,以及修改和调试方法。重点难点:源程序格式,常量表达,变量定义及属性、段定义、过程定义第1节汇编程序一、汇编程序的功能•1.检查源程序,找出语法错误,给出出错信息。2•产生目标文件(・obj)和列表文件(.1st)。3.展开宏指令;数制转换•4.存储单元分配(变量);段基地址分配第2节伪指令一、概述语句一般是由分隔符分成的四个部分组成,它们有两种格式。...

汇编语言及伪指令打印5章
第五章汇编语言及伪指令教学 要求 对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗 :本章以微软宏汇编程序MASM5.x为蓝本,学习汇编语言源程序的格式、常用伪指令与操作符;同时,介绍汇编语言源程序的汇编、连接、运行过程,以及修改和调试方法。重点难点:源程序格式,常量 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达,变量定义及属性、段定义、过程定义第1节汇编程序一、汇编程序的功能•1.检查源程序,找出语法错误,给出出错信息。2•产生目标文件(・obj)和列表文件(.1st)。3.展开宏指令;数制转换•4.存储单元分配(变量);段基地址分配第2节伪指令一、概述语句一般是由分隔符分成的四个部分组成,它们有两种格式。执行性语句——由硬指令构成的语句,它通常对应一条机器指令:标号:硬指令助记符操作数,操作数;注释(2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:名字伪指令助记符参数,参数,...;注释・标号和名字是符合汇编语法的用户自定义的标识符,每个标识符的定义是唯一的。标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写,即大小写不敏感。・硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令。伪指令助记符主要将在本章和下一章学习。・处理器指令的操作数可以是立即数、寄存器和存储单元。伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。・语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性。・语句的4个组成部分要用分隔符分开。标号后的冒号、注释前的分号是规定采用的分隔符,操作数之间和参数之间一般使用逗号分隔,其他部分通常采用空格或制表符作为分隔符。多个空格和制表符的作用与一个相同。另外,MASM也支持续行符“\”。伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。•处理器选择伪操作(.386)•段定义伪操作•程序开始和结束伪操作•数据定义及存储器分配伪操作•表达式赋值伪操作•地址计数器与对准伪操作•基数控制伪操作程序分段完整的汇编语言源程序也由段组成。一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。通常,程序还需要一个堆栈段。二、段的定义1.完整段定义的源程序格式段名segment[定位][组合][段字]['类别'];语句序列(指令、伪指令)段名endsSEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束。段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型,代码段应具有‘code'类别,其他为可选属性参数。如果不指定,则采用默认参数;但如果指定,注意要按照上列次序。(1)段定位(align)属性的边界:指定逻辑段在主存储器中BYTE:段开始为下一个可用的字节地址(xxxxxxxxb),属性值为1WORD:段开始为下一个可用的偶数地址(xxxxxxx0b),属性值为2DWORD:段开始为下一个可用的4倍数地址(xxxxxx00b),属性值为4PARA:段开始为下一个可用的节地址(xxxx0000b),属性值为16PAGE:段开始为下一个可用的页地址(00000000b),属性值为256简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位。完整段定义伪指令的默认定位属性是PARA。(2)段组合(Combine)属性指定多个逻辑段之间的关系:PRIVATE:本段与其他段没有逻辑关系,不与其他段合并。这是完整段定义伪指令默认的段组合方式。PUBLIC:连接程序把本段与所有同名同类型的其他段相邻地连接在一起,指定一个共同的段地址。这是简化段定义伪指令默认的段组合。STACK:本段是堆栈的一部分,这是堆栈段必须具有的段组合。(3)段字(Use)属性一一这是为支持32位段而设置的属性。对于16位x86CPU来说,它默认是16位段,即USE16。而对于汇编32位X86CPU指令时,它默认采用32位段,即USE32;但可以使用USE16指定 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的16位段。编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段。(4)段类别(Class)属性一一当连接程序组织段时,将所有的同类别段相邻分配。段类别可以是任意名称,但必须位于单引号中;大多数MASM程序使用'code'、'data'和'stack'来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续。例如:;lt301b・asm(文件名)stacksegmentstack;定义堆栈段stackdw512dup(?);堆栈段的大小是1024字节(512字)空间stackends;堆栈段结束datasegment;定义数据段datastringdb'Hello,Everybody!',0dh,0ah,'$';在数据段定义要显示的字符串dataends;数据段结束codesegment'code';定义代码段codeassumecs:code,ds:data,ss:stack;确定CS、DS、SS指向的逻辑段start:movax,data;设置数据段的段地址DSmovds,axmovdx,offsetstring;利用功能调用显示信息movah,9int21hmovax,4c00h;利用系统功能调用返回DOSint21hcodeends;代码段结束endstart;汇编结束,同时表明程序起始点为标号start处的指令完整段定义格式的段定义由SEGMENT和ENDS这一对伪操作实现,由代码段的assume伪指令指定用途。2.指定段寄存器伪指令:ASSUME名,・・・]段寄存器:段名[,段寄存器名:段ASSUME伪指令通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系。在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是ASSUME伪指令的主要功能。ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CS:IP和SS:SP。由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值ES。简化段定义格式:.STACK[大小]堆栈段伪指令.STACK创建一个堆栈段,段名是:stack。它的参数指定堆栈段所占存储区的字节数,默认是1KB(=1024=400h字节)。.DATA数据段伪指令.DATA创建一个数据段,段名是:_DATA。它用于定义具有初值的变量,当然也允许定义无初值的变量。.CODE[段名].CODE伪指令创建一个代码段,它的参数指定该代码段的段名。使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义的符号,例如:@CODE――表示.CODE伪指令定义的段名@DATA――表示由.DATA、・DATA?等定义的数据段的段名程序开始与结束伪指令:.STARTUP.STARTUP伪指令按照给定的CPU类型,根据・MODEL语句选择的存储模式、操作系统和堆栈类型,产生程序开始执行的代码;同时还指定了程序开始执行的起始点。在DOS下,.STARTUP语句还将初始化DS值,调整SS和SP值。如果不使用.STARTUP语句,我们可以用下面2条指令代替(没有调整堆栈SS:SP):start:movax,@data;@data表示数据段的段地址movds,ax;设置DS.EXIT[返回数码].EXIT语句产生终止程序执行返回操作系统的指令代码。它的可选参数是一个返回的数码,通常用0表示没有错误。例如.exit0对应的代码是:movax,4c00hint21h这是利用了DOS功能调用的4ch子功能(返回DOS功能:AH=4ch)实现的,它的入口参数就是AL=返回数码。汇编结束伪指令END[标号]END伪指令指示汇编程序MASM到此结束汇编过程。源程序的最后必须有一条END语句。可选的标号用于指定程序开始执行点,例如start。连接程序据此设置CS:IP值。注意:汇编结束不同于程序执行终止。过程名称PROC漏性]指令序列过程名称ENDP属性:FAR、NEAR源程序格式:对于大多数小型MASM程序,采用简化段定义伪指令,整个源程序格式表达如下:.modelsmall;定义程序的存储模式(一般采用small).stack;定义堆栈段.data;定义数据段...;数据定义.code;定义代码段・startup;程序起始点,并建立DS、SS内容...;程序代码・exit0;程序结束点,返回DOS・・・;子程序代码end;汇编结束三、变量定义格式变量定义(Define)伪指令为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。该类伪指令是最经常使用的伪指令,它的汇编格式为:变量名伪指令表达式列表•变量名为用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。变量名可以没有,这种情况,汇编程序将直接为初值表分配空间,无符号地址。设置变量名是为了方便存取它指示的存储单元。表达式表:是用逗号分隔的参数,主要由数值常数、表达式或?、DUP组成。其中?表示初值不确定即未赋初值;重复初值可以用DUP进行定义。DUP的格式为:重复次数DUP(重复项)变量定义伪指令有DB/DW/DD/DF/DQ/DT,它们根据申请的主存空间单位分类。1•字节定义伪指令DB,用于分配一个或多个字节单元,并可以将它们初始化为指定值。初值表中每个数据一定是字节量(Byte),可以是0~255的无符号数或是-128〜+127带符号数,也可以是字符串常数。例如:datasegment;数据段Xdb'a',-5Ydb'ABC',?,4*6ZDB0,0,0,0,0,0,0,0,0,0RDB10DUP(0)dataends61HFB41H42H43H18H利用它们的汇编指令示例:moval,X;此处X表示它的第1个数据,故AL—a'decX+1;对X为始的第2个数据减1,故成为-6movY,al;现在Y这个字符串成为'aBC'2.字定义伪指令DW字节定义伪指令DW,用于分配一个或多个字单元,并可以将它们初始化为指定值。初值表中每个数据一定是字量(Word),—个字单元可用于存放任何16位数据,如一个段地址、一个偏移地址、两个字符、0~65535之间的无符号数或-32768~+32767之间的带符号数。例如:datasegmentcountnumberarraydataends;数据段dw8000h,?,'ABdw32dw128dup(0)arraynumbercount(b)定义字量data数据段3.双字定义伪指令DD,用于分配一个或多个双字单元,并可以将它们初始化为指定值。初值表中每个数据是一个32位的双字量(DoubleWord),可以是有符号或无符号的32位整数,也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针。例如:Var1DD0,?,12345678hfarpointDD00400078h4.定义3字伪指令DF――用于为一个或多个6字节变量分配空间及初始化。定义4字伪指令DQ――用于为一个或多个8字节变量分配空间及初始化。定义10字节伪指令DT――用于为一个或多个10字节变量分配空间及初始化。5.实例:(1).modelsmall.stack.databvarDB16wvarDW4*3dvarDD4294967295;=232—1=FFFFFFFFHqvarDQ?DB1,2,3,4,5tvarDT2345abcDB'a','b','c'msgDB'Hello',13,10,'$'bbufDB12DUP('month')dbufDD25DUP(?)CALLDOSEQU.code・startup;建立DSmovbl,bvarmovax,wordptrdvar[0];取双字到DX.AXmovdx,wordptrdvar[2]movdx,offsetmsgmovah,09hCALLDOS.exit0;返回操作系统end;汇编结束四、定位伪指令用数据定义伪指令分配的数据是按顺序一个接着一个存放在数据段中的。但有时,我们希望能够控制数据的偏移地址ORG参数;使它后面的数据或指令从参数指定的地址开始ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如:ORG100h;从100h处安排数据或程序ORG$+10;使偏移地址加10,即跳过10个字节空间汇编语言程序中,符号“$”表示当前偏移地址值。例如:在偏移地址100H单元开始定义“dw1,2,$+4,$+4”,那么在104H单元的值为108H、106H单元的值为10aH。又如:arrayDB12,23,34lenEQU$-array那么len的值就是array变量所占的字节数。五、地址操作符标号和名字一经定义便具有以下两类(地址和类型)三种属性:段值:标号和名字对应存储单元所在段的段地址;偏移值:标号和名字对应存储单元所在段的段内偏移地址;类型:标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等。地址操作符取得名字或标号的段地址和偏移地址两个属性值。例如已经熟悉的中括号[]表示将括起的表达式作为存储器地址指针;符号$表示当前偏移地址;段前缀的冒号:也是一种地址操作符,它表示采用指定的段地址寄存器。另外,还有两个经常应用的地址操作符,就是:OFFSET名字/标号;返回名字或标号的偏移地址SEG名字/标号;返回名字或标号的段地址把字节变量ARRAY的段地址和偏移地址送入DS和BX就可用下列指令序列实现:movax,segarraymovds,axmovbx,offsetarray;等价于leabx,array在前面学习的加、减运算符同样可以用于地址表达式,例如movcl,array+4;等效于movcl,array[4],这里的4表示4个字节单元。六、类型操作符类型操作符对名字或标号的类型属性进行有关设置。类型名PTR名字/标号;使名字或标号具有指定的类型PTR操作符中的“类型名”可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE,或者是NEAR/FAR,还可以是由STRUCT、RECORD、UNION以及TYPEDEF定义的类型。使用PTR操作符,可以临时改变名字或标号的类型。THIS类型名;创建采用当前地址,但为指定类型的操作数利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型。类型名同PTR操作符中的类型一样。TYPE名字/标号;返回一个字量数值,表明名字或标号的类型另外,操作符SIZEOF和LENGTHOF具有类似TYPE的功能,分别返回整个变量占用的字节数和整个变量的数据项数(即元素数)。实际上:SIZEOF返回值=LENGTHOF返回值XTYPE返回值七、应用.modelsmall.stack.datav_byteequthisbyte;v_byte是字节类型的变量,但与变量v_word地址相同v_worddw3332h,3735h;v_word是字类型的变量targetdw5dup(20h);分配数据空间2X5=10个字节crlfdb0dh,0ah,'$'flagdb0n_pointdwoffsets_label;取得标号s_label的偏移地址.code.startupmoval,byteptrv_word;用ptr改变w_word的类型,否则与AL寄存器类型不匹配decalmovv_byte,al;对v_word的第一个字节操作,原来是32H,现在是31Hn_label:cmpflag,1jzs_label;flag单元为1,则转incflagjmpn_label;短转移s_label:cmpflag,2jznext;flag单元为2转移incflagjmpn_point;段内的存储器间接寻址,转移到标号s_label处next:movax,typev_word;汇编结果为movax,2movcx,lengthoftarget;汇编结果为movcx,5movsi,offsettargetw_again:mov[si],ax;对字单元操作incsi;SI指针加2incsiloopw_again;循环movcx,sizeoftarget;汇编结果为movcx,0ahmoval,'?'movdi,offsettargetb_again:mov[di],al;对字节单元操作incdi;DI指针加1loopb_again;循环movdx,offsetv_word;显示结果:1357??????????movah,9int21h.exit0end八、上机过程EXE程序利用程序开发工具,通常将生成EXE结构的可执行程序(扩展名为.EXE的文件)。它可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过64KB,执行起始处可以任意指定。当DOS装入或执行一个程序时,DOS确定当时主存最低的可用地址作为该程序的装入起始点。此点以下的区域称为程序段。在程序段内偏移0处,DOS为该程序建立一个程序段前缀控制块PSP(ProgramSegmentPrefix),它占256(=100h)个字节;而在偏移100h处才装入程序本身。EXE程序的加载需要重新定位:①DS和ES指向PSP段地址;②CS:IP和SS:SP是由连接程序确定的值,指向程序的代码段和堆栈段。如果不指定堆栈段,则SS=PSP段地址,SP=100H,堆栈段占用PSP中部分区域。程序一旦装载成功,就可以开始执行CS:IP指向的程序第一条指令。利用程序开发工具,通常将生成EXE结构的可执行程序(扩展名为.EXE的文件)。它可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过64KB,执行起始处可以任意指定。各段顺序随程序而定剩余内存堆栈段数据段代码段RAM高地址端—SP(随程序而定)—SS—IP(随程序而定)—CS程序段前缀
本文档为【汇编语言及伪指令打印5章】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_113440
暂无简介~
格式:doc
大小:46KB
软件:Word
页数:26
分类:
上传时间:2019-09-18
浏览量:0