欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    物理汇编语言程序设计.pptx

    • 资源ID:80060266       资源大小:1.43MB        全文页数:169页
    • 资源格式: PPTX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    物理汇编语言程序设计.pptx

    4.1 汇编语言的格式 4.1.1 8086汇编语言程序的一个例子MY_DATA SEGMENT ;定义数据段SUM DB?;为符号SUM保留一个字节MY_DATA ENDS ;定义数据段结束MY_CODE SEGMENT ;定义码段 ASSUME CS:MY_CODE,;规定CS和DS的内容 DS:MY_DATAPORT_VAL EQU 3 ;端口的符号名GO:MOV AX,MY_DATA ;DS初始化为MY_DATA MOV DS,AX MOV SUM,0 ;清SUM单元CYCLE:CMP SUM,100 ;SUM单元与100相比较 JNA NOT_DONE ;若未超过,转至NOT_DONE MOV AL,SUM ;若超过,把SUM单元的内容 OUT PORT_VAL,AL ;通过AL输出 HLT ;然后停机NOT DONE:IN AL,PORT_VAL ;未超过时,输入下一个字节 ADD SUM,AL ;与以前的结果累加 JMP CYCLE ;转至CYCLEMY CODE ENDS ;码段结束 END GO ;整个程序结束 第1页/共169页 一个语句行由4个部分组成:标号(或名称)操作码 操作数 ;注释*各部分之间至少要用一个空格作为间隔。*“&”作为后续行的标志。第2页/共169页4.1.2 8086汇编语言源程序的格式 8086的汇编语言的源程序是分段的,由若干个段形成一个源程序。源程序的一般格式为:NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END标号 每一个段有一个名称,以符号SEGMENT作为段的开始,以语句ENDS作为段的结束。这两者名称必须相同。整个源程序以语句END作为结束。第3页/共169页4.2 语句行的构成 语句行是由标记(Token)及分隔符(空格)按照一定的规则组织起来的,标记是IBM宏汇编源程序的最小的、有意义的单位。第4页/共169页4.2.1 标记 1.IBM宏汇编的字符集 (1)字母 包含大写的英文字母:ABCDXYZ;小写的英文字母:abcxyz。(2)数字 阿拉伯数字:0123456789。(3)特殊字符 可打印字符下图所示。第5页/共169页(4)打印字符有:空格、制表(TAB键)、回车和换行。其余字符若出现一律按空格处理。尽管&是字符集中的一个字符,但紧跟在回车换行之后的符号&代表连续行,被看作空格。IBM宏汇编字符集中的可打印字符第6页/共169页2.界符(Delimiters)界符是一些特殊字符。它们可以表明某个标记的结束。它们本身也有一定的意义 有了界符就可以不再用分隔符,例子中的冒号(:)、逗号(,)都是一种界符。next:mov ax,bx;将bx 的值赋给ax第7页/共169页3.常量(Constants)凡是出现在8086源程序中的固定值(它在程序运行期间不会变化),就称为常量。例子中的数0、3、100等都是常量,而且是数字常量。例如:MOV AL,100b (1)数字(整数)常量 二进制常量 以字母B结尾的由一串“0”和“1”组成的序列。例如,00101100B。第8页/共169页 十进制常量 09的数字组成的序列,可以以字母D作结尾,或没有任何字母作结尾。例如,1234D或1234。八进制常量 以字母Q(或字母O)结尾,由若干个07的数字组成的序列。例如255Q,377Q等。十六进制常量 以字母H结尾,由若干个09的数字或AF的字母所组成的序列。为了避免与标识符相混淆,十六进制数在语句中必须以数字打头。所以,凡是以字母AF开始的十六进制数,必须在前面加上数字0。例如56H,0BA3FH等。第9页/共169页 (2)字符串常量 字符串常量是由包含在单引号内的1至2个ASCII字符构成的。只有在初始化存储器时才可以使用多于两个字符的字符串常量。例如:MOV AL,D MOV AX,AB MOV AX,ASD MY_DATA SEGMENT SUM DBASHFHGHHCBNVB MY_DATA ENDS 第10页/共169页4.标识符(Identifiers)标识符是由程序员自由建立起来的、有特定意义的字符序列,例:SUM、CYCLE和PORT_VAL等等。一个标识符是由最多为31个字母、数字及规定的特殊字符(?_)等组成的,而且不能用数字打头(以免与十六进制数相混淆)。This_doneThisdone是不同的标识符。若前31个字符相同,但第32个字符不同,两个标识符也是相同的。第11页/共169页MY_DATA SEGMENT ;定义数据段SUM DB?;为符号SUM保留一个字节MY_DATA ENDS ;定义数据段结束MY_CODE SEGMENT ;定义码段 ASSUME CS:MY_CODE,;规定CS和DS的内容 DS:MY_DATAPORT_VAL EQU 3 ;端口的符号名GO:MOV AX,MY_DATA ;DS初始化为MY_DATA MOV DS,AX MOV SUM,0 ;清SUM单元CYCLE:CMP SUM,100 ;SUM单元与100相比较 JNA NOT_DONE ;若未超过,转至NOT_DONE MOV AL,SUM ;若超过,把SUM单元的内容 OUT PORT_VAL,AL ;通过AL输出 HLT ;然后停机NOT DONE:IN AL,PORT_VAL ;未超过时,输入下一个字节 ADD SUM,AL ;与以前的结果累加 JMP CYCLE ;转至CYCLEMY CODE ENDS ;码段结束 END GO ;整个程序结束 第12页/共169页5.保留字(Reserved words)(P93)保留字看上去像标识符,但是它们在语言中有特殊的意义,而且不能用它们作为标识符。如例子中的SEGMENT、MOV、EQU、AL等都是保留字。实际上凡是8086的指令助记符,汇编语言中的命令(伪指令),寄存器名等都是保留字。6.注释(Comment)注释是分号(;)后面的任意的字符序列。在汇编时并不处理。在可打印文件中,注释和源程序可同时打印。第13页/共169页4.2.2 符号使用符号的原因:为了使程序更具有普遍性,也便于程序的修改符号可以代替存储单元、数据、表达式等。符号属于标识符,要符合标识符的规则。例:存储单元SUM、输入输出端口PROT_VAL。符号可以分成五类:寄存器、变量、标号、数、其他。每个符号都具有一定的属性。第14页/共169页1.寄存器(Registers)8086的寄存器常代表某一个操作数。寄存器有一种类型特性:字节/字 寄存器。8086的标志位被看作是一位寄存器。2.变量(Variable)存放在存储单元中的操作数是变量,在程序中出现的是存储单元地址的符号,即它们的名称。MY-DATA SEGMENT ;定义数据段 SUM DB?;为符号SUM保留一个字节 MUL DW?MY_DATA ENDS第15页/共169页 所有的变量都具有三种属性:(1)段值(SEGMENT),即变量单元所在段的段地址(段的起始地址)的高16位,低4位始终为0;(2)偏移量(OFFSET),即变量单元地址与段的起始地址之间的偏移量(16位);(3)类型(TYPE),变量有三种类型:字节(BYTE)、字(WORD)和双字(DOUBLE WORD)。变量通常是用存储器初始化命令定义的。第16页/共169页MY-DATA SEGMENT SUM DB 10 MUL DW 1000 AA DB 23 MY_DATA ENDS问:变量SUM MUL AA的段值和偏移量以及类型?第17页/共169页3.标号(Label)标号是某条指令所存放单元的符号地址,它是转移(条件转移或无条件转移)指令或调用(CALL)指令的目标操作数。对于汇编程序来说,标号与变量是类似的,都是存储单元的符号地址。只是标号对应的存储单元中存放的是指令;而变量所对应的存储单元中存放的是数据。标号也有三种属性:(1)段值,(2)偏移量,(3)类型。第18页/共169页 标号的类型与变量不同,它的类型是NEAR或是FAR。NEAR是指转移到此标号所指的语句,或调用此子程序或过程,只需要改变IP值,而不改变CS值。即转移指令或调用指令与此标号所指的语句或过程在同一段内。FAR与NEAR不同,要转移到标号所指的语句,或调用此子程序或过程,不仅需要改变IP的值,而且需要改变CS,即是段交叉转移或调用。若没有对标号进行类型说明,就假定它为NEAR。第19页/共169页4.数 在汇编语言源程序中,常数也常以符号的形式出现,这样就更具有通用性,更便于修改。例:PORT_VAL EQU 3。PAI EQU 3.14159265.其他符号 除了上述4种符号以外,在汇编语言中还经常出现一些其他符号,把它们用作汇编程序中的伪指令名字。SEGMENT/ENDS CODEMACRO/ENDM 第20页/共169页4.2.3 表达式 一个表达式是一个由操作数和运算符组合的序列,在汇编时它能产生一个值。1.操作数(Operands)一个操作数可以是一个寄存器名、一个常量(数字常量或字符串常量)或一个存储器操作数。常量操作数是指具有数字值的操作数或表示常量的标识符。常量操作数的值是正的 常量操作数的范围是-65536+65535 第21页/共169页 存储器操作数 存储器操作数,通常为标识符,分成标号和变量两种。标号是可执行的指令语句的符号地址,通常是作为转移指令JMP和调用指令CALL的目标操作数。变量通常是指存放在一些存储单元中的值,这些值在程序运行过程中是可变的。变量的寻址方式包括:直接寻址、基址寻址、变址寻址、基址变址寻址 作为存储器操作数的符号和变量具有的属性是:段值、段内地址偏移量、类型 第22页/共169页 2.运算符(Operators)IBM宏汇编通常有以下几种运算符:算术运算符(Arithmetic Operators);逻辑运算符(Logical Operators);关系运算符(Relational Operators);分析运算符(Analytic Operators);合成运算符(Synthetic Operators)。第23页/共169页 (1)算术运算符 这是读者十分熟悉的运算符 +(加)、-(减)、*(乘)、/(除)、MOD(求余),算术运算符应用于数字操作数,结果也是数字的。算术运算符用在数字表达式或地址表达式中例如:MOV AX ,BX+10 MOV AX ,BX+10 MOV CX,2*6 MOV CX,2*6 MOV CX,D2-D1 MOV CX,D2-D1 注意:当算术运算符应用于存储器即地址操作数时其规则就更加严格:只有当结果有明确的、有意义的物理解释时,这些运算才是有效的。第24页/共169页MY_DATA SEGMENT ;定义数据段SUM DB?;为符号SUM保留一个字节MY_DATA ENDS ;定义数据段结束MY_CODE SEGMENT ;定义码段 ASSUME CS:MY_CODE,;规定CS和DS的内容 DS:MY_DATAPORT_VAL EQU 3 ;端口的符号名GO:MOV AX,MY_DATA ;DS初始化为MY_DATA MOV DS,AX MOV SUM,0 ;清SUM单元CYCLE:CMP SUM,100 ;SUM单元与100相比较 JNA NOT_DONE ;若未超过,转至NOT_DONE MOV AL,SUM ;若超过,把SUM单元的内容 OUT PORT_VAL,AL ;通过AL输出 HLT ;然后停机NOT DONE:IN AL,PORT_VAL ;未超过时,输入下一个字节 ADD SUM,AL ;与以前的结果累加 JMP CYCLE ;转至CYCLEMY CODE ENDS ;码段结束 END GO ;整个程序结束 SUM+2SUM-2NOT_DONE-GOSUM-CYCLE (X)为什么?第25页/共169页 (2)逻辑运算符 按位操作的逻辑运算符有:AND、OR、XOR和NOT。逻辑运算的操作数只能是数字,而且结果是数字。注意:AND、OR、XOR和NOT,也是8086指令的助记符。但是,作为IBM宏汇编的运算符是在程序汇编时计算的。而作为指令的助记符,则是在程序执行时计算的。第26页/共169页编辑程序MASMLINKMf.asmMf.exeMf.obj第27页/共169页例:IN AL,3 OUT 3 AND 0FEH,AL (OUT 2,AL)例:AND DX,21H AND 0FEH 21H AND 0FEH 是在汇编时计算的,汇编后相当于 AND DX,20HDX与20H的“与”操作是在指令执行时来完成的第28页/共169页 (3)关系运算符 在IBM宏汇编中有以下关系运算符:相等 EQ(Equal);不等 NE(Not Equal);小于 LT(Less Than);大于 GT(Greater Than);小于或等于 LE(Less Than or Equal);大于或等于 GE(Greater Than or Equal)。第29页/共169页 关系运算的两个操作数,或者都是数字的,或者是同一个段的存储器地址。关系运算的结果或者为真或者为假:为假时值为0;为真时值为0FFFFHMOV BX ,(PORT LT 5)AND 20)OR (PORT GE 5)AND 30)当PORT 小于5时,汇编为mov bx,20 否则,mov bx ,30第30页/共169页(4)分析运算符 分析运算符可以把存储器操作数分解为它的组成部分,如它的段值、段内偏移量和类型。(5)合成运算符 合成运算符可以由已经存在的存储器操作数生成一个段值与偏移量相同、而类型不同的新的存储器操作数。第31页/共169页4.2.4 语句源程序中的语句可分成两类:指令语句,汇编程序把它们翻译成机器代码,这些代码命令8086执行某些操作。如MOV、ADD、JMP等。格式为:标号:助记符 参数,.参数;注释 指示性语句(伪指令),汇编程序并不把它们(也不可能)翻译成机器代码,只是用来指示、引导汇编程序在汇编时进行一些操作.如定义符号、分配存储单元、初始化存储器等等,所以伪指令本身不占用存储单元。格式为:名字 命令 参数,参数;注释区别:在指令语句中,标号后面会跟有“:”;在指示性语句中,名字后面没有“:”。在指令语句中,标号与指令的地址符号名相联系;在指示性语句中名字与指令地址毫无联系。在指令语句中标号总是任选的;在指示性语句中的名字可能是强制的、任选的或禁止的,这取决于实际的命令。第32页/共169页4.3 指示性语句 在IBM宏汇编中有以下几种指示性语句(Directive statements):(1)符号定义语句(Symbol definition);(2)数据定义语句(Data definition);(3)段定义语句(Segmentation definition);(4)过程定义语句(Procedure definition);(5)结束语句(Termination)。第33页/共169页4.3.1 符号定义语句 1.等值语句EQU EQU语句给符号名定义一个值,或定义为别的符号名,甚至可定义为一条可以执行的指令等。EQU语句的格式为:NAME EQU EXPRESSION EQU语句在未解除前,不能重新定义。例:COUNT EQU CX PAI EQU 3.1415926 第34页/共169页2.等号(Equal sign)语句=此语句的功能与EQU语句类似,最大特点是能对符号进行再定义。D1=12.3;D1=D1+23.解除语句PURGE 已经用EQU命令定义的符号,若以后不再用了就可以用PURGE语句来解除。PURGE语句的格式为:PURGE 符号1,符号2,符号n 注意:PURGE语句本身不能有名字。用PURGE语句解除后的符号可以重新定义。PERGE COUNT,PAI;解除符号定义第35页/共169页4.3.2 数据定义语句 数据定义语句,为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,且为这个数据提供一个任选的初始值。与数据项相联系的符号名称为变量。数据定义语句的例子如下:THINGDB?;定义一个字节BIGGER_THING DW?;定义一个字BIGGEST_THINGDD?;定义一个双字 第36页/共169页 THING与存储器中的一个字节相联系,即它是一个字节变量。BIGGER_THING与存储器中的一个字相联系,即它是一个字变量。BIGGEST_THING与存储器中的一个双字相联系,即它是一个双字变量。第37页/共169页XXXXXXTHINGBIGGER-THING第38页/共169页 在实际应用中,还经常会用到由字节、字或双字构成的表。这可由在数据定义语句的参数部分,引入若干个用逗号分隔的参数就可以建立一个表。下列语句定义了一个包含2的权的字节的表:POWERS_2DB1,2,4,8,16 第39页/共169页 DUP可以表示若干相同的值。DUP利用给出的一个初值(或一组初值)以及这些值应该重复的次数来初始化存储器。DB 100 DUP(0);100个字节全初始化为0DW 100 DUP(0);100个字全初始化为0DW 10 DUP(?);保留10个字 FOO DD 50 DUP(FOO);FOO地址的50份备份 DB 10 DUP(10 DUP(00);10次重复的0的10次重复 DW 35 DUP(FOO,0,1);FOO的段内偏移量、0和1,这三个字的35次重复 DB 5 DUP(1,2,4 DUP(3),2 DUP(1,0);定义1,2,3,3,3,3,1,0,1,0的5份副本 字符串的定义必须用DB命令。EXAM1 DBTHIS IS AN EXAMPLE 第40页/共169页Data segement ORG 000AH D1 DB 10,20,30 D2 DW 10H,2089H D3 DD 3*1000,10202030H D4 DB HELLO ORG 2000H D5 DB?,?D6 DB 100 DUP(?)D7 DB 3 DUP(2 DUP(0),3)Data ENDSMOV AL,D1+210203010008920.HED1D2D4第41页/共169页 IBM宏汇编对在程序中涉及的每一个存储单元与一种数据类型联系起来,这样能对访问存储器的指令产生正确的目标码。例如,数据定义语句:SUM DB?告诉汇编程序,SUM是字节类型的,以后当遇到如下的指令语句:INCSUM汇编程序就产生一个字节增量,而不是字增量。IBM宏汇编对在程序中涉及到的每一个存储单元都与一定的类型联系起来。第42页/共169页 一个存储单元的类型如下:(1)数据字节。如 SUM DB?;定义一个字节 (2)数据字(两个连续的字节)。如 BIGGER DW?;定义一个字 (3)数据双字(四个连续的字节)。如 BIGGEST DD?;定义一个双字(4)NEAR指令单元。如 CYCLE:CMPSUM,100存储单元CYCLE的类型是near(5)FAR指令单元。第43页/共169页 分析运算符把存储器地址操作数分解为它们的各个组成部分。这些运算符是:(1)SEG(存储单元的段地址)(2)OFFSET(存储单元的段内偏移量)(3)TYPE(变量类型)(4)SIZE(字节数)(5)LENGTH(变量长度)第44页/共169页若在一个程序中,对它的数据段有如下定义DATA_TABLESEGMENTBUFFER1DB100 DUP(0)BUFFER2DW 200 DUP(20H)BUFFER3DD100 DUP(13)DATA_TABLE ENDS其中的每一个存储单元都有一些属性第45页/共169页 故语句:SEG BUFFER1SEGBUFFER2 的结果是相同的,它们返回的地址都是DATA_TABLES的地址。所以,若要对数据段寄存器初始化,则可以采用指令:MOVAX,SEG BUFFER1MOVDS,AX 第46页/共169页而 OFFSET BUFFER1 OFFSET BUFFER2 两个语句的结果是不相同的。若要向这些缓冲区填入新的数据,可以用一些地址指针,则可以用以下指令来初始化地址指针:MOVBX,OFFSET BUFFER1MOVSI,OFFSET BUFFER2 然后,就可以用这些指针来间接寻址这些缓冲区。第47页/共169页 TYPE运算符返回一个数字值,它表示存储器操作数的类型部分。字节、字和双字的类型部分,分别是它们所占有的字节数。而指令单元的类型部分的值,没有实际的物理意义。TYPE 运算符返回操作数的类型例:MOV AL,TYPE D1 变量变量 标号标号 字节字节 1 NEAR-1 字字 2 FAR-2 双字双字 4第48页/共169页LENGTH运算符返回一个与存储器地址操作数相联系的单元数(所定义的基本单元的个数)。注意:要用LENGTH返回的存储区必须用DUP()来定义,否则返回值为1。LENGTH BUFFER1=100LENGTH BUFFER2=200LENGTH BUFFER3=100 SIZE运算符返回一个为存储器地址操作数所分配的字节数。SIZE=LENGTH*TYPESIZE BUFFER1=100SIZE BUFFER2=400SIZE BUFFER3=400 第49页/共169页合成运算符为PTR和THIS,PTRPTR用来建立一个符号地址,但它本身并不分配内存,只是用来给已分配的存储单元赋予另一种属性格式:TYPE PTR 例如:(改变数据单元的属性)TWO_BYTE DW 10TWO_BYTE DW 10TWO_BYTETWO_BYTE的第一个字节可以定义为 ONE_BYTE EQU ONE_BYTE EQU BYTE PTRBYTE PTR TWO_BYTE TWO_BYTE其中TWO_BYTE TWO_BYTE 和ONE_BYTEONE_BYTE的段地址和段内偏移量均相同,但类型不同 MOV AL,ONE_BYTEMOV AL,ONE_BYTE MOV AL,BYTE PTR TWO_BYTE MOV AL,BYTE PTR TWO_BYTE MOV AL,TWO_BYTEMOV AL,TWO_BYTE 第50页/共169页练习:找出程序中的错误并改正BUFFERDW10dup(?).MOVSI,3MOVAL,BUFFERSIMOV AL ,BYTE PTR BUFFERSI 定义BYTE_BUFFEREQUBYTEPTRBUFFER则MOV AL ,BYTE _BUFFERSI 第51页/共169页再例如:MANY_BYTES DB 100 DUP(?)FIRST_WORD EQU WORD PTR MANY_BYTES SECOND_DOUBLE EQU DWORD PTR MANY_BYTES 则此段内存既可以按字节访问,也可以按双字访问判断下列指令的正误:1)ARRAY DB 10h,20h MOV AL ,ARRAY MOV AX ,ARRAY MOV AX,WORD PTR ARRAY2)D1 DW 4020H;MOV AL ,D1 MOV AL ,BYTE PTR D1 (AL)=20H第52页/共169页PTR 也可以用来改变指令单元的属性 例:INCHES:CMP SUM,100 JMP INCHE .MILES:EQU FAR PTR INCHES JMP MILES JMP far PTR NEXT 第53页/共169页THIS 运算符格式:变量名 THIS 功能:该变量的段地址和偏移地址就是汇编时的当前值。DATA-T SEGMENT WB1 EQU THIS WORD BU1 DB 100 DUP(0)WB2 EQU THIS BYTE BU2 DW 200 DUP(20H)DATA-T ENDS MOV AL ,WB2 MOV AX,BU2 20002000第54页/共169页用THIS 建立FAR 指令单元比较方便 MILES EQU THIS FAR CMP SUM,100 .JMP MILES第55页/共169页4.3.3 段定义语句 8086的存储器是分段的,所以8086必须按段来组织程序和利用存储器,这就需要有段定义语句。段定义的主要命令有:(1)SEGMENT,(2)ENDS,(3)ASSUME,(4)ORG。SEGMENT和ENDS语句把汇编语言源程序分成段,存放相应段的目标码。汇编程序必须知道程序的段结构,并知道各种指令执行时将访问哪一个段(由段寄存器所指向)。这个信息是由ASSUME语句提供的。第56页/共169页#通常,至少要定义码段(指令段)、堆栈段和数据段,有时还要定义附加段。#每一个段必须有一个名称,如MY_DATA、MY_CODE等。#一段由SEGMENT开始,由命令ENDS结束,它们必须成对出现,而且它们的语句中必须有名称,名称必须相同。#最后用语句END来结束整个源程序。#ASSUME语句,使汇编程序知道在程序执行时各个段寄存器的值,而这些段寄存器的实际值(除了码段寄存器CS以外),还必须在程序执行时,用MOV指令来赋给。#ORG(origin),它规定了段内的起始地址。伪指令ORG的一般格式为:ORG 表达式第57页/共169页MY-DATA SEGMENT ORG 0010H X DB?Y DB?Z DD?MY-DATA ENDSMY-EXTRA SEGMENT ALPHA DB?BETA DW?GAMMA DD?MY-EXTRA ENDSMY-STACK SEGMENT DW 100 DUP(?)TOP EQU THIS WORDMY-STACK ENDS第58页/共169页MY-CODE SEGMENT ASSUME CS:MY-CODE,DS:MY-DAYA;使汇编程序知道程序执行时各个段寄存器的值 ASSUME ES:MY-EXTRA,SS:MY-STACKSTART:MOV AX,SEG X MOV DS,AX ;必须由AX与段寄存器赋值 CS的值不必在程序中给出 MOV AX,SEG ALPHA MOV ES,AX MOV AX,MY-STACK MOV SS,AX MOV SP,OFFSET TOP .MY-CODE ENDS END START第59页/共169页一般来说,存储器段在哪并不重要,可由汇编程序选择。在masm5.0以上的汇编语言中,可采用完整段定义和简化段定义两种方法。在低于5.0的版本中,只能用完整段定义。在采用简化段定义时,一定要采用初始化内存模型。.model 内存模型(small,large,huge等),small模型适于本书,该命令对所有模型都能自动生成ASSUME语句。第60页/共169页4.3.4 过程定义语句 过程是程序的一部分,它们可被程序调用。每次可以调用一个过程。当过程中的指令执行完后,控制返回调用它的地方。在8086中调用过程和从过程返回的指令是CALL和RET。这些指令可以有两种情况:段内的和段交叉的。段交叉指令把过程应该返回处的段地址和段内偏移量这两者都入栈保护(CALL指令)和退栈(RET指令)。段内的调用与返回指令只入栈和退栈段内的地址偏移量。第61页/共169页 过程定义语句的格式为:PROCEDURE_NAMEPROCNEAR或PROCEDURE_NAMEPROCFARRETPROCEDURE_NAMEENDP 伪指令 PROC与ENDP都必须有名称,两者必须成对出现,名称必须相同。利用过程调用语句可以把程序分段,以便于阅读、理解、调试和修改。第62页/共169页4.3.5 结束语句 除了一个例外(END结束语句)以外,每一个结束语句(Termination Statements)都与某个开始语句成对出现。例如,SEGMENT和ENDS,PROC和ENDP。唯一的例外就是END语句,它标志着整个源程序的结束,它告诉汇编程序,没有更多的指令要汇编了。END语句的格式是:END表达式 其中,表达式必须产生一个存储器地址值,这个地址是当程序执行时,第一条要执行的指令的地址。第63页/共169页4.4 指 令 语 句 每一条指令语句,使汇编程序产生一条8086指令。一条8086指令是由一个操作码字段和一些由操作数寻址方式所指定的字段组成的。IBM宏汇编的指令语句,必须包括一个指令助记符,以及充分的寻址信息以允许汇编程序产生一条指令。第64页/共169页4.4.1 指令助记符 指令助记符(Instruction Mnemonics)与8086指令的符号操作码名相同。1.NOP(No Operation)指令助记符NOP,使汇编程序产生一字节指令,它使寄存器AX的内容自行交换。除了不做任何事以外,NOP并不浪费任何时间,因为它并不做任何的存储器访问。NOP可以保留一些单元为以后填入指令用。另外,当需要精确的时间关系时,这也可以使程序的一部分放慢。第65页/共169页 2.保留(指令位置)空格(Place Holder)NIL是使汇编程序不产生任何指令的惟一的指令助记符。与NOP指令相比较,NOP使汇编程序产生一条不做任何操作的指令;而NIL甚至连指令都不产生。NIL在汇编语言程序中是为标号保留空格的。如:CYCLE:NIL INC AX 虽然它与以下语句等效:CYCLE INCAX 但有了NIL,若以后需要的话,便于在INC指令前插入其他指令。第66页/共169页4.4.2 指令前缀 8086指令系统允许指令用一个或多个指令前缀(Instruction Prefixes)开始。有三种可能的前缀:(1)段超越(Segment override),(2)重复(Repeat),(3)锁定(Lock)。IBM宏汇编中允许的作为前缀的助记符如下:LOCKREP(Repeat,重复)REPE(当相等时重复)REPNE(当不相等时重复)REPZ(当标志Z=1时重复)REPNZ(当标志Z=0时重复)第67页/共169页4.4.3 操作数寻址方式 1.立即寻址(Immediate Addressing)2.寄存器寻址(Register Addressing)3.直接寻址(Direct Addressing)4.通过基址寄存器间接寻址(Indirect through Base Register Addressing)5.通过变址寄存器间接寻址(Indirect Through Index Register Addressing)6.通过基址寄存器加变址寄存器间接寻址(Indirect through Base Register Plus Index Register Addressing)7.通过基址或位移量间接寻址 8.通过基址寄存器加变址寄存器加位移量间接寻址参考第3章PPP-25页。第68页/共169页4.4.4 串操作指令 串操作指令MOVS是把在数据段中的地址偏移量在SI中的存储单元的内容,传送给在附加段中的地址偏移量在DI中的存储单元。对于这样的指令,不需要规定任何操作数,因为这条指令对从哪儿传送到哪儿没有选择的可能。然而,这条指令可以传送一个字节也可以传送一个字,汇编程序就必须确定它的类型,才能产生正确的指令。为此,IBM宏汇编必须规定已经传送至SI和DI的项的类型。CMPS有两个操作数,而SCAS、LODS和STOS有一个操作数,也需要确定操作数的类型。第69页/共169页补充:补充:汇编语言和汇编语言和DOS操作系统的接口操作系统的接口 当我们用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。操作系统在程序段前缀的开始处(偏移地址0000H)安排了一条INT 20H软中断指令。INT 20H中断服务程序由DOS提供,执行该服务程序后,控制就转移到DOS,即返回到DOS管理的状态。因此,用户在组织程序时,必须使程序执行完后能去执行存放于PSP开始处的INT 20H指令,这样便返回到DOS,否则就无法继续键入命令和程序。第70页/共169页 DOS在建立了程序段前缀区PSP之后,就将要执行的程序从磁盘装入内存。在定位程序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。内存分配好之后,DOS就设置段寄存器DS和ES的值,以使它们指向PSP的开始处,即INT 20H的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底(取决于堆栈的长度),然后系统开始执行用户程序。为了保证用户程序执行完后能返回到DOS状态,可使用如下两种方法。第71页/共169页首先将用户程序的主程序定义成一个FAR过程,其最后一条指令为RET。然后在代码段的主程序(即FAR过程)的开始部分用如下三条指令将PSP中INT 20H 指令的段地址及偏移地址压入堆栈:PUSH DS ;保护PSP段地址MOV AX,0 ;保护偏移地址0PUSH AX 1标准方法第72页/共169页 这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CS和IP,从而执行INT 20H指令,使控制返回到DOS状态。例如上面的多字节相加程序就是采用这种方法使控制返回到DOS状态的。第73页/共169页也可在用户的程序中不定义过程段,只在代码段结束之前(即CODE ENDS之前)增加两条语句:MOV AH,4CHINT 21H则程序执行完后也会自动返回DOS状态。2.非标准方法第74页/共169页汇编语言程序设计 通常,编制一个汇编语言程序应按如下步骤进行:明确任务,确定算法。绘流程图。根据流程图编写汇编语言程序。上机调试程序。第75页/共169页4.5 汇编语言程序上机过程 汇编语言程序上机运行的过程有以下几个步骤:(1)用编辑程序建立.ASM源文件;(2)用宏汇编程序MASM等汇编源文件,生成.OBJ目标码文件;(3)用连接程序LINK对目标码文件等模块进行连接,生成.EXE可执行文件;(4)键入可执行文件名执行该文件,分析执行结果;(5)用DEBUG等工具调试.ASM源程序,再汇编、连接、运行,直到得出正确结果。为此,除了DOS系统软件和编辑程序外,还需要备置如下程序:汇编程序 masm.exe或asm.exe或tasm.exe等连接程序 link.exe或tlink.exe等汇编调试程序 等交叉引用程序 cref.exe等 第76页/共169页4.5.1 编辑源程序 可使用任何一种能建立ASCII文本文件的编辑程序来建立汇编源程序文件,扩展名为.ASM。在使用各种文字编辑程序时,被编辑的源文件(.ASM)中不应有排版格式控制符。4.5.2 汇编源程序编辑生成的.ASM源程序文件,须经汇编程序进行汇编,生成二进制代码的目标文件。常见的汇编程序有行汇编和宏汇编两种类型。行汇编常用DEBUG.EXE的A命令,生成的目标代码可作为.COM 文件存盘,也可在DEBUG环境下直接运行。行汇编简单直观,生成的目标程序所占用的内存空间最小;但汇编按 绝对地址进行,长度限制在64KB范围内,目标程序没有与其它程序模 块连接的信息,要由用户或安装程序实现各个目标程序在内存中的地 址分配,这样既可能使各程序之间产生太大的空隙(造成浪费)、也 可能造成各程序的内存存储冲突。宏汇编MASM对汇编语言源程序*.ASM进行汇编常用方法。第77页/共169页4.5.3 汇编源程序(续)在DOS操作系统提示符下键入MASM后,MASM宏汇编程序被调入运行。屏幕上显示版本信息之后,对需要输入输出的3个文件提问如下:object filename EXAM.OBJ:Source listi

    注意事项

    本文(物理汇编语言程序设计.pptx)为本站会员(莉***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开