欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    微机原理.ppt

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

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

    微机原理.ppt

    第4章 汇编语言程序设计,4.1 汇编语言源程序4.2 伪指令4.3 DOS功能调用4.4 汇编语言程序设计基础,本章重点:结合实例理解汇编语言程序设计的基本步骤;掌握汇编语言程序设计的基本方法;熟练运用循环、分支和子程序的程序设计方法解决问题。本章难点:依据所要解决的问题,选择正确的程序设计方法,正确地运用指令编写实用的汇编原程序。,1、计算机语言的三层结构 语言的三层结构用来编写计算机程序的语言,即程序设语言,包括机器语言、汇编语言和高级语言,分别位于三个层次。1)机器语言 是位于最底层的程序设计语言,是使用二进制代码表示的指令系统。用机器语言编写的程序称为“目标程序”。难辨认,难记忆,易出错。,4.1 汇编语言源程序,2)汇编语言 使用助记符来表示指令的操作码和操作数,使用标号和符号来代表地址、常量和变量,便于识别和记忆。汇编语言的一条语句对应一条机器语言指令,用汇编语言编写的程序,称为“汇编语言程序”。“汇编语言程序”不能直接由计算机识别,需要通过一种起翻译作用的“汇编程序”将其翻译成机器语言,由计算机执行。缺点:使用汇编语言编写程序,必须要熟悉机器的指令系统,寻址方式、寄存器的设置和使用方法,它是一种面向机器的低级语言,不能被直接移植到其他机器上。,3)高级语言 高级语言是一种面向问题或过程的语言,它独立于机器,其编写的程序是可以移植的。高级语言的一个语句相当于许多条汇编语言指令或机器语言指令。高级语言编写的程序也必须翻译成机器语言后才能执行,实现这种翻译的程序叫做“编译程序”,不同的高级语言有不同的编译程序。用汇编语言或高级语言编写的程序称为“源程序”,4)汇编语言和高级语言的区别和联系 高级语言种类:Basic,Fortran,Pascal,C,C+,VC,VB,VF等。特点:更接近英语自然语言和数学表达式,可读性强;更容易掌握,常被非计算机技术人员采用;对于同一个问题高级语言比汇编语言简便得多,常用于科学计算和事务处理;高级语言的一个语句相当于多条汇编语言(或机器语言)指令,因此目标代码容量大。汇编语言优势 几乎直接使用目标代码;可对I/O端口直接调用实时性好;汇编程序效率高、省内存、运行速度快;常被计算机高级技术人员使用;可嵌入各种高级语言。,2、汇编语言的相关定义 汇编语言:是一种用助记符来表示指令的操作码和操作数,用标号和符号来代替地址、常量和变量的符号语言。汇编:把汇编语言编写的程序翻译成由机器代码组成的目标程序的过程。汇编程序:用来把汇编语言编写的程序自动翻译成目标程序的软件 源程序:用汇编语言编写的程序,3、汇编程序的建立及汇编过程 用文本编辑器EDIT建立后缀为.ASM的汇编源文件。用宏汇编MASM对源文件进行汇编,生成后缀为.OBJ的目标程序 用连接程序LINK对目标程序进行链接,形成一个以.EXE为扩展名的可执行文件 运行程序 用DEBUG命令调试程序,汇编过程,汇编程序建立过程,汇编语言是一种面向机器的语言,CPU不同的机器有不同的汇编语言,1、分段结构 程序按段编写,与8086内存分段编址相对应。每段由伪操作SEGMENT开始、由ENDS结束。程序可由多个段构成,至少有一个代码段。程序最后为END结束语句,后跟一启动地址。启动地址指示程序开始执行的第一条语句。程序中设有返回DOS的功能。使程序执行完后返回DOS系统的命令接受状态。程序中用到内存操作数时,应按操作数的寻址方式,给相应的段寄存器赋值,4.1.1 汇编语言源程序的结构,2、分段结构特点 代码段中存放源程序所有指令码。数据、变量等存放在数据段和附加段。堆栈段可以直接利用系统中的堆栈,也可以自己定义。具体源程序中需要多少个段是需要决定,一般都可以是多个数据、代码、附加、堆栈段,但是一个源程序模块只可以有一个代码段,一个数据段,一个附加段和一个代码段。,3、源程序的一般格式 每一个段有一个名字,以符号SEGMENT作为段的开始,以语句ENDS作为段的结束。这两者都必须有名字,而且名字必须相同。由若干个段组成一个源程序,整个源程序以语句END作为结束。8086的源程序是由若干段组成的,而一个段又是由若干个语句行组成的。所以,语句行是汇编源程序的基础。一个语句行也是由4个部分组成 标号 操作码 操作数;注释;各部分之间至少要用一个空格作为间隔。,4、汇编语言程序框架如下:stack SEGMENT PARA stack DB 100 DUP(stack)stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME CS:code,DS:data,ES:data start:MOV AX,data MOV DS,AX MOV ES,AX MOV AL,4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,1、程序由数条语句构成,每条语句占一行。语句分两类:指令性语句(指令语句):由指令助记符组成,能译成机器代码,可被CPU执行,完成一定的操作功能的语句。指示性语句(伪指令语句):为汇编程序在翻译汇编语言源程序时提供有关控制信息,不被CPU执行,没有相应的机器代码的语句。指令性(指令)语句与指示性(伪指令)语句区别:程序经汇编、连接和装入内存后,在执行程序之前指示性语句的功能已经完成,故又称伪操作,而指令性语句的功能尚未完成,需控制CPU去执行才能完成。,4.1.2 汇编语言语句类型及格式,2、格式指令性语句(指令语句)格式:标号:前缀 操作码 操作数,操作数;注解指示性语句(伪指令语句)格式:名字 伪操作 操作数,操作数;注解3、标号和名字 需要“标号”时需要加“:”,名字则没有这个要求。4、操作数 指令性语句操作数个数:0,1,2 指示性语句操作数个数:至少1个,多个的时候用“,”隔开。,【例4-1】求从1开始连续50各奇数之和,并将结果存放在名字为SUM的字存储单元中。流程图如图,;定义数据段;SUM定字类型,初值0;定义数据段结束;定义堆栈段;200字节内容为0连续空间;定义堆栈段结束;定义代码段;ASSUME伪指令定义各段;DS指向DATA段首地址;CX置循环次数50;累加器AX清零;BX置常数1,第一个奇数,DATA SEGMENT SUM DW 0DATA ENDSSTACK SEGMENT DB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATA MOV DS,AX MOV CX,50 MOV AX,0 MOV BX,1,;累加50个奇数的和;求下一各奇数;循环器计数值减1;CX不为零转移至NEXT;累加的和送到SUM中;调用4CH功能;返回DOS状态;代码段结束;整个程序汇编结束,NEXT:ADD AX,BX INC BX INC BX DEC CX JNE NEXT MOV SUM,AX MOV AH,4CH INT 21HCODE ENDS END START,4.1.3 语句的构成,1、语句行定义及组成 语句行:由标记及分隔符按照一定规则组织起来。标记:是汇编语言源程序的最小的,具有意义的单位。组成:标识符(Identifiers)、保留字(Reserved Words)、界符(Delimiters)、常数(Constants)和注释(Comments),所有这些都称为标记。,2、标识符功能:A.便于理解和书写所使用的一些字符串;B.常作为一程序段的开头;C.常作为一数据块的开头。注意事项:A.不能以数字开头;B.可由字母、数字和下划线组合而成 C.最大长度不能超过31个字符。3、保留字(关键字)凡是8086汇编指令、伪指令、寄存器名等都是保留字。保留字不能用于表示标识符。例如:等,4、界符 一个程序中或一条指令中两个部分的分割符号 例如:,“,”就是界符5、常数 二进制尾部加 十进制尾部加或不加 八进制尾部加或 十六进制尾部加,如果以字母AF开头需在字目前加“”引号括起来的字符代表常数代表ASCII码的41H、42H、43H、44H。,6、注释 功能:便于理解和阅读程序。注意事项:A.注释用分号“;”打头,可以加在任何一行程序中,直到行尾为止。B.如果一行写不下,要延续到下一行,则下一行仍要以分号开头 C.注释被略去而不作处理。,在8086汇编语言中,有数值表达式和地址表达式两种。由各种常量与运算符连接成的式子,称为数值表达式。将常量、变量、标号、寄存器内容和运算符、操作符组合成的有意义的式子,称为地址表达式。单个常量,变量、标号是表达式的最简形式。在汇编过程中,汇编程序按操作运算符约定的优先规则对表达式进行计算,得到一个数值或一个地址。表达式由操作数和运算符组成,在汇编时一个表达式得到一个值,如在立即数时,我们可以把表示为X。,4.1.4 表达式,1、操作数代表一个数据和地址 1)数据:常数或标号。对于数据,最简单的表达方式就是用常数形式,如100H。汇编语言源程序中也常常用标号来表示数据,如用PORT表示一个端口号,而在源程序中又对PORT作了定义,使它等于某个常数。2)地址:标号 在源程序中,存储器地址常常用标记符(也叫标号)表示。如规范程序中的START、NEXT等。程序中的地址标号常常作为转移指令的转移地址或调用指令的调用地址。这些标号所代表的地址值实际上包括了两个分量,一个是段值,另一个是偏移量。,2、操作运算符 用运算符可以对一个操作数或几个操作数进行运算,这就构成了一个表达式,从而也得到一个新的值。8086汇编中有5类运算符,即:1)算术运算符(+、-、*、/、MOD)2)逻辑运算符(AND、OR、NOT、XOR)3)关系运算符(EQ、NE、GT、GE、LT、LE)真:FFFFH;假:0 4)分析操作符(SEG、OFFSET、TYPE、LENGTH、SIZE、HIGH、LOW)5)修改属性操作(PTR、THIS),)算数运算符、X、/MOD(SHL SHR)对数据进行运算,运算结果仍为数据,但对地址不能进行乘除运算如:20A1104021hSHL 284HMOD取除法中的余数/整除/,)逻辑运算符AND OR NOT XOR 只能对常数进行运算,得到的结果也是常数既可以做指令助记符,又可以做汇编语言的运算符指令助记符是在程序执行时运算的,运算符是在汇编过程中进行的。例如 AND DX,PORT AND 0FEH如果PORT值为90H,则相当于AND DX,90H 如果PORT值为80H,则相当于AND DX,80H,3)关系运算符EQ NE LT GT LE GE=!=两个参与运算的数必须同是数值,或同是内存单元的地址,而结果总是一个数值。如果关系成立:其结果为0FFFFH否则:其结果为0例如:MOV DX,PORT LT 5 如果PORT小于5,相当于MOV DX,0FFFFH 否则,相当于MOV DX,0 关系运算符一般不单独使用,而是和逻辑运算符结合起来使用,例如:MOV BX,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30)当PORT小于时,相当于?当PORT大于时,相当于?注意:加括号表示优先级高,先进行运算。)分析操作符OFFSET 分离操作符SEG HIGHTYPE LOWSIZELENGTH,SEG 取符号地址(变量或标号)的段地址 例 MOV AX,SEG yy OFFSET 取符号地址(变量或标号)的偏移地址 例 MOV BX,OFFSET yy,bb SEGMENT yy DB 6 dup(?)bb ENDScc SEGMENT ASSUME CS:cc,DS:aa,ES:bbstart:CLD MOV AX,SEG yy MOV ES,AX MOV DI,OFFSET yy MOV CX,6.cc ENDS END start,aa SEGMENTxx DB Hello!aa ENDSbb SEGMENT yy DB 6 dup(?)bb ENDScc SEGMENT ASSUME CS:cc,DS:aa,ES:bbstart:CLD MOV AX,aa MOV DS,AX LEA SI,xx MOV AX,SEG yy MOV ES,AX MOV DI,OFFSET yy MOV CX,6 REP MOVSB MOV AH,4CH INT 21H cc ENDS END start,D:DEBUG hello1.exe-U;查看程序代码 129F:0000 FC CLD129F:0001 B89D12 MOV AX,129D129F:0004 8ED8 MOV DS,AX129F:0006 8D360000 LEA SI,0000 129F:000A B89E12 MOV AX,129E129F:000D 8EC0 MOV ES,AX129F:000F BF0000 MOV DI,0000129F:0012 B90600 MOV CX,0006129F:0015 F3 REP129F:0016 A4 MOVSB129F:0017 B44C MOV AH,4C129F:0019 CD21 INT 21、,例 A1DB 20H,30HA2DW 0438HMOV AL,TYPE A1MOV AH,TYPE A2汇编时形成指令MOV AL,1MOV AH,2,TYPE 取符号地址(变量或标号)的类型属性,LENGTH 取变量的长度属性例 A1DW 100 DUP(?)A2DW 1,2,3MOV CX,LENGTH A1MOV AH,LENGTH A2汇编时形成指令MOV CX,100;使用DUP时,返回此变量;包含的单元数为100个字。MOV AH,1;对其他情况则返回1。,SIZE 取变量的总字节数SIZE=LENGTH*TYPE例 A1DW 100 DUP(?)A2DW 1,2,3MOV CX,SIZE A1MOV AH,SIZE A2汇编时形成指令 MOV CX,200;LENGTH返回1,TYPE返回2 MOV AH,2;LENGTH返回1,TYPE返回2,例如:ABC DW 100 DUP(?)OFFSET:求偏移地址MOV DX,OFFSET ABC,SEG:求段地址 MOV AX,SEG ABC MOV DS,AXTYPE:求标识符类型值 LENGTH:求为标示符分配的相数SIZE:求为标识符分配的字节数TYPE ABC;等于2LENGTH ABC;等于100SIZE ABC;等于200,HIGH和LOW字节分离运算符格式:HIGH/LOW 变量或标号功能:对一个数或地址表达式,HIGH从中分离出高位字节,LOW分离出低位字节。例:K1EQU0ABCDHK2EQU1234HMOVAH,HIGH K1MOVBL,LOW K2汇编时形成指令MOVAH,0ABHMOVBL,34H,)属性操作符a、PTR 定义某内存单元类型,在汇编语言将指令语句翻译成目标代码的过程中,要求指令语句有非常明确的操作数地址的类型,以便准确的访问内存单元,尤其在双操作数指令中,两个操作数的类型必须一致,否则就会出错。格式:类型 PTR 标识名/内存单元/表达式地址例如:MOV AX,WORD PTR D1;定义标号D1;指向的内存单元为字单元。类型:BYTE、WORD、DWORD、NEAR、FAR。作用:以PTR前导类型为准,赋予地址表达式一个新的临时类型,原有的段属性和偏移量保持不变,其本身并不分配单元。,LABC和LABD具有相同的段地址和偏移量,但LABC是字节类型,LABD是字型量。,b、THIS指定新类型 格式:THIS 类型类型:BYTE、WORD、DWORD、NEAR、FAR。作用:同PTR,THIS应与EQU、或LABEL等伪操作命令连用。例:LABC EQU THIS BYTE LABD EQU 4321H,2255H(或MOV AL,BYTE PTR LABD)MOV AL,LABC;AL=21H MOV AX,LABD;AX=4321H,3、表达式的计算顺序规则:1)一般先执行优先级别高的运算 2)优先级相同的运算,自左向右 3)括号可改变运算顺序,伪指令用来指示汇编程序应该如何去处理汇编语言源程序,它们在汇编时被汇编程序解释执行、只有部分语句可以申请存储空间以、全部都不产生任何目标代码。,4.2 伪指令,1、作用:A.定义变量的类型;B.给寄存器赋初值;C.给变量分配存储空间。2、特点:A.不占用内存 B.无目标代码3、格式变量名 数据定义符 操作数,操作数,.;注释 数据定义符:DB、DW、DD、DQ、DT分别定义字节、字、双字、4个字、10个字节的类型变量。变量名:指示内存操作数的地址(符号地址)操作数:指示内存操作数的内容顺序存入变量名指向的内存单元中,数值不超过定义所类型的范围。,4.2.1 数据定义伪指令,4、功能:用来定义程序中所用的内存操作数,并用变量与存储单元建立联系。5、重复操作符DUP变量名 数据定义符 n DUP(初始值);注释 n表示重复次数,初始值可以是常量或“?”,后者“?”表示只定义n个大小随机的区域。6、注意事项:1)操作数可以是常量,或者是表达式。2)不同类型定义同样的初值占用的空间不同;3)定义多个字符的字符串只能用DB定义 4)DB和DW在定义字符时候是有区别的,DB按顺序进行存储,DW按“低低高高”顺序存储;,操作数可以是用常量、表达式和?表示。常量和表达式表示内存操作数的初始值,其值应在其定义的类型范围内,否则汇编出错。例 aa DB 270;错误 bb DW 80000;错误用?表示只保留存储空间不置初始值的内存操作数。例 cc DB?可用 DUP 复制操作符定义相同的操作数,其格式为:重复次数 DUP(操作数)例 ee DB 3 DUP(4)等价于 ee DB 4,4,4,例1:定义赋初值的变量 data SEGMENT xx DB 1,-1,0fcH yy DW 1,-1,0fcH zz DD 1,-1,0fcH data ENDS,例2:定义字符串变量(只能用DB定义)data SEGMENT str1 DB TsingHua str2 DB INPUT:,0dH,0aH,$data ENDS注意:3个及其以上的字符,只能用DB定义str1 DW abcdstr2 DD abcd,例3:DBAB 和 DW AB的存储有区别,AB以ASC码形式表示举例:S1 DB ABCDEF与S2 DB A,B,C,D,E,F 等效S2 DW AB,CD,EFS3 DD AB,CD,例4:在DEBUG下查看变量存放情况。,data SEGMENTxx DB 1,-1,0FCHyy DW 1,-1,0FCHzz DD 1,-1,0FCHstr DB TsingHuabuf DB 4,?,4 DUP(?)DB dataenddata ENDScode SEGMENT ASSUME CS:code ASSUME DS:datastart:MOV AX,data MOV DS,AX LEA BX,xx LEA SI,yy LEA DI,zz LEA BX,str LEA SI,buf MOV AH,4CH INT 21Hcode ENDS END start,4.2.2 符号定义伪指令,1、等值语句伪指令EQU 格式:符号名 EQU 表达式 新标号 EQU 旧标号 作用:用符号名等值指定的表达式,其中表达式可以是任何有效的操作数,汇编时用语句中的表达式代替程序中符号所在的地方。应用:1.定义符号常量,方便修改程序。2.某表达式多次出现时,用等值伪操作可以方便编程。注意:同一个标号不能被两次赋值,除非先清除标号的原值,与EQU相对应的伪指令:PURGE例:COUNTEQU 5,举例CONSTANTEQU256;将数256赋以符号名CONSTANTDATA EQUHEIGHT+12;HEIGHT为一标号,地址表达式赋以符号名DATAALPHA EQU7 BETA EQUALPHA2;这是一组赋值伪操作,把72=5赋以符号名BETAADDR EQUVAR+BETA;将VAR+5赋以符号名ADDRB EQUBP+8;变址引用赋以符号名BP8 EQUDS:BP+8;加段前缀的变址引用赋以符号名P8,2、等号伪指令“=”“=”与EQU 相类似,也可作为赋值操作使用。它们之间的区别:EQU伪操作中的表达式名是不允许重复定义的,而“=”伪操作则允许重复定义。3、解除定义伪指令PURGE格式:PURGE 功能:解除指定符号的定义。解除符号定义后,可用EQU重新进行定义。例:Y1EQU 7;定义PURGEY1;解除Y1EQU 36;重新定义,1、格式段名 SEGMENT 定位类型 组合类型 类别名段名 ENDS2、注意事项 1)段定义由伪操作SEGMENT开始、ENDS结束且必须成对出现,它们之间是指令和其他伪操作指令 2)语句前必须有段名,段名必须相同。3)SEGMENT后可带参数,即定位类型 组合类型 类别名 之间有空格,选一个或两个,不能交换顺序,分类名必须用单引号括起来。一般情况下这些参数可以省略,需要多模块连接,则要用到这些参数。,4.2.3 段定义伪指令,3、功能 用来把程序分成若干逻辑段,实现存储器的分段管理,在汇编和连接程序时,控制不同段的定位、组合和连接,以便形成一个可执行程序。4、段名设置 必须设置,且与本段用途相关(保留字除外)5、定位类型对段的起始边界的要求 BYTE:从任一地址开始,段间不留空隙 WORD:从偶字节开始,定义字类型数据段 PARA:隐含选择,从一个节(16字节)开始 PAGE:从页(256字节)开始,6、组合类型本模块和其它模块同名段的组合NONE:隐含,无组合关系,每段都有自己的段基址PUBLIC:与其它模块的同名段邻接从而形成一个新的逻辑段,共用一个段基址,所有偏移量调整为相对新逻辑段的起始地址。STACK:把所有同名段连成一个连续段,自动初始化SS和SP,SS首地址,SP堆栈底部1的存储单元。COMMON:把本段和同名段置成相同的起始地址,共享相同的存储区。MEMORY:本段定位在最高地址,多个的话第一个当MEMORY,其余COMMONAT:起始地址是表达式计算出的16位段地址。7、类别名(CLASS)用单引号括起来,连接时存放在连续的存储区。汇编连接时类别名相同的逻辑段组成一个段组。,例:源程序经汇编、连接后,装入内存的情况如下,伪指令,1、格式ASSUME 段寄存器:段名,段寄存器:段名,其中 段寄存器为CS、DS、ES、SS中的一个 段名为用伪操作SEGMENT定义过的段名 例 ASSUME CS:cc,DS:aa2、作用 用来明确段和段寄存器之间的关系。3、说明ASSUME语句只起指示作用,没有赋值作用,并不能把段地址装入段寄存器中,因此在程序中需用指令(如MOV)给相应的段寄存器赋值。但是,代码段CS除外,CS的装入是在程序初始化时完成的。,4.2.4 段寻址伪指令设定段寄存器,伪指令,ASSUME NOTHING则可取消前面由ASSUME所指定的段寄存器。4、注意:段名可以是任意的自定义标识符。ASSUME:用于指定用户定义的那一个段为数据段、代码段或堆栈段,对DS、SS只知道段基址,而实际值要在程序中使用传送命令来具体赋值。例如:ASSUME CS:CODE_SEG,DS:DATA_SEG该指令指出CODE_SEG的段基址在CS中,DATA_SEG的段基址在DS中,但是并没有把段地址装入相应的段寄存器,因此除了CS之外,(CS通过在启动代码段时由段简转移装入),将段地址装入相应寄存器的工作必须通过MOV传送指令完成。,如:CODE_SEG SEGMENTASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGSTART:MOV AX,DATA_SEG MOV DS,AX MOV AX,STACK_SEG MOV SS,AX CODE_SEG ENDS,注意:程序装入内存后,执行程序前,当前的DS值并非程序定义的data段值,1295 不等于 12A5,思考:如果上例中没有 MOV DS,AX 程序执行的结果会怎样?,D:MASMDEBUG assume.exe-R;查看程序执行前各寄存器AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1295 ES=1295 SS=12A5 CS=12A6 IP=0000 NV UP EI PL NZ NA PO NC12A6:0000 B8A512 MOV AX,12A5-U;查看在内存的程序12A6:0000 B8A512 MOV AX,12A512A6:0003 A10000 MOV AX,0000 12A6:0006 03060200 ADD AX,0002 12A6:000A A30400 MOV 0004,AX12A6:000D B44C MOV AH,4C12A6:000F CD21 INT 21、,data SEGMENT value DW 1234H,5678H result DW?data ENDS code SEGMENT ASSUME CS:code,DS:data start:MOV AX,data;给DS赋值;MOV DS,AX MOV AX,value;取数 ADD AX,value+2;两数相加 MOV result,AX;保存结果 MOV AH,4CH;返回DOS INT 21H code ENDS,1、子程序(过程)定义伪操作 格式 过程名 PROC 类型、过程名 ENDP 子程序(过程)定义由伪操作PROC开始、ENDP结束,PROC 和ENDP 必须成对出现,且语句前必须有过程名,过程名必须相同。PROC和ENDP语句之间为子程的指令序列,程序中可以定义多个过程。程序经汇编、连接及装入内存后,过程名为一具体的内存地址,指示子程入口。,4.2.5 过程定义伪指令,2、说明 过程名常用作CALL调用指令的操作数,子程的最后安排RET返回指令,使执行完子程后能返回调用处。过程有两种类型:NEAR和FAR,无类型项时,默认为NEAR类型。当过程与调用指令不在同一段时,应将过程定义为 FAR 类型。过程类型决定子程中RET的返回类型。段内调用时汇编程序对RET产生的指令编码是C3H,实现段内返回;段间调用时汇编程序对RET产生指令编码CBH,实现段间返回。汇编程序用PROC伪操作的类型来确定CALL和RET指令的属性。,例3:调用程序和子程序在同一代码段中。MAIN PROCFAR:CALLSUBR1:RET MAIN ENDP SUBR1 PROC NEAR:RETSUBR1 ENDP DOS把主程序看作一个FAR类型子程加以调用,故应把主程序定义为FAR类型。,例4:调用程序和子程序不在同一代码段中。SEGX SEGMENT:SUBT PROCFAR:RETSUBT ENDP:CALL SUBTSEGX ENDSSEGY SEGMENT:CALL SUBT:SEGY ENDS,1、NAME 和 TITLE 伪操作 格式 NAME 模块名 格式 TITLE 模块名 在源程序开始可用 NAME 或 TITLE 为模块命名,模块名的作用是指示给连接程序进行连接用。源程序中可无模块定义,此时源文件名作为模块名,4.2.6 模块定义与连接伪指令,2、END伪操作格式 END 启动地址标号 作用是指示源程序到此结束。汇编程序对 END 之后的语句不进行处理。程序中所有有效语句应放在 END 语句之前,多个模块连接时,则只有主模块要使用标号,程序 从主模块第一个标号处开始执行。源程序中必须有 END 结束语句。汇编程序对无END语句的源程序会给出错误信息。,3、模块连接伪指令用于多模块时程序和数据的相互共享。(1)全局符号伪指令定义共享模块 格式:PUBLIC 名称,名称,;注释 功能:定义符号名为全局符号名,允许程序中的其它模块直接引用。同一模块中只能定义一次。(2)引用伪指令调用共享模块 格式:EXTRN 名称:类型,名称:类型,;注释 功能:指明本模块中所使用的符号名在其它模块中已经定义,且出现在PUBLIC伪指令中。EXTRN语句的引用,必须与已用PUBLIC语句定义过的名称相呼应,启动地址可是一个标号或过程名,指示程序的入口。程序装入内存后,系统跳转到入口处,开始执行程序。,1、地址计数器$汇编过程中使用地址计数器来保存当前正在汇编的指令的偏移地址,地址计数器的值可用$来表示。$用在指令中时,表示当前地址,即本条指令的第一个字节的地址。例:JNE$2、ORG伪操作格式:ORG表达式作用:用来设置当前地址计数器的值。当用户要求指定某条指令或数据为某个指定地址时,可用ORG语句来改变,ORG语句可以放在程序的任何位置。,4.3.7 补充伪指令,例:VECTSEGMENTORG10 VECT1DW47A5H ORG20 VECT2DW0C596H VECTENDS3、LABEL 伪指令及外部伪指令格式:名称LABEL类型属性 LABEL伪指令给已定义的变量或标号取另一个名字(别名),并可重新定义它的类型属性,使同一变量或标号在不同地方被引用时,可采用不同的名字,具有不同的类型属性,但它们具有相同的地址属性。,例:DATB LABEL BYTE;DATB为DATW的别名DATW DW 3031H,3233H;MOV AL,DATB0;(AL)=31HMOV BX,DATW1;(BX)=3330H例:STACK SEGMENT STACK STACK DW 100 DUP(?);堆栈中经常使用LABEL。TOP LABEL WORD;TOP为栈底名,类型为字。STACK ENDS;如用指令MOV SP,OFFSET TOP,例:DATASEGMENTA1 DB30H,31HA2 DW 4 DUP(0)A3 EQU 0011HA4 DB 2 DUP(?)DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA:TMF LABEL FAR:PUBLIC A2,A3,TMF;A2,A3,TMF可供其他模块共享:CODEENDS,PDATA SEGMENTP1DB 0AH,0BHP2DB 2 DUP(?)PDATA ENDSPCODE SEGMENTEXTRN A2:WORD,A3:ABS,TMF:FARMAIN:MOVAX,PDATA:MOVAX,OFFSET A2MOVCX,A3:PCODEENDSENDMAIN,系统功能调用是DOS为系统程序员及用户提供的一组常用子程序,约80多个功能调用。DOS功能调用的使用方法如下:)在寄存器中存入所要调用功能的功能号。)根据所调用功能的规定设置入口参数。)用INT 21H指令转入子程序入口。)相应的子程序运行完后,可以按规定取得出口参数。,4.3 DOS系统功能及BIOS调用,AH=01;键盘输入 AH=02;显示器输出AH=03;串口输入 AH=04;串口输出AH=05;打印机输出AH=08;键盘输入(无回显)AH=09;显示字符串AH=0A;字符串输入1、键盘输入显示单字符(1号调用)格式:MOV AH,1 INT 21H 系统等待键盘输入,程序员按下任何一键后,系统先检测是否是Ctrl+Break键,是则退出,否则将键入字符的ASCII码置入寄存器中,并在屏幕上显示该字符。,4.3.1 键盘输入,2、字符串输入(0A调用)调用INT 21H 的A号功能,其功能是将键盘输入的字符串写入到内存缓冲区,因此事先必须要定义一个缓冲区DS:DX。DX为缓冲区的首地址。缓冲区的第一个字节为能存放的字符数,第二个字节为实际存入的字符数,从第三个字节开始用来存放键入的字符串,最后键入回车键表示字符串结束。如果实际键入的字符数不足填满缓冲区时,则其余字节添0,如果超出缓冲区容量,则超出字符被丢失。MAXLEN DB 32 ACTLEN DB?STRING DB 32 DUP(?)LEA DX,MAXLEN MOV AH,0AH INT 21H,1、单字符输出(2号调用)格式:MOV DL,MOV AH,2 INT 21H将置入寄存器中的字符从屏幕上显示输出在屏幕中显示“”MOV DL,33H;33H为的ASCII码MOV DL,3MOV AH,2INT 21H,4.3.2 显示器输出,2、屏幕显示字符串输出(9号调用)将指定的内存缓冲区的字符串从屏幕显示输出(或从打印机打印输出),缓存区的字符串以“$”结束。DS:DX为串的首地址。MESSAGE DB How are you!$MOV DX,SEG MESSAGE;取标号所在的段基址MOV DS,DX;转送到数据段MOV DX,OFFSET MESSAGE;LEA DX,MESSAGE;取偏移地址MOV AH,9INT 21,3、键盘输入但无屏幕显示(8号调用)BAA:MOV AH,08H INT 21H CMP AL,Y JE YES CMP AL,N JE NO JMP BAAYES:NO:4、打印输出字符(5号调用)把DL内容对应的字符输出到打印机上。,返回到DOS(4C号调用)格式:MOV AH,24CH INT 21H,4.3.3 返回到DOS,例4-2 向内存指定单元送10个数,并将这些数在屏幕上显示出来。,4.4.1 程序设计概述,1、判断程序质量的标准 程序的正确性 程序的可读性,易维护性 程序的执行时间 程序所占内存大小 2、程序设计的一般步骤一般说来,编制一个汇编程序的步骤如下:(1)分析题意,确定算法。(2)根据算法画出程序框图。(3)根据框图编写程序。(4)上机调试程序。,4.4 汇编语言程序设计基础,开始结束框 执行框 判别框 连接点 指向线,用流程图表示算法直观形象,比较清楚地显示出各个框之间的逻辑关系。常用的还有N-S结构化流程图。程序编制人员都应当掌握传统流程图,会看会画。,3、流程图的组成,4、流程图的绘制示意,顺序程序结构是一种最简单的程序结构。在流程图中,处理框一个接一个执行,既无分支,也无循环和转移。是一种简单的程序结构。,4.4.2 顺序结构,步骤如下:(1)分析题意,确定算法。顺序结构(2)根据算法画出程序框图。右图(3)根据框图编写程序。,例4-14编程求S=86H*34H-21H式中的三个数均为无符号数。,例4-14 流程图,例4-15 内存中自TABLE开始的16个单元连续存放着自然数015的平方值(称作平方表)。任给一数X(0X15)在XX单元,查表求X的平方值,并把结果存入YY单元。步骤如下:(1)分析题意,确定算法。顺序结构(2)根据算法画出程序框图。右图(3)根据框图编写程序。,例4-15 流程图,步骤如下:(1)分析题意,确定算法。顺序结构(2)根据算法画出程序框图。右图(3)根据框图编写程序。,例编程求y=(a+b)*c-d)/e其中a、b、c、d、e依次放在BLOCK单元开始的内存中,结果存放在SS单元中。,例4-4 流程图,1分支程序的结构形式 分支程序结构要求程序在运行过程中需要根据不同的情况或条件作出判断,并转向相应的处理程序。分支是通过条件转移指令实现的。分支程序结构可以有两种形式,如图所示。一般用条件转移实现,(a)IF_THEN_ELSE(b)CASE结构,4.4.3 分支结构,步骤如下:(1)分析题意,确定算法。分支结构(2)根据算法画出程序框图。右图(3)根据框图编写程序。,例1 根据BUFFER中的数(X)对符号函数BX(Y)赋值。,例1 流程图,例2 某车站需编写一个计算行李托运费的程序,其要求为:,其中G为托运质量,当G=0时,退出程序,G60Kg不受理。,步骤如下:(1)分析题意,确定算法。分支结构(2)根据算法画出程序框图。下页图(3)根据框图编写程序。,例2 流程图,例3 根据AL中的被放置位的

    注意事项

    本文(微机原理.ppt)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开