资源预览内容
第1页 / 共116页
第2页 / 共116页
第3页 / 共116页
第4页 / 共116页
第5页 / 共116页
第6页 / 共116页
第7页 / 共116页
第8页 / 共116页
第9页 / 共116页
第10页 / 共116页
亲,该文档总共116页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
微机原理与接口技术微机原理与接口技术第四章第四章 汇编语言程序设计汇编语言程序设计主要内容主要内容n n汇编语言源程序格式汇编语言源程序格式n n指示性语句指示性语句n n系统功能调用方法系统功能调用方法n n汇编程序设计方法汇编程序设计方法n n综合举例综合举例汇编语言源程序格式汇编语言源程序格式n n完整的汇编语言源程序由逻辑段组成。完整的汇编语言源程序由逻辑段组成。完整的汇编语言源程序由逻辑段组成。完整的汇编语言源程序由逻辑段组成。n n一个汇编语言源程序可以包含若干个代码段、数据段、附一个汇编语言源程序可以包含若干个代码段、数据段、附一个汇编语言源程序可以包含若干个代码段、数据段、附一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段。加段或堆栈段。加段或堆栈段。加段或堆栈段。n n段与段之间的顺序可随意排列。段与段之间的顺序可随意排列。段与段之间的顺序可随意排列。段与段之间的顺序可随意排列。n n需独立运行的程序必须包含一个代码段,并指示程序执行需独立运行的程序必须包含一个代码段,并指示程序执行需独立运行的程序必须包含一个代码段,并指示程序执行需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。的起始点,一个程序只有一个起始点。的起始点,一个程序只有一个起始点。的起始点,一个程序只有一个起始点。n n通常,程序还需要一个堆栈段。通常,程序还需要一个堆栈段。通常,程序还需要一个堆栈段。通常,程序还需要一个堆栈段。n n段由若干语句组成,一条语句通常写成一行。段由若干语句组成,一条语句通常写成一行。段由若干语句组成,一条语句通常写成一行。段由若干语句组成,一条语句通常写成一行。一个完整的汇编语言源程序一个完整的汇编语言源程序DATA SEGMENTMINUS DB ?NUMBER DB 100DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATACOUNT EQU 100START:MOV AX, DATAMOV DS, AXMOV MINUS, 0LEA SI, NUMBERMOV CX,COUNTAGAIN:MOV AL, SIOR AL, ALJNS NOT_MINUSINC MINUSNOT_MINUS:LOOP AGAINMOV AH, 4CHINT 21HCODE ENDSEND START汇编语言的语句格式汇编语言的语句格式n n指令性语句指令性语句指令性语句用于表达处理器指令,汇编后对应一条指令代码(目标代码),因而是可执行语句 标号标号标号标号: : 操作数操作数操作数操作数 ; ;注释注释注释注释 n n指示性语句指示性语句指示性语句指示源程序如何汇编、变量怎样定义、过程怎么设置,也称为伪指令,汇编时不产生目标代码,是不可执行语句 名字名字名字名字 参数参数参数参数 ; ;注释注释注释注释 每个部分称为“项”或“域”、“场”。指令与伪指令指令与伪指令n n指令指令(Instruction)n n让让CPUCPU产生动作,在产生动作,在程序执行时程序执行时才处理。才处理。n n指令就是第指令就是第3 3章章学习的处理器指令学习的处理器指令,与具体的处理,与具体的处理器有关、与汇编程序无关。器有关、与汇编程序无关。n n伪指令伪指令(Directive)n n不不产生产生CPUCPU动作,在动作,在程序执行前由程序执行前由汇编程序处理。汇编程序处理。n n伪指令与具体的处理器类型无关,但与汇编程序有伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令。关。不同版本的汇编程序支持不同的伪指令。指令和伪指令采用易于记忆的符合表达,这就是助记符标号、名字与标识符标号、名字与标识符n n标号标号是反映指令位置(逻辑地址)和属性的标识是反映指令位置(逻辑地址)和属性的标识符,后跟一个符,后跟一个冒号冒号分隔分隔n n名字名字是反映伪指令位置(逻辑地址)和属性的标是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,识符,后跟空格或制表符分隔,没有冒号没有冒号n n标识符标识符(IdentifierIdentifier)一般最多由一般最多由3131个字母、数字个字母、数字及规定的特殊符号(如及规定的特殊符号(如 _ _、$ $、? ?、)组成,)组成,不能不能以数字开头以数字开头。n n默认情况下,汇编程序不区别标识符中的字母大默认情况下,汇编程序不区别标识符中的字母大小写小写n n一个源程序中,每个标识符的定义是唯一的,还一个源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的不能是汇编语言采用的保留字保留字保留字保留字n n保留字保留字(Reserved Word)是汇编程序已经利用的标识符(也称为关键字关键字关键字关键字),主要有:n n指令助记符指令助记符指令助记符指令助记符例如例如:MOVMOV、ADDADDn n伪指令助记符伪指令助记符伪指令助记符伪指令助记符例如:例如:DBDB、DWDWn n操作符操作符操作符操作符例如:例如:OFFSETOFFSET、PTRPTRn n寄存器名寄存器名寄存器名寄存器名例如:例如:AXAX、CSCS 汇编语言大小写不敏感操作数和参数操作数和参数n n处理器指令的操作数操作数操作数操作数可以是立即数、寄存器和存储单元n n伪指令的参数参数参数参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔注释注释n n语句中由分号“ “;” ”开始的部分为注释内容,用以增加源程序的可读性n n必要时,一个语句行也可以由分号开始作为阶段性注释n n汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理分隔符分隔符n n语句的4个组成部分要用分隔符分开n n标号后用冒号,注释前用分号n n操作数之间和参数之间使用逗号分隔n n其他部分通常采用空格或制表符n n多个空格和制表符的作用与一个相同常量、变量和标号常量、变量和标号 n n汇编语言的数据可以简单分为常量和变量n n常量常量可以作为指令的立即数或伪指令的参数,变量变量主要作为存储器操作数n n汇编语言语句中的名字和标号名字和标号具有逻辑地址和类型属性,主要用做地址操作数,也可以作为立即数和存储器操作数常量常量常量表示一个固定的数值,它又分成多种形式1.1.常数常数2.2.字符串字符串3.3.符号常量符号常量4.4.数值表达式数值表达式(1) 常数常数n n指由指由1010、1616、2 2和和8 8进制形式表达的数值,各种进进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的制的数据以后缀字母区分,默认不加后缀字母的是十进制数是十进制数十进制十进制由由0 90 9数字组成,以字母数字组成,以字母D D(d d)结结尾(缺省情况可以省略)尾(缺省情况可以省略)100100,255D255D十六进制十六进制由由0 90 9、A FA F数字组成,以字母数字组成,以字母H H(h h)结尾,以字母开头的常数需结尾,以字母开头的常数需要加一个前导要加一个前导0 064H64H,0FFH0FFH0B800H0B800H二进制二进制由由0 0和和1 1两个数字组成,以字母两个数字组成,以字母B(b)B(b)结尾结尾01100100B01100100B(2) 字符串字符串n n字符串常量是用单引号或双引号括起来的单个字符或多个字符n n其数值是每个字符对应的数值是每个字符对应的ASCII码值码值n n例如:d(等于64H)AB(等于4142H)Hello, Assembly !(3) 符号常量符号常量n n符号常量使用标识符表达一个数值符号常量使用标识符表达一个数值n n用来为常量定义符号名用来为常量定义符号名n n符号定义伪指令有符号定义伪指令有“ “等价等价EQU” ”和和“ “等号等号” ”:符号名符号名 EQU 数值表达式数值表达式符号名符号名 数值表达式数值表达式n nEQU不能重复定义符号名,但“”允许重复定义。例如:X = 7;等效于:等效于:X X equequ 7 7X = X+5;“ “X EQU X+5”X EQU X+5”是错误的是错误的举例举例NUMBER EQU200COUNT EQU6*9ADDR EQUES:DI+2 MV EQUMOVSTRW EQUWORD PTR STRINGCOUNT = 123COUNT = COUNT +1(4) 表达式表达式n n表达式一般是由表达式一般是由运算符运算符连接的各种常量所构成连接的各种常量所构成n n汇编程序在汇编过程中计算表达式,最终得到一汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量个确定的数值,所以也是常量n n表达式的数值在程序运行前的汇编阶段计算,所表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定以组成表达式的各部分必须在汇编时就能确定n n经常使用的是加减乘除经常使用的是加减乘除( * / )n n例如:例如:mov ax,3*4+5;等价于:;等价于:movmov ax,17 ax,17and ax, 3 and 5 ;等价于:;等价于:and ax, 1and ax, 1变量变量 n n变量变量实质上是指内存单元的数据,虽然内存单元实质上是指内存单元的数据,虽然内存单元地址不变,但其中存放的数据可以改变地址不变,但其中存放的数据可以改变n n变量需要事先定义才能使用变量需要事先定义才能使用n n变量定义(变量定义(DefineDefine)伪指令为变量申请固定长度伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单为单位的存储空间,并可以同时将相应的存储单元初始化元初始化n n定义后的变量可以利用变量名等方法引用其中的定义后的变量可以利用变量名等方法引用其中的数据,即变量的数值数据,即变量的数值(1) 变量的定义变量的定义 n n变量定义的汇编语言格式为:变量定义的汇编语言格式为:变量名变量名 伪指令伪指令 初值表初值表n n变量名变量名为用户自定义标识符,表示初值表首为用户自定义标识符,表示初值表首元素的逻辑地址,常称为符号地址。变量名也元素的逻辑地址,常称为符号地址。变量名也可以没有可以没有n n初值表初值表是用逗号分隔的参数是用逗号分隔的参数, ,主要由常量、数主要由常量、数值表达式或值表达式或“ “?” ”组成。其中组成。其中“ “?” ”表示未赋表示未赋初值初值n n多个存储单元如果初值相同,可以用复制操作多个存储单元如果初值相同,可以用复制操作符符DUP进行定义:进行定义:重复次数重复次数 DUP(重复参数重复参数)n n变量定义伪指令有变量定义伪指令有DBDB、DWDW、DDDD等等字节变量的定义字节变量的定义DBn nDB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值n n初值表中每个数据一定是字节量,存放一个8位数据:n n可以是0255的无符号数n n或是128127带符号数n n也可以是字符串常数字节变量定字节变量定义实例义实例;数据段;数据段X Xdb a,-5db a,-5db 2 dup(100),?db 2 dup(100),?Y Ydb ABCdb ABC字节变量的应用字节变量的应用mov al,X ;此处X表示它的第1个数据,故ALadec X+1 ;对X为始的第2个数据减1,故成为6mov Y,al ;现在Y这个字符串成为 aBC字变量的定义字变量的定义DWn nDW伪指令用于分配一个或多个字单元,并可以伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值将它们初始化为指定值n n初值表中每个数据是字量,一个字单元可用于存初值表中每个数据是字量,一个字单元可用于存放任何放任何1616位数据:位数据:n n一个段地址一个段地址n n一个偏移地址一个偏移地址n n两个字符两个字符n n065535065535之间的无符号数之间的无符号数n n32768327683276732767之间的带符号数之间的带符号数字变量定字变量定义实例义实例;数据段;数据段countcountdwdw 8000h,?,AB 8000h,?,ABmaxintmaxintequequ 64h 64hnumbernumberdwdw maxintmaxintarrayarraydwdw maxintmaxint dup(0) dup(0)双字变量的定义双字变量的定义DDn nDD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值n n初值表中每个数据是一个32位的双字量:可以是有符号或无符号的可以是有符号或无符号的3232位整数位整数也可以用来表达也可以用来表达1616位段地址(高位字)和位段地址(高位字)和1616位位的偏移地址(低位字)的远指针的偏移地址(低位字)的远指针varddDD 0,?,12345678hfarpoint DD 00400078h(2)变量的应用变量的应用n n变量变量具有存储单元的逻辑地址n n程序代码中n n通过变量名引用其指向的首个数据通过变量名引用其指向的首个数据n n通过变量名加减位移量存取以首个数据为基地通过变量名加减位移量存取以首个数据为基地址的前后数据址的前后数据 变量的定义变量的定义 bvar1 db 100,01100100b,64h,d ;字节变量:不同进制表达同一个数值,内存中有;字节变量:不同进制表达同一个数值,内存中有4 4个个64H64Hminint= 5 ;符号常量:;符号常量:minintminint数值为数值为5 5,不占内存空间,不占内存空间bvar2 db -1,minint,minint+5 ;内存中数值依次为;内存中数值依次为FFH,5,0AHFFH,5,0AHdb ?,2 dup(20h) ;预留一个字节空间,重复定义了;预留一个字节空间,重复定义了2 2个数值个数值20H20Hwvar1 dw 2010h,4*4 ;字变量:两个数据是;字变量:两个数据是2010H2010H、0010H0010H,共占共占4 4个字节个字节wvar2 dw ? ;wvar2wvar2是没有初值的字变量是没有初值的字变量变量的定义(续)变量的定义(续)dvardvardddd 12347777h,87651111h,? 12347777h,87651111h,? ;双字变量:;双字变量:2 2个双字数据,一个双字空间个双字数据,一个双字空间abcabcdb a,b,c,?db a,b,c,?;定义字符,实际是字节变量定义字符,实际是字节变量maxintmaxint equequ 0ah 0ah;符号常量:符号常量:maxintmaxint1010stringstring db ABCDEFGHIJdb ABCDEFGHIJ ;定义字符串:使用字节定义;定义字符串:使用字节定义DBDB伪指令伪指令crlfsdb 13,10,$ ;回车符;回车符0DH0DH、换行符换行符0AH0AH和字符和字符$24H24Harray1dw maxint dup(0) ;1010个初值为个初值为0 0的字量,可以认为是数组的字量,可以认为是数组array db 2 dup(2,3,2 dup(4) ;6 6个字节内容依次为:个字节内容依次为:02 03 04 02 03 04 0404 02 03 04 02 03 04 0404变量的应用变量的应用;代码段;代码段movmov dl,bvar1 dl,bvar1;DLDL100100decdec bvar2+1 bvar2+1;bvar2+1bvar2+14 4movmov abc+3,dl abc+3,dl;abcabc abcdabcd movmov ax,word ax,word ptrptr dvardvar;取双字到取双字到DX.AXDX.AXmovmov dx,worddx,word ptrptr dvar+2 dvar+2add ax,word add ax,word ptrptr dvar+4 dvar+4;加双字到加双字到DX.AXDX.AXadcadc dx,worddx,word ptrptr dvar+6 dvar+6movmov word word ptrptr dvar+8,ax dvar+8,ax;保存双字的求和结果保存双字的求和结果movmov word word ptrptr dvar+10,dx dvar+10,dx(3) 变量的定位变量的定位n n汇编程序按照指令的先后顺序一个接着一个分配汇编程序按照指令的先后顺序一个接着一个分配存储空间存储空间n n定位伪指令定位伪指令ORGORG控制数据或代码所在的偏移地址控制数据或代码所在的偏移地址ORG ORG 参数参数参数参数n nORGORG伪指令是将当前偏移地址指针指向参数表达伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如:的偏移地址。例如:ORG 100hORG 100h ; ;从从100H100H处安排数据或程序处安排数据或程序ORG $+10ORG $+10 ; ; 偏移地址加偏移地址加1010,即跳过,即跳过1010个字节空间个字节空间n n汇编语言程序中,符号汇编语言程序中,符号汇编语言程序中,符号汇编语言程序中,符号“ “$”$”表示当前偏移地址表示当前偏移地址表示当前偏移地址表示当前偏移地址值值值值程序计数器程序计数器$n n 汇编程序有一个当前位置计数器当前位置计数器,用来记录正在汇编的数据或指令目标代码存放在当前段内的偏移量。n n $表示位置计数器的当前值。例如:n nBLOCK DB Hellon nNUM EQU $-BLOCK名字和标号的属性名字和标号的属性n n名字和标号是用户自定义的标识符。名字和标号是用户自定义的标识符。名字名字指向一指向一条伪指令,条伪指令,标号标号指向一条指令。名字和标号一经指向一条指令。名字和标号一经使用便具有两类属性:使用便具有两类属性: 逻辑地址逻辑地址名字和标号对应存储单元的逻名字和标号对应存储单元的逻辑地址,含有段地址和偏移地址;辑地址,含有段地址和偏移地址; 类型类型变量名的类型可以是变量名的类型可以是BYTE、WORD和和DWORD等;标号、段名、子程序名等;标号、段名、子程序名的类型可以是的类型可以是NEAR和和FAR,分别表示段内或,分别表示段内或段间调用段间调用n n汇编程序提供操作符汇编程序提供操作符TYPE,以便获取这些属性值以便获取这些属性值(1) 地址操作符地址操作符n n地址操作符地址操作符地址操作符地址操作符取得名字或标号的段地址和偏移地址取得名字或标号的段地址和偏移地址 将括起的表达式作为存储器地址指针将括起的表达式作为存储器地址指针 $ $当前偏移地址当前偏移地址 : :段前缀,采用指定的段地址寄存器段前缀,采用指定的段地址寄存器OFFSET OFFSET 名字名字/ /标号标号返回名字或标号的偏移地址返回名字或标号的偏移地址SEG SEG 名字名字/ /标号标号返回名字或标号的段地址返回名字或标号的段地址举例举例; ; 数据段数据段BUFFER DB ?BUFFER DB ?; ; 代码段代码段MOV BX, MOV BX, OFFSETOFFSET BUFFER BUFFER MOV BX, MOV BX, SEGSEG BUFFER BUFFER LEA BX, BUFFER(2) 类型操作符类型操作符n n类型操作符类型操作符类型操作符类型操作符对名字或标号的类型属性进行设置对名字或标号的类型属性进行设置类型名类型名类型名类型名 PTR PTR 名字名字名字名字/ /标号标号标号标号n n其中类型名可以是其中类型名可以是BYTEBYTE、WORDWORD、DWORD, DWORD, 或或者是者是NEARNEAR、FARFARn n操作符操作符SHORTSHORTn n对变量:对变量:l lLENGTHLENGTH 操作符获知某变量名指向多少个数据项操作符获知某变量名指向多少个数据项l lSIZESIZE 操作符获知它共占用多少字节空间操作符获知它共占用多少字节空间l lTYPETYPE 操作符获取变量类型值操作符获取变量类型值举例举例; ; 数据段数据段BUFFER DW ?STRING DB Hello, 10 DUP(?)RESULT DB 10 DUP(1,?); ; 代码段代码段MOV BX, TYPETYPE BUFFERMOV BX, TYPETYPE STRING MOV BX, TYPETYPE RESULT; (BX)=2; (BX)=1; (BX)=1举例举例; ; 数据段数据段BUFFER DW ?STRING DB Hello, 10 DUP(?)RESULT DB 10 DUP(1,?); ; 代码段代码段MOV BX, LENGTHLENGTH BUFFERMOV BX, LENGTHLENGTH STRING MOV BX, LENGTHLENGTH RESULT; (BX)=1; (BX)=1; (BX)=10举例举例; ; 数据段数据段BUFFER DW ?STRING DB Hello, 10 DUP(?)RESULT DB 10 DUP(1,?); ; 代码段代码段MOV BX, SIZESIZE BUFFERMOV BX, SIZESIZE STRING MOV BX, SIZESIZE RESULT; (BX)=2; (BX)=15; (BX)=20举例举例;数据段;数据段STUFF DD 12345678HSTUFF DD 12345678H;代码段;代码段MOV CL, BYTE PTR STUFFMOV CL, BYTE PTR STUFFMOV CH, BYTE PTR STUFF+1MOV CH, BYTE PTR STUFF+1MOV AX, WORD PTR STUFFMOV AX, WORD PTR STUFFMOV DX, WORD PTR STUFF+2MOV DX, WORD PTR STUFF+2; (CL)=78H; (CH)=56H; (AX)=5678H; (DX)=1234H段名段名 SEGMENT段名段名 ENDS段定义语句段定义语句(1) SEGMENT定义一个逻辑段,并给逻辑定义一个逻辑段,并给逻辑段赋予一个段名。段赋予一个段名。(2) 常见的段名如常见的段名如:CODE, DATA, STACKn n格式n nASSUME ASSUME 段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名, 段寄存器名:段名段寄存器名:段名段寄存器名:段名段寄存器名:段名 n n如如 ASSUME CS:CODE,DS:DATA,SS:STACKASSUME CS:CODE,DS:DATA,SS:STACKn n作用n n明确段寄存器与逻辑段之间的关系,并明确段寄存器与逻辑段之间的关系,并不是不是给段寄给段寄存器赋初值。存器赋初值。ASSUME完整段定义格式完整段定义格式n n完整段定义利用SEGMENTSEGMENT和ENDSENDS一对伪指令定义逻辑段n n同时需要配合ASSUMEASSUME伪指令指明逻辑段是代码段、堆栈段、数据段还是附加段n n完整段定义的优势是可以指明逻辑段的定位、组合、类别等属性n n而简化段定义只能采用系统默认的属性过程名过程名 PROC NEAR/FARRET过程名过程名 ENDP调用过程:CALL 过程名过程定义语句过程定义语句伪指令小结伪指令小结n n 符号定义语句符号定义语句符号定义语句符号定义语句n nEQU =EQU =n n 数据定义语句数据定义语句数据定义语句数据定义语句n nDB DW DD DUPDB DW DD DUPn n 段定义语句段定义语句n nSEGMENT/ENDSSEGMENT/ENDSn nASSUMEASSUMEn n 过程定义语句过程定义语句n nPROC/ENDPPROC/ENDPn n 其他其他n nORG $ ENDORG $ ENDn n 常用运算符常用运算符n nAND OR XOR NOTAND OR XOR NOTn nOFFSET SEG LENGTH SIZE TYPE PTR SHORTOFFSET SEG LENGTH SIZE TYPE PTR SHORT程序开始程序开始n n为了指明程序开始执行的位置,需要使用一个标为了指明程序开始执行的位置,需要使用一个标号(例题中采用了号(例题中采用了startstart标识符)标识符)n n连接程序会根据程序起始点正确地设置连接程序会根据程序起始点正确地设置CSCS和和IPIP值,根据程序大小和堆栈段大小设置值,根据程序大小和堆栈段大小设置SSSS和和SPSP值值n n连接程序没有设置连接程序没有设置DSDS和和ESES值。程序如果使用数值。程序如果使用数据段或附加段,必须明确给据段或附加段,必须明确给DSDS或或ESES赋值赋值n n大多数程序需要数据段,程序的执行开始应是:大多数程序需要数据段,程序的执行开始应是:start:start: movmov ax, data ax, data;datadata表示数据段的段地址表示数据段的段地址movmov ds,axds,ax;设置设置DSDS程序终止程序终止n n应用程序执行结束,应该将控制权交还操作系统应用程序执行结束,应该将控制权交还操作系统n n汇编语言程序设计中,有多种返回汇编语言程序设计中,有多种返回DOSDOS的方法,的方法,但一般利用但一般利用DOSDOS功能调用的功能调用的4CH4CH子功能实现,它子功能实现,它需要的入口参数是需要的入口参数是ALAL返回数码(通常用返回数码(通常用0 0表示表示程序没有错误)程序没有错误)n n于是,应用程序的终止代码就是:于是,应用程序的终止代码就是:movmov ax,4c00h ax,4c00hintint 21h 21h汇编结束汇编结束n n汇编结束表示汇编程序到此结束将源程序翻译成目标模块代码的过程n n源程序的最后必须有一条END伪指令END 标号标号n n可选的“标号”参数指定程序开始执行点,连接程序据此设置CS和IP值(例题中采用了startstart标识符) 不要糊涂程序终止和汇编结束是两码事系统功能调用方法系统功能调用方法n n汇编程序提供给汇编汇编程序提供给汇编汇编程序提供给汇编汇编程序提供给汇编语言程序员的功能非语言程序员的功能非语言程序员的功能非语言程序员的功能非常有限常有限常有限常有限n n程序员需要利用程序员需要利用程序员需要利用程序员需要利用ROM-ROM-BIOSBIOS和操作系统提供和操作系统提供和操作系统提供和操作系统提供的资源的资源的资源的资源n n系统功能调用是程序系统功能调用是程序系统功能调用是程序系统功能调用是程序设计的一个重要方面设计的一个重要方面设计的一个重要方面设计的一个重要方面裸机裸机汇编语言程序系统功能调用步骤系统功能调用步骤n n通常按照如下4个步骤进行: 在在在在AHAH寄存器中设置系统功能调用号寄存器中设置系统功能调用号寄存器中设置系统功能调用号寄存器中设置系统功能调用号 在指定寄存器中设置入口参数在指定寄存器中设置入口参数在指定寄存器中设置入口参数在指定寄存器中设置入口参数 用中断调用指令(用中断调用指令(用中断调用指令(用中断调用指令( INT i8INT i8)执行功能调用执行功能调用执行功能调用执行功能调用 根据出口参数分析功能调用执行情况根据出口参数分析功能调用执行情况根据出口参数分析功能调用执行情况根据出口参数分析功能调用执行情况DOS输入输出功能调用输入输出功能调用n nDOS利用21H号中断提供给用户近百个系统功能,主要包括设备管理、目录管理和文件管理三个方面的功能n n重点掌握:n n输入一个字符,输入一个字符,输入一个字符,输入一个字符,01H01H号功能调用号功能调用号功能调用号功能调用n n输出一个字符,输出一个字符,输出一个字符,输出一个字符,02H02H号功能调用号功能调用号功能调用号功能调用n n输出一个字符串,输出一个字符串,输出一个字符串,输出一个字符串,09H09H号功能调用号功能调用号功能调用号功能调用02H号号DOS功能调用功能调用n n输出一个字符 功能调用号:功能调用号:功能调用号:功能调用号:AHAH02H02H 入口参数:入口参数:入口参数:入口参数:DLDL欲显示字符的欲显示字符的欲显示字符的欲显示字符的ASCIIASCII码码码码 功能调用:功能调用:功能调用:功能调用:INT 21HINT 21H 出口参数:无出口参数:无出口参数:无出口参数:无;显示一个问号;显示一个问号“ ?”mov ah,02h;设置功能调用号设置功能调用号mov dl,?;设置入口参数设置入口参数int 21h;功能调用功能调用例题例题-回车换行的子程序回车换行的子程序crlfcrlfprocprocpush axpush ax;保护寄存器;保护寄存器push push dxdxmovmov ah,2 ah,2movmov dl,0dh dl,0dh ;回车功能的;回车功能的ASCIIASCII码是码是0DH0DHintint 21h 21hmovmov ah,2 ah,2movmov dl,0ah dl,0ah ;换行功能的换行功能的ASCIIASCII码是码是0AH0AHintint 21h 21hpop pop dxdx;恢复寄存器;恢复寄存器pop axpop axretretcrlfcrlfendpendp09H号号DOS功能调用功能调用n n输出一个字符串输出一个字符串 功能调用号:功能调用号:功能调用号:功能调用号:AHAH09H09H 入口参数:入口参数:入口参数:入口参数:DS:DXDS:DX欲显示字符串在内存中的首地址(逻辑欲显示字符串在内存中的首地址(逻辑欲显示字符串在内存中的首地址(逻辑欲显示字符串在内存中的首地址(逻辑地址形式:地址形式:地址形式:地址形式:DSDS段地址,段地址,段地址,段地址,DXDX偏移地址)偏移地址)偏移地址)偏移地址)内存中的字符串以内存中的字符串以内存中的字符串以内存中的字符串以ASCIIASCII码形式保存,最后必须添码形式保存,最后必须添码形式保存,最后必须添码形式保存,最后必须添加一个加一个加一个加一个“ “$”$”结尾(并不显示)结尾(并不显示)结尾(并不显示)结尾(并不显示) 功能调用:功能调用:功能调用:功能调用:INT 21HINT 21H 出口参数:无出口参数:无出口参数:无出口参数:无例题例题-在屏幕上显示一段信息在屏幕上显示一段信息; ;数据段(定义要显示的字符串)数据段(定义要显示的字符串)stringstringdb Hello, db Hello, A As ss se emmb bl ly y !,0dh,0ah,$ !,0dh,0ah,$; ;代码段(显示字符串的程序)代码段(显示字符串的程序)movmov dx,offsetdx,offset string stringmovmov ah,9 ah,9intint 21h 21hHello, Assembly !程序功能程序功能01H号号DOS功能调用功能调用n n输入一个字符 功能调用号:功能调用号:功能调用号:功能调用号:AHAH01H01H 入口参数:无入口参数:无入口参数:无入口参数:无 功能调用:功能调用:功能调用:功能调用:INT 21HINT 21H 出口参数:出口参数:出口参数:出口参数:ALAL键入字符的键入字符的键入字符的键入字符的ASCIIASCII码码码码;输入一个字符;输入一个字符mov ah,01h;设置功能调用号设置功能调用号int 21h;功能调用;功能调用mov dl,al;使用出口参数;使用出口参数结束用户程序的方法结束用户程序的方法START PROC FARSTART PROC FARBEGIN: PUSH DSBEGIN: PUSH DS MOV AX, 0 MOV AX, 0 PUSH AX PUSH AX . . RET RETSTART ENDPSTART ENDP推荐采用第1种方法。MOV AH, 4CHMOV AH, 4CHINT 21HINT 21HINT 20HINT 20HJMP 0JMP 0MOV AH, 0MOV AH, 0INT 21HINT 21H顺序程序设计顺序程序设计n n没有分支、循环等转移指令的程序,会按指令书没有分支、循环等转移指令的程序,会按指令书写的前后顺利依次执行,这就是写的前后顺利依次执行,这就是顺序程序顺序程序顺序程序顺序程序n n顺序结构是最基本的程序结构顺序结构是最基本的程序结构n n完全采用顺序结构编写的程序并不多见完全采用顺序结构编写的程序并不多见例题例题STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 64DUP DW 64DUP(?)(?) ;定义堆栈段;定义堆栈段STACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENT X DW 0010H X DW 0010H Y DW 0123H Y DW 0123H Z DW 7890H Z DW 7890H V DW 3456H V DW 3456H ;分配变量;分配变量X X、Y Y、Z Z、V V QR DW QR DW ? ;存放商;存放商 REMAINDER DW REMAINDER DW ?;存放余数;存放余数DATA ENDSDATA ENDS要求:计算(要求:计算(要求:计算(要求:计算(V V(X*YX*YZ Z540540)/X/X例例 代码段代码段CODE SEGMENTCODE SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKMAIN PROCMAIN PROCSTARTSTART: MOV AXMOV AX,DATADATA MOV DS MOV DS,AX AX ;初始化;初始化DSDS MOV AX MOV AX,X X ;AXXAXX IMUL Y IMUL Y;DXDX:AXX*YAXX*Y MOV CX MOV CX,AXAX MOV BX MOV BX,DXDX;暂存在;暂存在BXBX,CXCX中中 MOV AXMOV AX,Z Z CWDCWD;Z Z扩展扩展 ADD CXADD CX,AXAX ADCADC BX BX,DXDX;BXBX:CXX*YCXX*YZ Z 例例 代码段代码段(续续1) SUB CXSUB CX,540540 SBB BX SBB BX,0 0;可能有借位;可能有借位 MOV AXMOV AX,V V CWD CWD;扩展;扩展V V SUB AX SUB AX,CXCX SBBSBB DX DX,BXBX IDIVIDIV X X MOV MOV QRQR,AX AX ;保存商;保存商 MOV MOV REMAINDERREMAINDER,DXDX;保存余数;保存余数 例例 代码段代码段(续续2) MOV AHMOV AH,4CH4CH INT 21H INT 21H;程序结束,返回到程序结束,返回到DOSDOS MAIN ENDP MAIN ENDP;过程结束过程结束 CODE ENDSCODE ENDS;码段结束码段结束 END STARTEND START;结束汇编,指定程序入口地址结束汇编,指定程序入口地址举例顺序程序设计实例举例顺序程序设计实例data segmentdata segmentASCIIASCIIdbdb 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;对应对应0 90 9的的ASCIIASCII码码db 41h,42h,43h,44h,45h,46h;对应对应A FA F的的ASCIIASCII码码hexdb 04h,0bh;假设两个数据假设两个数据data endsdata ends采用查表法,实现一位16进制数转换为ASCII码显示例代码段例代码段code segmentcode segmentassume assume cs:codecs:code, , ds:datads:datastart:start:movmov ax, data ax, datamovmov dsds, ax, axmovmov bxbx, offset ASCII, offset ASCII;BXBX指向指向ASCIIASCII码表码表movmov al, hex al, hex;ALAL取得一位取得一位1616进制数进制数;恰好就是;恰好就是ASCIIASCII码表中的位移码表中的位移and al, 0fhand al, 0fh;只有低;只有低4 4位是有效的,高位是有效的,高4 4位清位清0 0xlatxlat;查表:;查表:ALDS:BXALDS:BXALAL例代码段(续)例代码段(续)movmov dl, al dl, al;入口参数:入口参数:DLALDLALmovmov ah, 2 ah, 2;0202号号DOSDOS功能调用功能调用intint 21h 21h;显示一个显示一个ASCIIASCII码字符码字符movmov al, hex+1 al, hex+1;转换并显示下一个数据转换并显示下一个数据and al, 0fhand al, 0fhxlatxlatmovmov dl, al dl, almovmov ah, 2 ah, 2intint 21h 21hmovmov ah, 4ch ah, 4chintint 21h 21hcode endscode endsend startend start分支程序设计分支程序设计n n分支程序根据条件是真或假决定执行与否分支程序根据条件是真或假决定执行与否n n判断的条件是各种指令,如判断的条件是各种指令,如CMPCMP、TESTTEST等执行后等执行后形成的状态标志形成的状态标志n n转移指令转移指令JccJcc和和JMPJMP可以实现分支控制可以实现分支控制n n分支结构有分支结构有n n单分支结构单分支结构单分支结构单分支结构n n双分支结构双分支结构双分支结构双分支结构n n多分支结构多分支结构多分支结构多分支结构单分支结构单分支结构 n n条件成立跳转,否则顺条件成立跳转,否则顺序执行分支语句体序执行分支语句体n n注意选择正确的条件转注意选择正确的条件转移指令和转移目标地址移指令和转移目标地址实例:求绝对值例计算例计算AX中有符号数的绝对值中有符号数的绝对值cmpcmp ax,0 ax,0jgejge nonnegnonneg;条件满足(条件满足(AX0AX0),),转移转移negneg ax ax;条件不满足,求补条件不满足,求补nonneg:movnonneg:mov result,ax result,ax;条件满足条件满足;不恰当的分支;不恰当的分支cmpcmp ax,0 ax,0jl jl yesnegyesneg;条件满足(条件满足(AXAX0 0),),转移转移jmpjmp nonnegnonnegyesnegyesneg: :negneg ax ax;条件不满足,求补条件不满足,求补nonneg:movnonneg:mov result,ax result,ax;条件满足条件满足双分支结构双分支结构条件成立跳转执行第条件成立跳转执行第2 2个个分支语句体,否则顺序执分支语句体,否则顺序执行第行第1 1个分支语句体个分支语句体注意第注意第1 1个分支体后一定个分支体后一定要有一个要有一个JMPJMP指令跳到第指令跳到第2 2个分支体后个分支体后实例:显示BX的最高位例例 显示显示BX的的最高位最高位shlshl bx,1 bx,1;BXBX最高位移入最高位移入CFCF标志标志jcjc one one;CFCF1 1,即最高位为即最高位为1 1,转移,转移movmov dl,30h dl,30h ;CFCF0 0,即最高位为即最高位为0 0:DL30HDL30H 00jmpjmp two two;一定要跳过另一个分支体一定要跳过另一个分支体one:one:movmov dl,31h dl,31h;DL 31HDL 31H 11two:two:movmov ah,2 ah,2intint 21h 21h;显示显示可以用JNC替换JC例显示例显示BX的的最高位最高位(续)(续)shlshl bx,1 bx,1;BXBX最高位移入最高位移入CFCF标志标志jncjnc one one;CFCF0 0,即最高位为即最高位为0 0,转移,转移movmov dl,31h dl,31h ;CFCF1 1,即最高位为即最高位为1 1:DL31HDL31H 11jmpjmp two two;一定要跳过另一个分支体!一定要跳过另一个分支体!one:one:movmov dl,30h dl,30h;DL 30HDL 30H 00two:two:movmov ah,2 ah,2intint 21h 21h;显示显示转换为单分支结构例例 显示显示BX的的最高位最高位(另解)(另解)movmov dl,0 dl,0 ;DL30HDL30H 00shlshl bx,1 bx,1;BXBX最高位移入最高位移入CFCF标志标志jncjnc two two;CFCF0 0,即最高位为即最高位为0 0,转移,转移movmov dl,1 dl,1 ;CFCF1 1,即最高位为即最高位为1 1:DL31HDL31H 11two:two:movmov ah,2 ah,2intint 21h 21h;显示显示 编写分支程序,需留心分支的开始和结束例例 显示显示BX的的最高位最高位(无分支)(无分支)movmov dl,0 dl,0shlshl bx,1 bx,1;BXBX最高位移入最高位移入CFCF标志标志adcadc dl,30h dl,30h;CFCF0 0,DL0DL030h30h0 030H30H 00;CFCF1 1,DL0DL030h30h1 131H31H 11two:two:movmov ah,2 ah,2intint 21h 21h;显示显示例例 显示压缩显示压缩BCD码,无前导码,无前导0; ;数据段数据段BCDBCDdb 04hdb 04h; ;代码段代码段movmov dl,BCD dl,BCDtest dl,0ffhtest dl,0ffh;如果如果BCDBCD码为码为0 0,显示,显示0 0jzjz zero zero;双分支结构双分支结构test dl,0f0htest dl,0f0h;如果;如果BCDBCD码高位为码高位为0 0,不显示,不显示0 0jzjz one one;单分支结构单分支结构例例 显示压缩显示压缩BCD码,无前导码,无前导0(续)(续)movmov cl,4 cl,4;处理高位处理高位shrshr dl,cldl,clor dl,30hor dl,30h;转换为转换为ASCIIASCII码码movmov ah,2 ah,2;显示高位显示高位intint 21h 21hmovmov dl,BCD dl,BCDand dl,0fhand dl,0fhone:one:or dl,30hor dl,30h;处理低位处理低位jmpjmp two twozero:zero:movmov dl,0 dl,0two:two:movmov ah,2 ah,2intint 21h 21h多分支结构多分支结构多多分分支支结结构构是是多多个个条条件件对对应应各各自自的的分分支支语语句句体体,哪哪个个条条件件成成立立就就转转入入相相应分支体执行应分支体执行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNcmpcmp ah,0 ah,0jz function0cmpcmp ah,1 ah,1jz function1cmpcmp ah,2 ah,2jz function2例大小写字母转换例大小写字母转换 ;如果;如果DLDL是一个小写字母,则转换为大写是一个小写字母,则转换为大写cmpcmp dl,a dl,a;小于小写字母小于小写字母a a,不需要处理不需要处理jbjb dispdispcmpcmp dl,z dl,z;大于小写字母大于小写字母z z,也不需要处理也不需要处理jaja dispdispsub dl,20hsub dl,20h;是小写字母,则转换为大写;是小写字母,则转换为大写dispdisp: :循环程序设计循环程序设计n n循环程序结构循环程序结构是满足一定条件的情况下,重复执行某段程序n n循环结构的程序通常有3个部分:n n 循环初始部分循环初始部分循环初始部分循环初始部分为开始循环准备必要的条件,为开始循环准备必要的条件,如循环次数、循环体需要的数值等如循环次数、循环体需要的数值等n n 循环体部分循环体部分循环体部分循环体部分指重复执行的程序部分,其中指重复执行的程序部分,其中包括对循环条件等的修改程序段包括对循环条件等的修改程序段n n循环控制部分循环控制部分循环控制部分循环控制部分判断循环条件是否成立,决判断循环条件是否成立,决定是否继续循环定是否继续循环循环控制循环控制n n循环结构程序循环结构程序的设计关键是循环控制部分的设计关键是循环控制部分n n循环控制可以在进入循环之前进行,也可以在循循环控制可以在进入循环之前进行,也可以在循环体后进行,于是形成两种结构:环体后进行,于是形成两种结构:n n“先判断、后循环先判断、后循环”结构结构n n“先循环、后判断先循环、后判断”结构结构n n循环结束的控制可以用循环次数,还可以用特定循环结束的控制可以用循环次数,还可以用特定条件等,于是又有:条件等,于是又有:n n计数控制循环计数控制循环n n条件控制循环条件控制循环先循环后判断的循环结构先循环后判断的循环结构 结束结束 初始化初始化 循环的初始状态循环的初始状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循环条件控制循环修改部分修改部分控制条件控制条件Y YN N计数控制循环计数控制循环 n n计数控制循环计数控制循环利用利用循环次数循环次数作为控制条件作为控制条件n n易于采用循环指令易于采用循环指令LOOP和和JCXZ实现实现n n初始化:将循环次数或最大循环次初始化:将循环次数或最大循环次数置入数置入CXn n循环体循环体n n循环控制:用循环控制:用LOOPLOOP指令对指令对CXCX减减1, 1,并判断是否为并判断是否为0 0例例-用二进制显示用二进制显示BL内容内容movmov cx,8 cx,8;CX8CX8(循环次数)循环次数)again:again:shlshl bl,1 bl,1;左移进左移进CF,CF,从高位开始显示从高位开始显示movmov dl,0 dl,0;MOVMOV指令不改变指令不改变CFCFadcadc dl,30h dl,30h;DL0DL030H30HCFCF ;CFCF若是若是0 0,则,则DL 0 DL 0 ;CFCF若是若是1 1,则,则DL 1 DL 1 movmov ah,2 ah,2intint 21h 21h;显示显示loop againloop again ;CXCX减减1 1,如果,如果CXCX未减至未减至0 0,则循环,则循环计数控制循环计数控制循环先循环后判断先循环后判断例例-求最大最小值求最大最小值在在1616位带符号数位带符号数中找出其中的最中找出其中的最大值和最小值,大值和最小值,分别放在分别放在MAXMAX和和MINMIN单元中。单元中。开始结束MAX该数?该数?取第一个数到MAX,MINYN取下一个数初始化指针、循环次数MAX该数MIN0?AL取相反数后回送取相反数后回送修正指针修正指针循环结束?循环结束?结束结束YNNYAGAINOVER综合举例综合举例 (续续)BEGIN:BEGIN: MOV AX, DATA MOV AX, DATA MOV DS, AX MOV DS, AX MOV ES, AX MOV ES, AX MOV CX, 100 MOV CX, 100 LEA SI, STRING LEA SI, STRINGAGAIN: MOV AL, SIAGAIN: MOV AL, SI CMP AL, 0 CMP AL, 0 JGE JGE OVER OVER;ALAL0 00 0,跳至跳至OVEROVER NEGNEG AL AL;ALAL0 0,对,对ALAL求补求补OVER: MOV SI, ALOVER: MOV SI, AL INC SI INC SI LOOP AGAIN LOOP AGAIN MOV AH,4CH MOV AH,4CH INT 21H INT 21H CODE ENDS CODE ENDS END BEGIN END BEGIN综合举例综合举例题目:编程把4位组合BCD码转换为二进制数。n n( (千位数千位数1010百位数)百位数)1010十位数)十位数)1010个位数个位数n n千位数千位数10001000百位数百位数100100十位数十位数1010个位数个位数n n采用第一种利用构造循环程序采用第一种利用构造循环程序n n1010采用子程序设计(入口参数、出口参数均为采用子程序设计(入口参数、出口参数均为AXAX)n n千位数、百位数、十位数、个位数如何取得?千位数、百位数、十位数、个位数如何取得?千位数、百位数、十位数、个位数如何取得?千位数、百位数、十位数、个位数如何取得?DATA SEGMENT BCDNUM DW 1968H BINNUM DW ?DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100 DUP (?)STACK ENDS顺序结构顺序结构CODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACKSTART:START: MOV AX, DATA MOV AX, DATA MOV DS, AX MOV DS, AX MOV AX, BCDNUM MOV AX, BCDNUM; ; 取取BCDBCD码码 MOV BX, AXMOV BX, AX MOV DX, AX MOV DX, AX; ; 暂存至暂存至BXBX、DXDX中中 AND AX, AND AX, 0F000H0F000H MOV CL, 12 MOV CL, 12 SHR AX, CL SHR AX, CL; ; 取千位数取千位数 CALLCALL MUL10MUL10; ; 千位数千位数10 10 AXAX AND BX, AND BX, 0F00H0F00H MOV CL, 8 MOV CL, 8 SHR BX, CL SHR BX, CL; ; 取百位数取百位数 ADD AX, BXADD AX, BX; ; 千位数千位数10 10 百位数百位数 AXAX CALLCALL MUL10MUL10 ; ;(千位数千位数10 10 百位数)百位数)10 10 AXAX顺序结构顺序结构(续续) MOV BX, DXMOV BX, DX AND BX, AND BX, 00F0H00F0H MOV CL, 4 MOV CL, 4 SHR BX, CL SHR BX, CL; ;取十位数取十位数 ADD AX, BX ADD AX, BX ; ;(千位数千位数10 10 百位数)百位数)1010十位数十位数 AXAX CALLCALL MUL10MUL10 MOV BX, DX MOV BX, DX AND BX, AND BX, 000FH000FH; ;取个位数取个位数 ADD AX, BXADD AX, BX MOV MOV BINNUMBINNUM, AX, AX MOV AH, 4CH MOV AH, 4CH INT 21H INT 21H顺序结构顺序结构(续续)MUL10 PROCMUL10 PROC PUSHPUSH BXBX SHL AX, 1 SHL AX, 1 MOV BX, AX MOV BX, AX SHL AX, 1 SHL AX, 1 SHL AX, 1 SHL AX, 1 ADD AX, BX ADD AX, BX POPPOP BXBX RET RETMUL10 ENDPMUL10 ENDPCODE ENDSCODE ENDS END START END START循环结构循环结构CODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACKSTART:START: MOV AX, DATA MOV AX, DATA MOV DS, AX MOV DS, AX MOV BX, BCDNUM MOV BX, BCDNUM; ; 取取BCDBCD码码 XOR AX, AXXOR AX, AX; AX; AX清零清零 MOV CH, 4MOV CH, 4AGAIN:AGAIN: MOV CL, 4 MOV CL, 4 ROL BX, CL ROL BX, CL MOV DX, BX MOV DX, BX AND DX, 000FH AND DX, 000FH ADD AX, DX ADD AX, DX CALLCALL MUL10MUL10 DEC CH DEC CH JNZ JNZ AGAINAGAIN MOV BINNUM, AX MOV BINNUM, AX
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号