《汇编程序设计分支》由会员分享,可在线阅读,更多相关《汇编程序设计分支(29页珍藏版)》请在金锄头文库上搜索。
1、第4章汇编语言程序设计4.3 DOS系统功能调用4.3.1 系统功能调用方法系统功能调用方法4.3.2 常用的常用的DOS系统功能调用系统功能调用4.3.1 系统功能调用方法DOS系统功能调用的方法一般可分为以下几步:系统功能调用的方法一般可分为以下几步: 设置所要调用功能的入口参数。设置所要调用功能的入口参数。 在在AH寄存器中存入所要调用功能的功能号。寄存器中存入所要调用功能的功能号。 INT 21H指令自动转入中断子程序入口。指令自动转入中断子程序入口。 相应中断子程序运行完毕,可按规定取得出口参数。相应中断子程序运行完毕,可按规定取得出口参数。 4.3.2 常用的DOS系统功能调用1
2、1不带回显的键盘单字符输入(不带回显的键盘单字符输入(8 8号功能)号功能) 2. 2. 带回显的键盘单字符输入(带回显的键盘单字符输入(1 1号功能)号功能)3. 3. 单字符输出(单字符输出(2 2号功能)号功能)4. 4. 字符串显示(字符串显示(9 9号功能)号功能)5. 5. 程序正常返回系统程序正常返回系统1号系统功能调用(从键盘读入一个字符)功能:单字符输入。功能:单字符输入。将将键键盘盘输输入入的的字字符符的的ASCIIASCII码码值值送送ALAL寄寄存存器器,同同时时回回显显在在屏屏幕幕上。上。入口参数:无入口参数:无出口参数:出口参数:ALAL寄存器存放输入字符的寄存器存
3、放输入字符的ASCIIASCII码值码值格式:格式:MOV AHMOV AH,1 1INT 21HINT 21H说明:在输入一个字符后,不需要键入回车。若只键入回车,说明:在输入一个字符后,不需要键入回车。若只键入回车,则出口参数则出口参数ALAL得到的是回车符的得到的是回车符的ASCIIASCII码值码值0DH0DH。2号系统功能调用(显示一个字符)功功能能:单单字字符符输输出出。即即将将以以DLDL寄寄存存器器内内容容为为ASCIIASCII码码值值的的ASCIIASCII字符输出到屏幕上。字符输出到屏幕上。入口参数:入口参数:DLDL要显示字符的要显示字符的ASCIIASCII码值码值出
4、口参数:无出口参数:无格式:格式:MOV DLMOV DL,要显示的字符,要显示的字符MOV AH,2INT 21HINT 21H例:例:MOV DLMOV DL,41H 41H ; MOV DL MOV DL,AAMOV AHMOV AH,2 2INT 21HINT 21H屏幕上输出字符屏幕上输出字符“A”“A”4.4 分支程序设计4.4.1 无条件、条件转移指令无条件、条件转移指令4.4.2 分支程序设计分支程序设计分支分支控制转移类控制转移类指令通过改变指令通过改变IP(和(和CS)值,实值,实现程序执行顺序的改变,是仅次于传送指令的最常现程序执行顺序的改变,是仅次于传送指令的最常用指令
5、,要求很好掌握用指令,要求很好掌握一、无条件转移指令JMP指令分成指令分成4种类型:种类型: 段内段内直接直接转移转移 段内段内间接间接转移转移 段间段间直接转移直接转移 段间间接转移段间间接转移JMP labelJMP labelJMPJMP格式:格式:程序转向程序转向labellabel标号指定的地址处执行标号指定的地址处执行 功能:功能:说明:说明:目标地址的范围:段内段内转移段内转移近转移近转移(near)n在在当当前前代代码码段段64KB范范围围内内转转移移( 32KB范围)范围)段内转移段内转移短转移短转移(short)n转转移移范范围围当当前前代代码码段段127B范范围围内转移内
6、转移n不不需需要要更更改改CS段段地地址址,只只要要改改变变IP偏移地址偏移地址代代码码段段代代码码段段JMPJMP目标地址的范围:段间段间转移段间转移远转移(远转移(far)n从从当当前前代代码码段段跳跳转转到到另另一一个个代代码码段,可以在段,可以在1MB范围范围n需要需要更改更改CS段地址和段地址和IP偏移地址偏移地址n目目标标地地址址必必须须用用一一个个32位位数数表表达达,叫做叫做32位远指针位远指针。代代码码段段代代码码段段 实实际际编编程程时时,汇汇编编程程序序会会根根据据目目标标地地址址的的距距离离,自动处理自动处理成短转移、近转移或远转移成短转移、近转移或远转移 程序员可用操
7、作符程序员可用操作符short、near ptr 或或far ptr 强制强制JMPJMP直接直接n转转移移地地址址象象立立即即数数一一样样,直直接接出出现现在指令中在指令中间接间接n转移地址转移地址在在寄存器寄存器或或主存单元主存单元中中用标号表达用标号表达用寄存器或存储器用寄存器或存储器操作数表达操作数表达JMPJMP段内直接转移段内直接转移举例JMP r16/m16 JMP r16/m16 例如:例如: jmp jmp axaxjmp jmp word ptr 2000hword ptr 2000h 段内间接转移段内间接转移JMP label JMP label 例如:例如:jmpjmp
8、 output output output:output:mov result,almov result,alJMP far ptr label 例如:例如: ;IPlabel的偏移地址的偏移地址 ;CSlabel的段地址的段地址jmp far ptr otherseg段间直接转移段间直接转移;IPlabel的偏移地址的偏移地址JMP far ptr mem 例如:例如: 段间间接转移段间间接转移JMP far ptr bx二、条件转移指令功功能能:指指定定的的条条件件cc如如果果成成立立,程程序序转转移移到到由由标标号号label指指定定的的目目标标地地址址去去执执行行指指令令;条条件件不不
9、成成立立,则则程程序序将将顺顺序序执执行下一条指令行下一条指令说明:(说明:(1) Jcc(2)操作数操作数label是采用段内短转移是采用段内短转移(3) Jcc指令不影响标志,但要利用标志指令不影响标志,但要利用标志Jcc labelJcc label格式:格式: Jcc指令的分类指令的分类根据利用的标志位不同,根据利用的标志位不同,16条指令分成条指令分成3种情况:种情况:1. 判断判断单个标志位单个标志位状态状态2. 比较比较无符号数无符号数高低高低3 . 比较比较有符号数有符号数大小大小1. 判断单个标志位状态这组指令单独判断这组指令单独判断5个状态标志之一个状态标志之一JZ/JE和
10、和JNZ/JNE:利利用用零零标标志志ZF,判判断断结结果果是是否否为为零零(或或相相等等)。 JZ/JE表表示示结结果果为为零(或相等),则转移。零(或相等),则转移。JS和和JNS:利利用用符符号号标标志志SF,判判断断结结果果是是正是负,正是负, JS表示结果为负则转移。表示结果为负则转移。JO和和JNO:利利用用溢溢出出标标志志OF,判判断断结结果果是是否产生溢出,否产生溢出, JO表示溢出则转移。表示溢出则转移。JP/JPE和和JNP/JPO:利利用用奇奇偶偶标标志志PF,判判断断结结果果中中“1”的的个个数数是是偶偶是是奇奇。JP表表示示偶偶个个数数个个1JC和和JNC:利利用用进
11、进位位标标志志CF,判判断断结结果果是是否进位或借位。进位或借位为否进位或借位。进位或借位为1则转移。则转移。JccJcc例题例题例题例题例题例题例题例题例题例题比较无符号数高低无符号数高低有无符号数高低有4种关系:种关系:高于高于(不低于等于):(不低于等于): JA ( JNBE )高于等于(不低于):高于等于(不低于): JAE (JNB)低于低于(不高于等于):(不高于等于):JB(JNAE)低于等于(不高于):低于等于(不高于):JBE(JNA)JccJcc例:比较无符号数例:比较无符号数比比较较无无符符号号数数大大小小,将将较较大大的的数数存存放放AX寄寄存存器器。 cmp ax,
12、bx cmp ax,bx;比较;比较axax和和bx,(AX)-(BX)bx,(AX)-(BX)jae nextjae next;若;若axaxbxbx,转移,转移xchg ax,bxxchg ax,bx;若;若axaxbxbx,交换,交换next:next:.结果:结果:AX保存较大的保存较大的无符号数无符号数比较有符号数大小两数的大小分成两数的大小分成4种关系:种关系:大于大于(不小于等于):(不小于等于): JG ( JNLE )大于等于(不小于):大于等于(不小于): JGE (JNL)小于小于(不大于等于):(不大于等于):JL(JNGE)小于等于(不大于):小于等于(不大于):JL
13、E(JNG)JccJcc例:比较有符号数例:比较有符号数比较有符号数大小,将较大的数存放在比较有符号数大小,将较大的数存放在AX寄存器。寄存器。 cmp ax,bx cmp ax,bx;比较;比较axax和和bxbxjge nextjge next;若;若axaxbxbx,转移,转移xchg ax,bxxchg ax,bx;若;若axaxbxbx,交换,交换next:next:.结果:结果:AX保存较大的保存较大的有符号数有符号数注意:根据数的不同选取不同的指令注意:根据数的不同选取不同的指令条件转移指令中的条件ccJccJcc 实际虽然指令只有实际虽然指令只有16条,但却有条,但却有30个助
14、记符个助记符 采用多个助记符,只是为了方便记忆和使用采用多个助记符,只是为了方便记忆和使用SF三、分支程序设计分分支支程程序序根根据据条条件件是是真真或或假假决决定定执执行行与与否否,判判断断的的条件是各种指令,条件是各种指令,单分支双分支多分支如如CMP、TEST等执行后形成的状态等执行后形成的状态标志与条件转移指令标志与条件转移指令Jcc联合可以实现分支控制。联合可以实现分支控制。用无条件转移指令用无条件转移指令JMP也可以实现分支控制。也可以实现分支控制。条条件件成成立立跳跳转转到到标标号号所所在在的的指指令令执执行行,否否则则顺顺序序执执行行分分支支语语句句体体;注注意意:选选择择正正
15、确确的的条条件件转转移移指指令令和和转移目标地址转移目标地址1、 单重分支1、 单分支【例【例4.9 】编程求编程求XY,结果存于结果存于RESULT单元中,单元中,设设X和和Y都为都为16位数。位数。DATA SEGMENTX DW -10Y DW 20RESULT DW ?DATA ENDSSTACK SEGMENT STACKDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,X SUB AX,Y JNS NONNEG NEG AXNON
16、NEG: MOV RESULT,AX MOV AH,4CH INT 21HCODE ENDS END START2、双分支程序设计条条件件成成立立跳跳转转执执行行第第2个个分分支支语语句句体体,否否则则顺顺序序执执行行第第1个个分分支支语语句句体体。注注意意第第1个个分分支支体体后后一一定定要要有有一一个个JMP指指令令跳跳到到第第2个分支体后个分支体后2、双分支程序设计【例4.10】 显示BX的最高位 shl bx,1jnc onemov dl,1jmp twoone: mov dl,0 two: mov ah,2int 21h提示:条件转移指令的使用很关键,要根据不同的情况正确的选用提示:
17、条件转移指令的使用很关键,要根据不同的情况正确的选用多个条件对应各自的分支语句体,多个条件对应各自的分支语句体,哪个条件成立就转入相应哪个条件成立就转入相应分支体执行分支体执行。多分支可以化解为双分支或单分支结构的组合。多分支可以化解为双分支或单分支结构的组合3、多分支结构AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN【例【例4.11】编写计算下面函数值的程序:编写计算下面函数值的程序: 1X0Y= 0X=0 -1X0设设输输入入数数据据为为X、输输出出数数据据Y,且且皆皆为为字字节节变变量量。程序流程图如图所示。程序流程图如图所示。3、 多分支图图 分支
18、运算分支运算程序流程图程序流程图DATA SEGMENTX DB -10Y DB ?DATA ENDSSTACK SEGMENT STACK DB 200 DUP(0)STACK ENDSCODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA MOV DS,AX CMP X,0 ;与;与0进行比较进行比较 JGE A1 ;X0转转A1 MOV Y,-1 ;X 0时,时,-1Y JMP EXITA1: JGA2 ;X0转转A2 MOV Y,0 ;X=0时,时,0Y JMP EXITA2: MOV Y,1 ;X0,1Y EXIT: MOV AH,4CH INT 21H CODE ENDS END START