《第三章 汇编语言程序设计1.ppt》由会员分享,可在线阅读,更多相关《第三章 汇编语言程序设计1.ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3 3章章 汇编语言程序设计汇编语言程序设计目录目录第第3章章 汇编语言程序设计汇编语言程序设计3.1 机器语言、汇编语言与高级语言机器语言、汇编语言与高级语言3.2 汇编语言源程序的结构汇编语言源程序的结构3.3 数据定义数据定义3.4 汇汇编语言的运算符编语言的运算符3.5 基本结构程序设计基本结构程序设计3.6 操作系统资源的使用操作系统资源的使用 3 3.1.1 机机器语言、汇编语言与高级语言器语言、汇编语言与高级语言机器语言:机器语言:计算机能够直接理解和执行的二进制计算机能够直接理解和执行的二进制 代码。代码。汇编语言汇编语言:采用助记符表示机器语言,便于理解:采用助记符表示机
2、器语言,便于理解 和记忆。和记忆。汇编程序汇编程序编辑程序编辑程序连接程序连接程序 PROG.ASM PROG.OBJ PROG.EXE汇编程序的主要功能:汇编程序的主要功能:(1)、检查源程序,测出源程序的语法错误,并给)、检查源程序,测出源程序的语法错误,并给出出错信息出出错信息(2)、产生源程序的目标文件(二进制),并给出)、产生源程序的目标文件(二进制),并给出列表文件列表文件(3)、展开宏指令)、展开宏指令目前常用的汇编程序目前常用的汇编程序 Microsoft:MASM Borland:TASM编程调试过程编程调试过程第一步:编辑第一步:编辑 EDIT 文件名(文件名(.ASM)第
3、二步:汇编第二步:汇编 MASM 文件名(文件名(.ASM)第三步:连接第三步:连接 LINK 文件名(文件名(.OBJ)第四步:运行第四步:运行 文件名(文件名(.EXE)第五步:调试第五步:调试 DEBUG 文件名文件名.EXEEXEDOSDOS装入装入EXEEXE文件后内存的分配状况文件后内存的分配状况 INT 20H 数据段数据段代码段代码段堆栈段堆栈段 DS,ESCS:IPSS:SPEXE文件PSP(程序段前缀)(程序段前缀)PSPPSP的头两个字节是的头两个字节是INT 20HINT 20H,用户程序可通,用户程序可通过该指令返回操作系统过该指令返回操作系统DOSDOS如何使用户程
4、序执行完后返回来执行这条指令?如何使用户程序执行完后返回来执行这条指令?系统占用系统占用INT 20H 程程序段前缀序段前缀用户数据区用户数据区用户堆栈区用户堆栈区用户代码段用户代码段RET系统和系统和ROM占用占用DS,ESSSCS将用户程序定义为一个将用户程序定义为一个远过程远过程,当可执行文件,当可执行文件装入内存后,装入内存后,DS,ES两个段寄存器被两个段寄存器被CPU自动自动设置为指向设置为指向PSP的首址,程序的开始指令为:的首址,程序的开始指令为:PUSH DS XOR AX,AX PUSH AX程序结束时的最后一条语句为程序结束时的最后一条语句为RET,就把压入就把压入堆栈的
5、堆栈的PSP段的段基址和偏移量段的段基址和偏移量0000H弹出并弹出并送入送入CS和和IP,转而执行返回转而执行返回DOS的指令的指令INT 20H。00H00HPSPLPSPH堆栈堆栈情况情况方法一:方法一:DATAS SEGMENT MSGDB Hello world,$DATAS ENDSCODES SEGMENT MAINPROC FARASSUMECS:CODES,DS:DATASSTART:push dsxor ax,ax ;mov ax,0push axmov ax,DATASmov ds,ax mov dx,OFFSET MSG mov ah,09h int 21h ret ;
6、返回;返回DOSMAINENDPCODES ENDSEND START在用户程序结束时,用下面两条指令:在用户程序结束时,用下面两条指令:MOV AH,4CH INT 21H方法二:方法二:SSEGSEGMENTSTACK;设置堆栈段设置堆栈段SKTOP DB20DUP(0)SSEGENDS ;堆栈段结束堆栈段结束;-DSEGSEGMENT;设置数据段设置数据段STRING DB HELLO WORLD!$DSEGENDS ;数据段结束数据段结束;-CSEGSEGMENT ;设置代码段设置代码段ASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DSEG ;将数据
7、段起始地址装入将数据段起始地址装入DSMOVDS,AXMOVAX,SSEG ;将堆栈段起始地址装入将堆栈段起始地址装入SSMOVSS,AXMOVSP,SIZESKTOP ;设置堆栈指针设置堆栈指针MOV DX,OFFSET STRINGMOV AH,9INT 21HMOVAH,4CH ;返回返回DOSINT21H CSEGENDS ;代码段结束代码段结束ENDSTART ;汇编语言源程序结束汇编语言源程序结束示例示例:3 3.2.2 汇编语言源程序的结构汇编语言源程序的结构伪指令伪指令:伪指令不是处理器运行的指令,而是程:伪指令不是处理器运行的指令,而是程序员给汇编序员给汇编编译程序编译程序下
8、达的命令。是在编译源程下达的命令。是在编译源程序期间由序期间由汇编编译程序执行的命令汇编编译程序执行的命令。伪指令语句:伪指令语句:在汇编时不产生二进制代码,仅为编在汇编时不产生二进制代码,仅为编译程序提供汇编时所需要的信息的语句。译程序提供汇编时所需要的信息的语句。名字名字 操作操作 操作数操作数 ;注释注释 data SEGMENT ;数据段数据段var DB?data ENDScode SEGMENT ;代码段代码段 ASSUME CS:code,DS:datastart:MOV AX,data MOV DS,AX MOV var,CL MOV AH,4CH INT 21H ;返回返回D
9、OScode ENDS END start例:例:变量变量 指令指令 寄存器寄存器 说明程序或语句说明程序或语句 标号标号 伪指令伪指令 变量变量 的功能的功能 常数常数 表达式表达式 汇编语言的指令及伪指令语句格式:汇编语言的指令及伪指令语句格式:汇编语言源程序的段定义汇编语言源程序的段定义段定义伪操作段定义伪操作格式格式1:段名段名 SEGMENT 段名段名 ENDS格式格式2:段名段名 SEGMENT 定位类型定位类型,连接方式连接方式,类别类别 段名段名 ENDS类型及属性的说明类型及属性的说明定位类型定位类型:说明段的起始地址应有怎样的边界值说明段的起始地址应有怎样的边界值PARA:
10、指定段的地址从小段边界开始指定段的地址从小段边界开始.-默认值默认值 BYTE:该段可从任何字节开始该段可从任何字节开始.WORD:该段必须从字边界开始该段必须从字边界开始.PAGE:该段必须从页的边界开始该段必须从页的边界开始.(每每256个字节为一页个字节为一页)连接类型连接类型:说明程序连接时段的合并方法:说明程序连接时段的合并方法NONE(PRIVATE):该段为私有段,连接时不与其他同名的分段合并该段为私有段,连接时不与其他同名的分段合并-默认值默认值PUBLIC:该段连接时与其他同名的分段连在一起该段连接时与其他同名的分段连在一起 COMMON:该段在连接时与其它同名的段具有相同的
11、起始地址该段在连接时与其它同名的段具有相同的起始地址.AT:使段的起始地址为后面表达式的使段的起始地址为后面表达式的16位值位值.STACK:指定该段为堆栈的一部分指定该段为堆栈的一部分.MEMORY:链接程序把本段定位在其他段之上(高地址区域)链接程序把本段定位在其他段之上(高地址区域)类别类别:给出连接时组成段组的类别名:给出连接时组成段组的类别名.STACK,CODE,DATA 段定义由伪操作段定义由伪操作SEGMENT开始、开始、ENDS结束结束。其中:其中:SEGMENT 和和ENDS 必须成对出现,必须成对出现,且语句前必须有段名,且语句前必须有段名,段名必须相同段名必须相同。程序
12、中可以定义多个段。程序中可以定义多个段。程序经汇编、连接及装入内存后,段名为一具体的段值。程序经汇编、连接及装入内存后,段名为一具体的段值。注意:注意:SSEGSEGMENTSTACK;设置堆栈段设置堆栈段SKTOP DB20DUP(0)SSEGENDS ;堆栈段结束堆栈段结束;-DSEGSEGMENT;设置数据段设置数据段STRING DB HELLO WORLD!$DSEGENDS ;数据段结束数据段结束;-CSEGSEGMENT ;设置代码段设置代码段ASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DSEG ;将数据段起始地址装入将数据段起始地址装入DS
13、MOVDS,AXMOVAX,SSEG ;将堆栈段起始地址装入将堆栈段起始地址装入SSMOVSS,AXMOVSP,SIZESKTOP ;设置堆栈指针设置堆栈指针MOV DX,OFFSET STRINGMOV AH,9INT 21HMOVAX,4C00H ;返回返回DOSINT21H CSEGENDS ;代码段结束代码段结束ENDSTART ;汇编语言源程序结束汇编语言源程序结束示例示例:汇编语言的段寻址汇编语言的段寻址(ASSUME伪操作)伪操作)格式格式 ASSUME 段寄存器:段名段寄存器:段名 ,段寄存器段寄存器:段名段名,其中其中:段寄存器段寄存器为为CS、DS、ES、SS中的一个中的一
14、个 段名段名为用伪操作为用伪操作SEGMENT定义过的段名定义过的段名例例 ASSUME CS:cc,DS:aa ASSUME 伪操作的作用伪操作的作用 明明确确段段和和段段寄寄存存器器的的关关系系,指指示示汇汇编编程程序序指指令令中中用用到到的的标标号、号、过程及变量所在的段。过程及变量所在的段。注注意意:ASSUME只只起起指指示示作作用用,并并不不能能把把段段地地址址装装入入段段寄寄存存器器,必须在代码段中把段地址装入相应的段寄存器(代码段除外)。必须在代码段中把段地址装入相应的段寄存器(代码段除外)。MOV AX,数据段名MOV DS,AXMOV AX,附加数据段名MOV ES,AXM
15、OV AX,堆栈段名MOV SS,AX装填数据段数据段装填附加数据段附加数据段装填堆栈堆栈段段说明说明:DS,ES须在程序段中进行人工装填,ss段已有初始化,但也可通过装填进行修改 CS由OS根据文件头中的信息自动装填。段寄存器的装填:段寄存器的装填:data_seg1 segmentdata_seg1 ends ;定义数据段定义数据段data_seg2 segmentdata_seg2 ends ;定义附加段定义附加段code_seg segment assume cs:code_seg,ds:data_seg1,es:data_seg2start:mov ax,data_seg1 mov
16、ds,ax mov ax,data_seg2 mov es,ax ;段地址段地址段寄存器段寄存器 code_seg ends end start例:例:第第1第第3第第2(汇编结束语句)(汇编结束语句)END伪操作伪操作 格式格式 END 标号标号 多个程序模块相连,则只有主程序要使用标号,多个程序模块相连,则只有主程序要使用标号,其他子程序则只用其他子程序则只用END而不用指定标号而不用指定标号 作用是指示源程序到此结束。作用是指示源程序到此结束。汇编程序对汇编程序对 END 之后的语句不进行处理。之后的语句不进行处理。程序中所有有效语句应放在程序中所有有效语句应放在 END 语句之前。语句
17、之前。源程序中必须有源程序中必须有 END 结束语句。结束语句。汇编程序对无汇编程序对无 END 语句的源程序不进行处理语句的源程序不进行处理,只给出无只给出无 END 语句错误信息。语句错误信息。启动地址启动地址SSEGSEGMENTSTACK;设置堆栈段设置堆栈段SKTOP DB20DUP(0)SSEGENDS ;堆栈段结束堆栈段结束;-DSEGSEGMENT;设置数据段设置数据段STRING DB HELLO WORLD!$DSEGENDS ;数据段结束数据段结束;-CSEGSEGMENT ;设置代码段设置代码段ASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOV
18、AX,DSEG ;将数据段起始地址装入将数据段起始地址装入DSMOVDS,AXMOVAX,SSEG ;将堆栈段起始地址装入将堆栈段起始地址装入SSMOVSS,AXMOVSP,SIZESKTOP ;设置堆栈指针设置堆栈指针MOV DX,OFFSET STRINGMOV AH,9INT 21HMOVAX,4C00H ;返回返回DOSINT21H CSEGENDS ;代码段结束代码段结束ENDSTART ;汇编语言源程序结束汇编语言源程序结束示例示例:标准程序返回方式标准程序返回方式方法方法1:在汇编程序最后加在汇编程序最后加 MOV AH,4CH ;功能模块号功能模块号 INT 21H ;中断功能
19、调用中断功能调用方法方法2:使用中断调用使用中断调用20H (过程结束)过程结束)PROC FAR PUSH DS SUB AX,AX (MOV AX,0)PUSH AX RET ENDP汇编语言的过程定义汇编语言的过程定义 过程(子程序)定义伪操作过程(子程序)定义伪操作:过程名过程名 PROC PROC 属性属性 RETRET过程名过程名 ENDPENDPNEAR(FAR)与标号类似,与标号类似,是子程序入口的符号地址是子程序入口的符号地址过程的属性过程的属性有有NEARNEAR和和FARFAR两种属性两种属性过程属性的确定原则:过程属性的确定原则:NEARNEAR属性:调用程序和子程序在
20、同一代码段中属性:调用程序和子程序在同一代码段中 (段内调用)(段内调用)FAR FAR 属性:调用程序和子程序不在同一代码段中属性:调用程序和子程序不在同一代码段中 (段间调用)(段间调用)code segmentcode segment main proc farmain proc far .call subr1call subr1 .ret retmain main endpendpsubr1 proc nearsubr1 proc near .ret retsubr1 subr1 endpendpcode endscode endscode segmentcode segment ma
21、in proc farmain proc far .call subr1 call subr1 .ret retsubr1 proc nearsubr1 proc near .ret retsubr1 subr1 endpendpmain main endpendpcode endscode ends例例 调用程序和子程序在同一代码段中调用程序和子程序在同一代码段中把过把过程写程写成嵌成嵌套的套的形式形式NEARNEAR例例 调用程序和子程序不在同一代码段中调用程序和子程序不在同一代码段中 segxsegx segment segment .subtsubt proc far proc far
22、 .ret ret subtsubt endpendp .call call subtsubt .segxsegx ends ends segy segmentsegy segment segment segment .call call subtsubt .segy endssegy endsFARFARFARFAR一、常量、变量及标号一、常量、变量及标号常量常量:表示固定的数值。如常数、字符、字符串等表示固定的数值。如常数、字符、字符串等常数:二进制常数:二进制(B),八进制八进制(Q),十六进制十六进制(H),十进制十进制(D)(默认默认)字符或字符串用字符或字符串用单引号或双引号单引号
23、或双引号括起来括起来变量变量:代表存放在某些存储单元的数据,这些数据在程序的运行期代表存放在某些存储单元的数据,这些数据在程序的运行期间随时可以修改。间随时可以修改。在程序中以在程序中以变量名变量名的形式出现。的形式出现。3.3 数据定义数据定义每个变量都有三个属性每个变量都有三个属性1)段属性段属性(SEG)变量所在的存储单元的段基址变量所在的存储单元的段基址2)偏移量属性偏移量属性(OFFSET)变量所在的存储单元距段变量所在的存储单元距段起点的字节数起点的字节数3)类型属性类型属性(TYPE)一个单位变量占用存储单元的一个单位变量占用存储单元的字节数,分为:字节数,分为:DB(1个字节个
24、字节)DW(2个字节个字节)DD(4个字节个字节)标号:是代码段中某一指令的地址。标号:是代码段中某一指令的地址。标号由下列字符组成:标号由下列字符组成:字母字母:AZ,az;数字数字:09;特殊字符特殊字符:?._$数字不能作标识符的第一个字符,标识符最长为数字不能作标识符的第一个字符,标识符最长为31个字符。个字符。标号后面跟冒号,标号后面跟冒号,代表该行指令的起始地址代表该行指令的起始地址,标号可以被转移指令、标号可以被转移指令、被调用指令直接引用。被调用指令直接引用。标号也有标号也有3个属性:个属性:1)段属性段属性(SEG)该条指令所在段的段基址该条指令所在段的段基址2)段内偏移量属
25、性段内偏移量属性(OFFSET)该指令的偏移地址该指令的偏移地址(距段起距段起点的字节数点的字节数)3)类型属性类型属性 表示该标号是作为表示该标号是作为段内段内还是还是段间段间被调用或转被调用或转移的,该属性有两个值:移的,该属性有两个值:a)NEAR(FFFFH,-1):本标号只能被标号所在段的转移本标号只能被标号所在段的转移或调用指令所访问或调用指令所访问(段内转移段内转移),标号后有冒号;,标号后有冒号;b)FAR(FFFEH,-2):本标号可被其他段本标号可被其他段(不是标号所在不是标号所在段段)的转移或调用指令访问的转移或调用指令访问(段间转移段间转移)。标号名标号名 LABEL
26、FAR指明标号属性:指明标号属性:二、数据定义和分配数据单元的伪操作二、数据定义和分配数据单元的伪操作DB:定义字节,其后的每个操作数占有一个字节单元,定义字节,其后的每个操作数占有一个字节单元,连续存放;连续存放;BUFFER DB 2,3,505H03H02HBUFFERDW:定义字,其后的每个操作数占有两个字节;定义字,其后的每个操作数占有两个字节;BUF DW 2,3,505H00H00H03H00H02HBUFDD:定义双字,其后每个操作数占定义双字,其后每个操作数占4个字节;个字节;另一种格式:另一种格式:若若仅保留单元,不初始化仅保留单元,不初始化,用,用?代替初值;代替初值;若
27、若数据重复数据重复,用,用 n DUP()代替,代替,n为重复次数。为重复次数。ARRAY DB 100 DUP(?)保留保留100个字节,首地址为个字节,首地址为ARRAY,不初始化,即不初始化,即100个字节内均个字节内均为随机值为随机值DATA1 DB 100 DUP(AB)初始化初始化200个字节,内有个字节,内有100个个41H,42H 定义字符串变量定义字符串变量(只能用只能用DB定义定义)data SEGMENT str1 DB TsingHua str2 DB INPUT:,0dH,0aH,$data ENDS注意注意:3个及其以上的字符,个及其以上的字符,只能用只能用DB定义
28、定义str1 DW abcdstr2 DD abcdstr1str25473696e67487561494e5055543a0d0a24TsingHuaINPUT:0dH0aH$三、等值伪操作三、等值伪操作名字名字 EQU 表达式表达式名字名字 =表达式表达式用一个名字来代表一个常数或表达式,在汇编时,凡是出现该名字用一个名字来代表一个常数或表达式,在汇编时,凡是出现该名字的地方就用定义的数据替代。的地方就用定义的数据替代。用用EQU赋值的名字赋值的名字不能重新赋值不能重新赋值TIMES EQU 50BUF DB TIMES DUP(?)等效于等效于BUF DB 50 DUP(?)ALPHA
29、EQU 256BETA =ALPHA-23.4 汇编语言的运算符汇编语言的运算符汇编语言运算符汇编语言运算符:是编译程序在编译时计算的,与运算指:是编译程序在编译时计算的,与运算指令不同,指令是在程序运行时计算的。令不同,指令是在程序运行时计算的。一、算术运算符一、算术运算符,*,/,MOD,SHL,SHR MOV AX,A+B CC EQU DD SHL 2二、逻辑运算符二、逻辑运算符AND,OR,XOR,NOT C EQU B-A AND AX,C AND OFH三、关系运算符三、关系运算符 EQ,NE,LT,GT,LE,GE less than,great than 结果产生一个逻辑值,
30、结果产生一个逻辑值,真为真为0FFFFH,假为假为0000H MOV AX,(choice LT 20)AND 5)OR(choice GE 20)AND 6)四、值返回符四、值返回符1)$运算符运算符$:当前地址偏移量的值:当前地址偏移量的值BLOCK DB HELLO!NUM EQU$-BLOCKHELLO!BLOCK$;NUM为为 62)SEG 和和OFFSET3)SEG:求标号或变量的段基址求标号或变量的段基址4)OFFSET:求标号或变量的距段首址的偏移量求标号或变量的距段首址的偏移量DATA SEGMENT A DB 12 B DW 23,25DATA ENDSMOV BX,OFF
31、SET BMOV AX,SEG BLEA BX,B;BX:0001H;AX:DS值值;BX:0001H 等价等价MOV BX,OFFSET B3)TYPE 标号或符号的类型值标号或符号的类型值对变量对变量:表示变量的字节数:表示变量的字节数 DB 1,DW 2,DD 4对标号:表示过程或指令地址的调用类型对标号:表示过程或指令地址的调用类型(NEAR)-1或或(FAR)-2DATA SEGMENT A DB 12 B DW 23,25DATA ENDSMOV AX,TYPE AMOV BX,TYPE B;AX:0001H;BX:0002H4)LENGTH 和和 SIZELENGTH:对对DUP
32、情况下情况下,变量的项数或元素个数变量的项数或元素个数,在其他情况下在其他情况下该项属性为该项属性为1;SIZE:对操作数分配的字节数。对操作数分配的字节数。SIZE=LENGTH TYPE A DB 1234 B DW 5 DUP(2,3 DUP(0)C DW AB,C,DL1:MOV AL,TYPE B MOV BL,LENGTH B MOV AH,SIZE A MOV BH,SIZE C MOV CL,TYPE L1 MOV CH,SIZE B;AL:2;BL:5;AH:1;BH:2;CL:0FFH;CH:0AH5)HIGH 和和LOWHIGH:对操作数取高字节;对操作数取高字节;LOW
33、:对操作数取低字节。对操作数取低字节。NUM EQU 0CDEFHMOV AH,HIGH NUMMOV AL,LOW NUM;AH:0CDH;AL:0EFH五、属性运算符五、属性运算符用来给指令中的操作数指定一个临时的属性,而用来给指令中的操作数指定一个临时的属性,而暂时暂时忽略忽略操作数定义时的属性。操作数定义时的属性。1)PTR 定义操作数为新的类型定义操作数为新的类型新类型新类型 PTR 操作数操作数操作数可以是存储器的地址或标号名操作数可以是存储器的地址或标号名F1 DW 1234HF2 DB 23H,56H,18HMOV AL,BYTE PTR F1MOV AX,WORD PTR F
34、2;AL:34H;AX:5623H18H56H23H12H34HF2F1 DAT1 DB 12H,34H DAT2 DB 56H,78H MOV AX,WORD PTR DAT1 CMP AX,WORD PTR DAT2 JA L1 MOV BX,WORD PTR DAT2 MOV WORD PTR DAT2,AX MOV WORD PTR DAT1,BXL1:HLTDAT1单元的值是:单元的值是:_;AX:3412H;7856H56H2)THIS 指定新类型指定新类型像像PTR一样可用来建立一个某种类型的存储器地址操作数,而没有一样可用来建立一个某种类型的存储器地址操作数,而没有为它分配存储
35、器。新的存储器操作数的段和偏移量部分就是为它分配存储器。新的存储器操作数的段和偏移量部分就是下一个下一个能分配的存储单元的段和偏移量。能分配的存储单元的段和偏移量。F1 EQU THIS BYTEF2 DW 4321H,2255HMOV AL,F1MOV AX,F2THIS 类型名类型名22H55H43H21HF2F1;AL:21H;AX:4321HF1和和F2具有相同的段基地址和偏移地址,但类型不同。具有相同的段基地址和偏移地址,但类型不同。3)段超越段超越强迫当前指令的操作数按指定的段基地址寻址。强迫当前指令的操作数按指定的段基地址寻址。MOV AX,ES:BX4)SHORT用于无条件转移
36、指令用于无条件转移指令JMP,通知编译器,转移的目通知编译器,转移的目标地址在标地址在+127-128之间。之间。JMP 标号标号 ;是三字节指令;是三字节指令JMP SHORT 标号标号;是两字节指令是两字节指令3.6 操作系统资源的使用操作系统资源的使用使用汇编语言编程对计算机硬件和外设进行控制和输入输出,有下面使用汇编语言编程对计算机硬件和外设进行控制和输入输出,有下面3种方法,种方法,A用户程序直接操作计算机硬件和外部设备。这样用户必须了解计算机用户程序直接操作计算机硬件和外部设备。这样用户必须了解计算机硬件的细节,才能对硬件进行控制。硬件的细节,才能对硬件进行控制。B 用户程序通过用
37、户程序通过BIOS中断调用操作计算机硬件和外部设备,用户不必中断调用操作计算机硬件和外部设备,用户不必了解计算机硬件的细节,就可以对硬件进行操作,而且使程序更简洁,可读性和了解计算机硬件的细节,就可以对硬件进行操作,而且使程序更简洁,可读性和可移植性更好。可移植性更好。C用户程序通过用户程序通过DOS中断调用来操作硬件,中断调用来操作硬件,DOS中断调用为用户提中断调用为用户提供的功能更多。程序简洁,可读性和可移植性都很好。供的功能更多。程序简洁,可读性和可移植性都很好。用户程序对I/O的需求DOS中断调用BIOS中断调用计算机硬件、外部设备ABC在汇编程序中,如果用户程序要与输入输出设备打交
38、道,在汇编程序中,如果用户程序要与输入输出设备打交道,就要调用现成的程序,就要调用现成的程序,这些程序是这些程序是DOS系统的一部分,随系统的一部分,随着着DOS系统驻留内存系统驻留内存,用户需要按照这些程序要求的接口,用户需要按照这些程序要求的接口格式调用。格式调用。这些完成不同功能的子程序是以这些完成不同功能的子程序是以中断服务程序中断服务程序的方的方式提供的。式提供的。这些功能按不同的类别分成许多组,分别有不同的这些功能按不同的类别分成许多组,分别有不同的中断入口,在汇编程序中最常用的是中断入口,在汇编程序中最常用的是INT 21H中断中断入口,也称为入口,也称为DOS系统功能调用系统功
39、能调用。3.6.1 DOS功能调用功能调用调用方式:调用方式:这个中断入口中有许多小程序,每个小程序都这个中断入口中有许多小程序,每个小程序都被编上号,固定完成某一种功能,调用时有一定被编上号,固定完成某一种功能,调用时有一定的格式,因为对某一个小程序而言,输入条件的格式,因为对某一个小程序而言,输入条件(入入口参数口参数)和输出结果和输出结果(出口参数出口参数)的格式都是固定的。的格式都是固定的。用户在使用时,既要用户在使用时,既要给出小程序的编号给出小程序的编号(AH),又又要按照其提供的格式进行调用,才能正确完成操要按照其提供的格式进行调用,才能正确完成操作。作。只介绍与输入输出有关的一
40、部分。只介绍与输入输出有关的一部分。1)在显示器上显示单个字符在显示器上显示单个字符(2号功能号功能)功能功能:在屏幕的光标处显示单个字符:在屏幕的光标处显示单个字符入口参数入口参数:要显示字符的要显示字符的ASCII码放在码放在DL中中出口参数出口参数:无无MOV DL,AMOV AH,2INT 21H;提供调用功能号提供调用功能号;系统功能调用系统功能调用;在屏幕光标处显示字符在屏幕光标处显示字符A运行至此,屏幕上当前光标处显示字符运行至此,屏幕上当前光标处显示字符A2)在屏幕上显示字符串在屏幕上显示字符串(9号功能号功能)功能功能:在屏幕上当前光标处输出存储在内存数据段的一串:在屏幕上当
41、前光标处输出存储在内存数据段的一串字符串,该字符串以字符串,该字符串以$结束。结束。入口参数入口参数:DS:DX指向欲显示字符串的首址指向欲显示字符串的首址DATA SEGMENT STRING DB I am a student.$DATA ENDSMOV DX,OFFSET STRINGMOV AH,9INT 21H;指向字符串首址指向字符串首址;提供调用功能号提供调用功能号;系统功能调用系统功能调用3)带显示的键盘输入带显示的键盘输入(1号功能号功能)功能功能:等待键盘输入,直到按下一个键。:等待键盘输入,直到按下一个键。入口参数入口参数:无无出口参数出口参数:键入键的键入键的ASCII
42、码放在码放在AL中,并在屏幕上显中,并在屏幕上显示该键。示该键。MOV AH,1INT 21HMOV 2000H,AL;提供调用功能号提供调用功能号;系统功能调用系统功能调用程序运行到此程序运行到此停下,等待用停下,等待用户键盘输入户键盘输入用户从键盘键入的键用户从键盘键入的键的的ASCII码进入码进入AL中中4)不带显示的键盘输入不带显示的键盘输入(7号功能号功能)功能功能:等待键盘输入,直到按下一个键。:等待键盘输入,直到按下一个键。入口参数入口参数:无无出口参数出口参数:键入键的键入键的ASCII码放在码放在AL中,但在屏幕上没中,但在屏幕上没有显示,常用于输入密码。有显示,常用于输入密
43、码。MOV AH,7INT 21HMOV 2000H,AL;提供调用功能号提供调用功能号;系统功能调用系统功能调用程序运行到此程序运行到此停下,等待用停下,等待用户键盘输入户键盘输入用户从键盘键入的键用户从键盘键入的键的的ASCII码进入码进入AL中中该功能与该功能与1号功能类似,只是输入的字符不在屏幕上显示号功能类似,只是输入的字符不在屏幕上显示5)字符串输入字符串输入(10号功能号功能)功能功能:等待从键盘输入一串字符到存储区的数据段,直到:等待从键盘输入一串字符到存储区的数据段,直到按下回车结束输入。按下回车结束输入。入口参数入口参数:DS:DX指向接收字符串的内存地址的首址,该指向接收
44、字符串的内存地址的首址,该地址的第一个字节是地址的第一个字节是由用户设置由用户设置的可输入字符串的的可输入字符串的最大字最大字符数符数(含回车含回车)出口参数出口参数:存放输入字符串存储区的第二个字节是:存放输入字符串存储区的第二个字节是实际输实际输入的字符数入的字符数(不含回车不含回车),实际输入的字符串实际输入的字符串从该存储区的从该存储区的第三个字节处开始存放第三个字节处开始存放。DATA SEGMENT BUF DB 20,20 DUP(?)DATA ENDS LEA DX,BUFMOV AH,0AHINT 21H14H程序运行到此停下,程序运行到此停下,等待用户键盘输入等待用户键盘输
45、入若输入若输入ABCD后后BUFDX04H41H42H43H44H实际字符个数实际字符个数开始存放开始存放6)程序结束,返回程序结束,返回DOS(4C号功能号功能)功能功能:将控制权移交:将控制权移交DOS。入口参数入口参数:无:无出口参数出口参数:无:无MOV AH,4CHINT 21H在屏幕上显示在屏幕上显示Whats your name?,用户输入自己的名字用户输入自己的名字#后显示:后显示:Welcome#。DATA SEGMENT MEG DB Whats your name?,10,13,$MEG1 DB Welcome$BUF DB 30,?,30 DUP(0)DATA ENDS
46、CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA DX,MEG MOV AH,9 INT 21H;输出字符串输出字符串 LEA DX,BUF MOV AH,10 INT 21H;接受姓名接受姓名 LEA DX,MEG1 MOV AH,9 INT 21H;输出输出Welcome XOR BH,BH MOV BL,BUF+1 MOV BX+BUF+2,$LEA DX,BUF+2 MOV AH,9 INT 21H;输出姓名输出姓名 MOV AH,4CH INT 21HCODE ENDS END START显示字符串后
47、回车换行显示字符串后回车换行下面程序从键盘重复接收一字符送下面程序从键盘重复接收一字符送BUFF开始的单元,直开始的单元,直到接收到回车符到接收到回车符0DH为止。为止。DATA SEGMENT BUFF DB 128 DUP(0)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX _LOP:_ INT 21H MOV SI,AL _ _ JNE LOP MOV AH,4CH INT 21HCODE ENDS END STARTLEA SI,BUFFMOV AH,1INC SICMP AL,0DH3.6
48、.2 BIOS中断调用中断调用什麽是什麽是BIOS?BIOS即即Basic Input/Output System,指的是基本指的是基本输入输入/输出系统。这是一组底层的基础软件程序,输出系统。这是一组底层的基础软件程序,BIOS驻留在驻留在系统板的只读存储器系统板的只读存储器ROM中,计算机中,计算机加电后,可以随时调用加电后,可以随时调用BIOS程序。程序。BIOS程序程序独独立于任何操作系统立于任何操作系统,因此无论该计算机是运行,因此无论该计算机是运行DOS,CP/M,还是还是UNIX等任何操作系统,用户等任何操作系统,用户都可以调用这些服务程序。都可以调用这些服务程序。BIOS 键盘
49、中断键盘中断(INT 16H AH=0,1,2)从从键键盘盘读读一一字字符符(0 0)/读读键键盘盘缓缓冲冲区区字字符符(1 1)/取取键键盘盘状态字节(状态字节(2 2)例:从键盘读一字符例:从键盘读一字符(AH=0)movmov ah,0 ah,0 intint 16h 16h ;al=;al=字符码字符码 ;ah=ah=扫描码扫描码 movmov bxbx,ax,ax call call binihexbinihex BIOS 显示中断显示中断(INT 10H AH=1,2,3,6,7,8,9,A)(控制光标控制光标/读光标位置读光标位置/清屏和卷屏清屏和卷屏/字符显示)字符显示)BIOS 打印中断打印中断(INT 17H AH=0,1,2)(打印一个字符打印一个字符/初始化打印机初始化打印机/取打印机状态字节)取打印机状态字节)BIOS 串行通讯口功能串行通讯口功能(INT 14H AH=0,1,2,3)(初始化串口初始化串口/向串口写字符向串口写字符/从串口读字符从串口读字符/取串口状态)取串口状态)