




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1微型计算机原理及应用微型计算机原理及应用2第三章第三章 汇编语言程序设计汇编语言程序设计33.1 3.1 汇编语言基本元素汇编语言基本元素4 由汇编语言编写的源程序是由许多语句由汇编语言编写的源程序是由许多语句(也可称也可称为汇编指令为汇编指令)组成的。每个语句由组成的。每个语句由14个部分组成,个部分组成,其格式是:其格式是:标识符标识符 指令助记符指令助记符 操作数操作数;注解;注解 其中用方括号括起来的部分,可以有也可以其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格没有。每部分之间用空格(至少一个至少一个)分开,一行最分开,一行最多可有多可有132个字符。个字符。3.1.
2、1 3.1.1 汇编语言的语句格式汇编语言的语句格式5(1)标识符:标识符:给指令或某一存储单元地址所起的名字。给指令或某一存储单元地址所起的名字。标识符由下列字符组成标识符由下列字符组成:(以字母或圆点开头):(以字母或圆点开头)字母字母: AZ, az; 数字数字: 09; 特殊字符特殊字符: ? . _ $ 数字不能作标识符的第一个字符,而数字不能作标识符的第一个字符,而. 仅能作仅能作标识符的第一个字符,标识符最长为标识符的第一个字符,标识符最长为31个字符。个字符。标识符后跟冒号时标识符后跟冒号时表示标号表示标号,代表该行指令的起代表该行指令的起始地址始地址, 标号可以被转移、调用指
3、令直接引用。标号可以被转移、调用指令直接引用。标识符后不带冒号时标识符后不带冒号时表示变量表示变量。伪指令前的标识符不加冒号。伪指令前的标识符不加冒号。 6(2)指令助记符指令助记符 表示不同操作的指令表示不同操作的指令,可以是,可以是8086/8088的指令助的指令助记符,也可以是伪指令。记符,也可以是伪指令。 (3)操作数操作数 是指令执行的对象。是指令执行的对象。依指令的要求,可能有一个、依指令的要求,可能有一个、两个、没有或者多个。两个、没有或者多个。 例如:例如: RET ;无操作数无操作数 COUNT: INC CX ;一个操作数一个操作数 MOV CX,DI ;两个操作数两个操作
4、数 ADD AX,BP十十4 ;第二个操作数为表达式;第二个操作数为表达式 (4)注释注释 该项可有可无,是为源程序所加的注解,用于提高该项可有可无,是为源程序所加的注解,用于提高程序的可读性。程序的可读性。 7汇编语言运算符:汇编语言运算符:是汇编程序在汇编时计算的是汇编程序在汇编时计算的,与运算指令不同,指令是在程序运行时计算的。与运算指令不同,指令是在程序运行时计算的。1、算术运算符、逻辑运算符、关系运算符、算术运算符、逻辑运算符、关系运算符 如:、如:、 / 、 AND、OR、LT等等 MOV AX, DI+BX ADD AX, FIRST+1MOV AX, (choice LT 20
5、) AND 5) OR (choice GE 20) AND 6 )3.1.2 3.1.2 汇编语言运算符汇编语言运算符8注意:注意: 算术运算符总可以用于数字操作,其结果也是算术运算符总可以用于数字操作,其结果也是数字的。当应用于存储器操作数时,只有数字的。当应用于存储器操作数时,只有+, -运运算符有意义;算符有意义; 逻辑运算符的操作数也必须是数字,存储器操逻辑运算符的操作数也必须是数字,存储器操作数不能进行逻辑运算;作数不能进行逻辑运算; 关系运算符连接的两个操作数,必须都是数字关系运算符连接的两个操作数,必须都是数字的或是在同一段内的存储器地址。的或是在同一段内的存储器地址。92、取
6、值运算符取值运算符 1) $运算符运算符$:当前地址偏移量的值:当前地址偏移量的值BLOCK DB HELLO!NUM EQU $-BLOCKHELLO!BLOCK$;NUM为为 6102) SEG 和和OFFSETSEG: 求标号或变量的段地址求标号或变量的段地址OFFSET: 求标号或变量的偏移地址求标号或变量的偏移地址例如,定义:例如,定义: SLOT DW 25则:则:MOV AX,SLOT; 从从SLOT地址中取一个字送入地址中取一个字送入AX MOV AX,SEG SLOT; 将将SLOT的段地址送入的段地址送入AX MOV AX,OFFSET SLOT; 将将SLOT的段内偏移地
7、址送的段内偏移地址送AX 113) TYPE 返回标号或存储器操作数的类型值返回标号或存储器操作数的类型值对对存储器操作数存储器操作数:表示占用的字节数:表示占用的字节数 对标号:表示过程或指令地址的调用类型对标号:表示过程或指令地址的调用类型表表3-1 存储器操作数的类型属性及返回值存储器操作数的类型属性及返回值 字节字节 字字 双字双字 NEAR FAR 1 2 4 1 2124) LENGTH 和和 SIZE(对用对用DUP定义数据的情况下)定义数据的情况下)LENGTH:返回一个与存储器操作数相联系的基本数据个数,返回一个与存储器操作数相联系的基本数据个数, SIZE:返回一个为存储器
8、操作数分配的字节数返回一个为存储器操作数分配的字节数 关系:关系:SIZE=LENGTH TYPE例如:若例如:若 MULT-WORD DW 50 DUP(0)则则 LENGTH MULT-WORD=50 SIZE MULT-WORD=100 TYPE MULT-WORD=2133、属性运算符、属性运算符 用来给指令中的操作数指定一个临时的属性,而用来给指令中的操作数指定一个临时的属性,而暂时暂时忽略操作数定义时的属性。忽略操作数定义时的属性。1) PTR 定义操作数为新的类型定义操作数为新的类型一般格式:类型一般格式:类型 PTR 操作数操作数功能:建立一个存储器操作数,它与其后的存储器操功
9、能:建立一个存储器操作数,它与其后的存储器操作数有相同的段地址和偏移地址,但有不同的类型。作数有相同的段地址和偏移地址,但有不同的类型。 F2 DW 3456HMOV AL, BYTE PTR F2MOV BX, 3MOV BYTE PTR BX, 3; AL: 56H; 错,类型不明确错,类型不明确; 字节传输字节传输143.1.3 3.1.3 表达式表达式 是由运算符和操作数组成的序列,在汇是由运算符和操作数组成的序列,在汇编时产生一个确定的值。这个值可以仅表示编时产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的偏移一个常量,也可以表示一个存储单元的偏移地址,相应的表达
10、式称为常量表达式和地址地址,相应的表达式称为常量表达式和地址表达式。表达式。 151、 常数常数二进制二进制(B),八进制八进制(Q),十六进制十六进制(H),十进制十进制(D)(默认默认),十进制浮点数,十六进制实数,字符和字符串十进制浮点数,十六进制实数,字符和字符串100 01100100B 244Q 64HBD This is a classroom.162、常量操作数、常量操作数 常量操作数是一个数值操作数,一般是常量常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符。或者是表示常量的标识符。 如如:COUNT EQU 10 NAME=J 可以为数字常量操作数或字符串常量操
11、作数。可以为数字常量操作数或字符串常量操作数。前者可采用二进制、八进制、十进制或十六进制前者可采用二进制、八进制、十进制或十六进制等进位计数形式;而后者所对应的常量值为相应等进位计数形式;而后者所对应的常量值为相应字符的字符的ASCII码。码。 173、存储器操作数、存储器操作数 存储器操作数是一个地址操作数,代表一个存储器操作数是一个地址操作数,代表一个存储单元的地址,通常以标识符的形式出现。存储单元的地址,通常以标识符的形式出现。 变量:变量:代表的是某个数据在数据段、附加段或堆代表的是某个数据在数据段、附加段或堆栈段中的地址。变量所对应的存储单元内容在程栈段中的地址。变量所对应的存储单元
12、内容在程序的运行过程中是可以改变的。序的运行过程中是可以改变的。标号:标号:代表的是某条指令代码在代码段中的地址。代表的是某条指令代码在代码段中的地址。标号通常作为转移指令或调用指令的目标操作数,标号通常作为转移指令或调用指令的目标操作数,在程序运行过程中不能改变。在程序运行过程中不能改变。 18存储器操作数有三个属性存储器操作数有三个属性1) 段属性段属性(SEG) : 所对应存储单元的段地址所对应存储单元的段地址2) 偏移量属性偏移量属性(OFFSET) :所对于存储单元在所所对于存储单元在所在段内的偏移地址在段内的偏移地址(距段起点的字节数距段起点的字节数)3) 类型属性类型属性(TYP
13、E)变量的类型变量的类型 是占用存储单元的字节数,分为:是占用存储单元的字节数,分为: DB(1个字节个字节) DW(2个字节个字节) DD(4个字节个字节)标号标号的类型的类型 则反映了相应存储单元地址在作为则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,转移或调用指令的目标操作数时的寻址方式,可有两种情况,即可有两种情况,即NEAR和和FAR。 19DATA SEGMENT X DB 5, 4 Y DW 40H Z DD 2030HDATA ENDS05H04H40H00H30H20H00H00HDS:0000HXYZX,Y,Z分别都有三个属性:分别都有三个属性:段地
14、址,偏移地址和类型值,段地址,偏移地址和类型值,这三个属性都有固定的值。这三个属性都有固定的值。204、常量表达式、常量表达式 由常量操作数及运算符构成由常量操作数及运算符构成, ,在汇编时产生在汇编时产生一个常量。一个常量。 如如PORT、VAL十十1、 OFFSET SUM、 SEG SUM、TYPE CYCLE等。等。 215、地址表达式、地址表达式 由存储器操作数与运算符构成,但由存储器操由存储器操作数与运算符构成,但由存储器操作数构成地址表达式时,必须有明确的物理意义。作数构成地址表达式时,必须有明确的物理意义。 例如例如 SUM2、CYCLE5 表达式表达式SUMSUM2 2、CY
15、CLECYCLE5 5的值仍然是一个存的值仍然是一个存储器操作数,该存储器操作数的段地址与类型属储器操作数,该存储器操作数的段地址与类型属性分别与存储器操作数性分别与存储器操作数SUMSUM及及CYCLECYCLE相同,但偏移相同,但偏移地址分别比地址分别比SUMSUM及及CYCLECYCLE大大2 2或小或小5 5。表达式是在汇。表达式是在汇编时计算的,而变量单元的内容在程序的运行过编时计算的,而变量单元的内容在程序的运行过程中可以改变。程中可以改变。 223.1.4 3.1.4 汇编语言程序汇编步骤汇编语言程序汇编步骤23.ASM.OBJ.EXE汇编汇编连接连接宏汇编程序:宏汇编程序: M
16、ASM.EXE连接程序:连接程序: LINK.EXE编编辑辑程程序序源源程程序序连连接接程程序序汇汇编编程程序序目目标标程程序序执执行行程程序序步骤:步骤:1)编写源程序;编写源程序;2)汇编;汇编;3)连接;连接;4)调试。调试。24用户编写程序,程序在计算机中运行,用户编写程序,程序在计算机中运行,计算机的控制由操作系统交给用户程序,运计算机的控制由操作系统交给用户程序,运行用户程序,当用户程序运行结束后,应再行用户程序,当用户程序运行结束后,应再将控制权交回操作系统,所以,在程序中应将控制权交回操作系统,所以,在程序中应该有返回该有返回DOS的操作。在计算机中,返回的操作。在计算机中,返
17、回DOS的操作由操作系统中的一个子程序来实的操作由操作系统中的一个子程序来实现,用户使用时调用这个子程序即可。现,用户使用时调用这个子程序即可。25每当一个用户的可执行文件每当一个用户的可执行文件.EXE装入内存后,存储器的装入内存后,存储器的分配情况如图:分配情况如图:系统占用系统占用程序段前缀程序段前缀用户数据区用户数据区用户堆栈区用户堆栈区用户代码段用户代码段系统和系统和ROM占用占用00000HDS,ES100个字节个字节SS用户程序空间用户程序空间FFFFFHCS26系统占用系统占用INT 20H 程序段前缀程序段前缀用户数据区用户数据区用户堆栈区用户堆栈区用户代码段用户代码段系统和
18、系统和ROM占用占用无论用户程序有几段,也无论这些段无论用户程序有几段,也无论这些段的排列顺序如何,用户程序的代码前的排列顺序如何,用户程序的代码前一定有一定有100个字节的个字节的程序段前缀程序段前缀(Program Segment Prefix, 简称简称PSP),PSP给出了用户的可执行文件给出了用户的可执行文件(.EXE)的若干控制信息。其中的若干控制信息。其中PSP的开始处的开始处(第第1,2字节字节)有一条中断指令有一条中断指令INT 20H的代码,通过它可以的代码,通过它可以结束用户程序,结束用户程序,返回操作系统返回操作系统。在用户程序执行完以。在用户程序执行完以后,通过执行该
19、条指令就可以返回后,通过执行该条指令就可以返回DOS。27如何使用户程序执行完后返回来执行这条指令?如何使用户程序执行完后返回来执行这条指令?系统占用系统占用INT 20H 程序段前缀程序段前缀用户数据区用户数据区用户堆栈区用户堆栈区用户代码段用户代码段RET系统和系统和ROM占用占用DS,ESSSCS首先将用户程序定义为一个首先将用户程序定义为一个远过程远过程,当,当可执行文件装入内存后,可执行文件装入内存后,DS,ES两个段两个段寄存器被寄存器被CPU自动设置为指向自动设置为指向PSP的首的首址,所以一般程序的开始指令为:址,所以一般程序的开始指令为: PUSH DS MOV AX, 0
20、PUSH AX即将即将DS的内容和的内容和0000H压入堆栈,程序压入堆栈,程序结束时的最后一条语句为结束时的最后一条语句为RET,就把压就把压入堆栈的入堆栈的PSP段的段地址和偏移地址段的段地址和偏移地址0000H弹出并送入弹出并送入CS和和IP,转而执行返转而执行返回回DOS的指令的指令INT 20H。00H00HPSPLPSPH堆栈堆栈情况情况28返回操作系统的另一个办法是通过系统调返回操作系统的另一个办法是通过系统调用(调用号是用(调用号是4CH)。这时,这时, 在用户程序结在用户程序结束时,用下面两条指令:束时,用下面两条指令: MOV AH, 4CH INT 21H即可实现返回即可
21、实现返回DOS。293.2 3.2 伪指令伪指令30伪指令:伪指令不是伪指令:伪指令不是CPU运行的指令,而是运行的指令,而是程序员给程序员给汇编程序汇编程序下达的命令。是在汇编源下达的命令。是在汇编源程序期间由程序期间由汇编程序执行的命令汇编程序执行的命令。伪指令用来对汇编程序进行控制,对程伪指令用来对汇编程序进行控制,对程序中的数据进行存储空间分配、实现条件汇序中的数据进行存储空间分配、实现条件汇编、列表等处理,其格式和汇编指令一样,编、列表等处理,其格式和汇编指令一样,但但不产生目标代码不产生目标代码,即不直接命令即不直接命令CPU去执去执行什么操作。行什么操作。 313.2.1 数据定
22、义伪指令数据定义伪指令DB:定义字节,其后的每个操作数占有一个存储定义字节,其后的每个操作数占有一个存储单元,连续存放;单元,连续存放;BUFFER DB 2, 3STRING DB NOON03H02HBUFFERDW:定义字,其后的每个操作数占有两个字节;定义字,其后的每个操作数占有两个字节;BUF DW 2, 3, 505H00H00H03H00H02HBUFSTRINGDD: 定义双字,其后每个操作定义双字,其后每个操作数占数占4个字节;个字节;还有还有DQ(4个字长)、个字长)、DT(10个字节长)个字节长)32若仅保留单元,不初始化,用若仅保留单元,不初始化,用?代替初值;代替初值
23、;若数据重复,用若数据重复,用 n DUP( )代替,代替,n为重复次数。为重复次数。ARRAY DB 100 DUP(?)保留保留100个字节,首地址为个字节,首地址为ARRAY,不初始化,不初始化,即即100个字节内均为随机值个字节内均为随机值DATA1 DB 100 DUP(AB)初始化初始化200个字节,内有个字节,内有100个个41H, 42H(即(即41H 42H 41H 42H 41H 42H)33例:有如下数据定义伪指令:例:有如下数据定义伪指令:VAL DB 1,4 DUP (5, 2 DUP(FFH, 0 )则在则在VAL存储区前存储区前10个字节单元的数据是:个字节单元的
24、数据是:1,5,FFH,0,FFH, 0, 5, FFH,0,FFH若定义若定义 DW 1, 2, 5 DUP(YES,2 DUP(3), 则在存则在存储区的数据是什么?储区的数据是什么?343.2.2 符号定义伪指令符号定义伪指令标识符标识符 EQU 表达式表达式标识符标识符 = 表达式表达式给标识符定义一个值或其他符号名或一条可执行语句,给标识符定义一个值或其他符号名或一条可执行语句,汇编时,凡是出现该标识符的地方就用定义的数据替代。汇编时,凡是出现该标识符的地方就用定义的数据替代。注意:注意:用用EQU赋值的名字不能重新赋值,需用赋值的名字不能重新赋值,需用PURGE释释放后重新定义。如
25、:放后重新定义。如:PURGE TIMES TIMES EQU 100TIMES EQU 50BUF DB TIMES DUP(?)等效于:等效于:BUF DB 50 DUP(?)BETA = TIMES-2BETA = TIMES+5 ;重新赋值重新赋值35DATA SEGMENT A DW 3 B DW 4 L EQU B-ADATA ENDS03H00H04H00HDS:0000H数据段数据段L为常量,不占空间,值为为常量,不占空间,值为2363.2.3 段定义伪指令段定义伪指令SEGMENT和和ENDS一般的源程序分为一般的源程序分为4个段:代码段个段:代码段Code、数据段数据段Da
26、ta、堆栈段堆栈段Stack、附加段附加段Extra。各个段从段定义语句开始,到段结束语句各个段从段定义语句开始,到段结束语句ENDS结束。结束。段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别段体段体段名段名 ENDS用户指定用户指定可任选定义可任选定义371)段名必须是合法的标识符。段名必须是合法的标识符。2)定位类型:定位类型:表示本段起始地址位于何处表示本段起始地址位于何处内存可以看成是一本书内存可以看成是一本书,将其将其分成分成页页,段段,字字,和字节和字节。每每256个地址为一页个地址为一页(PAGE),每页的起始地址为二进制:每页的起始地址为二进制:* *
27、* 0000 000016进制:进制:*00H第一页第一页 (256个地址个地址)第二页第二页 (256个地址个地址)00000H000FFH00100H00200H001FFH38每每16个地址为一段个地址为一段(PARA),每段的起始地址为二进制:每段的起始地址为二进制:* * * * 000016进制:进制:*0H第一段第一段 (16个地址个地址)第二段第二段 (16个地址个地址)*00H*0FH*10H*1FH*20H段段(节节)是默认的定位类型。是默认的定位类型。39每每2个地址为一个字个地址为一个字(WORD),每个字的起始地址为每个字的起始地址为偶数偶数;最基本的类型是字节最基本
28、的类型是字节(BYTE),每个每个字节只包含一个地址字节只包含一个地址,可以是内存的任何空间。可以是内存的任何空间。定位类型表示所定义的段存放在内存空间时,段定位类型表示所定义的段存放在内存空间时,段首地址对内存空间的要求首地址对内存空间的要求,即段起始点是放在一,即段起始点是放在一页的起点上页的起点上(PAGE)还是一段的起点上还是一段的起点上(PARA)等,等,如果不定义定位类型,编译程序将默认其为段类如果不定义定位类型,编译程序将默认其为段类型,即将段首地址放在从型,即将段首地址放在从*0H开始的内存空间。开始的内存空间。BYTE: 表示本段起始单元可以从任一地址开始;表示本段起始单元可
29、以从任一地址开始;WORD: 表示本段起始单元从一个偶地址开始表示本段起始单元从一个偶地址开始;PARA: 表示本段起始单元从一个段的边界开始表示本段起始单元从一个段的边界开始(默认默认);PAGE: 表示本段起始单元从一个页的边界开始。表示本段起始单元从一个页的边界开始。403)组合类型组合类型告诉汇编程序,所定义的段与其他段的关系,即告诉汇编程序,所定义的段与其他段的关系,即将该段存放内存时,是否将该段与其他段在物理将该段存放内存时,是否将该段与其他段在物理上或逻辑上放在一起。上或逻辑上放在一起。NONE: 表示本段与其他段不发生任何关系,该表示本段与其他段不发生任何关系,该段有自己的段基
30、址,段有自己的段基址,是默认的组合关系。是默认的组合关系。PUBLIC:在满足定位类型的前提下与其他模块在满足定位类型的前提下与其他模块的同名段连接在一起,形成一个新的逻辑段,的同名段连接在一起,形成一个新的逻辑段,共共用一个段基址用一个段基址。41COMMON: 表示产生一个覆盖段。连接时,把本表示产生一个覆盖段。连接时,把本段与其他段与其他也用也用COMMON说明的同名段说明的同名段置成相同的置成相同的起始地址,重叠在一起,共享相同的存储区,其起始地址,重叠在一起,共享相同的存储区,其段长度由最长的段确定。段长度由最长的段确定。STACK: 在每个汇编程序中,只能必须有一个堆栈在每个汇编程
31、序中,只能必须有一个堆栈段,连接时,将本段与其他段,连接时,将本段与其他也用也用STACK说明的同说明的同名段名段连接成一个连续的连接成一个连续的STACK段,段,编译程序自动编译程序自动初始化初始化SS和和SP寄存器寄存器,使,使SS的内容为该连续段的的内容为该连续段的段基址,段基址,SP指向堆栈底部加指向堆栈底部加1的存储单元。的存储单元。42MEMORY: 表示本段在存储器中应定位在所表示本段在存储器中应定位在所有其他段的最高地址。有其他段的最高地址。AT: 表示本段从表达式指定的地址表示本段从表达式指定的地址处开始装入,这样,在程序中用户就可以直接处开始装入,这样,在程序中用户就可以直
32、接定义段地址,这种方式不适用于代码段。定义段地址,这种方式不适用于代码段。434) 类别类别 是用单引号括起来的字符串,以表明该段的是用单引号括起来的字符串,以表明该段的类别,如代码段类别,如代码段(CODE)、数据段数据段(DATA)、堆堆栈段栈段(STACK)等。当然也允许用户在类别中用等。当然也允许用户在类别中用其他的名,这样进行连接时,连接程序便将同其他的名,这样进行连接时,连接程序便将同类别的段类别的段(但不一定同名但不一定同名)放在连续的存储区内。放在连续的存储区内。443.2.4 设定段寄存器伪指令设定段寄存器伪指令ASSUME一般格式:一般格式:ASSUME 段寄存器段寄存器:
33、 段名段名,段寄存器段寄存器: 段名,段名,功能:功能:通知汇编程序,哪一个段寄存器是该段的通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。正确的目的代码。 例如,例如,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK 45注意:注意: 当程序运行时,由于当程序运行时,由于DOSDOS的装入程序负责把的装入程序负责把CSCS初始初始化成正确的代码段地址,化成正确的代码段地址,SSSS初始化为正确的堆栈段地初始化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装
34、入程序址,因此用户在程序中就不必设置。但是,在装入程序中中DSDS寄存器由于被用作其它用途,因此,在用户程序寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对中必须用两条指令对DSDS进行初始化,以装入用户的数进行初始化,以装入用户的数据段段地址。当使用附加段时,也要用据段段地址。当使用附加段时,也要用MOVMOV指令给指令给ESES赋赋段地址。段地址。 例如,例如,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送段值送AX MOV DS,AX ;AX内容送内容送DS,DS才有实际段值才有实际段值 CO
35、DE ENDS 463.2.5 过程定义伪指令过程定义伪指令PROC和和ENDP 在程序设计中,可将具有一定功能的程序段看成为在程序设计中,可将具有一定功能的程序段看成为一个过程一个过程(相当于一个子程序相当于一个子程序),它可以被别的程序调用。,它可以被别的程序调用。 要求先定义后使用。要求先定义后使用。 一个过程由伪指令一个过程由伪指令PROC和和ENDP来定义,其格式为来定义,其格式为:过程名过程名 PROC 类型类型 过程体过程体 RET过程名过程名 ENDP 注意:注意:PROC和和ENDP要成对出现。要成对出现。过程名是为过程所起的名称,过程名是为过程所起的名称,不能省略不能省略
36、类型由类型由FARFAR(远过程,为段远过程,为段间调用)和间调用)和NEARNEAR(近过程,近过程,为段内调用)来确定,如果为段内调用)来确定,如果缺省类型,则该过程就默认缺省类型,则该过程就默认为近过程。为近过程。 过程体内至少有一条过程体内至少有一条RETRET指令指令 47一个码段中可以包含一个或许多过程。一个码段中可以包含一个或许多过程。过程可以过程可以嵌套调用,可以递归调用,但不可以嵌套定义。嵌套调用,可以递归调用,但不可以嵌套定义。MYCODE SEGMENTASSUME CS: MYCODESUB1 PROC FAR RETSUB1 ENDPSUB2 PROC NEAR RE
37、TSUB2 ENDPCALL SUB2MYCODE ENDSFAR: 该过程为远过程,调用该过程为远过程,调用该过程时为段间调用,即该过程时为段间调用,即CS和和IP均要重新赋值;均要重新赋值;NEAR: 该过程为近过程,调该过程为近过程,调用该过程时为段内调用,只用该过程时为段内调用,只修改修改IP。(默认默认)CALL: 调用过程调用过程SUB2,到此到此处才真正去执行子程序。处才真正去执行子程序。48例:延时例:延时100ms的子程序,编程定义如下:的子程序,编程定义如下:DELAY PROC MOV BL, 10AGAIN: MOV CX, 2801HWAIT1: LOOP WAIT1
38、 DEC BL JNZ AGAIN RETDELAY ENDP任何一个过程都要求先定义,后调用。调用时才任何一个过程都要求先定义,后调用。调用时才真正执行该过程。一个过程产生一段目标代码。真正执行该过程。一个过程产生一段目标代码。49在汇编语言书写的源程序中,有的程序在汇编语言书写的源程序中,有的程序段要多次使用,为了简化书写,段要多次使用,为了简化书写,该程序段可该程序段可以用一条特殊的指令来代替以用一条特殊的指令来代替,这个特殊的指,这个特殊的指令就是宏指令。令就是宏指令。宏指令只是为了方便书写,当汇编程序宏指令只是为了方便书写,当汇编程序汇编生成目标代码时,汇编生成目标代码时,在引用宏指
39、令处仍会在引用宏指令处仍会产生原来程序段应生成的目标代码,引用一产生原来程序段应生成的目标代码,引用一次生成一次。次生成一次。3.2.6 宏指令宏指令501) 宏指令定义格式:宏指令定义格式:宏指令名宏指令名 MACRO 汇编程序段汇编程序段(宏体宏体)ENDMMACRO 与与 ENDM必须成对出现,先定义后引用必须成对出现,先定义后引用SHIFT MACRO MOV CL, 4 SAL AL, CLENDM宏名宏名程序段程序段: 将将AL左移左移4位位(乘乘16)IN AL, 5FHSHIFTOUT 5FH, AL在程序中引用宏指令如下:在程序中引用宏指令如下:51宏指令也可以接收参数,如对
40、宏指令也可以接收参数,如对X左移左移Y位。位。SHIFT MACRO X, Y MOV CL, Y SAL X, CLENDM形参列表形参列表MOV BX, WORD PTR BUFSHIFT BX, 4MOV WORD PTR BUF , BX在程序中引用宏指令如下:在程序中引用宏指令如下:功能:功能:BX的值左移的值左移4位。位。BXX4Y实参形参一一对应实参形参一一对应523.2.7 定位伪指令定位伪指令格式:格式:ORG 表达式表达式功能:指定在其后的指令或数据存放的偏移地址。功能:指定在其后的指令或数据存放的偏移地址。CODE SEGMENT ORG 0100H MOV AX, 0C
41、ODE ENDS指定指定MOV指令放在指令放在代码段中偏移地址为代码段中偏移地址为0100H开始的位置。开始的位置。DATA SEGMENT ORG 2000H NUM DB 0,5DATA ENDS指定指定NUM指向数据段中指向数据段中偏移地址为偏移地址为2000H开始开始的位置。的位置。533.2.8 汇编结束伪指令汇编结束伪指令END汇编程序在汇编时遇到汇编程序在汇编时遇到END,便知源程序已便知源程序已经结束。经结束。一般格式:一般格式:END 表达式表达式表达式为可执行程序运行的起始位置。一般是表达式为可执行程序运行的起始位置。一般是一个标号。一个标号。543.3 3.3 汇编程序设
42、计汇编程序设计55汇编语言编写的程序也跟高级语言类似,程序汇编语言编写的程序也跟高级语言类似,程序结构分三种:顺序、分支、循环;较复杂的程结构分三种:顺序、分支、循环;较复杂的程序也应该是由众多子程序组成的,每个子程序序也应该是由众多子程序组成的,每个子程序是一个过程,在程序中被显式地调用。变量等是一个过程,在程序中被显式地调用。变量等数据部分被定义在数据段,所有程序都要显式数据部分被定义在数据段,所有程序都要显式地定义堆栈段。汇编程序的每一条指令都与机地定义堆栈段。汇编程序的每一条指令都与机器语言一一对应,因此,汇编生成的可执行文器语言一一对应,因此,汇编生成的可执行文件代码少,适合于实时控
43、制,但由于语法成分件代码少,适合于实时控制,但由于语法成分很少,不适合于复杂的算法、运算。很少,不适合于复杂的算法、运算。汇编程序汇编程序主要的调试环境是主要的调试环境是DOS系统下的系统下的DEBUG程序。程序。56 完整结构完整结构1DATA SEGMENT X DB 3 Y DB 5DATA ENDSSTACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS: DATA, SS:STACK BEGIN: MOV AX, DATA MOV DS, AX MOV AH,4CH INT 21H
44、 CODE ENDS END BEGIN设置设置DS段寄段寄存器内容存器内容源程序结束,第源程序结束,第一条指令的地址一条指令的地址分配段寄存器分配段寄存器首指令位置首指令位置数据段数据段堆栈段堆栈段(可略)可略)返回返回DOS57 完整结构完整结构2DATA SEGMENT X DB 3 Y DB 5DATA ENDSSTACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS: DATA, SS:STACK BEGIN PROC FAR PUSH DS XOR AX, AX PUSH AX
45、MOV AX, DATA MOV DS, AX RET BEGIN ENDPCODE ENDSEND BEGIN将将PSP首址压栈,首址压栈,以便返回以便返回DOS。设置设置DS段寄存器内容段寄存器内容源程序结束,第源程序结束,第一条指令的地址一条指令的地址分配段寄存器分配段寄存器主过程名主过程名数据段数据段堆栈段堆栈段(可略)可略)返回返回DOS58一、一、 顺序程序设计顺序程序设计 顺序程序设计是没有分支,没有循环的顺序程序设计是没有分支,没有循环的直线运行程序,程序执行按照直线运行程序,程序执行按照IP内容自动内容自动增加的顺序进行。增加的顺序进行。59例例1 1 利用查表法计算平方值。
46、已知利用查表法计算平方值。已知0 0 9 9的平方值连续存在以的平方值连续存在以SQTABSQTAB开始的存储开始的存储区域中,求区域中,求SURSUR单元内容单元内容X X的平方值,并的平方值,并放在放在DISDIS单元中。假定单元中。假定00X 9X 9且为整数。且为整数。分析:解这个问题,关键在两方面,分析:解这个问题,关键在两方面, 一是了解平方表的存放位置;一是了解平方表的存放位置; 二是根据二是根据X X的值,找到的值,找到X X对应对应X X2 2在表在表 中位置,在这里为表的首地址加上中位置,在这里为表的首地址加上 X X单元的内容。也可以用查表指令。单元的内容。也可以用查表指
47、令。 60Data segment sur db ? dis db ? sqtab db 0,1,4,9,16,25,36,49,64,81Data endsCode segment assume cs:code, ds:dataBegin: mov ax,data mov ds,ax LEA BX, SQTAB MOV AH,0 MOV AL,SUR ADD BX,AX MOV AL,BXMOV DIS,ALMOV AH,4CHINT 21HCODE ENDS END BEGINLEA BX, SQTABMOV AL,SURXLATMOV DIS,AL61例例2 2 已知已知 Z=(X+Y)
48、-(W+Z)Z=(X+Y)-(W+Z),其中其中X X,Y Y, Z Z,WW均为用压缩均为用压缩BCDBCD码表示的数,码表示的数, 写出程序段。写出程序段。 分析:注意是压缩分析:注意是压缩BCD码相加减,因此码相加减,因此 正常运算完要进行相应的十进制正常运算完要进行相应的十进制 调整。调整。 62二、二、 分支程序设计分支程序设计 分支程序的基本思分支程序的基本思想是根据逻辑判断的结想是根据逻辑判断的结果来形成程序的分支,果来形成程序的分支,如图,若条件如图,若条件A成立,成立,则执行则执行P1;否则执行否则执行P2。 一般情况下,两个一般情况下,两个分支仅选其一执行。分支仅选其一执行
49、。 63MOV AL,ZMOV BL,WADD AL,BLDAAMOV BL,ALMOV AL,XMOV DL,YADD AL,DLDAASUB AL,BLDASMOV Z,AL64例例1 1 试编写完整程序,实现符号函试编写完整程序,实现符号函 数。变量数。变量X X的符号函数可表示为:的符号函数可表示为: 1 1 X0X0Y= 0 X=0Y= 0 X=0 -1 X0 -1 X0、0的数据个数。的数据个数。 循环控制变量初值为原始数据个数循环控制变量初值为原始数据个数。74DATA SEGMENTBUFF DW X1, X2, XnCOUNT EUQ $-BUFFPLUS DB ?ZERO
50、DB ?MINUS DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATABEGIN: MOV AX,DATA MOV DS, AX MOV CX,COUNT SHR CX,1 MOV DX,0 MOV AX,0 LEA BX,BUFFAGAIN: CMP WORD PTR BX,0 JGE PLU INC AHJMP NEXTPLU: JZ ZER INC DL JMP NEXTZER: INC DHNEXT: INC BX INC BX LOOP AGAIN MOV PLUS,DL MOV ZERO,DH MOV MINUS,AH MOV AX,4
51、C00H INT 21HCODE ENDS END BEGIN75例例5 要求从要求从0FFH端口输入一组端口输入一组100个字符,若个字符,若 该字符是数字,则转换成数值后以非压缩该字符是数字,则转换成数值后以非压缩 BCD码的形式存放在以码的形式存放在以DATA开始的存区,开始的存区, 并统计输入的数字的个数,存放在并统计输入的数字的个数,存放在NUM 单元中。单元中。分析:分析:如何确定输入的是数字?如何确定输入的是数字? 判别:判别:0 0 X 9X 9 如何将如何将数字的数字的ASCIIASCII码转换成非压缩码转换成非压缩BCDBCD码?码? X AND 0FH X 或或 X30H
52、 X 即可即可 设置设置BX为地址指针,初值指向为地址指针,初值指向DATA,DH为为 计数器进行统计。循环进行计数器进行统计。循环进行N次。次。 循环控制变量初值为循环控制变量初值为100。76思考:思考:1、若题目没有明确告知输入的字符个数,、若题目没有明确告知输入的字符个数,仅以仅以$表示输入结束,程序如何修改?表示输入结束,程序如何修改?2、若题目要求以压缩、若题目要求以压缩BCD码形式存放,码形式存放,程序又该如何修改?程序又该如何修改?77DATA SEGMENT ORG 1000H ADDR DW ? COUNT DW ?DATA ENDSCODE SEGMENTASSUME C
53、S: CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX XOR CX, CX MOV AX, ADDR REPEAT: TEST AX, 0FFFFH JZ EXIT SHR AX, 1 JNC NEXT INC CX NEXT: JMP REPEAT EXIT: MOV COUNT, CX MOV AX, 4C00H INT 21H CODE ENDS END START例例6 阅读此程序,指出阅读此程序,指出该程序完成了什么工作?该程序完成了什么工作?统计在数据段统计在数据段1000H单元单元(ADDR)开始存放的开始存放的16位数据中位数据中1的个数
54、,并将的个数,并将统计结果存放在统计结果存放在COUNT单元中。单元中。78例例7 在当前数据段从偏移地址在当前数据段从偏移地址 BUFFER开始开始 顺序存放着顺序存放着100个无符号个无符号16位数,现要编位数,现要编 写程序将这写程序将这100个字数据从大到小排序。个字数据从大到小排序。分析:分析:排序的方法有很多,我们采用冒泡法实现。排序的方法有很多,我们采用冒泡法实现。 这时,需要两重循环。外循环控制变量这时,需要两重循环。外循环控制变量BL的的 初值为初值为99,每次减,每次减1,而内循环控制变量,而内循环控制变量CL每每 次的初值等于当时次的初值等于当时BL的值。的值。 设置设置
55、DI为基本地址指针,初值指向为基本地址指针,初值指向BUFFER, 另一个地址指针另一个地址指针SI的初值每次总同的初值每次总同DI的值,也的值,也 就是说,内循环总是从第一个数据开始。就是说,内循环总是从第一个数据开始。79DS_SEG SEGMENT COUNT DB 4 BLK1 DB 96H, 74H, 32H, 16H BLK2 DB 65H, 94H, 87H, 29H BLK3 DB 4 DUP(?)DS_SEG ENDSCS_SEG SEGMENT ASSUME CS: CS_SEG, DS:DS_SEGMAIN PROC FARSTART: PUSH DS XOR AX, A
56、X PUSH AX MOV AX, DS_SEG MOV DS, AX MOV SI, OFFSET BLK1 MOV DI, OFFSET BLK2 MOV BX, OFFSET BLK3 MOV CL, COUNT MOV CH, 0 CLCNEXT: MOV AL, SI INC SI ADC AL, DI DAA INC DI MOV BX, AL INC BX LOOP NEXT RETMAIN ENDPCS_SEG ENDS END START4H96H74H32H16H65H94H87H29HCOUNTBLK1BLK2BLK3SIDIBXBCD码加法码加法16 32 74 962
57、9 87 94 6546 20 69 6161H69H20H46H80DATA SEGMENT TABLE DW 1020H, 2030H, 3040H, 4050H, 5060H TEMP DW 5 DUP(0) COUNT DW 5DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV ES, AX MOV CX, COUNT LEA SI TABLE LEA DI, TEMP CLD REP MOVSW LEA SI, TEMP MOV CX, COUNT MOV DI, OFFSE
58、T TABLE MOV BX, CX SHL BX, 1LOP1: DEC BX DEC BX MOV AX, SI+BX MOV DI, AX ADD DI, 2 LOOP LOP1 MOV AX, 4C00H INT 21H CODE ENDS END STARTREP MOVSW在指令中的功能是:在指令中的功能是:循环程序段循环程序段LOP1的功能是:的功能是:程序运行结束时程序运行结束时TEMP+2,TEMP+0字单元的内容字单元的内容程序运行结束时,程序运行结束时,DI的值为:的值为:复制数据块复制数据块TABLE到到TEMP将原数据块倒排将原数据块倒排2030H1020HTEMP或
59、或TABLE+1081DATA SEGMENT TABLE DW 1020H, 2030H, 3040H, 4050H, 5060H TEMP DW 5 DUP(0) COUNT DW 5DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS:DATAMAIN PROC FARSTART: MOV AX, DATA MOV DS, AX MOV ES, AX MOV CX, COUNT LEA SI TABLE LEA DI, TEMP CLD REP MOVSW LEA SI, TEMP MOV CX, COUNT MOV DI, OFFSET TABLE MOV
60、 BX, CX SHL BX, 1LOP1: DEC BX DEC BX MOV AX, SI+BX MOV DI, AX ADD DI, 2 LOOP LOP1 MOV AX, 4C00H INT 21H RETMAIN ENDPCODE ENDS END START若将若将CLD改为改为STD,则程序运行结束时,则程序运行结束时,TEMP+8字单元,字单元,TEMP字单元的内容字单元的内容分别是:分别是:0000H1020H82四、四、 子程序设计子程序设计对于一个子程序,应该注意它的入口参数和出对于一个子程序,应该注意它的入口参数和出口参数口参数。入口参数是由主程序传给子程序的参。入口参
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外资保险公司中国区资深理赔员全职聘用合同
- 国际工程承包法律风险防范协议
- 冷链物流运输与智能监控系统合作协议
- 抖音智慧城市智慧环保合作协议
- 固态电池安全标准制定与执行合同
- 智能在线教育课程退费争议快速响应协议
- 肝硬化护理要点
- 血液透析护理病人
- 金属矿产投资咨询合同(2篇)
- 癫痫手术的护理
- IT行业专业试题集范本1
- 国有企业内部审计工作制度
- 2025宿迁辅警考试题库
- 健康生活方式指导手册含饮食、运动
- 2025年森林管护员考试题及答案
- 未成年人学校保护规定的国际比较研究
- 研究院内部科技成果转化的管理流程
- 中考语文试卷名著专题汇编《钢铁是怎样炼成的》文段赏析题(截至2024年)
- 2019建筑排水管道安装塑料管道19S406
- KCA试题库完美版
- 2024年中国扁平吊装带市场调查研究报告
评论
0/150
提交评论