版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 n 第第1节节 MASM宏汇编语言结构宏汇编语言结构n 第第2节汇编语言的数据、表达式和符号节汇编语言的数据、表达式和符号 n 第第3节节 伪指令伪指令 n 第第4节节 程序设计程序设计 n 第第5节节 DOS功能调用功能调用 n 第第6节节 实用程序设计举例实用程序设计举例 第第4 4章章 汇编语言程序设计汇编语言程序设计 24.1 MASM4.1 MASM汇编语句结构汇编语句结构MASMMASM汇编语言有三种语句:指令语句、伪指令语句及宏汇编语言有三种语句:指令语句、伪指令语句及宏指令语句。这里只介绍前两种。指令语句。这里只介绍前两种。1 1、指令语句(、指令语句(Instructio
2、n statements)Instruction statements)l指令语句又称可执行语句,要求指令语句又称可执行语句,要求CPUCPU执行某种操作。执行某种操作。l指令语句的格式为:指令语句的格式为: 标号标号: : 指令助记符指令助记符 操作数操作数 ; ;注释注释 标号是该指令的符号地址,表示该指令第一标号是该指令的符号地址,表示该指令第一个字节的地址。以冒号作为结束符。个字节的地址。以冒号作为结束符。32、伪指令语句(、伪指令语句(pseude instruction statements)l伪指令又称指示词句,伪指令又称指示词句,它不要求它不要求CPUCPU执行某种操作执行某种
3、操作,汇编时也不产生对应的机器代码,汇编时也不产生对应的机器代码,而仅仅告诉汇,而仅仅告诉汇编程序,对它后面的指令语句和操作数应该如何产编程序,对它后面的指令语句和操作数应该如何产生机器目标代码。生机器目标代码。l伪指令的格式为:伪指令的格式为: 符号名符号名 定义符定义符 操作数操作数 ; ;注释注释 注意伪指令符号名后无冒号注意伪指令符号名后无冒号44.2 汇编语言中的数据、表达式和符号汇编语言中的数据、表达式和符号1、常数、常数l 常数是编程时已经确定的纯数值。常数是编程时已经确定的纯数值。l常数分为两种类型:常数分为两种类型:数值型常数:如二进制数数值型常数:如二进制数01110010
4、B、八进制数、八进制数723Q、十进制数、十进制数14D、十六进制数、十六进制数3AH。字符串型常数字符串型常数 :用单引号括起来的字符串,如:用单引号括起来的字符串,如ABC、5。每个字符在机内以。每个字符在机内以ASCII码格式存码格式存放。放。 52、变量、变量 变量用来定义存放在存储器单元中的数据。其三重变量用来定义存放在存储器单元中的数据。其三重属性为:属性为:l 段属性(段属性(SEG):变量所在段的段基址。:变量所在段的段基址。l 偏移地址属性(偏移地址属性(OFFSET):变量的偏移地址。:变量的偏移地址。l 类型属性(类型属性(TYPE):变量占用的字节数。:变量占用的字节数
5、。例:例:DATA SEGMENTFIRST DB 5AH SECOND DW 1122H DATA ENDS对变量的操作:对变量的操作:LEA AX,FIRSTMOV AL,FIRSTMOV AX,SECOND变量名:存放数据存储单元的符号地址。变量名:存放数据存储单元的符号地址。63、标号、标号 给指令语句所在地址取的名字。标号与变量类似,给指令语句所在地址取的名字。标号与变量类似,也有三重属性。也有三重属性。 l 段属性(段属性(SEG):标号所在段的段基址。:标号所在段的段基址。l 偏移地址属性(偏移地址属性(OFFSET):标号的偏移地址。:标号的偏移地址。l 距离属性(距离属性(D
6、istance):当标号作为转移类指令:当标号作为转移类指令的操作数时,可以在同一段或不同段之间执行转移的操作数时,可以在同一段或不同段之间执行转移。若只在同一段内转移,距离属性为。若只在同一段内转移,距离属性为NEAR,否则,否则距离属性为距离属性为FAR。 例:例:LOP:MOV AX,0000 JMP LOP74、表达式、表达式 MASM 允许使用的表达式分为两类:允许使用的表达式分为两类: 1)数值表达式)数值表达式 数值表达式的结果是一个常数。数值表达式的结果是一个常数。例:例:MOV DX,(,(6*A - B)/2 ;(A、B为变量)为变量) 2)地址表达式)地址表达式 地址表达
7、式的结果是一个存储单元的地址。地址表达式的结果是一个存储单元的地址。 例:例:MOV AX,ES:BX+SI+1000H 85、运算符、运算符 MASM的运算符分为六大类:的运算符分为六大类: 1)算数运算符)算数运算符 2)逻辑运算符)逻辑运算符 3)关系运算符)关系运算符 4)分析运算符)分析运算符 5)合成运算符)合成运算符 6)其它运算符)其它运算符由运算符组成的表达式可以得到一个确定的值,在由运算符组成的表达式可以得到一个确定的值,在指令中可以作为指令中可以作为源操作数源操作数。9MASM支持的运算符支持的运算符运算符运算符类型类型符号符号名称名称运算结果运算结果实例实例算术运算符算
8、术运算符+加法加法和和减法减法差差*乘法乘法乘积乘积/除法除法商商MOD模除模除余数余数SHL左移左移左移后二进制数左移后二进制数SHR右移右移右移后二进制数右移后二进制数2+6=88-2=68 *5=4022/5=412 MOD 3= 032 MOD 6= 2 0010B SHL 2=1000B1100B SHR 1=0110B10例:例:A1 EQU 1020+3300MOV BX,A1-1000MOV AX,35*5MOV DX, A1/100MOV CX,A1 MOD 100MOV AL,00001010B SHL 4等效于:等效于: A1 EQU 4320 MOV BX,3320 M
9、OV AX,175 MOV DX, 43 MOV CX,20 MOV AL,10100000B运算符和运算指令的区别:运算符和运算指令的区别:1、运算符如果在指令语句中指令助记符的位置时为运算指令,、运算符如果在指令语句中指令助记符的位置时为运算指令,在其它位置时,如在源操作数的位置,为运算符。在其它位置时,如在源操作数的位置,为运算符。2、运算指令在可执行程序执行时进行,而运算符是在汇编时由、运算指令在可执行程序执行时进行,而运算符是在汇编时由汇编程序完成其运算功能。汇编程序完成其运算功能。*算术运算符组成的算术表达式的值取其整数。算术运算符组成的算术表达式的值取其整数。11运算符运算符类型
10、类型符号符号名称名称运算结果运算结果实例实例逻辑运算符逻辑运算符NOT非运算非运算逻辑非结果逻辑非结果AND与运算与运算逻辑与结果逻辑与结果OR或运算或运算逻辑或结果逻辑或结果XOR异或运算异或运算 逻辑异或结果逻辑异或结果NOT 1010B=0101B1011B AND1100B=1000B1011B OR 1100B=1111B1011B XOR 1100B=0110B12运算符运算符类型类型符号符号名称名称运算结果运算结果实例实例关系运算符关系运算符EQ相等相等NE不等不等LT小于小于LE不大于不大于GT大于大于GE不小于不小于 6EQ11B=全全06NE11B=全全15LT8=全全17
11、LE101B=全全06GT100B=全全16GE111B=全全0结果为真输出结果为真输出全全1结果为假输出结果为假输出全全013例例2: MOV AX,5 EQ 101B ADD BL,10H GT 16例例1: MOV AL,NOT 10101010B MOV AL,11110000B AND 10111101B等效于:等效于: MOV AL,01010101B MOV AL,10110000B等效于:等效于:MOV AX,FFFFH ADD BL,00H14运算符运算符类型类型符号符号运算结果运算结果实例实例分析运算符分析运算符SEG返回返回变量或标号的变量或标号的段基段基址址OFFSET
12、返回变量或标号的偏移返回变量或标号的偏移地址地址LENGTH返回变量的单元数返回变量的单元数TYPE返回变量单元字节数或返回变量单元字节数或标号的距离属性标号的距离属性SIZE返回变量总字节数返回变量总字节数=LENGTH*TYPESEG N1=N1所在所在段段基址段段基址OFFSET N1=N1的偏移地址的偏移地址LENGTH N2=N2单元数单元数TYPE N2=N2元素字节数元素字节数SIZE N2=N2总字节数总字节数15 MOV AX,SEG FIRST MOV DI,OFFSET FIRST MOV AL,TYPE FIRST ;(AL)=1 (字节字节) MOV AL,TYPE
13、SECOND ;(AL)=2 (字节字节) MOV BX,SEG LOP MOV SI,OFFSET LOP MOV AL,LENGTH FIRST ; (AL)=2 MOV AL,SIZE SECOND ; (AL)=2例:例:DATA SEGMENT LOP:MOV AX,0000 FIRST DB 5AH,6BH SECOND DW 1122H JMP LOP DATA ENDS 16ES:BX;DS:BLOCK运算符运算符类型类型符号符号名称名称运算结果运算结果实例实例修改运算符修改运算符PTR修改类型属性修改类型属性 修改后类型修改后类型THIS指定类型指定类型/距离属性距离属性指定
14、后类型指定后类型段寄存段寄存器名器名段前缀段前缀修改段修改段HIGH分离高字节分离高字节高字节高字节LOW分离低字节分离低字节低字节低字节SHORT 短转移说明短转移说明BYTE PTRBXALPHA EQU THIS BYTEHIGH 2345H=23HLOW 2345H=45HJMP SHORT LABEL17nPTR :强制类型转换。用于修改变量的类型或修强制类型转换。用于修改变量的类型或修改标号的距离属性。改标号的距离属性。例例 : F1 DB 15H F2 DW 3132H ALPHA: MOV AL,BYTE PTR F2 JMP FAR PTR ALPHAn(EQU) THIS:
15、指定类型及距离属性指定类型及距离属性例:例:B-GAMA EQU THIS BYTE W-GAMA DW 1234H MOV AL,B-GAMA MOV AX,W-GAMA可以这样吗?可以这样吗?AL中中存的是什么?能通过存的是什么?能通过debug解决此问题?解决此问题?18运算符运算符类型类型符号符号名称名称运算结果运算结果实例实例其它运算符其它运算符( )圆括号圆括号改变运算级优先级改变运算级优先级 方括号方括号下标或间接寻址下标或间接寻址点运算符点运算符连接结构与变量连接结构与变量尖括号尖括号修改变量修改变量MASK返回字段屏返回字段屏蔽码蔽码字段屏蔽码字段屏蔽码WIDTH返回记录返回
16、记录宽度宽度记录记录 / 字段位字段位数数(84)*4=16MOV AX,BXTABT1MASK CWIDTH W(了解)(了解)19运算符的优先级表(了解)运算符的优先级表(了解)优先级优先级符号符号高高低低1234567891011LENGTH,SIZE,WIDTH,MASK,( ), ,PTR,OFFSET,SEG,TYPE,THISHIGH,LOW+, (单目单目)*,/,MOD,SHL,SHR+,(双目双目)EQ,NE,LT,LE,GT,GENOTANDOR,XORSHORT204.3 4.3 伪指令(指示语言)伪指令(指示语言) 伪指令是伪指令是说明性语句说明性语句,它没有对应的机
17、器指令,它没有对应的机器指令,不由,不由CPUCPU执行,而是在汇编程序汇编时识别,用执行,而是在汇编程序汇编时识别,用于说明于说明CPUCPU的类型、段结构、源程序起止信息和段的类型、段结构、源程序起止信息和段内存的安排等。内存的安排等。 MASMMASM的伪指令可分为变量定义语句、符号定义的伪指令可分为变量定义语句、符号定义语句、段定义语句、段分配语句、过程定义语句、语句、段定义语句、段分配语句、过程定义语句、群定义语句、结构定义语句、记录定义语句等。群定义语句、结构定义语句、记录定义语句等。211、变量定义语句变量定义语句 变量定义语句用来定义字节、字或双字等变量,变量定义语句用来定义字
18、节、字或双字等变量,变量定义语句有两种不同的格式。变量定义语句有两种不同的格式。 1)格式一)格式一 变量名变量名 DB / DW / DD / DQ / DT 表达式表达式 功能:为每个表达式分配功能:为每个表达式分配 1 字节字节/ 2 字节字节/ 4 字节字节/ 8 字节字节/ 10字节的存储单元,并赋值。字节的存储单元,并赋值。注意注意: :变量定义语句前的变量名不是一定要有的。如在堆栈变量定义语句前的变量名不是一定要有的。如在堆栈段中,通过变量定义语句规定堆栈的容量时,在其前面就不段中,通过变量定义语句规定堆栈的容量时,在其前面就不需要变量名。见需要变量名。见PPT33PPT33。2
19、2(1)表达式为数值。例如:表达式为数值。例如:K1 DB 5AH ;将将5AH赋给字节变量赋给字节变量K1K2 DW 2354H ;将将2354H赋给字变量赋给字变量K2K3 DD 2A00 4455H ;将将2A00 4455H赋给双字变量赋给双字变量K35AH54H23H55H44H00H2AHK1K2K3如果表达式是?,表示一个不确定如果表达式是?,表示一个不确定的值,要求系统分配(预留)与其的值,要求系统分配(预留)与其类型相匹配的存储单元。例如:类型相匹配的存储单元。例如:BLOW DW ? ;定义变量定义变量BLOW为不确定值的字变量为不确定值的字变量23(2)表达式为字符串。例
20、如:表达式为字符串。例如:ONE DB “HOW ARE YOU” ;将将“HOW ARE YOU” 字符串赋给变量字符串赋给变量ONE。TWO DW OK ;将将OK字符串赋给变字符串赋给变 量量TWOHOW KOONETWO字符串以字符串以ASCII码的形式储存,一码的形式储存,一个个ASCII码占一个字节。码占一个字节。*单引号,双引号无区别。一般习单引号,双引号无区别。一般习惯上字符用单引号,字符串用双引惯上字符用单引号,字符串用双引号。号。24(3)表达式为数组。例如:表达式为数组。例如:A1 DB 00H,11H,22H,33HA2 DW 3456H,1025H,25*25,100
21、0/3,10A0H例:例:MOV AL,A13 ;(AL)=33H MOV AX,A21 ;(AX)=1025H*A1、A2为变量名,是其所存放数据单元的符号地址,等为变量名,是其所存放数据单元的符号地址,等于数据单元第一个字节的偏移地址。见课本于数据单元第一个字节的偏移地址。见课本P64。MOV AL,A13 ;源操作数为直接寻址,源操作数为直接寻址,MOV AL, AL+3MOV AX,A22; 因为因为A2是字变量,所以是字变量,所以A2+2为为1025H的偏移地址。的偏移地址。25 2)格式二)格式二 格式格式 2 用于定义重复变量,其格式为:用于定义重复变量,其格式为: DB DW
22、DD DF DQ DT变量名变量名n DUP(表达式)表达式)例:例:TAB1 DB 10 DUP(0) TAB2 DW 2 DUP(?)(?) TAB3 DB 4 DUP(1,2 DUP(50H)262、符号定义语句、符号定义语句 1)等值语句()等值语句(EQU) 格式:符号格式:符号 EQU 表达式表达式 功能:用左边的符号代替右边的将表达式。表功能:用左边的符号代替右边的将表达式。表达式可以是常数、变量、标号、寄存器名、数值或地达式可以是常数、变量、标号、寄存器名、数值或地址表达式。址表达式。 在同一程序中,不能对在同一程序中,不能对EQU定义的符号定义的符号重新重新定义。定义。EQU
23、伪指令只是为常量、表达式等定义伪指令只是为常量、表达式等定义一个符号名,但并不申请分配内存。一个符号名,但并不申请分配内存。 2)等号语句)等号语句 格式:符号格式:符号 = 表达式表达式 等号语句(等号语句(=)与)与EQU语句有同样的功能,区别语句有同样的功能,区别在于等号语句定义的符号允许重新定义,使用更加方在于等号语句定义的符号允许重新定义,使用更加方便灵活。便灵活。27【例例1】 :ACOS EQU 1250H COUNT EQU 100 BUF EQU ACOS+1000H MOV CL,COUNT【例例2】 :ONE =100 COUNT =100 A=ONE S=COUNT+1
24、00 A=A+100使用符号定义语句主要是为了编程方便,或是提高程使用符号定义语句主要是为了编程方便,或是提高程序的可读性。序的可读性。283、段定义指令段定义指令 在汇编程序设计中,需要将存储器分成若干段,在汇编程序设计中,需要将存储器分成若干段,80X86CPU访问存储器时,凭借段寄存器对各个段进访问存储器时,凭借段寄存器对各个段进行访问。通常用段定义语句(行访问。通常用段定义语句(SEGMENT/ENDS)来来定义各种类型的逻辑段。定义各种类型的逻辑段。 格式:格式: 段名段名 SEGMENT定位类型定位类型 ,组合类型组合类型,字字长选择长选择,分类名分类名 (段体)(段体) 段名段名
25、 ENDS 1)完整段定义伪指令)完整段定义伪指令29l段名:自己选定,前后一致段名:自己选定,前后一致l定位类型:表示对段的定位类型:表示对段的 起始边界的要求,规定逻辑段起始边界的要求,规定逻辑段的起始地址能够被的起始地址能够被256、16、4、2、1整除:整除:PAGE(页页):表示该段从一表示该段从一“页页”的边界开始。段的边界开始。段的首地址后两位为的首地址后两位为00H。一页为。一页为256个字节。个字节。PARA(节节):表示该段从一表示该段从一“节节”的边界开始。的边界开始。 段段的首地址后的首地址后1位为位为0H,节边界。一节为节边界。一节为16个字节。个字节。DWORD(双
26、字双字):表示该段从表示该段从4的倍数的地址开始的倍数的地址开始。WORD(字字):表示该段从表示该段从2的倍数的地址开始。的倍数的地址开始。BYTE(节节):表示该段从任一字节开始。表示该段从任一字节开始。若定位类型省略,系统默认为若定位类型省略,系统默认为PARA。30l组合类型:汇编时如何对各逻辑段进行连接。例如:组合类型:汇编时如何对各逻辑段进行连接。例如:NONE:(:(隐含)与其它同名段不连接,独立存在。隐含)与其它同名段不连接,独立存在。STACK:表明汇编时带有表明汇编时带有STACK组合类型的同名段连成一组合类型的同名段连成一个大的堆栈段,系统自动对个大的堆栈段,系统自动对S
27、S和和SP初始化。否则,初始化。否则,SS和和SP需需程序指定。程序指定。AT 表达式:表示本段可定义在表达式指示的节边界上。注表达式:表示本段可定义在表达式指示的节边界上。注意,这一组合类型不能用于代码段。意,这一组合类型不能用于代码段。例:例:MCODE SEGMENT AT 2050H;该段的首地址为该段的首地址为20500H。l字长选择:用于定义段中使用偏移地址和寄存器字长,字长选择:用于定义段中使用偏移地址和寄存器字长,只用于只用于32位系统。如省略,则系统默认为位系统。如省略,则系统默认为USE32。USE16:段字长为段字长为16位,最大段长为位,最大段长为64KBUSE32:段
28、字长为段字长为32位,最大段长为位,最大段长为4GBl分类名:分类名: 用单引号括起,分类名相同的逻辑段存放在连续存储空间。用单引号括起,分类名相同的逻辑段存放在连续存储空间。31l 段分配语句(段分配语句(ASSUME) 段分配语句用来说明源程序中定义的段由哪个段寄段分配语句用来说明源程序中定义的段由哪个段寄存器去寻址。段寄存器可以是存器去寻址。段寄存器可以是CS,SS,DS,ES,FS或或GS。 格式:格式: ASSUME 段寄存器:段名,段寄存器:段名段寄存器:段名,段寄存器:段名注意:注意:ASSUMEASSUME语句只建立当段和段寄存器之间的联系,但语句只建立当段和段寄存器之间的联系
29、,但ASSUMEASSUME语句不能将各段的段基值装入各个段寄存器,段基址的语句不能将各段的段基值装入各个段寄存器,段基址的装入是用程序的办法。对于代码段,装入是用程序的办法。对于代码段,CSCS和和IPIP的内容由汇编程序的内容由汇编程序自动装入;对于数据段自动装入;对于数据段DSDS和附加段和附加段ESES、FSFS、GS,GS,在代码段中装在代码段中装入段基值;对于堆栈段,如果在组合类型中选择了入段基值;对于堆栈段,如果在组合类型中选择了STACK,SS和和IP由由汇编程序自动装入,否则要在程序中汇编程序自动装入,否则要在程序中设置。设置。32DS、ES、FS和和GS的装入:的装入: D
30、S、ES、FS和和GS不能用立即数不能用立即数寻址方式直接装入,段基值需先送入通用寄存器,再传送给段寻址方式直接装入,段基值需先送入通用寄存器,再传送给段寄存器。寄存器。 SS及及SP的装入:在段定义伪指令中,选用的装入:在段定义伪指令中,选用 “STACK”参数项参数项,在,在ASSUME语句中,把堆栈段分配给语句中,把堆栈段分配给SS,则则SS和和SP自动装入自动装入。如未使用。如未使用“STACK”参数项,则用程序实现参数项,则用程序实现SS和和SP的装入。的装入。例:例:MOV AX,DATA MOV DS,AX CS的装入的装入 :由起始标号确定:由起始标号确定CS和和IP。注意:此
31、处段名表示段基址。在注意:此处段名表示段基址。在MOVMOV指令中,不允许将立即数指令中,不允许将立即数直接送给段寄存器,通常借助通用寄存器中转。直接送给段寄存器,通常借助通用寄存器中转。33通知:下周三(通知:下周三(29日)晚日)晚19:00-21:00 微机原理期中考试。范围:前微机原理期中考试。范围:前4章章。地点地点SY109。考试题型:填空题、。考试题型:填空题、选择题、指令改错题、程序分析题、选择题、指令改错题、程序分析题、编写程序题。编写程序题。答疑:本周二下午答疑:本周二下午14:00-17:00。9教南教南308。助教:张晓斌。助教:张晓斌34例:
32、例: STACK2 SEGMENT DW 40 DUP(?)(?) BOTTOM LABEL WORD;堆栈底的位置堆栈底的位置 STACK2 ENDS CODE SEGMENT ASSUME CS:CODE SS:STACK2START: MOV AX,STACK2 MOV SS,AX MOV SP,OFFSET BOTTOM CODE ENDS END START35例:DATA SEGMENT BCDBUF DB 22H DATA ENDS EXTRA SEGMENT BUFF DB 20 DUP(00H) EXTRA ENDS STACK SEGMENT STACK SBUFF DB
33、200 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AXCODE ENDS END START 36 2)简化段定义伪指令)简化段定义伪指令l内存模式语句(内存模式语句(.MODEL) 格式:格式:.MODEL 模式类型模式类型 功能:指定数据和代码允许使用的长度。功能:指定数据和代码允许使用的长度。l其它简化的段定义语句其它简化的段定义语句 .x86: 定义定义80 x86微处理器微处理器 .DAT
34、A:定义数据段定义数据段 37例:例:MODEL SMALL486(支持支持32位寄存器操作位寄存器操作)STACK DB 200HDATA BCDBUF DB 12HCODESTART: END START384、过程定义伪指令(过程定义伪指令(PROC/ENDP) 在程序设计中,常把具有一定功能的程序段设计在程序设计中,常把具有一定功能的程序段设计成一个子程序,又称为过程。成一个子程序,又称为过程。 过程定义伪指令的格式如下:过程定义伪指令的格式如下:过程名过程名 PROC(NEAR/FAR)RET过程名过程名 ENDPRETRETRET是过程返回语是过程返回语句。在过程内部任句。在过程内
35、部任意位置都可以设置意位置都可以设置多个返回指令作为多个返回指令作为过程的出口。但过过程的出口。但过程的最后一个指令程的最后一个指令必须是必须是RETRET语句。语句。395、其他伪指令、其他伪指令1. LABEL 伪指令伪指令: 用于给已定义的变量或标号起一个别名,用于给已定义的变量或标号起一个别名,并可重新定义它的类型或距离属性。(详见课本并可重新定义它的类型或距离属性。(详见课本P115) 格式:名称格式:名称 LABLE 类型类型/距离距离2. (1)定位伪指令定位伪指令 格式:格式:ORG 表达式表达式 表达式给出的是表达式给出的是ORG语句后第一条指令或第一个数据的偏移语句后第一条
36、指令或第一个数据的偏移地址。地址。 (详见课本(详见课本P116) 40 (2)当前位置计数器当前位置计数器:在汇编程序时,用:在汇编程序时,用 $ 表示当前位置的偏表示当前位置的偏移地址值移地址值。 DATA SEGMENT ST DB ABCDEFGH COUNT EQU $-ST DATA ENDS 在程序中经常用这种方法获得字符串的长度。在程序中经常用这种方法获得字符串的长度。 3、END 伪指令伪指令: 作为汇编源程序的结束语句,放在程序的最作为汇编源程序的结束语句,放在程序的最后一行。后一行。 格式:格式:END 标号标号此处的标号是源程序中第一条可执行语句的标号,是源程序的此处的
37、标号是源程序中第一条可执行语句的标号,是源程序的起始地址。见课本起始地址。见课本P127参考程序。参考程序。41 与高级语言程序设计类似,在用汇编语言进行程与高级语言程序设计类似,在用汇编语言进行程序设计时,同样应按以下步骤进行。序设计时,同样应按以下步骤进行。 1. 1.分析问题,明确要解决的问题和要求分析问题,明确要解决的问题和要求 2. 2.确定解决问题的思路和方法确定解决问题的思路和方法 3. 3.将解决问题的方案编制程序流程图将解决问题的方案编制程序流程图 4. 4.根据流程图,逐条编制程序根据流程图,逐条编制程序 5. 5.调试程序,验证程序是否正确调试程序,验证程序是否正确4.4
38、 4.4 程序设计程序设计42一个源程序的基本格式如下:一个源程序的基本格式如下:DATA SEGMENT DATA ENDSEXTRA SEGEMNT EXTRA ENDSSTACK1 SEGMENT PARA STACK STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME SS:STACK1,ES:EXTRA;存放数据项的数据段;存放数据项的数据段;存放数据项的附加段;存放数据项的附加段;堆栈段;堆栈段43START: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV AH,4CH I
39、NT 21HCODE ENDS END START(核心程序段核心程序段);DS装入段基址装入段基址;ES装入段基址装入段基址;系统功能调用:;系统功能调用:返回操作系返回操作系统统444.4.1 顺序结构程序顺序结构程序例:编制程序,求下列公式中的例:编制程序,求下列公式中的Z值,值,Z =(X+Y)*8 - X2设设X,Y的值分别存放在的值分别存放在VARX,VARY单元中,结果存单元中,结果存放到放到RESULT单元中。运算结果不超过单元中。运算结果不超过16位。设位。设X=0006H, Y=0007H。解:解: (1)存储单元存储单元 RESULT 用来存放结果,用来存放结果,VARX
40、 和和 VARY 放放 X、Y的值。寄存器的值。寄存器 DX 放中间运算结果,左移放中间运算结果,左移 1 位相当位相当于乘于乘 2,右移,右移 1 位相当于除位相当于除 2,所以可以用左移,所以可以用左移 3 位得到乘以位得到乘以 8 的结果。的结果。 45开始开始预置段寄存器预置段寄存器DX XDX X+YDX右移得右移得(X+Y)*8-X)/2RESULT DX结束结束DX左移左移3次次(X+Y)*8DX (DX)-X(2)程序流程图和程序如下:程序流程图和程序如下:46DATA SEGMENT VARX DW 0006H VARY DW 0007H RESUL DW ?DATA END
41、SSTACK1 SEGMENT PARA STACK DW 100H DUP(?)STACK1 ENDSCOSEG SEGMENT ASSUME CS:COSEG, DS:DATA ASSUME SS:STACK147 START: MOV AX , DATA MOV DS , AX;- MOV DX,VARX ;DXX ADD DX,VARY ;DX X+Y MOV CL , 3 SAL DX,CL ;DX (X+Y)*8 SUB DX,VARX ;DX (X+Y)*8-X SAR DX,1 ;DX ( (X+Y)*8-X )/2 MOV RESULT,DX;- MOV AH,4CH INT
42、 21H ;系统功能调用,返回操作系统系统功能调用,返回操作系统COSEG ENDS END START注意:段名就是段基址。在注意:段名就是段基址。在MOVMOV指令指令中,不允许将立即数直接送给段寄存中,不允许将立即数直接送给段寄存器,通常借助通用寄存器中转。器,通常借助通用寄存器中转。思考:此题需要设置堆栈段吗?思考:此题需要设置堆栈段吗?484.4.2 分支程序分支程序n条件转移:条件转移:Jcc Jcc 目标目标n用于程序需要进行分别处理的情况。用于程序需要进行分别处理的情况。n主要使用转移指令。主要使用转移指令。n转移指令分为无条件转移指令和条件转移指令。转移指令分为无条件转移指令
43、和条件转移指令。n无条件转移指令:无条件转移指令: JMP JMP 目标目标n在进行分支程序设计时,通常用比较、测试,或算在进行分支程序设计时,通常用比较、测试,或算术运算、逻辑运算影响标志位,然后选择转移指令。术运算、逻辑运算影响标志位,然后选择转移指令。49【课本例课本例4-4】 符号函数符号函数 y= 1 x0 0 x=0 -1 x 0与与0比较比较X 0AL=0AL-1AL0AL1 NYNYYAL结束结束51DATA SEGMENT XX DB x YY DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX,DAT
44、A MOV DS, AX;-(分支程序内容,见后页分支程序内容,见后页);- MOV AH, 4CH INT 21HCODE ENDS END START52MOV AL, XX CMP AL, 0 ;x-0,建标志位,建标志位 JGE BIGD ;x 0转移转移 MOV AL,-1 ;x0转移转移 MOV AL, 0 ;x=0 JMP JUS2 ;与;与JUS1隔离。隔离。 JUS1: MOV AL, 1 ;x0JUS2: MOV YY, AL如无此指令,上一条指令执行完后如无此指令,上一条指令执行完后,会按顺序执行,会按顺序执行JUS1指令,对指令,对AL重新赋值。重新赋值。534.4.3
45、 循环程序循环程序 一个循环程序通常由以下四部分组成:一个循环程序通常由以下四部分组成:n初始化部分初始化部分 :建立循环的初始值,如初始化地址:建立循环的初始值,如初始化地址指针、计数器及给变量赋初值等。指针、计数器及给变量赋初值等。n循环体:循环的操作处理部分。循环体:循环的操作处理部分。n修改部分:为执行循环修改地址指针、计数器或变修改部分:为执行循环修改地址指针、计数器或变量等。量等。n控制部分:判断循环是否结束。通常采用两种方法:控制部分:判断循环是否结束。通常采用两种方法:计数器控制循环计数器控制循环和和条件控制循环条件控制循环。前者通常用于。前者通常用于先先执行后判断执行后判断的
46、循环结构。后者通常用于的循环结构。后者通常用于先判断后执先判断后执行行的循环结构。的循环结构。54常用的计数器控制循环指令有:常用的计数器控制循环指令有:LOOP, LOOPE, LOOPNE。对应的控制循环结构分别为:。对应的控制循环结构分别为: MOV CX, n标号标号: .LOOP 标号标号; (CX0)时重复时重复MOV CX, n标号标号: .CMP dst, srcLOOPE 标号标号;(CX0)且相等且相等时重复时重复MOV CX, n标号标号: .CMP dst, srcLOOPNE 标号标号;(CX0)且不相且不相等时重复等时重复注意:标号为循环体的入口。注意:标号为循环体
47、的入口。循环控制指令计数器必须选择循环控制指令计数器必须选择CX。LOOP、LOOPE、LOOPNE用于计数器用于计数器 循环控制。每执行一次循环控制。每执行一次循环,循环,CX-1。CX=0时退出循环。见下例。时退出循环。见下例。55【课本例课本例4-6】计算计算Y= 201iia解:定义数组名解:定义数组名TABL存放存放 a1a20;和存放于单元和存放于单元YY中。中。中间结果存于寄存器中间结果存于寄存器AX中。中。BX寄存器为地址指针,寄存器为地址指针,CX寄存器作计数器。寄存器作计数器。设设 a1,a2,a20是一组无符号十六位二进制数,并设是一组无符号十六位二进制数,并设其和不大于
48、其和不大于2个字节个字节 。56DATASEGMENTTABL DW A1,A2, . A20YY DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;-;- MOV AH,4CH INT 21HCODE ENDS END START57MOVAX,0 MOV BX,OFFSET TABL MOV CX,20LOP:ADD AX,BX INC BXINC BX LOOP LOPMOV YY,AX 修改部分修改部分初始化部分初始化部分循环体循环体控制部分:循环控制部分:循环20次后,次后,CX=0,
49、 退出循环。退出循环。581 1、循环的基本结构、循环的基本结构A A. .先执行,后判断结构先执行,后判断结构(通常采用计数器控制(通常采用计数器控制循环循环 )流程图如右:流程图如右:初始化部分初始化部分循环体循环体修改部分:修改部分:修改参数修改参数控制部分:控制部分:循环结束?循环结束?出口出口Y YN N入口入口59例:编程统计数据块中正数的个数,并将其送例:编程统计数据块中正数的个数,并将其送 RS单单元中。(继续深入:课后习题元中。(继续深入:课后习题20)解:数据块定义为解:数据块定义为 D1,RS单元存放正数的个数,单元存放正数的个数,数据块长度用数据块长度用 COUNT表示
50、。表示。BX作地址指针,作地址指针,CX作计数器,作计数器,DX记录正数的个数。记录正数的个数。60START预置段预置段RBX D1 DX 0 CX COUNT BX0? DX DX+1BX BX+1 CX CX-1CX=0?RS (DX)ENDNYNY61DATASEGMENT D1 DB -1,-3,5,7,-9,-6,8,4COUNT EQU $-D1RS DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOV DS,AX;-;- MOVAH,4CH INT 21HCODE ENDS END START补码
51、表示补码表示:FFH表示当前偏移地址表示当前偏移地址.详见课本详见课本P11762 MOV RS,DX JUSTI:INC BX DEC CX JNZ LOP1MOV BX,OFFSET D1MOV CX,COUNTMOV DX,0LOP1:MOV AL,BX CMP AL,0JLE JUSTIINC DX如果求数据块中大于如果求数据块中大于0的数之和的数之和,结果送结果送RS单元单元,试修改程序试修改程序.等价于等价于LOOP LOP1初始化部分初始化部分循环体循环体修改部分修改部分控制部分控制部分63B.先判断,后执行结构(通常采用条件控制循环)先判断,后执行结构(通常采用条件控制循环)流
52、程图如右流程图如右初始化部分初始化部分循环结循环结束?束?循环体循环体修改部分修改部分出口出口YN入口入口64【课本例课本例4-7】 AX寄存器中有一个寄存器中有一个 16位的二进制数,位的二进制数,编程统计其中值为编程统计其中值为 1的位的个数,并将结果存于的位的个数,并将结果存于CX中。中。解:解: 由于由于AX有可能有可能为为 0,若,若AX=0则不则不必再往下作统计工必再往下作统计工作,因此可采用先作,因此可采用先判断,后执行结构。判断,后执行结构。流程图如右:流程图如右:STARTCX0AX=0?AX左移左移CF=0?CX CX+1ENDYNYN65CODE SEGMENTASSUM
53、ECS:CODESTART:NOP;-MOVAX,1100101000111101BXORCX,CXAGAIN:CMPAX,0;建立标志位建立标志位ZF JZNEXTSHLAX,1JNCAGAIN;判断判断CF,CF等于等于0跳转跳转INCCXJMPAGAINNEXT: NOP;-MOVAH,4CHINT21HCODE ENDSEND STARTTEST AX,0FFFFH(AND AX,AX)66例:在一串字符串中查找某一关键字例:在一串字符串中查找某一关键字#,若查到,若查到,记下存放该关键字单元的偏移地址,若找不到用记下存放该关键字单元的偏移地址,若找不到用 -1 作作标记。标记。解:设
54、串变量名解:设串变量名 STRING,关键字单元关键字单元CHAR,关键关键字单元的偏移地址放字单元的偏移地址放 FLAG单元。寄存器单元。寄存器 SI为字符为字符串的地址指针,串的地址指针,CX为字符串长度,为字符串长度,AL用于放关键字用于放关键字#。67STARTSI STRING的的EA CX 串长度串长度 AL #SI=AL?SI=SI+1CX-1=0?FLAG -1ENDFLAG SIYNYN还可用字符串指令实现还可用字符串指令实现683、 多重循环多重循环循环体中又有循环称多重循环。循环体中又有循环称多重循环。 开始开始循环控制条件循环控制条件循环体循环体结束结束循环控制条件循环
55、控制条件循环体循环体69 程序设计过程中常常把多次引用的相同程序段编程序设计过程中常常把多次引用的相同程序段编成一个独立的程序段,当需要只执行这个程序段时,成一个独立的程序段,当需要只执行这个程序段时,可以用调用指令调用它。具有这种功能的程序段称为可以用调用指令调用它。具有这种功能的程序段称为过程过程或或子程序子程序。 适合编成子程序的程序有以下两大类适合编成子程序的程序有以下两大类:l程序需要反复使用,这类程序编成子程序可避免重复程序需要反复使用,这类程序编成子程序可避免重复编写程序,并节省大量存储空间。编写程序,并节省大量存储空间。l 程序具有通用性,这类程序大家都要用到,如键盘程序具有通
56、用性,这类程序大家都要用到,如键盘管理程序,磁盘读写程序,标准函数程序等。编成子管理程序,磁盘读写程序,标准函数程序等。编成子程序后便于用户共享。程序后便于用户共享。4.4.4 子程序子程序701、编写子程序文件、编写子程序文件 为了使用户使用方便,子程序应当以文件形式编写。为了使用户使用方便,子程序应当以文件形式编写。一般包含两部分:一般包含两部分:(1)子程序说明部分)子程序说明部分(2)子程序程序部分)子程序程序部分子程序用过程定义伪指令子程序用过程定义伪指令(PROC/ENDP)定义,编写格式如下:定义,编写格式如下:子程序名子程序名 PROC(NEAR/FAR) RET子程序名子程序
57、名 ENDPNEAR:当子程序和调用:当子程序和调用程序在同一代码段;程序在同一代码段;FAR: 当子程序和调用当子程序和调用程序不在同一代码段。程序不在同一代码段。71【课本例课本例4-10】编写子程序,将内存为编写子程序,将内存为BUF的缓冲区清的缓冲区清0。DATA SEGMENT BUF DB 20H DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASUPROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATA MOV DS,AX;-;-RETSUENDPCODE ENDS END SU MOV BX,OFFSE
58、T BUF LP: MOV BX,0 INC BX CMP BX,20H JNZ LP72(2)调用子程序时寄存器及所用存储单元内容的保护。调用子程序时寄存器及所用存储单元内容的保护。 如果子程序中要用到某些寄存器或存储单元时,如果子程序中要用到某些寄存器或存储单元时,为了不破坏原有的信息,要将寄存器或存储单元的原为了不破坏原有的信息,要将寄存器或存储单元的原有内容压栈保护或存入子程序不用的寄存器或存储单有内容压栈保护或存入子程序不用的寄存器或存储单元中。元中。2、子程序使用中的问题、子程序使用中的问题(1)子程序的调用和返回子程序的调用和返回 主程序调用子程序主程序调用子程序 是通过是通过C
59、ALL指令来实现,指令来实现,子程序执行后,通过子程序执行后,通过RET指令返回主程序。指令返回主程序。73 为程序员编写汇编语言源程序时提供方便,为程序员编写汇编语言源程序时提供方便,MS-DOS系统中设置了几十个内部子程序,可供用户调用。系统中设置了几十个内部子程序,可供用户调用。调用时需要使用软中断指令:调用时需要使用软中断指令: INT n 为软中断调用的类型号,其中为软中断调用的类型号,其中DOS功能子程序功能子程序的调用使用中断指令的调用使用中断指令“INT 21H”,它共有它共有80多个功多个功能子程序,可完成磁盘读写控制,文件管理,存储管能子程序,可完成磁盘读写控制,文件管理,
60、存储管理,基本输入理,基本输入/输出管理等功能。输出管理等功能。 调用调用21H类型功能子程序时需要用以下方式:类型功能子程序时需要用以下方式:l传送入口参数到指定寄存器中传送入口参数到指定寄存器中l调用的功能号送入调用的功能号送入AH寄存器寄存器lINT 21H4.4.5 5 DOSDOS功能调用功能调用74n带显示的键盘输入单字符带显示的键盘输入单字符(1号功能号功能):输入字符的输入字符的ASCII码存码存入入AL,并在屏幕上显示该字符。并在屏幕上显示该字符。格式:格式: MOV AH,01H INT 21H ; n不带显示的键盘输入单字符不带显示的键盘输入单字符(8号功能号功能): 同
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【2025考研】全国统考数学三历年真题(高清电子版)
- 2024考研数学二期末试卷|高频考点
- 军训实训考试题及答案
- 悬吊操作考试题及答案
- 2026年高职美容美发(美发进阶技术)试题及答案
- 燃气锅考试题及答案
- 重力坝考试题及答案
- 护士结核考试题及答案
- 沧州市肃宁县2027届数学三年级第一学期期末教学质量检测模拟试题含解析
- 江苏省无锡市江阴市2026年七上数学期末达标测试试题含解析
- 天然气中氦气含量测定规范
- 煤层气地质学课件
- 2022机电工程安装工艺细部节点做法
- 人格障碍课件
- DB44T 1242-2013 水产饲料添加剂β-1,3-D-葡聚糖
- 公司后勤安全培训课件
- 大象版心理健康六年级全册教学设计教案
- 2025年高考地理大题答题模板汇编
- 企业安全生产风险辨识评估管控指导手册-件杂货码头
- 矿山运输安全培训课件
- 应急广播维护合同范本
评论
0/150
提交评论