




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7章章 汇编语言程序设计汇编语言程序设计n汇编语言是一种以处理器指令系统为基础的低汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数码,采用标识符号表示指令操作数n利用汇编语言编写程序的主要优点是可以直接、利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序列短小、运行快速的可执行程序n在有些应用领域,汇编语言的作用是不容置疑在有些应用领域,汇编语言的作用是不容置疑和无可替代的和无可替代的n汇编
2、程序设计的过程是与其他高级语言程序设汇编程序设计的过程是与其他高级语言程序设计大致相同计大致相同第第7章:教学重点章:教学重点n汇编语言源程序格式(汇编语言源程序格式(程序结构)程序结构)n汇编语言常用汇编语言常用伪指令伪指令的使用方法的使用方法n常量、变量和标号常量、变量和标号n汇编语言程序设计方法汇编语言程序设计方法n顺序程序设计顺序程序设计n分支程序设计分支程序设计n循环程序设计循环程序设计n子程序设计子程序设计7.1 汇编语言程序结构汇编语言程序结构 汇编语言源程序是由汇编语言源程序是由语句语句序列组成的,语句序序列组成的,语句序列应包括:列应包括: n 数据(程序要处理的对象);数据
3、(程序要处理的对象); n 处理数据的实体(程序);处理数据的实体(程序); n 承上启下的记录承上启下的记录。8086/8088 汇编语言程序必须具备:汇编语言程序必须具备: n 代码段(处理数据的对象)代码段(处理数据的对象) n 数据段(定义加工处理对象)数据段(定义加工处理对象) n 堆栈段堆栈段 标准汇编语言程序框架标准汇编语言程序框架n定义堆栈段定义堆栈段STACK_SEGSEGMENTPARASTACKSTACK;定义堆栈深度与堆栈段变量定义堆栈深度与堆栈段变量STACK_SEGENDSn定义数据段定义数据段DATA_SEGSEGMENTPARAPUBLICDATA ;定义变量定
4、义变量DATA_SEGENDSdata1 db 32h, 38h, 30h, 36h, 37h,$data2 db 33h, 35h, 33h, 38h, 32h, $sta db 100 dup (?)n通常,一个源程序都有大体相同的结构或框架,下面给出一通常,一个源程序都有大体相同的结构或框架,下面给出一个源程序的框架结构,该程序是在个源程序的框架结构,该程序是在PC-DOS环境下运行的。环境下运行的。n定义代码段定义代码段CODE_SEGSEGMENTPARAPUBLICCODEMAINPROCFARASSUMECS:CODE_SEG,DS:DATA_SEGASSUMESS:STACK_
5、SEGSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATA_SEGMOVDS,AX;主过程内容主过程内容RETMAINENDPPROC_APROCNEAR;子过程子过程A内容,内容,A为主为主过程调用过程调用PROC_AENDP ;其他过程内容其他过程内容CODE_SEGENDSENDSTART1 汇编语言源程序格式汇编语言源程序格式n完整的汇编语言源程序由段组成完整的汇编语言源程序由段组成n一个汇编语言源程序可以包含一个汇编语言源程序可以包含若干若干个个代码段代码段、数据段、附加段或堆栈段数据段、附加段或堆栈段,段与段之间的顺序,段与段之间的顺序可随意排列可随意排列n需独立
6、运行的程序必须包含一个需独立运行的程序必须包含一个代码段代码段,并指,并指示程序执行的示程序执行的起始点起始点,一个程序只有一个起始,一个程序只有一个起始点点n所有的所有的可执行性语句可执行性语句必须位于某一个代码段内,必须位于某一个代码段内,说明性语句可根据需要位于任一段内说明性语句可根据需要位于任一段内n通常,程序还需要一个堆栈段通常,程序还需要一个堆栈段 源程序由语句序列构成1. 汇编语言的语句的类型和组成汇编语言的语句的类型和组成执行性语句执行性语句执行性语句用于表达执行性语句用于表达处理处理器指令器指令(也称为硬指令也称为硬指令),汇编后对应一条,汇编后对应一条指令代码。由处理器指令
7、组成的代码序列指令代码。由处理器指令组成的代码序列是程序设计的主体是程序设计的主体n标号标号: 硬指令助记符硬指令助记符 操作数操作数,操作数操作数 ;注释注释说明性语句说明性语句说明性语句用于表达伪指说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、令,指示源程序如何汇编、变量怎样定义、过程怎么设置等过程怎么设置等n名字名字 伪指令助记符伪指令助记符 参数参数,参数参数, ;注释注释2. 硬指令与伪指令硬指令与伪指令n硬指令(硬指令(Instruction)使使CPU产生动作、产生动作、并在程序执行时才处理的指令并在程序执行时才处理的指令硬指令就是第硬指令就是第6章学习的处理器指令
8、,与具体的章学习的处理器指令,与具体的处理器有关、与汇编程序无关处理器有关、与汇编程序无关n伪指令(伪指令(Directive)不产生不产生CPU动作、在动作、在程序执行前由汇编程序处理的说明性指令程序执行前由汇编程序处理的说明性指令伪指令与具体的处理器类型无关,但与汇编程序伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令有关。不同版本的汇编程序支持不同的伪指令 硬指令和伪指令采用易于记忆的符合表达,这就是助记符3. 标号、名字与标识符标号、名字与标识符n标号标号是反映硬指令位置(逻辑地址)和属性的是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔标
9、识符,后跟一个冒号分隔n名字名字是反映伪指令位置(逻辑地址)和属性的是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号标识符,后跟空格或制表符分隔,没有冒号n标识符标识符(Identifier)一般最多由)一般最多由31个字母、个字母、数字及规定的特殊符号(如数字及规定的特殊符号(如 _、$、?、)组)组成,不能以数字开头。默认情况下,汇编程序成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写不区别标识符中的字母大小写n一个源程序中,每个标识符的定义是唯一的,一个源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的还不能是汇编语言采用的保留字保留字
10、名字和标号的属性名字和标号的属性n名字和标号是用户自定义的标识符。名字和标号是用户自定义的标识符。名字名字指向一条指向一条伪指令,伪指令,标号标号指向一条硬指令。名字和标号一经使指向一条硬指令。名字和标号一经使用便具有两类属性:用便具有两类属性: 逻辑地址逻辑地址名字和标号对应存储单元的逻辑名字和标号对应存储单元的逻辑地址,含有段地址和偏移地址;地址,含有段地址和偏移地址; 类型类型变量名的类型可以是变量名的类型可以是BYTE(字节)、(字节)、WORD(字)和(字)和DWORD(双字)等;标号、段(双字)等;标号、段名、子程序名的类型可以是名、子程序名的类型可以是NEAR(近)和(近)和FA
11、R(远远),分别表示段内或段间调用,分别表示段内或段间调用n汇编程序提供有关的操作符,以便获取这些属性值汇编程序提供有关的操作符,以便获取这些属性值地址操作符地址操作符n地址操作符取得名字或标号的段地址和偏移地址 将括起的表达式作为存储器地址指针 $当前偏移地址 :段前缀,采用指定的段地址寄存器OFFSET 名字/标号返回名字或标号的偏移地址SEG 名字/标号返回名字或标号的段地址类型操作符类型操作符n类型操作符类型操作符对名字或标号的类型属性进行设置对名字或标号的类型属性进行设置类型名类型名 PTR 名字名字/标号标号n其中可以是其中可以是BYTE、WORD、DWORD(依次表示(依次表示字
12、节、字、双字)等字节、字、双字)等,或者是或者是NEAR、FAR(分别表(分别表示近、远),还可以是由结构、记录等定义的类型示近、远),还可以是由结构、记录等定义的类型n对变量:对变量:lLENGTH 操作符获知某变量名指向多少个数据项操作符获知某变量名指向多少个数据项lSIZE 操作符获知它共占用多少字节空间操作符获知它共占用多少字节空间4. 保留字保留字n保留字(保留字(Reserved Word)是汇编程序)是汇编程序已经利用的标识符(也称为关键字),主已经利用的标识符(也称为关键字),主要有:要有:n硬指令助记符硬指令助记符例如:例如:MOV、ADDn伪指令助记符伪指令助记符例如:例如
13、:DB、DWn操作符操作符例如:例如:OFFSET、PTRn寄存器名寄存器名例如:例如:AX、CSn预定义符号预定义符号例如:例如:data 汇编语言大小写不敏感5. 操作数和参数操作数和参数n处理器指令的处理器指令的操作数操作数可以是立即数、寄存可以是立即数、寄存器和存储单元器和存储单元n伪指令的伪指令的参数参数可以是常数、变量名、表达可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔式等,可以有多个,参数之间用逗号分隔6. 注释注释n语句中由分号语句中由分号“;”开始的部分为注释内开始的部分为注释内容,用以增加源程序的可读性容,用以增加源程序的可读性n必要时,一个语句行也可以由分
14、号开始作必要时,一个语句行也可以由分号开始作为阶段性注释为阶段性注释n汇编程序在翻译源程序时将跳过该部分,汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理不对它们做任何处理8. 分隔符分隔符n语句的语句的4个组成部分要用分隔符分开个组成部分要用分隔符分开n标号标号后用后用冒号冒号,注释注释前用前用分号分号n操作数之间和参数之间使用操作数之间和参数之间使用逗号逗号分隔分隔n其他部分通常采用其他部分通常采用空格空格或制表符或制表符n多个空格和制表符的作用与一个相同多个空格和制表符的作用与一个相同nMASM支持续行符支持续行符 “”例例1 : 在屏幕上显示一段信息在屏幕上显示一段信息; ;数据
15、段(定义要显示的字符串)数据段(定义要显示的字符串)stringstringdbHello, Assembly !,0dh,0ah,$dbHello, Assembly !,0dh,0ah,$; ;代码段(显示字符串的程序)代码段(显示字符串的程序)mov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hHello, Assembly !程序功能程序功能7.2 常量、变量和标号常量、变量和标号 n汇编语言的数据可以简单分为常量和变量汇编语言的数据可以简单分为常量和变量n常量常量可以作为硬指令的可以作为硬指令的立
16、即数立即数或伪指令的参或伪指令的参数数n变量变量主要作为存储器操作数主要作为存储器操作数n汇编语言语句中的汇编语言语句中的名字和标号名字和标号具有逻辑地址具有逻辑地址和类型属性,主要用做和类型属性,主要用做地址操作数地址操作数,也可以,也可以作为立即数和存储器操作数作为立即数和存储器操作数7.2.1 常量常量常量表示一个固定的数值,它又分成多种形式常量表示一个固定的数值,它又分成多种形式常数常数字符串字符串符合常量符合常量1.1.数值表达式数值表达式1. 常数常数n指由指由10、16、2和和8进制形式表达的数值,各种进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母进制的数据以
17、后缀字母区分,默认不加后缀字母的是十进制数的是十进制数十进制十进制由由0 9数字组成,以字母数字组成,以字母D(d)结尾(缺省情况可以省略)结尾(缺省情况可以省略)100,255D十六进制十六进制由由0 9、A F数字组成,以字母数字组成,以字母H(h)结尾,以字母开头的常数需)结尾,以字母开头的常数需要加一个前导要加一个前导064H,0FFH0B800H二进制二进制由由0和和1两个数字组成,以字母两个数字组成,以字母B(b)结尾结尾01100100B2. 字符串字符串n字符串常量是用字符串常量是用单引号单引号或或双引号双引号括起来括起来的单个字符或多个字符的单个字符或多个字符n其数值是每个字
18、符对应的其数值是每个字符对应的ASCII码值码值n例如:例如:d(等于(等于64H)AB(等于(等于4142H)Hello, Assembly !3. 符号常量符号常量n符号常量使用标识符表达一个数值符号常量使用标识符表达一个数值n符号定义伪指令有符号定义伪指令有“等价等价EQU”和和“等号等号”:符号名符号名 EQU 数值表达式数值表达式符号名符号名 数值表达式数值表达式nEQU用于数值等价时不能重复定义符号名,用于数值等价时不能重复定义符号名,但但“”允许有重复赋值。例如:允许有重复赋值。例如:X= 7;等效于:;等效于:X qeu 7X= X+5;“X EQU X+5”是错误的是错误的4
19、. 数值表达式数值表达式n数值表达式一般是指由数值表达式一般是指由运算符运算符连接的各种常量连接的各种常量所构成的表达式所构成的表达式n汇编程序在汇编过程中计算表达式,最终得到汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量一个确定的数值,所以也是常量n表达式的数值在程序运行前的汇编阶段计算,表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确所以组成表达式的各部分必须在汇编时就能确定定n汇编语言支持多种运算符(汇编语言支持多种运算符(表表3.4)n我们经常使用的是加减乘除(我们经常使用的是加减乘除( * / )n例如:例如:mov ax,3*4
20、+5;等价于:;等价于:mov ax,17运算符运算符1. 算术运算符算术运算符: 加减乘除(加减乘除( * / )2. 取值运算符取值运算符: SEG、OFFSET、TYPE、SIZE和和LENGTH3. 属性运算符属性运算符 PTR地址操作符地址操作符n地址操作符取得名字或标号的段地址和偏移地址 将括起的表达式作为存储器地址指针 $当前偏移地址 :段前缀,采用指定的段地址寄存器OFFSET 名字/标号返回名字或标号的偏移地址SEG 名字/标号返回名字或标号的段地址类型操作符类型操作符n类型操作符类型操作符对名字或标号的类型属性进行设置对名字或标号的类型属性进行设置类型名类型名 PTR 名字
21、名字/标号标号n其中可以是其中可以是BYTE、WORD、DWORD(依次表示(依次表示字节、字、双字)等字节、字、双字)等,或者是或者是NEAR、FAR(分别表(分别表示近、远),还可以是由结构、记录等定义的类型示近、远),还可以是由结构、记录等定义的类型n对变量:对变量:lLENGTH 操作符获知某变量名指向多少个数据项操作符获知某变量名指向多少个数据项lSIZE 操作符获知它共占用多少字节空间操作符获知它共占用多少字节空间7.2.2 变量变量 n变量变量实质上是指内存单元的数据,虽然内存单实质上是指内存单元的数据,虽然内存单元地址不变,但其中存放的数据可以改变元地址不变,但其中存放的数据可
22、以改变n变量需要事先定义才能使用变量需要事先定义才能使用n变量定义(变量定义(Define)伪指令伪指令为变量申请固定长为变量申请固定长度为单位的存储空间,并可以同时将相应的存度为单位的存储空间,并可以同时将相应的存储单元初始化储单元初始化n定义后的变量可以利用变量名等方法引用其中定义后的变量可以利用变量名等方法引用其中的数据,即变量的数值的数据,即变量的数值1. 变量的定义变量的定义 n变量定义的汇编语言格式为:变量定义的汇编语言格式为:变量名变量名 伪指令伪指令 初值表初值表n变量名变量名为用户自定义标识符,表示初值表首元为用户自定义标识符,表示初值表首元素的逻辑地址,常称为符号地址。变量
23、名也可素的逻辑地址,常称为符号地址。变量名也可以没有以没有n初值表初值表是用逗号分隔的参数是用逗号分隔的参数,主要由常量、数值主要由常量、数值表达式或表达式或“?”组成。其中组成。其中“?”表示未赋初表示未赋初值值n多个存储单元如果初值相同,可以用复制操作多个存储单元如果初值相同,可以用复制操作符符DUP进行定义:进行定义:重复次数重复次数 DUP(重复参数重复参数)n变量定义伪指令有变量定义伪指令有DB、DW、DD等等字节变量的定义字节变量的定义DB(Define Byte)nDB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值n初值表中每个数据一定是字节量,存放一个8位数据:n
24、可以是0255的无符号数n或是128127带符号数n也可以是字符串常数字节变量定字节变量定义实例义实例;数据段Xdb a,-5db 2 dup(100),?Ydb ABC字节变量的应用字节变量的应用mov al,X;此处X表示它的第1个数据,故ALadec X+1;对X为始的第2个数据减1,故成为6mov Y,al;现在Y这个字符串成为 aBC字变量的定义字变量的定义DW(Define Word)nDW伪指令用于分配一个或多个字单元,伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值并可以将它们初始化为指定值n初值表中每个数据是字量,一个字单元可初值表中每个数据是字量,一个字单元可用于
25、存放任何用于存放任何16位数据:位数据:n一个段地址一个段地址n一个偏移地址一个偏移地址n两个字符两个字符n065535之间的无符号数之间的无符号数n3276832767之间的带符号数之间的带符号数字变量定义实例字变量定义实例;数据段countdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)双字变量的定义双字变量的定义DD(Define Double word)nDD伪指令伪指令用于分配一个或多个双字单元,用于分配一个或多个双字单元,并可以将它们初始化为指定值并可以将它们初始化为指定值n初值表中每个数据是一个初值表中每
26、个数据是一个3232位的双字量:位的双字量:n可以是有符号或无符号的可以是有符号或无符号的3232位整数位整数n也可以用来表达也可以用来表达1616位段地址(高位字)和位段地址(高位字)和1616位的偏移地址(低位字)的远指针位的偏移地址(低位字)的远指针varddvarddDD 0,?,12345678hDD 0,?,12345678hfarpointfarpoint DD 00400078hDD 00400078h2. 变量的应用变量的应用n变量变量具有存储单元的逻辑地址具有存储单元的逻辑地址n程序代码中程序代码中n通过变量名引用其指向的首个数据通过变量名引用其指向的首个数据n通过变量名加
27、减位移量存取以首个数据为基通过变量名加减位移量存取以首个数据为基地址的前后数据地址的前后数据 例例2 变量的定义变量的定义 ;数据段bvar1db 100,01100100b,64h,d;字节变量:不同进制表达同一个数值,内存中有4个64Hminint = 5;符号常量:minint数值为5,不占内存空间bvar2db -1,minint,minint+5;内存中数值依次为FFH,5,0AHdb ?,2 dup(20h);预留一个字节空间,重复定义了2个数值20Hwvar1dw 2010h,4*4;字变量:两个数据是2010H、0010H,共占4个字节wvar2dw ?;wvar2是没有初值的
28、字变量例例2 变量的定义(续)变量的定义(续)dvardd 12347777h,87651111h,?;双字变量:2个双字数据,一个双字空间abcdb a,b,c,?;定义字符,实际是字节变量maxint equ 0ah;符号常量:maxint10stringdb ABCDEFGHIJ;定义字符串:使用字节定义DB伪指令crlfsdb 13,10,$;回车符0DH、换行符0AH和字符$24Harray1 dw maxint dup(0);10个初值为0的字量,可以认为是数组arraydb 2 dup(2,3,2 dup(4);6个字节内容依次为:02 03 04 04 02 03 04 04例
29、例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;保存双字的求和结果mov word ptr dvar10,dx例例2 变量的应用(续)变量的应用(续)mov cx,maxint;CX10mov bx,0;BX0again: add stringbx
30、,3;string每个数值加3inc bxloop again;循环lea dx,abc;从abc开始mov ah,9;09H号DOS功能调用int 21h;显示结果:abcdDEFGHIJKLM3. 变量的定位变量的定位n汇编程序按照指令的先后顺序一个接着一个分配汇编程序按照指令的先后顺序一个接着一个分配存储空间,按照段定义伪指令规定的边界定位属存储空间,按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置(包括偏移地址)性确定每个逻辑段的起始位置(包括偏移地址)n定位伪指令定位伪指令ORG控制数据或代码所在的偏移地址控制数据或代码所在的偏移地址ORG 参数参数nORG伪指令是将当前偏
31、移地址指针指向参数表达伪指令是将当前偏移地址指针指向参数表达的偏移地址。的偏移地址。例如:例如:ORG 100h;从;从100H处安排数据或程序处安排数据或程序ORG $+10;偏移地址加;偏移地址加10,即跳过,即跳过10个字节空个字节空间间n汇编语言程序中,符号汇编语言程序中,符号“$”表示当前偏移地址值表示当前偏移地址值n 定义数据伪指令定义数据伪指令DB、DW、DD、DQ、DT n符号定义伪指令符号定义伪指令EQU、=n 段定义伪指令段定义伪指令SEGMENT和和ENDSn 设定段寄存器伪指令设定段寄存器伪指令ASSUMEn 定义过程的伪指令定义过程的伪指令PROC和和ENDPn 宏指
32、令宏指令MACRO n 定位伪指令定位伪指令ORGn 汇编结束伪指令汇编结束伪指令END 7.3 汇编语言伪指令汇编语言伪指令 1. 定义数据伪指令定义数据伪指令该类伪指令用来定义存储空间及其所存数据的长度。该类伪指令用来定义存储空间及其所存数据的长度。 DB:定义字节,即每个数据是:定义字节,即每个数据是1个字节。个字节。 DW:定义字,即每个数据占:定义字,即每个数据占1个字个字(2个字节个字节)。 DD:定义双字,即每个数据占:定义双字,即每个数据占2个字。低字部分个字。低字部分在低地址,高字部分在高地址。在低地址,高字部分在高地址。 DQ:定义:定义4字长,即每个数据占字长,即每个数据
33、占4个字。个字。 DT:定义:定义10个字节长,用于压缩式十进制数,个字节长,用于压缩式十进制数,例如:例如:DATA1 DB 5,6,8,100 DATA2 DW 7,287 TABLE DB ? ;表示在;表示在TABLE单单元中存放的内容是随机的元中存放的内容是随机的n当一个定义的存储区内的每个单元要放置同当一个定义的存储区内的每个单元要放置同样的数据时,可用样的数据时,可用DUP操作符。操作符。n一般格式一般格式:COUNT DUP(?)(?),nCOUNT 为重复的次数,为重复的次数,“()()”中为要中为要重复的数据。重复的数据。如:如:BUFFER DB 100DUP(0) ;表
34、示以;表示以BUFFER为首地址的为首地址的100个字节中存放个字节中存放00H数据数据 BUFFER1 DB 100 DUP(3,5,2DUP(10),),35),),24,NUM2. 符号定义伪指令符号定义伪指令nEQU 伪指令给符号定义一个值。在程序中,凡是出现该伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替,符号的地方,汇编时均用其值代替, 如:如:TIMES EQU 50 DATA DB TIMES DUP(?) 上述两个语句实际等效于如下一条语句:上述两个语句实际等效于如下一条语句: DATA DB 50 DUP(?)n“=”伪指令可给初始变量赋值。伪指
35、令可给初始变量赋值。 如:如:COUNT=100 ;COUNT=100 TIME=50 ;TIME=50n PURGE伪指令用于释放由伪指令用于释放由EQU伪指令定义的变量,使伪指令定义的变量,使这些变量可以被重新定义。这些变量可以被重新定义。 PURGE TIMES ; 释放释放TIMES变量变量 TIMES EQU 2 ; 重新定义重新定义3. 段定义伪指令段定义伪指令nSEGMENT和和ENDS 一般来说,一个完整的汇编源程序由一般来说,一个完整的汇编源程序由3个段组成,即堆个段组成,即堆栈段、数据段和代码段。段定义伪指令可将源程序划栈段、数据段和代码段。段定义伪指令可将源程序划分成若干
36、段,以便生成目的代码和连接时将各同名段分成若干段,以便生成目的代码和连接时将各同名段进行组合。进行组合。n 段定义伪指令一般格式为段定义伪指令一般格式为 : 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDSn SEGMENT和和ENDS应成对使用应成对使用,缺,缺不可。不可。 其中段名是不可省略的。其它是可选项,是赋予段名其中段名是不可省略的。其它是可选项,是赋予段名的属性,可以省略。的属性,可以省略。n例如:例如: DATA SEGMENT DW 20 DUP(?) DATA ENDS4.设定段寄存器伪指令设定段寄存器伪指令ASSUMEn一般格式一般
37、格式: ASSUME 段寄存器:段名段寄存器:段名,段寄存器:段名,段寄存器:段名,n功能功能:通知汇编程序,哪一个段寄存器是该段的段寄存:通知汇编程序,哪一个段寄存器是该段的段寄存器,如器,如CODE表示代码段,表示代码段,DATA表示数据段,表示数据段,STACK表表示堆栈段。示堆栈段。n例如:例如: CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送段值送AX MOV DS,AX ;AX内容送内容送DS,DS才有实际段值才有实际段值 . CODE ENDS 5.定义过程的伪指令定义过程的伪指令PROC和和EN
38、DPn在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。n格式格式: 过程名过程名 PROC 类型类型 过程体过程体 RET 过程名过程名 ENDP CODE1 SEGMENT ASSUME CS:CODE1 FARPROC PROC FAR . RET FARPROC ENDP CODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2 CALL FAR PROC . CODE2 ENDSnCODE1 段中的FAR PROC 过程被另一段CODE2调用,故为远过程。例例:6. ORG 伪指令伪指令nORG伪指令规定了在某一段
39、内,程序或数据代伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。码存放的起始偏移地址。n格式:格式: ORG n例如:例如:DATASEGMENT BUFF1 DB23,56H,EOF ORG2000H BUFF2 DBSTRING DATAENDSn上述变量定义中,上述变量定义中,BUFF1从从DATA段偏移地址段偏移地址为为0的单元开始存放,而的单元开始存放,而BUFF2则从则从DATA段段偏移为偏移为2000H的单元开始存放,两者不是连的单元开始存放,两者不是连续存放。续存放。 7. 汇编结束伪指令汇编结束伪指令ENDn该伪指令表示源程序的结束令汇编程序该伪指令表示源程序的结束
40、令汇编程序停止汇编。因此,任何一个完整的源程序停止汇编。因此,任何一个完整的源程序均应有均应有END指令。指令。n格式:格式: END 表达式表达式n其中表达式表示该汇编程序的启动地址。其中表达式表示该汇编程序的启动地址。n例如:例如: END START ;表明该程序的启;表明该程序的启动地址为动地址为START。7.4 汇编程序设计汇编程序设计 n简单程序设计简单程序设计 n分支程序设计分支程序设计 n循环程序设计循环程序设计 n子程序设计子程序设计 1. 顺序程序设计顺序程序设计n没有分支、循环等转移指令的程序,会没有分支、循环等转移指令的程序,会按指令书写的前后顺利依次执行,这就按指令
41、书写的前后顺利依次执行,这就是顺序程序是顺序程序n顺序结构是最基本的程序结构顺序结构是最基本的程序结构n完全采用顺序结构编写的程序并不多见完全采用顺序结构编写的程序并不多见例题例题4 顺序程序设计实例顺序程序设计实例采用查表法,实现一位采用查表法,实现一位16进制数进制数转换为转换为ASCII码显示码显示例例4 数据段数据段;数据段数据段ASCIIdb 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;对应;对应0 9的的ASCII码码db 41h,42h,43h,44h,45h,46h;对应;对应A F的的ASCII码码hexdb 04h,0bh;假设两个数据;
42、假设两个数据例例4 代码段代码段;代码段代码段mov bx,offset ASCII ;BX指向指向ASCII码表码表mov al,hex ;AL取得一位取得一位16进制数,恰好就是进制数,恰好就是ASCII码表中的位移码表中的位移and al,0fh ;只有低;只有低4位是有效的,高位是有效的,高4位清位清0Xlat ;换码:;换码:ALDS:BXALmov dl,al ;入口参数:;入口参数:DLALmov ah,2 ;02号号DOS功能调用功能调用int 21h ;显示一个;显示一个ASCII码字符码字符mov al,hex+1 ;转换并显示下一个数据;转换并显示下一个数据and al,
43、0fhxlatmov dl,almov ah,2int 21h2. 分支程序设计分支程序设计n分支程序根据条件是真或假决定执行与否分支程序根据条件是真或假决定执行与否n判断的条件是各种指令,如判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志等执行后形成的状态标志n转移指令转移指令Jcc和和JMP可以实现分支控制可以实现分支控制n分支结构有分支结构有n单分支结构单分支结构n双分支结构双分支结构n多分支结构多分支结构单分支结构单分支结构 n条件成立跳转,否则顺序执行分支语句体n注意选择正确的条件转移指令和转移目标地址计算计算AX中有符号数的绝对值中有符号数的绝对值cmp ax,0jg
44、e nonneg;条件满足(AX0),转移neg ax;条件不满足,求补nonneg: mov result,ax ;条件满足;不恰当的分支cmp ax,0jl yesneg;条件满足(AX0),转移jmp nonnegyesneg: neg ax;条件不满足,求补nonneg: mov result,ax ;条件满足双分支结构双分支结构条件成立跳转执行第条件成立跳转执行第2个个分支语句体,否则顺序执分支语句体,否则顺序执行第行第1个分支语句体个分支语句体注意第注意第1个分支体后一定个分支体后一定要有一个要有一个JMP指令跳到第指令跳到第2个分支体后个分支体后例:显示例:显示BX的最高位的最高
45、位shl bx,1;BX最高位移入CF标志jc one;CF1,即最高位为1,转移mov dl,30h;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;显示例例5. 显示压缩显示压缩BCD
46、码,无前导码,无前导0;数据段数据段BCDdb 04h ;代码段代码段mov dl,BCDtest dl,0ffh;如果;如果BCD码为码为0,显示,显示0jz zero;双分支结构;双分支结构test dl,0f0h;如果;如果BCD码高位为码高位为0,不显,不显示示0jz one ;单分支结构;单分支结构显示压缩显示压缩BCD码,无前导码,无前导0(续)(续)mov cl,4;处理高位;处理高位shr dl,clor dl,30h;转换为;转换为ASCII码码mov ah,2;显示高位;显示高位int 21hmov dl,BCDand dl,0fhone:or dl,30h;处理低位;处理
47、低位jmp twozero: mov dl,0two: mov ah,2int 21h例例6: 大小写字母转换大小写字母转换;如果如果DL是一个小写字母,则转换为大写是一个小写字母,则转换为大写cmp dl,a ;小于小写字母;小于小写字母a,不需要处理,不需要处理jb dispcmp dl,z ;大于小写字母;大于小写字母z,也不需要处理,也不需要处理ja dispsub dl,20h ;是小写字母,则转换为大写;是小写字母,则转换为大写disp: 多分支结构多分支结构多分支结构是多个条多分支结构是多个条件对应各自的分支语件对应各自的分支语句体,哪个条件成立句体,哪个条件成立就转入相应分支体
48、执就转入相应分支体执行行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNor ah,ah;cmp ah,0jz function0dec ah;cmp ah,1jz function1dec ah;cmp ah,2jz function23. 循环程序设计循环程序设计n循环程序结构循环程序结构是满足一定条件的情况下,是满足一定条件的情况下,重复执行某段程序重复执行某段程序n循环结构的程序通常有循环结构的程序通常有3个部分:个部分:n 循环初始部分循环初始部分为开始循环准备必要的条为开始循环准备必要的条件,如循环次数、循环体需要的数值等件,如循环次数、循环体需
49、要的数值等n 循环体部分循环体部分指重复执行的程序部分,其指重复执行的程序部分,其中包括对循环条件等的修改程序段中包括对循环条件等的修改程序段n循环控制部分循环控制部分判断循环条件是否成立,判断循环条件是否成立,决定是否继续循环决定是否继续循环循环控制循环控制n循环结构程序循环结构程序的设计关键是循环控制部分的设计关键是循环控制部分n循环控制可以在进入循环之前进行,也可循环控制可以在进入循环之前进行,也可以在循环体后进行,于是形成两种结构:以在循环体后进行,于是形成两种结构:n“先判断、后循环先判断、后循环”结构结构n“先循环、后判断先循环、后判断”结构结构n循环结束的控制可以用循环次数,还可
50、以循环结束的控制可以用循环次数,还可以用特定条件等,于是又有:用特定条件等,于是又有:n计数控制循环计数控制循环n条件控制循环条件控制循环先循环后判断的循环结构先循环后判断的循环结构 结束结束 初始化初始化 循环的初始状态循环的初始状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循环条件控制循环修改部分修改部分控制条件控制条件Y YN N1. 计数控制循环计数控制循环 n计数控制循环计数控制循环利用利用循环次数循环次数作为控制条件作为控制条件n易于采用循环指令易于采用循环指令LOOP和和JCXZ实现实现n初始化:将循环次数或最大初始化:将循
51、环次数或最大循环次数置入循环次数置入CXn循环体循环体n循环控制:用循环控制:用LOOP指令对指令对CX减减1、并判断是否为、并判断是否为0例例7: 用二进制显示用二进制显示BL内容内容mov cx,8;CX8(循环次数)(循环次数)again: shl bl,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,则循环,则循环计数控制循
52、环计数控制循环先循环后判断先循环后判断例例8. 求数组元素的最大值和最小值求数组元素的最大值和最小值;数据段数据段arraydw 10;假设一个数组,其中头个数据;假设一个数组,其中头个数据10表示元素个数表示元素个数dw -3,0,20,900,587,-632,777,234,-34,-56;这是一个有符号字量元素组成的数组;这是一个有符号字量元素组成的数组maxay dw ?;存放最大值;存放最大值minay dw ?;存放最小值;存放最小值初始化:循环次数元素个数初始化:循环次数元素个数1循环体:逐个比较求最大、小值循环体:逐个比较求最大、小值循环控制:比较完所有数据循环控制:比较完所
53、有数据例例8. 代码段代码段;代码段;代码段lea si,arraymov cx,si;取得元素个数;取得元素个数dec cx;减;减1后是循环次数后是循环次数add si,2mov ax,si;取出第一个元素给;取出第一个元素给AX,AX用于暂存最大值用于暂存最大值mov bx,ax;取出第一个元素给;取出第一个元素给BX,BX用于暂存最小值用于暂存最小值初始化例例8. 代码段(续)代码段(续)maxck:add si,2cmp si,ax;与下一个数据比较jle minckmov ax,si;AX取得更大的数据jmp nextminck:cmp si,bxjge nextmov bx,si
54、;BX取得更小的数据next:loop maxck;计数循环mov maxay,ax;保存最大值mov minay,bx;保存最小值循环体2. 条件控制循环条件控制循环n条件控制循环需要利用特定条件条件控制循环需要利用特定条件判断循环是否结束判断循环是否结束n条件控制循环用条件转移指令判条件控制循环用条件转移指令判断循环条件断循环条件n转移指令可以指定目的标号来改转移指令可以指定目的标号来改变程序的运行顺序,如果目的标变程序的运行顺序,如果目的标号指向一个重复执行的语句体的号指向一个重复执行的语句体的开始或结束,便构成了循环控制开始或结束,便构成了循环控制结构结构例例9. 显示以显示以0结尾的
55、字符串结尾的字符串;数据段;数据段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: 条件控制循环条件控制循环先判断后循环先判断后循环例例10 记录某个字存储单元数据中记录某个字存储单元数据中1的个数的个数;数据段数据段numberdw 11100B;代码段代码段mov bx,numberxor dl,dl;循环初值:;循
56、环初值:DL0again:test bx,0ffffh;也可以用;也可以用cmp bx,0jz done;全部是;全部是0就可以退出循环,减少循环次数就可以退出循环,减少循环次数shl bx,1;用指令;用指令shr bx,1也可以也可以adc dl,0;利用;利用ADC指令加指令加CF的特点进行计数的特点进行计数jmp again条件控制循环条件控制循环先判断后循环先判断后循环例例10. 十进制显示(十进制显示(016数值)数值)done: cmp dl,10;判断;判断1的个数是否小于的个数是否小于10jb digit;1的个数小于的个数小于10,转移,转移push dxmov dl,1;
57、1的个数大于或等于的个数大于或等于10mov ah,2;则要先显示一个;则要先显示一个1int 21hpop dxsub dl,10digit: add dl,0;显示个数;显示个数mov ah,2int 21h单分支结构单分支结构4. 子程序设计子程序设计 n把功能相对独立的程序段单独编写和调把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使试,作为一个相对独立的模块供程序使用,就形成用,就形成子程序子程序n子程序可以实现源程序的子程序可以实现源程序的模块化模块化,可简,可简化源程序结构,可以提高编程效率化源程序结构,可以提高编程效率n主程序(调用程序)需要利用主程序(调用
58、程序)需要利用CALL指令指令调用子程序(被调用程序)调用子程序(被调用程序)n子程序需要利用子程序需要利用RET指令返回主程序指令返回主程序1. 过程定义和子程序编写过程定义和子程序编写n汇编语言中,子程序要用一对过程伪指令汇编语言中,子程序要用一对过程伪指令PROC和和ENDP声明,格式如下:声明,格式如下:过程名过程名PROC NEAR|FAR;过程体过程体过程名过程名ENDPn可选的参数指定过程的调用属性。没有指定过可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性程属性,则采用默认属性nNEARNEAR属性(段内近调用)的过程只能被相同属性(段内近调用)的过程只能被相同代
59、码段的其他程序调用代码段的其他程序调用nFARFAR属性(段间远调用)的过程可以被相同属性(段间远调用)的过程可以被相同或不同代码段的程序调用或不同代码段的程序调用子程序编写注意事项子程序编写注意事项子程序要利用过程定义伪指令声明子程序要利用过程定义伪指令声明子程序最后利用子程序最后利用RET指令返回主程序,主程序指令返回主程序,主程序执行执行CALL指令调用子程序指令调用子程序子程序中对堆栈的压入和弹出操作要成对使用,子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈的平衡保持堆栈的平衡子程序开始应该保护使用到的寄存器内容,子子程序开始应该保护使用到的寄存器内容,子程序返回前相应进行恢复程序
60、返回前相应进行恢复子程序应安排在代码段的主程序之外,最好放子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置(返回在主程序执行终止后的位置(返回DOS后、汇后、汇编结束编结束END伪指令前),也可以放在主程序开伪指令前),也可以放在主程序开始执行之前的位置始执行之前的位置子程序编写注意事项(续)子程序编写注意事项(续)子程序允许嵌套和递归子程序允许嵌套和递归子程序可以与主程序共用一个数据段,也可以子程序可以与主程序共用一个数据段,也可以使用不同的数据段(注意修改使用不同的数据段(注意修改DS),还可以),还可以在子程序最后设置数据区(利用在子程序最后设置数据区(利用CS寻址)寻址
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国乳胶曲指手套行业投资前景及策略咨询报告
- 门诊vip管理制度
- 阀门厂品控管理制度
- 陶瓷厂砂仓管理制度
- 非在册员工管理制度
- 餐具回收区管理制度
- 餐厅工作群管理制度
- 餐饮业噪声管理制度
- 2025年交通设备制造业数字化转型中的项目管理与实施报告
- 2025年交通设备制造业数字化转型下的智能交通设备制造物联网报告
- 2025-2030中国空调行业发展分析及发展趋势预测与投资风险研究报告
- 乳房外Paget病诊治专家共识(2024版)解读
- 采购合同付款协议书
- 2025江西上饶市国控投资集团限公司招聘中层管理6人易考易错模拟试题(共500题)试卷后附参考答案
- 2025-2030中国碲化镉(CdTe)行业市场发展趋势与前景展望战略研究报告
- DB64-T 2133-2025 骨干渠道安全巡护检查技术导则
- 2025-2030中国协作机器人行业市场现状供需分析及投资评估规划分析研究报告
- 储能站施工组织设计施工技术方案(技术标)
- 楼梯 栏杆 栏板(一)22J403-1
- 广西河池市(2024年-2025年小学六年级语文)统编版期末考试((上下)学期)试卷及答案
- 2024届九省联考英语试题(含答案解析、MP3及录音稿)
评论
0/150
提交评论