版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、( (计算机接口技术计算机接口技术) )第第3 3章章汇编语言汇编语言汇编语言的语句格式(见教材汇编语言的语句格式(见教材2425页)页)执行性语句执行性语句执行性语句用于表达处理执行性语句用于表达处理器指令器指令(也称为硬指令也称为硬指令),汇编后对应一条指,汇编后对应一条指令代码。由处理器指令组成的代码序列是令代码。由处理器指令组成的代码序列是程序设计的主体程序设计的主体标号标号: 硬指令助记符硬指令助记符 操作数操作数,操作数操作数 ;注释注释说明性语句说明性语句说明性语句用于表达伪指说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、令,指示源程序如何汇编、变量怎样定义、过程怎
2、么设置等过程怎么设置等名字名字 伪指令助记符伪指令助记符 参数参数,参数参数, ;注释注释硬指令与伪指令硬指令与伪指令硬指令(硬指令(Instruction)使使CPU产生动作、并产生动作、并在程序执行时才处理的指令在程序执行时才处理的指令硬指令就是第硬指令就是第2章学习的处理器指令,与具体的章学习的处理器指令,与具体的处理器有关、与汇编程序无关处理器有关、与汇编程序无关伪指令(伪指令(Directive)不产生不产生CPU动作、在程动作、在程序执行前由汇编程序处理的说明性指令序执行前由汇编程序处理的说明性指令伪指令与具体的处理器类型无关,但与汇编程序伪指令与具体的处理器类型无关,但与汇编程序
3、有关。不同版本的汇编程序支持不同的伪指令有关。不同版本的汇编程序支持不同的伪指令 硬指令和伪指令采用易于记忆的符合表达,这就是助记符标号、名字与标识符(见教材标号、名字与标识符(见教材25页)页)标号标号是反映硬指令位置(逻辑地址)和属性的标是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔识符,后跟一个冒号分隔名字名字是反映伪指令位置(逻辑地址)和属性的标是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号识符,后跟空格或制表符分隔,没有冒号标识符标识符(Identifier)一般最多由)一般最多由31个字母、数字个字母、数字及规定的特殊符号(如及规定的特殊符
4、号(如 _、$、?、)组成,不)组成,不能以数字开头。默认情况下,汇编程序不区别标能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写识符中的字母大小写一个源程序中,每个标识符的定义是唯一的,还一个源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的不能是汇编语言采用的保留字保留字保留字保留字保留字(保留字(Reserved Word)是汇编程序已经)是汇编程序已经利用的标识符(也称为关键字),主要有:利用的标识符(也称为关键字),主要有:硬指令助记符硬指令助记符例如:例如:MOV、ADD伪指令助记符伪指令助记符例如:例如:DB、DW操作符操作符例如:例如:OFFSET、PTR寄
5、存器名寄存器名例如:例如:AX、CS预定义符号预定义符号例如:例如:data 汇编语言大小写不敏感操作数和参数操作数和参数处理器指令的处理器指令的操作数操作数可以是立即数、寄存器可以是立即数、寄存器和存储单元和存储单元伪指令的伪指令的参数参数可以是常数、变量名、表达式可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔等,可以有多个,参数之间用逗号分隔注释注释语句中由分号语句中由分号“;”开始的部分为注释内容,开始的部分为注释内容,用以增加源程序的可读性用以增加源程序的可读性必要时,一个语句行也可以由分号开始作为必要时,一个语句行也可以由分号开始作为阶段性注释阶段性注释汇编程序在翻译源
6、程序时将跳过该部分,不汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理对它们做任何处理分隔符分隔符语句的语句的4个组成部分要用分隔符分开个组成部分要用分隔符分开标号后用冒号,注释前用分号标号后用冒号,注释前用分号操作数之间和参数之间使用逗号分隔操作数之间和参数之间使用逗号分隔其他部分通常采用空格或制表符其他部分通常采用空格或制表符多个空格和制表符的作用与一个相同多个空格和制表符的作用与一个相同MASM支持续行符支持续行符 “”例例3.1 在屏幕上显示一段信息在屏幕上显示一段信息; ;数据段(定义要显示的字符串)数据段(定义要显示的字符串)stringstringdbHello, Asse
7、mbly !,0dh,0ah,$dbHello, Assembly !,0dh,0ah,$; ;代码段(显示字符串的程序)代码段(显示字符串的程序)mov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hHello, Assembly !程序功能程序功能简化段定义格式简化段定义格式.model small;定义程序的;定义程序的存储模式存储模式(小型模式)(小型模式).stack;定义;定义堆栈段堆栈段(默认是(默认是1KB空间)空间).data;定义;定义数据段数据段;数据定义;数据定义.code;定义;定义
8、代码段代码段start: mov ax,data;程序;程序开始点开始点mov ds,ax;设置;设置DS指向用户定义的数据段指向用户定义的数据段;程序代码;程序代码mov ax,4c00hint 21h;程序终止点,返回;程序终止点,返回DOS;子程序代码;子程序代码end start;汇编结束,同时指明程序起始点;汇编结束,同时指明程序起始点start第一个源程序文件第一个源程序文件wj0301.asm;wj0301.asm.model small.stack.datastringstringdb Hello, Assembly !,0dh,0ah,$db Hello, Assembly
9、!,0dh,0ah,$.codestart:mov ax,datamov ds,axmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hint 21hend start1. 存储模式(存储模式(Memory Model)存储模式存储模式决定了一个程序的规模,也确定决定了一个程序的规模,也确定了子程序调用、指令转移和数据访问等的了子程序调用、指令转移和数据访问等的缺省属性缺省属性当使用简化段定义的源程序格式时,必须当使用简化段定义的源程序格式时,必须有存储模式有存储模式.MODEL语句
10、,且位于所有简语句,且位于所有简化段定义语句之前。其格式为:化段定义语句之前。其格式为:.MODEL 存储模式存储模式.MODEL语句确定了程序采用的存储模式,语句确定了程序采用的存储模式,MASM有有7种可以选择,如表种可以选择,如表3.1所示所示 本课程学习过程中,均采用小型模式SMALL2. 逻辑段的简化定义逻辑段的简化定义.STACK 大小大小;堆栈段定义伪指令;堆栈段定义伪指令.STACK创建一个堆栈段,段名是:创建一个堆栈段,段名是:STACK。可选的。可选的“大小大小”参数指定堆栈段所占存储区的参数指定堆栈段所占存储区的字节数,默认是字节数,默认是1KB(1024400H字节)字
11、节).DATA;数据段定义伪指令;数据段定义伪指令.DATA创建一个数据段,段名是:创建一个数据段,段名是:_DATA。数据段名可用。数据段名可用DATA预定义标识符表示预定义标识符表示.CODE 段名段名;代码段定义伪指令;代码段定义伪指令.CODE创建一个代码段,可选的创建一个代码段,可选的“段段名名”参数指定该代码段的段名。如果没有给出段名,则采参数指定该代码段的段名。如果没有给出段名,则采用默认段名用默认段名 一个段的开始自动结束前面的一个段 简化段定义伪指令之前,需有存储模式语句3. 程序开始程序开始为了指明程序开始执行的位置,需要使用一个标为了指明程序开始执行的位置,需要使用一个标
12、号(例题中采用了号(例题中采用了start标识符)标识符)连接程序会根据程序起始点正确地设置连接程序会根据程序起始点正确地设置CS和和IP值,值,根据程序大小和堆栈段大小设置根据程序大小和堆栈段大小设置SS和和SP值值连接程序没有设置连接程序没有设置DS和和ES值。程序如果使用数值。程序如果使用数据段或附加段,必须明确给据段或附加段,必须明确给DS或或ES赋值赋值大多数程序需要数据段,程序的执行开始应是:大多数程序需要数据段,程序的执行开始应是:start:mov ax,data;data表示数据段的段地址表示数据段的段地址mov ds,ax ;设置设置DS4. 程序终止程序终止应用程序执行结
13、束,应该将控制权交还操应用程序执行结束,应该将控制权交还操作系统作系统汇编语言程序设计中,有多种返回汇编语言程序设计中,有多种返回DOS的的方法,但一般利用方法,但一般利用DOS功能调用的功能调用的4CH子子功能实现,它需要的入口参数是功能实现,它需要的入口参数是AL返回返回数码(通常用数码(通常用0表示程序没有错误)表示程序没有错误)于是,应用程序的终止代码就是:于是,应用程序的终止代码就是:mov ax,4c00hint 21h5. 汇编结束汇编结束汇编结束表示汇编程序到此结束将源程序汇编结束表示汇编程序到此结束将源程序翻译成目标模块代码的过程翻译成目标模块代码的过程源程序的最后必须有一条
14、源程序的最后必须有一条END伪指令伪指令END 标号标号可选的可选的“标号标号”参数指定程序开始执行点,参数指定程序开始执行点,连接程序据此设置连接程序据此设置CS和和IP值(例题中采用值(例题中采用了了start标识符)标识符) 不要糊涂程序终止和汇编结束是两码事6. 可执行程序的结构可执行程序的结构DOS操作系统支持两种可执行程序结构操作系统支持两种可执行程序结构1. EXE程序程序程序可以有多个代码段和多个数据段,程序长程序可以有多个代码段和多个数据段,程序长度可以超过度可以超过64KB通常生成通常生成EXE结构的可执行程序结构的可执行程序2. COM程序程序只有一个逻辑段,程序长度不超
15、过只有一个逻辑段,程序长度不超过64KB需要满足一定条件才能生成需要满足一定条件才能生成COM结构的可执结构的可执行程序(行程序(MASM 6.x需要采用需要采用TINY模式)模式)3.2 常量、变量和属性常量、变量和属性 汇编语言的数据可以简单分为常量和变量汇编语言的数据可以简单分为常量和变量常量常量可以作为硬指令的立即数或伪指令的参可以作为硬指令的立即数或伪指令的参数,数,变量变量主要作为存储器操作数主要作为存储器操作数汇编语言语句中的汇编语言语句中的名字和标号名字和标号具有逻辑地址具有逻辑地址和类型属性,主要用做地址操作数,也可以和类型属性,主要用做地址操作数,也可以作为立即数和存储器操
16、作数作为立即数和存储器操作数本节将详细讨论语句中的参数和操作数、名本节将详细讨论语句中的参数和操作数、名字和标号,并引出相关的伪指令和操作符字和标号,并引出相关的伪指令和操作符3.2.1 常量常量常量表示一个固定的数值,它又分成多种形式常量表示一个固定的数值,它又分成多种形式常数字符串符合常量1. 数值表达式1. 常数常数指由指由10、16、2和和8进制形式表达的数值,各种进进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的制的数据以后缀字母区分,默认不加后缀字母的是十进制数是十进制数十进制十进制由由0 9数字组成,以字母数字组成,以字母D(d)结)结尾(缺省情况可以省略)尾
17、(缺省情况可以省略)100,255D十六进制十六进制由由0 9、A F数字组成,以字母数字组成,以字母H(h)结尾,以字母开头的常数需要)结尾,以字母开头的常数需要加一个前导加一个前导064H,0FFH0B800H二进制二进制由由0和和1两个数字组成,以字母两个数字组成,以字母B(b)结尾结尾01100100B2. 字符串字符串字符串常量是用单引号或双引号括起来的字符串常量是用单引号或双引号括起来的单个字符或多个字符单个字符或多个字符其其数值是每个字符对应的数值是每个字符对应的ASCII码值码值例如:例如:d(等于(等于64H)AB(等于(等于4142H)Hello, Assembly !3.
18、 符号常量符号常量符号常量使用标识符表达一个数值符号常量使用标识符表达一个数值MASM提供等价机制,用来为常量定义符号名提供等价机制,用来为常量定义符号名符号定义伪指令有符号定义伪指令有“等价等价EQU”和和“等号等号”:符号名符号名 EQU 数值表达式数值表达式符号名符号名 EQU 符号名符号名 数值表达式数值表达式EQU用于数值等价时不能重复定义符号名,用于数值等价时不能重复定义符号名,但但“”允许有重复赋值。例如:允许有重复赋值。例如:X= 7;等效于:;等效于:X qeu 7X= X+5;“X EQU X+5”是错误的是错误的4. 数值表达式数值表达式数值表达式一般是指由数值表达式一般
19、是指由运算符运算符连接的各种常量所连接的各种常量所构成的表达式构成的表达式汇编程序在汇编过程中计算表达式,最终得到一汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量个确定的数值,所以也是常量表达式的数值在程序运行前的汇编阶段计算,所表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定以组成表达式的各部分必须在汇编时就能确定汇编语言支持多种运算符(汇编语言支持多种运算符(表表3.4)我们经常使用的是加减乘除(我们经常使用的是加减乘除( * / )例如:例如:mov ax,3*4+5;等价于:;等价于:mov ax,173.2.2 变量变量 变量变
20、量实质上是指主存单元的数据,虽然内存单元实质上是指主存单元的数据,虽然内存单元地址不变,但其中存放的数据可以改变地址不变,但其中存放的数据可以改变变量需要事先定义才能使用变量需要事先定义才能使用变量定义(变量定义(Define)伪指令为变量申请固定长度)伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单为单位的存储空间,并可以同时将相应的存储单元初始化元初始化定义后的变量可以利用变量名等方法引用其中的定义后的变量可以利用变量名等方法引用其中的数据,即变量的数值数据,即变量的数值1. 变量的定义变量的定义 变量定义的汇编语言格式为:变量定义的汇编语言格式为:变量名变量名 伪指令伪
21、指令 初值表初值表变量名变量名为用户自定义标识符,表示初值表首元素为用户自定义标识符,表示初值表首元素的逻辑地址,常称为符号地址。变量名也可以没的逻辑地址,常称为符号地址。变量名也可以没有有初值表初值表是用逗号分隔的参数是用逗号分隔的参数,主要由常量、数值表主要由常量、数值表达式或达式或“?”组成。其中组成。其中“?”表示未赋初值表示未赋初值多个存储单元如果初值相同,可以用复制操作符多个存储单元如果初值相同,可以用复制操作符DUP进行定义:进行定义:重复次数重复次数 DUP(重复参数重复参数)变量定义伪指令有变量定义伪指令有DB、DW、DD等(表等(表3.5)字节变量的定义字节变量的定义DB(
22、Define Byte)DB伪指令用于分配一个或多个字节单元,伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值并可以将它们初始化为指定值初值表中每个数据一定是字节量,存放一初值表中每个数据一定是字节量,存放一个个8位数据:位数据:u可以是可以是0255的无符号数的无符号数u或是或是128127带符号数带符号数也可以是字符串常数也可以是字符串常数字节变量定义实例字节变量定义实例;数据段;数据段Xdb a,-5db 2 dup(100),?Ydb ABC字节变量的应用字节变量的应用mov al,X;此处;此处X表示它的第表示它的第1个数据,故个数据,故ALadec X+1;对;对X为始
23、的第为始的第2个数据减个数据减1,故成为,故成为6mov Y,al;现在;现在Y这个字符串成为这个字符串成为 aBC字变量的定义字变量的定义DW(Define Word)DW伪指令用于分配一个或多个字单元,并伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值可以将它们初始化为指定值初值表中每个数据是字量,一个字单元可初值表中每个数据是字量,一个字单元可用于存放任何用于存放任何16位数据:位数据:u 一个段地址一个段地址u 一个偏移地址一个偏移地址u 两个字符两个字符u 065535之间的无符号数之间的无符号数3276832767之间的带符号数之间的带符号数字变量定义实例字变量定义实例;
24、数据段;数据段countdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)双字变量的定义双字变量的定义DD(Define Double word)DD伪指令伪指令用于分配一个或多个双字单元,用于分配一个或多个双字单元,并可以将它们初始化为指定值并可以将它们初始化为指定值初值表中每个数据是一个初值表中每个数据是一个3232位的双字量:位的双字量:u 可以是有符号或无符号的可以是有符号或无符号的3232位整数位整数u 也可以用来表达也可以用来表达1616位段地址(高位字)和位段地址(高位字)和1616位位的偏移地址(低位字)
25、的远指针的偏移地址(低位字)的远指针varddvarddDD 0,?,12345678hDD 0,?,12345678hfarpointfarpoint DD 00400078hDD 00400078h2. 变量的应用变量的应用变量变量具有存储单元的逻辑地址具有存储单元的逻辑地址程序代码中程序代码中通过变量名引用其指向的首个数据通过变量名引用其指向的首个数据通过变量名加减位移量存取以首个数据为基地通过变量名加减位移量存取以首个数据为基地址的前后数据址的前后数据 例题例题3.2 变量的定义变量的定义 ;数据段数据段bvar1db 100,01100100b,64h,d;字节变量:不同进制表达同一
26、个数值,内存中有字节变量:不同进制表达同一个数值,内存中有4个个64Hminint = 5;符号常量:;符号常量:minint数值为数值为5,不占内存空间,不占内存空间bvar2db -1,minint,minint+5;内存中数值依次为;内存中数值依次为FFH,5,0AHdb ?,2 dup(20h);预留一个字节空间,重复定义了;预留一个字节空间,重复定义了2个数值个数值20Hwvar1 dw 2010h,4*4;字变量:两个数据是;字变量:两个数据是2010H、0010H,共占,共占4个字节个字节wvar2 dw ?;wvar2是没有初值的字变量是没有初值的字变量例题例题3.2 变量的定
27、义(续)变量的定义(续)dvardd 12347777h,87651111h,?;双字变量:;双字变量:2个双字数据,一个双字空间个双字数据,一个双字空间abcdb a,b,c,?;定义字符,实际是字节变量定义字符,实际是字节变量maxint equ 0ah;符号常量:符号常量:maxint10string db ABCDEFGHIJ;定义字符串:使用字节定义;定义字符串:使用字节定义DB伪指令伪指令crlfsdb 13,10,$;回车符;回车符0DH、换行符、换行符0AH和字符和字符$24Harray1 dw maxint dup(0);10个初值为个初值为0的字量,可以认为是数组的字量,可
28、以认为是数组arraydb 2 dup(2,3,2 dup(4);8个字节内容依次为:个字节内容依次为:02 03 04 04 02 03 04 04例题例题3.2 变量的应用变量的应用;代码段;代码段mov dl,bvar1;DL100dec bvar2+1;bvar2+14mov abc3,dl;abcabcdmov ax,word ptr dvar0;取双字到;取双字到DX.AXmov dx,word ptr dvar2add ax,word ptr dvar4;加双字到;加双字到DX.AXadc dx,word ptr dvar6mov word ptr dvar8,ax;保存双字的求
29、和结果;保存双字的求和结果mov word ptr dvar10,dx例题例题3.2 变量的应用(续)变量的应用(续)mov cx,maxint;CX10mov bx,0;BX0again:add stringbx,3;string每个数值加每个数值加3inc bxloop again;循环;循环lea dx,abc;从;从abc开始开始mov ah,9;09H号号DOS功能调用功能调用int 21h;显示结果:;显示结果:abcdDEFGHIJKLM3. 变量的定位变量的定位汇编程序按照指令的先后顺序一个接着一个分配汇编程序按照指令的先后顺序一个接着一个分配存储空间,按照段定义伪指令规定的边
30、界定位属存储空间,按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置(包括偏移地址)性确定每个逻辑段的起始位置(包括偏移地址)定位伪指令定位伪指令ORG控制数据或代码所在的偏移地址控制数据或代码所在的偏移地址ORG 参数参数ORG伪指令是将当前偏移地址指针指向参数表达伪指令是将当前偏移地址指针指向参数表达的偏移地址。的偏移地址。例如:例如:ORG 100h;从;从100H处安排数据或程序处安排数据或程序ORG $+10;偏移地址加;偏移地址加10,即跳过,即跳过10个字节空间个字节空间汇编语言程序中,符号汇编语言程序中,符号“$”表示当前偏移地址值表示当前偏移地址值3.2.3 名字和标
31、号的属性名字和标号的属性名字和标号是用户自定义的标识符。名字和标号是用户自定义的标识符。名字名字指向一条指向一条伪指令,伪指令,标号标号指向一条硬指令。名字和标号一经使指向一条硬指令。名字和标号一经使用便具有两类属性:用便具有两类属性: 逻辑地址逻辑地址名字和标号对应存储单元的逻辑名字和标号对应存储单元的逻辑地址,含有段地址和偏移地址;地址,含有段地址和偏移地址; 类型类型变量名的类型可以是变量名的类型可以是BYTE(字节)、(字节)、WORD(字)和(字)和DWORD(双字)等;标号、段(双字)等;标号、段名、子程序名的类型可以是名、子程序名的类型可以是NEAR(近)和(近)和FAR(远远)
32、,分别表示段内或段间调用,分别表示段内或段间调用汇编程序提供有关的操作符,以便获取这些属性值汇编程序提供有关的操作符,以便获取这些属性值1. 地址操作符地址操作符地址操作符地址操作符取得名字或标号的段地址和偏移地址取得名字或标号的段地址和偏移地址 将括起的表达式作为存储器地址指针将括起的表达式作为存储器地址指针 $当前偏移地址当前偏移地址 :段前缀,采用指定的段地址寄存器段前缀,采用指定的段地址寄存器OFFSET 名字名字/标号标号返回名字或标号的偏移地址返回名字或标号的偏移地址SEG 名字名字/标号标号返回名字或标号的段地址返回名字或标号的段地址2. 类型操作符类型操作符类型操作符类型操作符
33、对名字或标号的类型属性进行设置对名字或标号的类型属性进行设置类型名类型名 PTR 名字名字/标号标号其中可以是其中可以是BYTE、WORD、DWORD(依次表示字(依次表示字节、字、双字)等节、字、双字)等,或者是或者是NEAR、FAR(分别表示(分别表示近、远),还可以是由结构、记录等定义的类型近、远),还可以是由结构、记录等定义的类型对变量:对变量:lLENGTHOF操作符获知某变量名指向多少个数据项操作符获知某变量名指向多少个数据项lSIZEOF操作符获知它共占用多少字节空间操作符获知它共占用多少字节空间3.3 顺序程序设计顺序程序设计没有分支、循环等转移指令的程序,会按没有分支、循环等
34、转移指令的程序,会按指令书写的前后顺利依次执行,这就是顺指令书写的前后顺利依次执行,这就是顺序程序序程序顺序结构是最基本的程序结构顺序结构是最基本的程序结构完全采用顺序结构编写的程序并不多见完全采用顺序结构编写的程序并不多见例题例题3.4 顺序程序设计实例顺序程序设计实例采用查表法,实现一位采用查表法,实现一位16进制数进制数转换为转换为ASCII码显示码显示例例3.4 数据段数据段;数据段数据段ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;对应;对应0 9的的ASCII码码db 41h,42h,43h,44h,45h,46h;对应;对应A
35、F的的ASCII码码hexdb 04h,0bh;假设两个数据;假设两个数据例例3.4 代码段代码段 ;代码段代码段mov bx,offset ASCII;BX指向指向ASCII码表码表mov al,hex;AL取得一位取得一位16进制数进制数;恰好就是;恰好就是ASCII码表中的位移码表中的位移and al,0fh;只有低;只有低4位是有效的,高位是有效的,高4位清位清0 xlat;换码:;换码:ALDS:BXAL例例3.4 代码段(续)代码段(续)mov dl,al;入口参数:;入口参数:DLALmov ah,2;02号号DOS功能调用功能调用int 21h;显示一个;显示一个ASCII码字
36、符码字符mov al,hex+1;转换并显示下一个数据;转换并显示下一个数据and al,0fhxlatmov dl,almov ah,2int 21h3.4 分支程序设计分支程序设计分支程序根据条件是真或假决定执行与否分支程序根据条件是真或假决定执行与否判断的条件是各种指令,如判断的条件是各种指令,如CMP、TEST等等执行后形成的状态标志执行后形成的状态标志转移指令转移指令Jcc和和JMP可以实现分支控制可以实现分支控制分支结构有分支结构有单分支结构单分支结构双分支结构双分支结构多分支结构多分支结构单分支结构单分支结构 条件成立跳转,否条件成立跳转,否则顺序执行分支语则顺序执行分支语句体句
37、体注意选择正确的条注意选择正确的条件转移指令和转移件转移指令和转移目标地址目标地址计算计算AX中有符号数的绝对值中有符号数的绝对值cmp ax,0cmp ax,0jge nonnegjge nonneg;条件满足(;条件满足(AX0AX0),转移),转移neg axneg ax;条件不满足,求补;条件不满足,求补nonneg:nonneg: mov result,axmov result,ax ;保存结果;保存结果;不恰当的分支;不恰当的分支cmp ax,0cmp ax,0jl yesnegjl yesneg;条件满足(;条件满足(AXAX0 0),转移),转移jmp nonnegjmp no
38、nnegyesneg:yesneg: neg axneg ax;条件满足,求补;条件满足,求补nonneg:nonneg: mov result,axmov result,ax ;保存结果;保存结果双分支结构双分支结构条件成立跳转执行第条件成立跳转执行第2个个分支语句体,否则顺序执分支语句体,否则顺序执行第行第1个分支语句体个分支语句体注意第注意第1个分支体后一定个分支体后一定要有一个要有一个JMP指令跳到第指令跳到第2个分支体后个分支体后显示显示BX的最高位的最高位shl bx,1;BX最高位移入最高位移入CF标志标志jc one;CF1,即最高位为,即最高位为1,转移,转移mov dl,3
39、0h;CF0,即最高位为,即最高位为0:DL30H0jmp two;一定要跳过另一个分支体;一定要跳过另一个分支体one:mov dl,31h;DL 31H1two:mov ah,2int 21h;显示;显示显示显示BX的最高位(续)的最高位(续)shl bx,1;BX最高位移入最高位移入CF标志标志jnc one;CF0,即最高位为,即最高位为0,转移,转移mov dl,31h;CF1,即最高位为,即最高位为1:DL31H1jmp two;一定要跳过另一个分支体;一定要跳过另一个分支体one:mov dl,30h;DL 30H0two:mov ah,2int 21h;显示;显示显示显示BX的
40、最高位(另解)的最高位(另解)mov dl,0 ;DL30H0shl bx,1;BX最高位移入最高位移入CF标志标志jnc two;CF0,即最高位为,即最高位为0,转移,转移mov dl,1;CF1,即最高位为,即最高位为1:DL31H1two:mov ah,2int 21h;显示;显示 编写分支程序,需留心分支的开始和结束编写分支程序,需留心分支的开始和结束显示显示BX的最高位(无分支)的最高位(无分支)mov dl,0shl bx,1;BX最高位移入最高位移入CF标志标志adc dl,30h;CF0,DL030h030H0;CF1,DL030h131H1two: mov ah,2int
41、21h;显示;显示例题例题3.5 显示压缩显示压缩BCD码,无前导码,无前导0;数据段数据段BCDdb 04h ;代码段代码段mov dl,BCDtest dl,0ffh ;如果;如果BCD码为码为0,显示,显示0jz zero;双分支结构;双分支结构test dl,0f0h ;如果;如果BCD码高位为码高位为0,不显示,不显示0jz one;单分支结构;单分支结构例题例题3.5 显示压缩显示压缩BCD码,无前导码,无前导0(续)(续)mov cl,4;处理高位;处理高位shr dl,clor dl,30h;转换为;转换为ASCII码码mov ah,2;显示高位;显示高位int 21hmov
42、dl,BCDand dl,0fhone:or dl,30h;处理低位;处理低位jmp twozero: mov dl,0two:mov ah,2int 21h例题例题3.6 从键盘输入一个字符串从键盘输入一个字符串;数据段数据段keynum= 255keybufdb keynum; 键盘输入缓冲区键盘输入缓冲区db 0db keynum dup(0);代码段代码段mov dx,offset keybuf ;输入字符串输入字符串mov ah,0ahint 21hmov dl,0ah;再进行换行再进行换行mov ah,2int 21h例题例题3.6 大小写字母转换大小写字母转换 mov bx,of
43、fset keybuf+1 ;取出字符个数取出字符个数mov cl,bxmov ch,0;作为循环的次数作为循环的次数again: inc bxcmp dl,a;小于小写字母小于小写字母a,不需要处理,不需要处理jb dispcmp dl,z;大于小写字母大于小写字母z,不需要处理,不需要处理ja dispsub dl,20h;是小写字母,则转换为大写是小写字母,则转换为大写disp:mov ah,2;显示一个字符显示一个字符int 21hloop again;循环,处理完整个字符串循环,处理完整个字符串多分支结构多分支结构多分支结构是多个条件多分支结构是多个条件对应各自的分支语句体,对应各自
44、的分支语句体,哪个条件成立就转入相哪个条件成立就转入相应分支体执行应分支体执行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNor ah,ah;cmp ah,0jz function0dec ah;cmp ah,1jz function0dec ah;cmp ah,2jz function0例题例题3.7 地址表实现多分支结构地址表实现多分支结构;数据段数据段number db 78h;假设一个数值:假设一个数值:D3位为位为1addrsdw offset fun0, ,offset fun7;取得各处理程序开始的偏移地址取得各处理程序开始的偏移地址;代码段
45、代码段mov al,numbermov dl,?;数值为数值为0,显示一个问号,显示一个问号“?”cmp al,0;排除排除AL0的特殊情况的特殊情况jz disp例题例题3.7 地址表实现多分支结构(续)地址表实现多分支结构(续)mov bx,0;BX记录为记录为1的位数的位数again:shr al,1;最低位右移进入最低位右移进入CFjc next;为为1,转移,转移inc bx;不为不为1,继续,继续jmp againnext:shl bx,1;偏移地址是偏移地址是2个字节个字节jmp addrsbx;IPaddrsBXfun0:mov dl,0jmp dispdisp:mov ah,
46、2;显示一个字符显示一个字符int 21h3.5 循环程序设计循环程序设计循环程序结构循环程序结构是满足一定条件的情况下,是满足一定条件的情况下,重复执行某段程序重复执行某段程序循环结构的程序通常有循环结构的程序通常有3个部分:个部分: 循环初始部分循环初始部分为开始循环准备必要的条件,为开始循环准备必要的条件,如循环次数、循环体需要的数值等如循环次数、循环体需要的数值等 循环体部分循环体部分指重复执行的程序部分,其中指重复执行的程序部分,其中包括对循环条件等的修改程序段包括对循环条件等的修改程序段循环控制部分循环控制部分判断循环条件是否成立,决判断循环条件是否成立,决定是否继续循环定是否继续
47、循环循环控制循环控制循环结构程序循环结构程序的设计关键是循环控制部分的设计关键是循环控制部分循环控制可以在进入循环之前进行,也可循环控制可以在进入循环之前进行,也可以在循环体后进行,于是形成两种结构:以在循环体后进行,于是形成两种结构:“先判断、后循环先判断、后循环”结构结构“先循环、后判断先循环、后判断”结构结构循环结束的控制可以用循环次数,还可以循环结束的控制可以用循环次数,还可以用特定条件等,于是又有:用特定条件等,于是又有:计数控制循环计数控制循环条件控制循环条件控制循环先循环后判断的循环结构先循环后判断的循环结构 结束结束 初始化初始化 循环的初始状态循环的初始状态 循环体循环体 循
48、环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循环条件控制循环修改部分修改部分控制条件控制条件Y YN N3.5.1 计数控制循环计数控制循环 计数控制循环计数控制循环利用利用循环次数循环次数作作为控制条件为控制条件易于采用循环指令易于采用循环指令LOOP和和JCXZ实现实现初始化:将循环次数或最大循环初始化:将循环次数或最大循环次数置入次数置入CX循环体循环体循环控制:用循环控制:用LOOP指令对指令对CX减减1、并判断是否为、并判断是否为0例例3.8 二进制显示二进制显示BL内容内容mov cx,8;CX8(循环次数)(循环次数)again: shl bl
49、,1;左移进;左移进CF,从高位开始显示从高位开始显示mov dl,0;MOV指令不改变指令不改变CFadc dl,30h ;DL030HCF;CF若是若是0,则,则DL 0 ;CF若是若是1,则,则DL 1 mov ah,2int 21h;显示;显示loop again;CX减减1,如果,如果CX未减至未减至0,则循环,则循环计数控制循环计数控制循环先循环后判断先循环后判断例例3.9 求数组元素的最大值和最小值求数组元素的最大值和最小值;数据段数据段arraydw 10;假设一个数组,其中头个数据;假设一个数组,其中头个数据10表示元素个数表示元素个数dw -3,0,20,900,587,-
50、632,777,234,-34,-56;这是一个有符号字量元素组成的数组;这是一个有符号字量元素组成的数组maxay dw ?;存放最大值;存放最大值minay dw ?;存放最小值;存放最小值初始化:循环次数元素个数初始化:循环次数元素个数1循环体:逐个比较求最大、小值循环体:逐个比较求最大、小值循环控制:比较完所有数据循环控制:比较完所有数据例例3.9 代码段代码段;代码段;代码段lea si,arraymov cx,si;取得元素个数;取得元素个数dec cx;减;减1后是循环次数后是循环次数add si,2mov ax,si;取出第一个元素给;取出第一个元素给AX,AX用于暂存最大值用
51、于暂存最大值mov bx,ax;取出第一个元素给;取出第一个元素给BX,BX用于暂存最小值用于暂存最小值初始化例例3.9 代码段(续)代码段(续)maxck: add si,2cmp si,ax;与下一个数据比较;与下一个数据比较jle minckmov ax,si;AX取得更大的数据取得更大的数据jmp nextminck:cmp si,bxjge nextmov bx,si;BX取得更小的数据取得更小的数据next:loop maxck;计数循环;计数循环mov maxay,ax ;保存最大值;保存最大值mov minay,bx;保存最小值;保存最小值循环体例例3.10 键盘输入键盘输入N
52、,显示,显示N个个“?”mov ah,1;接受键盘输入接受键盘输入int 21hand al,0fh;只取低只取低4位位xor ah,ahmov cx,ax;作为循环次数作为循环次数jcxz done;次数为次数为0,则结束,则结束again:mov dl,?;循环体循环体mov ah,2int 21hloop again;循环控制循环控制done:;结束结束“边界”问题3.5.2 条件控制循环条件控制循环条件控制循环需要利用特定条件判条件控制循环需要利用特定条件判断循环是否结束断循环是否结束条件控制循环用条件转移指令判断条件控制循环用条件转移指令判断循环条件循环条件转移指令可以指定目的标号来
53、改变转移指令可以指定目的标号来改变程序的运行顺序,如果目的标号指程序的运行顺序,如果目的标号指向一个重复执行的语句体的开始或向一个重复执行的语句体的开始或结束,便构成了循环控制结构结束,便构成了循环控制结构显示以显示以0结尾的字符串结尾的字符串;数据段;数据段string db Let us have a try !,0;代码段;代码段mov bx,offset stringagain: mov dl,bxcmp dl,0jz done;为;为0结束结束mov ah,2;不为;不为0,显示,显示int 21hinc bx;指向下一个字符;指向下一个字符jmp againdone:条件控制循环条件控制循环先判断后循环先判断后循环例例3.11 记录某个字存储单元数据中记录某个字存储单元数据中1的个数的个数;数据段数据段number dw 1110111
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市绿化合同管理办法
- 宗教艺术博物馆管理办法
- 一站式工程维护服务承诺书
- 车辆限号管理办法
- 美容院实习生转正合同
- 城市供电设施拆迁电力保障
- 生态养殖场养猪场租赁
- 城市绿化箱涵施工合同
- 产品售后服务承诺书协议书
- 建筑照明工程合同
- 小学体育课学生学情分析报告
- 服装企业安全台账2
- 国内研究现状及发展趋势分析
- 信息技术(基础模块上下册)4.3分析数据
- 鲁科版《盐类的水解》省公开课金奖全国赛课一等奖微课获奖课件
- 11水平五 高一 田径单元18课时计划-《田径:跨栏跑-跨栏步》教案
- “三新”背景下2024年高考政治一轮复习策略建议
- 网球活动策划推广方案
- 全国食品安全风险监测参考值 2024年版
- 急救学教学课件
- 2023年福建省考评员考试题
评论
0/150
提交评论