资源预览内容
第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
第9页 / 共37页
第10页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章 汇编语言程序设计一、概述 二、顺序程序设计 三、DOS系统功能调用四、分支程序设计 五、循环程序设计 六、串处理类指令4.3 DOS系统功能调用4.3.1 系统功能调用方法4.3.2 常用的DOS系统功能调用4.3.1 系统功能调用方法DOS系统功能调用的方法一般可分为以下几步: 设置所要调用功能的入口参数。 在AH寄存器中存入所要调用功能的功能号。 INT 21H指令自动转入中断子程序入口。 相应中断子程序运行完毕,可按规定取得出口参数 。 4.3.2 常用的DOS系统功能调用1不带回显的键盘单字符输入(8号功能) 2. 带回显的键盘单字符输入(1号功能) 3. 单字符输出(2号功能) 4. 字符串显示(9号功能) 5. 字符串输入(0AH号功能) 7. 程序正常返回系统1号系统功能调用(从键盘读入一个字符)功能:单字符输入。 将键盘输入的字符的ASCII码值送AL寄存器,同时回显在屏幕 上。 入口参数:无 出口参数:AL寄存器存放输入字符的ASCII码值格式:MOV AH,1 INT 21H说明:在输入一个字符后,不需要键入回车。若只键入回车, 则出口参数AL得到的是回车符的ASCII码值0DH。2号系统功能调用(显示一个字符)功能:单字符输出。即将以DL寄存器内容为ASCII码值的 ASCII字符输出到屏幕上。 入口参数:DL要显示字符的ASCII码值 出口参数:无 格式:MOV DL,要显示的字符 MOV AH,2 INT 21H 例:MOV DL,41H ; MOV DL,A MOV AH,2 INT 21H 屏幕上输出字符“A”说明:掌握P104的回车和换行符的使用。4.4 分支程序设计4.4.1 无条件、条件转移指令 4.4.2 分支程序设计 4.4.3 用跳转表实现多分支程序设计分支控制转移类指令通过改变IP(和CS)值,实 现程序执行顺序的改变,是仅次于传送指令的最常 用指令,要求很好掌握一、无条件转移指令JMP指令分成4种类型: 段内直接转 移 段内间接转 移 段间直接转 移 段间间接转 移JMP labelJMPJMP格式:程序转向label标号指定的地址处执行 功能:说明:目标地址的范围:段内段内转移近转移(near)n在当前代码段64KB范围 内转移( 32KB范围)段内转移短转移(short)n转移范围当前代码段 127B范围内转移n不需要更改CS段地址, 只要改变IP偏移地址代码段代码段JMPJMP目标地址的范围:段间段间转移远转移(far)n从当前代码段跳转到另一 个代码段,可以在1MB范围n需要更改CS段地址和IP 偏移地址n目标地址必须用一个32位 数表达,叫做32位远指针。代码段代码段实际编程时,汇编程序会根据目标地址的距离, 自动处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制JMPJMP直接n转移地址象立即数一样,直 接出现在指令中间接n转移地址在寄存器或主存单 元中用标号表达用寄存器或存储器 操作数表达JMPJMPJMPJMP段内直接转移JMP label;IPIP+位移量 位移量是紧接着JMP指令后的那条指令的偏移地 址,到目标指令的偏移地址的地址位移。 当向地址增大方向转移时,位移量为正;向地址 减小方向转移时,位移量为负 jmp output ;转移到output处继续执行 output: mov result,al;标号output的指令段内间接转移JMP r16/m16 ;IPr16/m16 将一个16位寄存器或主存字单元内容送入IP寄存 器,作为新的指令指针。jmp ax ;IPAX jmp word ptr 2000h ;IP2000h段间直接转移JMP far ptr label ;IPlabel的偏移地址 ;CSlabel的段地址将标号所在段的段地址作为新的CS值,标号在 该段内的偏移地址作为新的IP值;这样,程序跳转 到新的代码段执行jmp far ptr otherseg ;远转移到另一代码段的otherseg处JMPJMP段间间接转移JMP far ptr mem ;IPmem,CSmem+2 用一个双字存储单元表示要跳转的目标地址。这 个目标地址存放在主存中连续的两个字单元中,低 位字送IP寄存器,高位字送CS寄存器注意:此处的操作数只能是存储器操作数mov word ptr bx,0 mov word ptr bx+2,1500h JMP dword ptr bx ;转移到1500:0hJMPJMP二、条件转移指令功能:指定的条件cc如果成立,程序转移到由标号 label指定的目标地址去执行指令;条件不成立,则程序将顺 序执行下一条指令说明:(1) Jcc(2)操作数label是采用段内短转移(3) Jcc指令不影响标志,但要利用标志Jcc label格式: Jcc指令的分类 根据利用的标志位不同,16条指令分成3种情况:1. 判断单个标志位状态 2. 比较无符号数高低 3 . 比较有符号数大小1. 判断单个标志位状态这组指令单独判断5个状态标志之一 JZ/JE和JNZ/JNE:利用零标志ZF,判断 结果是否为零(或相等)。 JZ/JE表示结果为 零(或相等),则转移。 JS和JNS:利用符号标志SF,判断结果 是正是负, JS表示结果为负则转移。 JO和JNO:利用溢出标志OF,判断结果 是否产生溢出, JO表示溢出则转移。 JP/JPE和JNP/JPO:利用奇偶标志PF, 判断结果中“1”的个数是偶是奇。JP表示偶个数 个1 JC和JNC:利用进位标志CF,判断结果 是否进位或借位。进位或借位为1则转移。JccJcc例题例题例题例题例题例:JZ/JNZ指令测试al最高位,若为0,将0送入ah,若为1,将-1送入 ah test al,80h ;测试最高位 jz next0;D70(ZF1),转移 mov ah,0ffh;D71,顺序执行 jmp done;无条件转向 next0:mov ah,0 done: .test al,80h ;测试最高位 jnz next1;D71(ZF0),转移 mov ah,0;D70,顺序执行 jmp done;无条件转向 next1:mov ah,0ffh done: .例:JS/JNS指令;计算|XY|(绝对值) ;X和Y为存放于X单元和Y单元的16位操作数 ;结果存入result mov ax,X sub ax,Y jns nonneg neg ax;neg是求补指令 nonneg: mov result,ax例:JO/JNO指令;计算XY; ;X和Y为存放于X单元和Y单元的16位操作数 ;若溢出,则转移到overflow处理 mov ax,X sub ax,Y jo overflow .;无溢出,结果正确 overflow:. ;有溢出处理例:JC/JNC指令;记录BX中1的个数 xor al,al;AL0,CF0 again:test bx,0ffffh ;等价于 cmp bx,0 je next shl bx,1 jnc again inc al jmp again next:.;AL保存1的个数另一种做法记录BX中“1”的个数xor al,al;AL0,CF0 again:cmp bx,0 jz next shl bx,1;也可使用 shr bx,1 adc al,0 jmp again next:.;AL保存1的个数比较无符号数高低无符号数高低有4种关系: 高于(不低于等于): JA ( JNBE ) 高于等于(不低于): JAE (JNB) 低于(不高于等于):JB( JNAE) 低于等于(不高于):JBE (JNA)JccJcc例:比较无符号数比较无符号数大小,将较大的数存放AX寄存 器。 cmp ax,bx;比较ax和bx,(AX)-(BX) jae next;若axbx,转移 xchg ax,bx;若axbx,交换 next:.结果:AX保存较大的无符号数比较有符号数大小两数的大小分成4种关系: 大于(不小于等于): JG ( JNLE ) 大于等于(不小于): JGE ( JNL) 小于(不大于等于):JL( JNGE) 小于等于(不大于):JLE( JNG)JccJcc例:比较有符号数比较有符号数大小,将较大的数存放在AX寄存器 。 cmp ax,bx;比较ax和bx jge next;若axbx,转移 xchg ax,bx;若axbx,交换 next:.结果:AX保存较大的有符号数注意:根据数的不同选取不同的指令条件转移指令中的条件ccJccJcc实际虽然指令只有16条,但却有30个助记符 采用多个助记符,只是为了方便记忆和使用SF三、分支程序设计分支程序根据条件是真或假决定执行与否,判 断的条件是各种指令,单分支双分支多分支如CMP、TEST等执行后形成的状态 标志与条件转移指令Jcc联合可以实现分支控制。用无条件转移指令JMP也可以实现分支控制。条件成立跳转到标号所在的指 令执行,否则顺序执行分支语句 体;注意:选择正确的条件转移指 令和转移目标地址1、 单重分支1、 单分支【例4.9 】编程求XY, 结果存于RESULT单元中, 设X和Y都为16位数。 DATA SEGMENT X DW -10 Y DW 20 RESULT DW ? DATA ENDS STACK SEGMENT STACKDB 100 DUP(?) STACK ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AX MOV AX,XSUB AX,YJNS NONNEGNEG AX NONNEG: MOV RESULT,AXMOV AH,4CHINT 21H CODE ENDSEND START2、双分支程序设计条件成立跳转执行第2 个分支语句体,否则顺 序执行第1个分支语句体 。注意第1个分支体后一 定要有一个JMP指令跳 到第2个分支体后2、双分支程序设计【例4.10】 显示BX的最高位,用DL作标志第一种方法shl bx,1 jnc one mov dl,1 jmp two one: mov dl,0 two: mov ah,2 int 21hmov dl,0 shl bx,1 jnc two mov dl,1 two: mov ah,2 int 21h第二种方法提示:条件转移指令的使用很关键,要根据不同的情况正确的选用多个条件对应各自的分支语句体,哪个条件成立就转入相应 分支体执行。多分支可以化解为双分支或单分支结构的组合3、多分支结构AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN【例4.11】编写计算下面函数值的程序:1X0 Y= 0 X=0-1X0 设输入数据为X、输出数据Y,且皆为字节变 量。程序流程图如图所示。3、 多分支图 分支运算程序流程图DATA SEGMENT X DB -10 Y DB ? DATA ENDS STACK SEGMENT STACKDB 200 DUP(0) STACK ENDS CODE SEGMENTASSUME DS:DATA,SS:STACK,CS: CODE START:MOVAX,DATAMOV DS,AXCMP X,0 ;与0进行比较JGE A1 ;X0转A1MOV Y,-
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号