资源描述
第第3 3章章 80868086汇编语言程序设计汇编语言程序设计3-1 汇编语言程序格式汇编语言程序格式3-2 MASM中的表达式中的表达式3-3 伪指令语句伪指令语句3-4 DOS和和BIOS中断调用中断调用3-5 程序设计方法程序设计方法1第第3章章 8086汇编语言程序设计汇编语言程序设计3-2 MASM中的表达式中的表达式3-1 3-1 汇编语言程序格式汇编语言程序格式23-1 汇编语言程序格式汇编语言程序格式2一个汇编语言程序可由若干个一个汇编语言程序可由若干个(此例有此例有3 3个个)段段组成。每个段均以组成。每个段均以SEGMENTSEGMENT开始以开始以ENDSENDS结束。结束。每个段可以包含若干语句,而语句又可以是指每个段可以包含若干语句,而语句又可以是指令语句或伪指令语句两种。如程序中用到的令语句或伪指令语句两种。如程序中用到的ASSUMEASSUME,DBDB,SEGMENTENDSSEGMENTENDS等为伪指令语句。等为伪指令语句。每条语句可由标识符、保留字、表达式等元素每条语句可由标识符、保留字、表达式等元素组成。组成。3一个汇编语言程序可由若干个一个汇编语言程序可由若干个(此例有此例有3个个)段组成。每个段均以段组成。每个段均以S一、一、一、一、指令性语句指令性语句指令性语句指令性语句指令性语句与机器指令相对应,汇编程序可将它翻译成目标代码。指令性语句与机器指令相对应,汇编程序可将它翻译成目标代码。语句格式为:语句格式为:标号:指令助记符标号:指令助记符 操作数,操作数;注释操作数,操作数;注释标标 号号 符号地址,后跟符号地址,后跟“:”,使用英文大小写字母阿拉伯字,使用英文大小写字母阿拉伯字 母和特殊字符,第一个非数字,母和特殊字符,第一个非数字,3131个个助记符助记符 与指令对应,不可省。与指令对应,不可省。操作数操作数 参加运算的数据,用常数、变量、标号、寄存器名或参加运算的数据,用常数、变量、标号、寄存器名或 表达式。表达式。注注 释释 说明一指令或程序功能。可省略。用说明一指令或程序功能。可省略。用“;”隔离。隔离。4一、一、指令性语句指令性语句 4二、伪指令语句二、伪指令语句二、伪指令语句二、伪指令语句 伪指令语句无对应的机器指令,汇编程序汇编源程序时对伪指令伪指令语句无对应的机器指令,汇编程序汇编源程序时对伪指令进行处理,它可完成数据定义,存储区分配,段定义,段分配,进行处理,它可完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。指示程序结束等功能。语句格式为:语句格式为:名字名字 伪指令指示符伪指令指示符 操作数,操作数;注释操作数,操作数;注释名名名名 字:字:字:字:赋予伪指令的名称,名字后不允许带冒号赋予伪指令的名称,名字后不允许带冒号“:”,可省略。可省略。名字常为变量名、段名、过程名、符号名等。名字常为变量名、段名、过程名、符号名等。指示符指示符指示符指示符:汇编程序汇编程序MASMMASM规定的符号,各种定义语句后详述。规定的符号,各种定义语句后详述。操作数:操作数:操作数:操作数:按伪指令要求可有可无,操作数可以是常数、变量、字按伪指令要求可有可无,操作数可以是常数、变量、字 符串、表达式等。符串、表达式等。注注注注 释:释:释:释:功能和使用与指令性语句相同。功能和使用与指令性语句相同。5二、伪指令语句二、伪指令语句 5三、数据项三、数据项三、数据项三、数据项常数、变量和标号是三种基本数据项。常数、变量和标号是三种基本数据项。1 1常数常数常数常数 二进制二进制(B)、八进制八进制(Q或或O)、十进制十进制(D)、十六进十六进 制制(H)、ASCll码字符串码字符串(用单引号用单引号abcd)。2 2变量变量变量变量 常指存放在常指存放在M中的数值,程序运行中可修改。中的数值,程序运行中可修改。三个属性三个属性三个属性三个属性:段值段值(SEGMENT):变量所在段的段基址。变量所在段的段基址。段偏移地址段偏移地址(OFFSET):变量地址与所在段首地址之间的地变量地址与所在段首地址之间的地址偏移字节数。址偏移字节数。类型类型(TYPE):变量中每个元素包含的字节数变量中每个元素包含的字节数,有字节变量有字节变量(BYTE),字变量字变量(WORD)及双字变量及双字变量(DWORD)等等6三、数据项常数、变量和标号是三种基本数据项。三、数据项常数、变量和标号是三种基本数据项。63标号标号 指令语句的地址的符号表示,可作为指令语句的地址的符号表示,可作为JMP指令和调用指指令和调用指令令CALL的目标操作数,以确定程序转向的目标地址。的目标操作数,以确定程序转向的目标地址。三个属性:三个属性:段值段值(SEGMENT):标号所在段的段基址。标号所在段的段基址。段内偏移地址段内偏移地址(OFFSET):标号地址与所在段的段首标号地址与所在段的段首址之间的偏移地址字节数址之间的偏移地址字节数类型类型(TYPE):指转移指令中标号可转移的距离。近指转移指令中标号可转移的距离。近标号标号(NEAR),远标号远标号(FAR)。NEAR指针长度指针长度2字节字节FAR 指针长度指针长度4字节字节73标号标号73-23-2 MASMMASM中的表达式中的表达式运算对象运算对象运算符运算符表达式表达式 汇编运算汇编运算结果作为语句中操作数结果作为语句中操作数运算对象:常数、变量、标号运算对象:常数、变量、标号运算结果:常数或运算结果:常数或存储器地址(变量或标号)存储器地址(变量或标号)8086汇编语言中的运算符汇编语言中的运算符算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符分析运算符分析运算符综合运算符综合运算符+(加法加法)AND(与与)EQ(相等相等)SEG(求段基址求段基址)PTR-(减法减法)OR(或或)NE(不相等不相等)OFFSET(求偏移量求偏移量)THIS*(乘法乘法)XOR(异或异或)LT(小于小于)TYPE(求变量的类型求变量的类型)SHORT/(除法除法)NOT(非非)GT(大于大于)SIZE(求字节数求字节数)HIGHMOD(取余取余)LE(小于或等于小于或等于)LENGTH(求变量长求变量长)LOWSHL(左移左移)GE(大于或等于大于或等于)SHR(右移右移)83-2 MASM中的表达式运算对象表达式中的表达式运算对象表达式 一一一一 算术运算符算术运算符算术运算符算术运算符所有的算术运算符均可以对数据进行运算,运算对象与运算结所有的算术运算符均可以对数据进行运算,运算对象与运算结果都是整数。若对地址运算,通常是在标号上加减某一个数果都是整数。若对地址运算,通常是在标号上加减某一个数字量,对地址乘是没有意义的。字量,对地址乘是没有意义的。例例 源程序指令格式如下源程序指令格式如下:DA EQU 300DA EQU 300 MOV AX,DA-80 MOV AX,DA-80 MOV BX,DA MOD 100 MOV BX,DA MOD 100 MOV CX,DA/100 MOV CX,DA/100 MOV DH,01100100B SHR 2 MOV DH,01100100B SHR 2汇编时计算表达式形成指令为汇编时计算表达式形成指令为DA EQU 300DA EQU 300 MOV AX,220 MOV AX,220 MOV BX,0 MOV BX,0 MOV CX,3 MOV CX,3 MOV DH,19H MOV DH,19H9一一 算术运算符例算术运算符例 源程序指令格式如下源程序指令格式如下:汇编时计算表达式形成指汇编时计算表达式形成指二二二二 逻辑运算符逻辑运算符逻辑运算符逻辑运算符逻辑运算符是按位运算的只能对常数进行运算,得到结果也逻辑运算符是按位运算的只能对常数进行运算,得到结果也是常数。是常数。逻辑运算符与逻辑运算符与80868086指令系统中的指令助记符指令系统中的指令助记符ANDAND、OROR、NOTNOT、XORXOR符号完全相同,符号完全相同,但二者是不会混淆的。作为但二者是不会混淆的。作为MASMMASM的运算符是在的运算符是在汇编过程中进行计算的,而指令助记符是在程序执行时进行运汇编过程中进行计算的,而指令助记符是在程序执行时进行运算的。算的。例:例:AND DX,PORT AND 0FEH逻辑运算符汇编时逻辑运算符汇编时计算产生一立即数计算产生一立即数指令助记符程指令助记符程序执行时运算序执行时运算10二二 逻辑运算符逻辑运算符汇编时指令助记符程逻辑运算符逻辑运算符汇编时指令助记符程10三三三三 关系运算符关系运算符关系运算符关系运算符所连接两操作数必为两数据或同一段内的两个存储单元的地址所连接两操作数必为两数据或同一段内的两个存储单元的地址运算结果:真运算结果:真0FFFFH,假假0常与逻辑运算符组合使用常与逻辑运算符组合使用例例MOV AX,10H GT 16MOV AX,10H GT 16ADD BL,6 EQ 0110BADD BL,6 EQ 0110BMOV CX,(PORT LT 5)AND 100)OR(PORT GE 5)AND 200)MOV CX,(PORT LT 5)AND 100)OR(PORT GE 5)AND 200)汇编时形成指令为汇编时形成指令为:MOV AX,0MOV AX,0MOV BL,0FFHMOV BL,0FFHMOV CX,100 ;PORT5MOV CX,100 ;PORT5时时11三三 关系运算符例汇编时形成指令为关系运算符例汇编时形成指令为:11四四四四 数值返回运算符(分析运算符)数值返回运算符(分析运算符)数值返回运算符(分析运算符)数值返回运算符(分析运算符)操作符号操作符号表达式表达式表达式含义表达式含义SEGSEGSEG SEG 变量或标号变量或标号取出变量或标号的段基址取出变量或标号的段基址OFFSETOFFSETOFFSET OFFSET 变量或标号变量或标号取出变量或标号的偏移地址取出变量或标号的偏移地址TYPETYPETYPE TYPE 变量或标号变量或标号取出变量或标号的类型取出变量或标号的类型LENGTHLENGTHLENGTH LENGTH 变量变量变量中使用变量中使用DUPDUP时返回变量包含的单元数时返回变量包含的单元数其它变量返回其它变量返回1 1SIZESIZESIZE SIZE 变量变量返回变量包含的总字节数返回变量包含的总字节数SIZE=LENGTH*TYPESIZE=LENGTH*TYPE12四四 数值返回运算符(分析运算符)数值返回运算符(分析运算符)操作符号表达式表操作符号表达式表类型类型类型类型返回值返回值返回值返回值变变变变量量量量DB1DW2DD4DQ8标标标标号号号号NEAR-1 0FFHFAR-2 0FEHTYPETYPE运算符返回值运算符返回值13类型返回值类型返回值DB1DW2DD4DQ8标标NEAR-1 0FF例:例:M1 DW 100 DUP(?)M1 DW 100 DUP(?)M2 DW 1,2,3M2 DW 1,2,3M3 DB M3 DB ABCDABCDL1:L1:MOV AH,TYPE M1MOV AH,TYPE M1 MOV AL,TYPE M3 MOV AL,TYPE M3 MOV BH,TYPE L1 MOV BH,TYPE L1 MOV CX,LENGTH M1MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV BL,LENGTH M2 MOV CX,SIZE M1MOV CX,SIZE M1 MOV BL,SIZE M2 MOV BL,SIZE M2 MOV AL,SIZE M3 MOV AL,SIZE M3汇编时形成指令:汇编时形成指令:MOV AH,2 MOV AH,2 MOV AL,1 MOV AL,1 MOV BH,0FFH MOV BH,0FFH MOV CX,100MOV CX,100 MOV BL,1 MOV BL,1 MOV CX,200MOV CX,200 MOV BL,2 MOV BL,2 MOV AL,1 MOV AL,114例:汇编时形成指令:例:汇编时形成指令:14五五五五 修改属性运算符(综合或合成运算符)修改属性运算符(综合或合成运算符)修改属性运算符(综合或合成运算符)修改属性运算符(综合或合成运算符)1.段操作符段操作符段前缀:变量或地址表达式段前缀:变量或地址表达式表示某个变量或地址被修改到哪个段寄存器提供的段基址中表示某个变量或地址被修改到哪个段寄存器提供的段基址中 如:如:MOV AX,ES:BXMOV AX,ES:BX15五五 修改属性运算符(综合或合成运算符)修改属性运算符(综合或合成运算符)152.PTR类型类型/距离距离 PTR PTR 变量或标号变量或标号功能:功能:将将PTRPTR左边的类型属性赋给右边的变量或标号。左边的类型属性赋给右边的变量或标号。PTRPTR本本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,身并不分配存储单元,仅给已分配的存储单元赋予新的属性,这样可以保证运算时操作数类型的匹配,常与类型这样可以保证运算时操作数类型的匹配,常与类型BYTEBYTE、WORDWORD、NEARNEAR、FARFAR等连用。等连用。例:例:DATA1 DB 10H,20H,30H DATA1 DB 10H,20H,30H ;数据定义;数据定义 DATA2 DW 4023H,0A845H DATA2 DW 4023H,0A845H MOV BX MOV BX,WORD PTR DATA1 WORD PTR DATA1 ;2010H 2010H 传送到传送到 BXBX MOV AL MOV AL,BYTE PTR DATA2 BYTE PTR DATA2 ;23H 23H 传送到传送到 AL AL MOV WORD PTR BX,10H ;BX,BX+1MOV WORD PTR BX,10H ;BX,BX+10010H162.PTR例:例:163.THIS变量变量/标号标号 EQU THIS EQU THIS 类型类型/距离距离功能功能:将将EQU THISEQU THIS右边的类型距离属性,赋给左边的变量右边的类型距离属性,赋给左边的变量标号,该变量或标号的段地址和偏移地址与下一个存储单元的标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同地址相同 例例:MY_BYTE EQU THIS BYTEMY_BYTE EQU THIS BYTE MY_WORD DW 1122H MY_WORD DW 1122H MOV AL,MY_BYTE MOV AL,MY_BYTE ;将;将22H22H传送给寄存器传送给寄存器ALAL MOV BX,MY_WORD MOV BX,MY_WORD ;将;将1122H1122H传送给寄存器传送给寄存器BXBX173.THIS例例:17例例:THIS:THIS 操作符对于建立操作符对于建立FARFAR属性是方便的属性是方便的 START EQU THIS FARSTART EQU THIS FAR MOV CX,100 MOV CX,100 赋予传送指令(赋予传送指令(MOVMOV)有一个)有一个FARFAR属性的地址属性的地址STARTSTART,允,允许其他段的转移指令(许其他段的转移指令(JMPJMP)直接转移到)直接转移到START.START.18例例:THIS 操作符对于建立操作符对于建立FAR属性是方便的属性是方便的184.SHORT格式:格式:JMP SHORT JMP SHORT 标号标号功能:功能:指定转移的距离属性为短,实际转移范围为指定转移的距离属性为短,实际转移范围为-128-128127127字节。字节。例例:JMP SHORT NEAR_LABEL JMP SHORT NEAR_LABEL NEAR_LABEL:NEAR_LABEL:194.SHORT例例:195.HIGH和和LOW分离字节运算符分离字节运算符HIGHHIGH分离高字节分离高字节 LOW LOW 分离低字节分离低字节 例例K1 EQU 0ABCDHK1 EQU 0ABCDHK2 EQU 1234HK2 EQU 1234H MOV AH,HIGH K1 ;AH MOV AH,HIGH K1 ;AH0ABH MOV BL,LOW K2 ;BL MOV BL,LOW K2 ;BL34H205.HIGH和和LOW例例20六六六六 其它运算符其它运算符其它运算符其它运算符1.1.圆括号圆括号()()圆括号用来改变运算符的优先级别,圆括号用来改变运算符的优先级别,()()中的运算中的运算符具有最高优先权。符具有最高优先权。2.2.方括号方括号 方括号主要用来表示地址表达式或多重变量的下方括号主要用来表示地址表达式或多重变量的下标值。标值。M1 DB 10H,20H,30H,40HM1 DB 10H,20H,30H,40HM2 DW 1234H,5678H,9ABCHM2 DW 1234H,5678H,9ABCHM3 DW 5 DUP(?)M3 DW 5 DUP(?)MOV BX,OFFSET M1 MOV BX,OFFSET M1 MOV CL,BX ;CL MOV CL,BX ;CL10H MOV BX,OFFSET M2 MOV BX,OFFSET M2 MOV DX,BX+2 ;DX MOV DX,BX+2 ;DX5678H MOV AL,M13 ;AL MOV AL,M13 ;AL40H21六六 其它运算符其它运算符M1 DB 10H,20H,30H,40H3.3.尖括号尖括号及圆点及圆点 运算符在结构中专用,表示结构中的变量在预置结构运算符在结构中专用,表示结构中的变量在预置结构付本时是否修改,修改成什么数值。付本时是否修改,修改成什么数值。运算符在结构中专用运算符在结构中专用,表示结构付本名与变量名连接在一表示结构付本名与变量名连接在一起起,作为预置的结构付本中的各个变量。作为预置的结构付本中的各个变量。4.MASK4.MASK和和WIDTHWIDTHMASKMASK和和WIDTHWIDTH运算符在记录中专用运算符在记录中专用.223.尖括号尖括号及圆点及圆点22七七七七 优先级优先级优先级优先级优先级优先级运运 算算 符符1(),LENGTH,WIDTH,SIZE,MASK2PTR,OFFSET,SEG,TYPE,THIS,CS:,DS:,ES:,SS:3HIGHT,LOW4*,/,MOD,SHL,SHR5+,-6EQ,NE,LT,LE,GT,GE7NOT8AND9OR,XOR10SHORT23七七 优先级优先级运优先级优先级运 算算 符符1(),6-3 6-3 伪指令语句伪指令语句一一数据定义语句数据定义语句格式格式1:变量名:变量名 助记符助记符 操作数,操作数,操作数,操作数,.;注释注释格式格式2:变量名:变量名 助记符助记符 n DUP(操作数,操作数,操作数,操作数,.);注释注释 助记符:助记符:DB定义字节定义字节 DW 定义字定义字DD定义双字定义双字 DQ定义四字定义四字DT定义十字节定义十字节变量名变量名符号表示,可省略。作其后第一字节符号地址。符号表示,可省略。作其后第一字节符号地址。操作数操作数常数,字符串,变量,标号,表达式常数,字符串,变量,标号,表达式n DUP()n为整数,表示括号中操作数重复次数。为整数,表示括号中操作数重复次数。246-3 伪指令语句数据定义语句伪指令语句数据定义语句24注意:注意:注意:注意:定义多字节字符串用定义多字节字符串用DB,DW只允许包含两个字符只允许包含两个字符。操作数用操作数用?定义不确定值变量,以保留存储空间存放运算定义不确定值变量,以保留存储空间存放运算结果。结果。用用DW和和DD可以将变量或标号逻辑地址存入存储器。当可以将变量或标号逻辑地址存入存储器。当用用DD来定义时,原变量或标号的偏移地址存入低位字中,来定义时,原变量或标号的偏移地址存入低位字中,原变量或标号的段基址存入高位字中。原变量或标号的段基址存入高位字中。25注意:注意:25例:例:DATA SEGMENT DA1 DB 10H DA2 DW 1122H DA3 DD 0A0H ST1 DB HOW ST2 DB OK ST3 DW OK M DW 2 DUP(?)ADR1 DW ST1 ADR2 DD ST2DATA ENDS变量变量MEMORYEADA110H0000DA222H000111H0002DA3A0H000300H000400H000500H0006ST148H00074FH000857H0009ST24FH000A4BH000BST34BH000C4FH000DM?000E?000F?0010?0011ADR107H001200H0013ADR20AH001400H0015DATA0016001726例:例:变量变量MEMORYEADA110H0000DA2二二表达式赋值语句表达式赋值语句 1 赋值语句赋值语句EQU格式:符号格式:符号格式:符号格式:符号 EQU EQU 表达式表达式表达式表达式功能:功能:用来给变量,标号,常数,指令,表达式等定义一用来给变量,标号,常数,指令,表达式等定义一个符号名,在同一个程序模块中不能个符号名,在同一个程序模块中不能重新定义。重新定义。A EQU 7 A EQU 7 ;将;将7 7赋予符号名赋予符号名 A A B EQU A-2 B EQU A-2 ;将;将A-2A-2的值的值5 5赋予符号名赋予符号名 B B COUT EQU CX COUT EQU CX ;将;将COUTCOUT作为寄存器作为寄存器CXCX的同义名的同义名PURGEPURGE语句可以解除对某一标号的赋值,使它在后面可语句可以解除对某一标号的赋值,使它在后面可以重新定义。以重新定义。PURGE COUNT PURGE COUNT ;COUNTCOUNT不再代替不再代替CXCX27表达式赋值语句表达式赋值语句 A EQU 7 ;将;将7赋赋2 等号语句等号语句 =等号语句等号语句“=”与与EQUEQU语句具有相同功能,区别仅在语句具有相同功能,区别仅在于于EQUEQU中左边的标号不允许重新定义,而用中左边的标号不允许重新定义,而用“=”定定义的语句允许重复定义。义的语句允许重复定义。A=7 A=7 ;正确;正确A=19 A=19 ;正确;正确A EQU 7 A EQU 7 ;正确;正确A EQU 19 A EQU 19 ;再次定义,错误;再次定义,错误282 等号语句等号语句 =A=7 ;正确;正确28三三段定义、分配语句段定义、分配语句1 1段定义语句段定义语句格式:段名格式:段名 SEGMENT SEGMENT 定位类型定位类型 组合类型组合类型 分类名分类名.段名段名 ENDSENDS 段名段名:是逻辑段的标识符,不可省略,它确定了逻辑段是逻辑段的标识符,不可省略,它确定了逻辑段在存储器中的地址,在存储器中的地址,SEGMENTSEGMENT和和ENDSENDS前的段名必须相同。前的段名必须相同。SEGMENTSEGMENTENDS:ENDS:是段定义的伪指令助记符,任何一个逻是段定义的伪指令助记符,任何一个逻辑段必须以辑段必须以SEGMENTSEGMENT开始,开始,ENDSENDS结束,不可省略,并且必结束,不可省略,并且必须成对出现,两者之间是本逻辑段的内容。须成对出现,两者之间是本逻辑段的内容。29段定义、分配语句段定义、分配语句29定位类型定位类型对该段起始地址定位对该段起始地址定位nPAGEPAGE(页)(页)起始地址可以被起始地址可以被256256整除(整除(XXX00HXXX00H)nPARAPARA(节)(节)起始地址可以被起始地址可以被1616整除(整除(XXXX0HXXXX0H)nDWORDDWORD(字)(字)起始地址可以被起始地址可以被4 4整除(整除(XXXXNHXXXXNH)()(N N为为4 4的倍数)的倍数)nWORDWORD(字)(字)起始地址可以被起始地址可以被2 2整除(整除(XXXXNHXXXXNH)()(N N为为偶数)偶数)nBYTEBYTE(字节)(字节)起始地址可以被起始地址可以被1 1整除(整除(XXXXXHXXXXXH)n缺省为缺省为PARAPARA30定位类型定位类型对该段起始地址定位对该段起始地址定位30组合类型组合类型表示段与段之间的连接表示段与段之间的连接 nNONE:NONE:该段与其它同名段不进行连接,各段独立存在于存储器中,该段与其它同名段不进行连接,各段独立存在于存储器中,NONENONE可作为缺省参数。可作为缺省参数。nPUBLIC:PUBLIC:该段与其它模块中的同名段连接时,由低地址到高地址连接该段与其它模块中的同名段连接时,由低地址到高地址连接起来,组成一个逻辑段,连接次序由连接命令指定,连接时满足定位类起来,组成一个逻辑段,连接次序由连接命令指定,连接时满足定位类型要求。型要求。nCOMMON:COMMON:该段在连接时与其它模块中的同名段有相同的起始地址该段在连接时与其它模块中的同名段有相同的起始地址,采采用覆盖的方式在存储器中存放,连接长度为各分段中最大长度。用覆盖的方式在存储器中存放,连接长度为各分段中最大长度。nATAT表达式表达式:定位该段的起始地址在表达式所指定的节定位该段的起始地址在表达式所指定的节(16(16的整数倍的整数倍)边边界上。一般情况下各个逻辑段在存储器中的位置由系统自动分配,当用界上。一般情况下各个逻辑段在存储器中的位置由系统自动分配,当用户要求某个逻辑段在指定节的边界上时,就要用户要求某个逻辑段在指定节的边界上时,就要用ATAT参数来实现。参数来实现。31组合类型组合类型表示段与段之间的连接表示段与段之间的连接 31nSTACK:STACK:指定该段为堆栈段,此参数在堆栈段中不可省略,多个模指定该段为堆栈段,此参数在堆栈段中不可省略,多个模块只需设置一个堆栈段,各个模块中的堆栈段采用覆盖方式组合容块只需设置一个堆栈段,各个模块中的堆栈段采用覆盖方式组合容量为各个模块中所设置的最大堆栈段容量。量为各个模块中所设置的最大堆栈段容量。nMEMORY:MEMORY:定位该段与其它模块中的同名段有相同的首地址,采用覆定位该段与其它模块中的同名段有相同的首地址,采用覆盖方式在存储器中组合连接,其功能与盖方式在存储器中组合连接,其功能与COMMONCOMMON参数类似,区别是第一参数类似,区别是第一个带个带MEMORYMEMORY参数的逻辑段复盖在其它同名段的最上层,其它带此参数参数的逻辑段复盖在其它同名段的最上层,其它带此参数的同名段按照的同名段按照COMMONCOMMON方式处理。方式处理。分类名分类名必须用单引号必须用单引号 括起来,分类名可选择不超过括起来,分类名可选择不超过4040个字符个字符的名称,主要作用是汇编程序连接时将所有分类名相同的的名称,主要作用是汇编程序连接时将所有分类名相同的逻辑段组成一个段组。逻辑段组成一个段组。32STACK:指定该段为堆栈段,此参数在堆栈段中不可省略,多指定该段为堆栈段,此参数在堆栈段中不可省略,多2 段分配语句段分配语句格式:格式:ASSUME CS:段名,段名,DS:段名,段名,SS:段名,段名,ES:段名段名功能:功能:-定义定义4个逻辑段,指明段与段寄存器的关系。个逻辑段,指明段与段寄存器的关系。段名:段名:-必须是必须是SEGMENTENDS定义过的。定义过的。ASSUMENOTHING取消前面取消前面ASSUME指定的段寄存器。指定的段寄存器。四个段不一定全部定义四个段不一定全部定义,代码段和数据段必须定义代码段和数据段必须定义。ASSUME只是指定某段分配给何寄存器,并不能将段地址装入段寄只是指定某段分配给何寄存器,并不能将段地址装入段寄存器存器.仅仅CSCS在分配时自动装入在分配时自动装入。332 段分配语句段名:段分配语句段名:-必须是必须是SEGMENTENDS定义过定义过四四 过程定义语句过程定义语句格式:过程名格式:过程名 PROC 属性属性 .RET N 过程名过程名 ENDP功能:定义一个过程,主程序可以用功能:定义一个过程,主程序可以用CALLCALL指令调用它。指令调用它。过程名过程名:给所定义的过程取的名字,不可缺省。它是主程序调给所定义的过程取的名字,不可缺省。它是主程序调用的目标操作数。过程名具有三种属性用的目标操作数。过程名具有三种属性n段属性:为该过程所在段的段基址。段属性:为该过程所在段的段基址。n偏移地址属性:指该过程第一个字节与段首址之间距离偏移地址属性:指该过程第一个字节与段首址之间距离字节。字节。n距离属性:为距离属性:为NEARNEAR或或FARFAR。格式中的属性就指距离属性。格式中的属性就指距离属性,NEAR,NEAR为缺省使用。为缺省使用。34四四 过程定义语句过程定义语句34PROCENDP:过程定义伪指令助记符,成对出现,不可缺省。过程定义伪指令助记符,成对出现,不可缺省。二者前面有相同的过程名,整个过程内容包括在二者前面有相同的过程名,整个过程内容包括在PROCENDP之内。之内。RET N:过程内部的返回指令。过程内部的返回指令。过程内部至少有一条过程内部至少有一条RETRET指令,指令,它可以在过程的任何位置上,使过程返回到主程序调用它的它可以在过程的任何位置上,使过程返回到主程序调用它的CALL指令之下一条指令。指令之下一条指令。RET后面跟的后面跟的N N为弹出值,可以缺省,为弹出值,可以缺省,N N表示表示从过程返回以后,堆栈中应有从过程返回以后,堆栈中应有N个字节的值作废个字节的值作废(从栈顶开始从栈顶开始),N必须为正偶数。过程内部可以有多个必须为正偶数。过程内部可以有多个RET,表示此过程具有多个,表示此过程具有多个返回出口返回出口(在不同条件下,从不同出口返回在不同条件下,从不同出口返回)。35PROCENDP:过程定义伪指令助记符,成对出现,不可缺过程定义伪指令助记符,成对出现,不可缺例例 两个两个1616位无符号二进制数相乘位无符号二进制数相乘DATA SEGMENT DATA SEGMENT ;数据段;数据段 D1 DW 1234HD1 DW 1234H D2 DW 5678H D2 DW 5678H P1 DD?P1 DD?DATA ENDSDATA ENDSSTACK SEGMENT STACK STACK SEGMENT STACK STACKSTACK ;堆栈段;堆栈段 DW 100 DUP(?)DW 100 DUP(?)STACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARMAIN PROC FARSTART:START:MOV AX,STACK MOV AX,STACK ;初始化;初始化SSSS MOV SS,AX MOV SS,AX36例例 两个两个16位无符号二进制数相乘位无符号二进制数相乘36 PUSH DS PUSH DS ;返回;返回DOSDOS用用 SUB AX,AX SUB AX,AX PUSH AX PUSH AX MOV AX,DATA MOV AX,DATA ;初始化;初始化DSDS MOV DS,AX MOV DS,AXL1:MOV AX,D1 L1:MOV AX,D1 ;D1D2D1D2,积,积DX AX MUL D2 MUL D2 MOV BX,OFFSET P1 MOV BX,OFFSET P1 ;积保存到存储单元;积保存到存储单元 MOV BX,AX MOV BX,AX MOV BX+2,DX MOV BX+2,DX RETRETMAIN ENDPMAIN ENDPCODE ENDSCODE ENDS END STARTEND START37 PUSH DS ;返回;返回DO例例 用过程调用的方法,将内存中用过程调用的方法,将内存中N N个个BCDBCD码相加码相加DATA SEGMENT ;数据段;数据段 ONE DB 22H,33H,44H,55H TWO DB 55H,66H,77H,88H SUM DB 20 DUP(?)DATA ENDSSTACK SEGMENT STACK ;堆栈段;堆栈段 STT DB 100 DUP(?)TOP EQU LENGTH STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATAMAIN PROC FARSTART:MOV AX,STACK ;初始化;初始化SS,SP MOV SS,AX MOV SP,TOP 38例例 用过程调用的方法,将内存中用过程调用的方法,将内存中N个个BCD码相加码相加38 MOV SI,OFFSET ONE ;SI指向第一个加数指向第一个加数 MOV BX,OFFSET TWO ;BX指向第二个加数指向第二个加数 MOV DI,OFFSET SUM ;DI指向和指向和 CLD ;清方向标志清方向标志 MOV CX,4LL:CALL ABC LOOP LL RETMAIN ENDPABC PROC NEAR ;完成单字节数据加法运算;完成单字节数据加法运算 LODSB ;SIAL,SI+1SIL1:ADD AL,BX DAA STOSB ;ALDI,DI+1DI INC BX RETABC ENDPCODE ENDS END START39 MOV SI,OFFSET ONE 五五 程序开始和结束语句程序开始和结束语句1 1 NAMENAME程序名程序名;为源程序目标模块赋名为源程序目标模块赋名 功能功能置于程序开始置于程序开始,则在输出源程序列表文件时则在输出源程序列表文件时,将在每页开头打将在每页开头打出程序名出程序名.省略则打印源文件名。省略则打印源文件名。2 2 TITLE TITLE 文本名文本名 ;文本名赋予目标模块文本名赋予目标模块 功能功能同同NAME3 3ORG ORG 表达式表达式 功能功能给程序设置地址指针给程序设置地址指针,指定下个语句起始偏移地址。指定下个语句起始偏移地址。表达式表达式给定偏移地址给定偏移地址,结果为正整数。结果为正整数。n一般情况下,段定义语句一般情况下,段定义语句(SEGMENT)(SEGMENT)指出了段的起点,指出了段的起点,偏移地址偏移地址为为0 0,段内各个语句或数据的地址由段地址开始依次类推可确定。,段内各个语句或数据的地址由段地址开始依次类推可确定。当用户要求指定某条指令或数据为某个指定地址时,可用当用户要求指定某条指令或数据为某个指定地址时,可用ORGORG语语句来改变,句来改变,ORGORG语句可以放在程序的任何位置语句可以放在程序的任何位置。40五五 程序开始和结束语句程序开始和结束语句40例例 用用ORGORG改变数据段地址改变数据段地址DATA SEGMENTDATA SEGMENT ORG 100H ORG 100H A1 DB 10H,20H,30H A1 DB 10H,20H,30H ORG 200H ORG 200H A2 DW 3031H,3233H A2 DW 3031H,3233HDATA ENDSDATA ENDS4 4 END END 标号名标号名;标记汇编程序结束标记汇编程序结束 END在源程序最后一行在源程序最后一行 每个源程序只有一个每个源程序只有一个END41例例 用用ORG改变数据段地址改变数据段地址413-4 DOS和和BIOS调用调用nDOS(Disk Operating System)是是IBM PC机的磁盘操作系机的磁盘操作系统。统。nDOS是用户和是用户和PC机之间的接口。机之间的接口。n内部命令:内部命令:如如DIR、TYPE、CD等等n外部命令:外部命令:如如PRINT、XCOPY、FORMAT等等 423-4 DOS和和BIOS调用调用DOS(Disk OperatnDOS具有对具有对I/O设备管理及磁盘与文件管理的功能。设备管理及磁盘与文件管理的功能。n一部分被固化在系统的一部分被固化在系统的ROM中,可作为中,可作为ROM BIOS(Basic Input/Output System)模块。用户使用模块。用户使用BIOS中断调用来使用它们。中断调用来使用它们。n另一部分存放在系统磁盘上,在系统启动时被装入内存,另一部分存放在系统磁盘上,在系统启动时被装入内存,用户的应用程序及用户的应用程序及MS-DOS的大部分命令都将通过软件的大部分命令都将通过软件中断来调用它们。中断来调用它们。n调用这些软中断时,只要给定入口参数,接着写一条中断调用这些软中断时,只要给定入口参数,接着写一条中断指令指令INT n就可以了。就可以了。43DOS具有对具有对I/O设备管理及磁盘与文件管理的功能。设备管理及磁盘与文件管理的功能。43一、常用的软件中断一、常用的软件中断一、常用的软件中断一、常用的软件中断44一、常用的软件中断一、常用的软件中断44二、二、二、二、DOSDOS系统功能调用系统功能调用系统功能调用系统功能调用(INT 21H)(INT 21H)DOS系统功能调用分别实现设备管理、文件读写、文件管理系统功能调用分别实现设备管理、文件读写、文件管理和目录管理等功能。每个子程序对应一个功能号,所有的系和目录管理等功能。每个子程序对应一个功能号,所有的系统功能调用的格式是一致的,按下面统功能调用的格式是一致的,按下面4步进行:步进行:(1)系统功能号送到系统功能号送到AH寄存器中寄存器中(2)入口参数送到指定寄存器中入口参数送到指定寄存器中(3)由由INT 21H指令执行功能调用指令执行功能调用(4)根据出口参数分析功能调用执行情况根据出口参数分析功能调用执行情况 45二、二、DOS系统功能调用系统功能调用(INT 21H)451.DOS键盘功能调用键盘功能调用键盘提供了字符键键盘提供了字符键(数字数字09,字母,字母AZ,az,%,$,#),功能键,功能键(Home,End,Del,Ins,PgUp,PgDown等等)和控制键和控制键(Ctrl,Alt,Shift)。每个键都有对应的键值,即。每个键都有对应的键值,即标准标准ASCII码值。码值。通过通过DOS功能调用可读入键值到功能调用可读入键值到AL寄存器或存储器中。寄存器或存储器中。461.DOS键盘功能调用键盘功能调用46DOSDOS键盘功能调用键盘功能调用47DOS键盘功能调用键盘功能调用47从键盘输入字符或字符串从键盘输入字符或字符串从键盘输入字符或字符串从键盘输入字符或字符串u1 1,8 8,6 6,7 7号功能调用从键盘输入一个字符到号功能调用从键盘输入一个字符到ALAL寄存器寄存器1 1号和号和6 6号功能调用号功能调用输入同时在屏幕上显示字符输入同时在屏幕上显示字符8 8号和号和7 7号功能调用号功能调用不在屏幕上回显字符不在屏幕上回显字符u0AH0AH号功能调用从键盘接收字符串到内存缓冲区号功能调用从键盘接收字符串到内存缓冲区要求预先定义一个输入缓冲区,缓冲区的要求预先定义一个输入缓冲区,缓冲区的第一个字节第一个字节指出指出能容纳的最大字符个数,由用户给出;能容纳的最大字符个数,由用户给出;第二个字节第二个字节存放实存放实际输入的字符个数,由系统最后填入;从际输入的字符个数,由系统最后填入;从第三个字节第三个字节开始开始存放从键盘接收的字符,直到存放从键盘接收的字符,直到ENTERENTER键结束。键结束。48从键盘输入字符或字符串从键盘输入字符或字符串48例例:1号功能调用号功能调用 交互式程序中用户按下数字键交互式程序中用户按下数字键1,2,3,程序转入相应的服务子程序,程序转入相应的服务子程序,若按下其它键就继续等待。若按下其它键就继续等待。KEY:MOV AH,1 ;读入键值读入键值AL INT 21H CMP AL,1 ;键值为键值为1否否?JE ONE CMP AL,2 ;键值为键值为2否否?JE TWO CMP AL,3 ;键值为键值为3否否?JE THREE JMP KEY ;否则返回,继续等待键盘输入否则返回,继续等待键盘输入ONE:.;程序分支程序分支1TWO:.;程序分支程序分支2THREE:;程序分支程序分支3 49例例:1号功能调用号功能调用49例例例例:0AH:0AH号功能调用号功能调用号功能调用号功能调用 BUFF DB 32 DB?DB 32 DUP(?)MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUFF MOV AH,0AH INT 21H 输入字符串内输入字符串内(31bytes):By brooks too broad for leaping50例例:0AH号功能调用号功能调用 输入字符串内输入字符串内(31bytes):2.DOS2.DOS2.DOS2.DOS显示功能调用显示功能调用显示功能调用显示功能调用 DOS DOS显示功能调用能够显示单字符或字符串,这些功能都显示功能调用能够显示单字符或字符串,这些功能都自动向前移动光标。自动向前移动光标。512.DOS显示功能调用显示功能调用51例例例例:显示单个字符显示单个字符显示单个字符显示单个字符 33CODE SEGMENT ASSUME CS:CODESTART:MOV DL,33H ;将;将33H给给DL MOV AH,2 ;调用显示功能;调用显示功能 INT 21H MOV AH,4CH ;退回;退回DOS INT 21HCODE ENDS ;程序段结束;程序段结束 END START ;程序结束;程序结束52例例:显示单个字符显示单个字符352例例例例:输出一串字符输出一串字符输出一串字符输出一串字符DATA SEGMENTDATA SEGMENT HM DB HELLO,WORLD,0DH,0AH,$HM DB HELLO,WORLD,0DH,0AH,$DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA ;DSSTART:MOV AX,DATA ;DS指向数据段指向数据段 MOV DS,AX MOV DS,AX MOV DX,OFFSET HM MOV DX,OFFSET HM;DX;DX指向串首指向串首 MOV AH,9 MOV AH,9 ;dos;dos功能调用功能调用9 9号子功能设置号子功能设置 INT 21H INT 21H ;显示字符串显示字符串 MOV AH,4CH MOV AH,4CH ;返回返回DOSDOS INT 21H INT 21HCODE ENDS;CODE ENDS;程序段结束程序段结束 END START;END START;程序结束程序结束53例例:输出一串字符输出一串字符533 DOS3 DOS打印功能调用打印功能调用打印功能调用打印功能调用 INT 21H的的5号功能调用号功能调用完成将完成将DL寄存器中的寄存器中的字符送到打印机,若字符送到打印机,若需要回车换行,也同需要回车换行,也同样将回车换行的字符样将回车换行的字符码送到码送到DL寄存器。寄存器。543 DOS打印功能调用打印功能调用54三、三、三、三、BIOSBIOS功能调用功能调用功能调用功能调用 在存储系统中,从地址在存储系统中,从地址0FE000H开始的开始的8K ROM(只读(只读存储器)中装有存储器)中装有BIOS(Basic Input/Output System)例行例行程序。驻留在程序。驻留在ROM中的中的BIOS提供了系统加电自检,引提供了系统加电自检,引导装入主要导装入主要I/O设备的处理程序以及接口控制等功能模设备的处理程序以及接口控制等功能模块来处理所有的系统中断。程序员可直接用指令设置参块来处理所有的系统中断。程序员可直接用指令设置参数,中断调用数,中断调用BIOS中的子程序。中的子程序。55三、三、BIOS功能调用功能调用555656DOSDOS与与与与BIOSBIOS的关系的关系的关系的关系BIOS和和DOS是两组系统服务程序的集合,它们使程序员是两组系统服务程序的集合,它们使程序员能访问和使用组成能访问和使用组成IBM-PC机的硬件。机的硬件。在一些情况下,选择在一些情况下,选择DOS中断或选择中断或选择BIOS中断可以执行中断可以执行同样的功能。同样的功能。BIOS程序提供了基本的低层服务,所以通过程序提供了基本的低层服务,所以通过BIOS功能调功能调用比通过相应的用比通过相应的DOS功能调用更能提高程序的执行效率。功能调用更能提高程序的执行效率。只有少数的只有少数的BIOS功能调用没有相应的功能调用没有相应的DOS中断。中断。57DOS与与BIOS的关系的关系57如何进行如何进行如何进行如何进行BIOSBIOS调用调用调用调用中断调用前需要把功能号装入中断调用前需要把功能号装入AH中,设置相应的入口参数。中,设置相应的入口参数。中断调用后,或产生一个动作,或设置相应的出口参数。中断调用后,或产生一个动作,或设置相应的出口参数。具体请查阅书上具体请查阅书上BIOS功能调用的相关表格。功能调用的相关表格。举例:举例:INT 10H是常用的是常用的BIOS功能调用,它是显示器功能调用,它是显示器I/O的的BIOS功能调用。功能调用。置光标位置指令如下置光标位置指令如下:MOV AH,02H ;装入功能号装入功能号MOV DH,6 ;定光标所在行定光标所在行MOV DL,6 ;定光标所在列定光标所在列MOV BH,0 ;定光标所在页定光标所在页INT 10H 58如何进行如何进行BIOS调用调用58四、汇编语言与四、汇编语言与DOSDOS的接口:的接口:程序段前缀程序段前缀程序段前缀程序段前缀(PSP)(PSP)(PSP)(PSP)n运行一个程序时,运行一个程序时,MS-DOSMS-DOS将首先确定可用内存区的最低地址将首先确定可用内存区的最低地址n并由此处开始填写程序运行时所需要的一系列参数,还设置并由此处开始填写程序运行时所需要的一系列参数,还设置一个磁盘读一个磁盘读/写缓冲区写缓冲区n这个参数区和缓冲区合起来称为程序段前缀,这个参数区和缓冲区合起来称为程序段前缀,PSPPSP共占共占256256(100H100H)字节)字节59四、汇编语言与四、汇编语言与DOS的接口:程序段前缀的接口:程序段前缀(PSP)596060n操作系统在程序段前缀首址加操作系统在程序段前缀首址加100H100H处装配要运行的程序处装配要运行的程序n对于扩展名为对于扩展名为EXEEXE的程序,刚运行时,的程序,刚运行时,DSDS和和ESES这这2 2个寄存器会个寄存器会指向程序段前缀指向程序段前缀PSP+0PSP+0;对于扩展名为;对于扩展名为COMCOM的程序,则在运行的程序,则在运行时时4 4个段寄存器均指向个段寄存器均指向PSP+0PSP+0 接口方法接口方法:将应用程序定义为主程序的一个:将应用程序定义为主程序的一个FARFAR过程,最过程,最后一条指令为后一条指令为RETRETn方法方法1 1:把:把PSPPSP中中INT 20HINT 20H指令的段基址指令的段基址(DS=CS=ES)(DS=CS=ES)及偏移地及偏移地址址(0)(0)压入堆栈:压入堆栈:PUSH DSPUSH DS MOV AX,0 MOV AX,0 PUSH AX PUSH AXn方法方法2 2:应用程序不定义为过程段,只在代码结束前,增加:应用程序不定义为过程段,只在代码结束前,增加指令:指令:MOV AH,4CH MOV AH,
展开阅读全文