1、4.3 实地址方式下的汇编语言程序设计实地址方式下的汇编语言程序设计 一般将公用性、重复性或有相对独立性的程序应设计成子程序一般将公用性、重复性或有相对独立性的程序应设计成子程序子程序设计子程序设计 结构结构: :程序部分程序部分RETNAME ENDP必须必须RET结束结束NAME PROCNEAR(FAR)过程名过程名过程类型过程类型PUSHAXPUSHBX主程序现场保护主程序现场保护POPBXPOPAX4.3 实地址方式下的汇编语言程序设计实地址方式下的汇编语言程序设计子程序设计子程序设计 调用与返回调用与返回:调用调用:CALL 过程名(子程序地址)过程名(子程序地址)功能:功能:(1
2、)下条指令的地址压入堆栈。下条指令的地址压入堆栈。主子同段(段内调用):主子同段(段内调用):只将只将IP的值压入堆栈的值压入堆栈段间调用:段间调用:先将先将CS的值压入堆栈,再将的值压入堆栈,再将IP的值压入堆栈。的值压入堆栈。 (2)转入子程序运行转入子程序运行 子程序的地址送入子程序的地址送入CS:IP4.3 实地址方式下的汇编语言程序设计实地址方式下的汇编语言程序设计子程序设计子程序设计 调用与返回调用与返回:返回指令返回指令RET 子程序的最后一条指令,用于返回子程序的最后一条指令,用于返回CALL指令的下条指指令的下条指令继续执行。无论对那一种调用方式其返回指令都相同。令继续执行。
3、无论对那一种调用方式其返回指令都相同。 功能:功能:(1) 段内调用只将当前段内调用只将当前SP弹进弹进IP,从而使程序正常返回。从而使程序正常返回。(2)对于段间调用则先弹对于段间调用则先弹IP,再弹再弹CS。 4.3 实地址方式下的汇编语言程序设计实地址方式下的汇编语言程序设计子程序设计子程序设计 子程序的设计与应用应注意的问题子程序的设计与应用应注意的问题 (1)(1)现场的保护现场的保护 PUSHAXPUSHBXPUSH SIPOPSIPOPBXPOPAXRET4.3 实地址方式下的汇编语言程序设计实地址方式下的汇编语言程序设计子程序设计子程序设计 子程序的设计与应用应注意的问题子程序
4、的设计与应用应注意的问题 (2)参数的传递参数的传递v主程序调用子程序必须传递入口参数,主程序调用子程序必须传递入口参数,v子程序返回必须传递出口参数。子程序返回必须传递出口参数。常用的方法有:常用的方法有:v寄存器:寄存器:适用于参数少的情况。适用于参数少的情况。v约定单元:约定单元:适用于参数多的情况。要事先建立参数数据缓冲区。适用于参数多的情况。要事先建立参数数据缓冲区。v堆栈:堆栈:适用于参数较多,且子程序嵌套,递归调用的情况适用于参数较多,且子程序嵌套,递归调用的情况 ;子程序的入口参数:;子程序的入口参数:;SI=数据区的首地址,数据区的首地址,CX=数据个数数据个数;出口参数:;
5、出口参数:AL为最大的数为最大的数;用到的寄存器:;用到的寄存器:AX,CX,SI4.3 实地址方式下的汇编语言程序设计实地址方式下的汇编语言程序设计2组组8位无符号数,每组中有位无符号数,每组中有N个无符号个无符号数,分别找出每一组中的最大数,并将最数,分别找出每一组中的最大数,并将最大数存放在每组数的开绐地址。大数存放在每组数的开绐地址。 CODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,BUF1 ;入口参数入口参数INCSI ;指向数据开始指向数据开始MOVCX,N1 ;入口参数入口参数CALLSUBROTMOV
6、BUF1,ALLEASI,BUF2INCSI ;指向数据开始指向数据开始MOVCX,N2CALLSUBROTMOVBUF2,ALMOVAH,04CHINT21HSUBROT PROCPUSHCX;子程序开始子程序开始PUSHSIDECCX;MOVAL,SI ;LOOP1:INCSI;CMPAL,SIJANEXTMOVAL,SINEXT:LOOPLOOPLOOP1POPSIPOPCXRETSUBROT ENDPDATASEGMENTBUF1DB ?,12H,45HN1=$-BUF1N1=$-BUF1BUF2DB ?,65H,ACHN2=$-BUF2N2=$-BUF2DATAENDSCODEEND
7、SENDSTART4.4 汇编程序及上机过程汇编程序及上机过程汇编汇编程序要建立的文件:程序要建立的文件:EDIT.EXE MASM.EXELIKE.EXEDEBUG.COMEDIT是编辑程序是编辑程序,MASM为汇编程序,为汇编程序,LINK为连接程序,为连接程序,EXE2BIN为转换成为转换成COM文件所需要的程序文件所需要的程序4.4 汇编程序及上机过程汇编程序及上机过程1、建立建立ASM文件文件用记事本或用记事本或EDIT编辑源程序文件,文件的扩展名一编辑源程序文件,文件的扩展名一般应为般应为.ASM。 如如X.ASM2、用、用MASM对源文件进行汇编,对源文件进行汇编,C:amasm
8、 xMicrosoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename x.OBJ:Source listing NUL.LST:Cross-reference NUL.CRF:x.ASM(9): error A2042: Constant expected0 Warning Errors (警告错误警告错误 ) 1 Severe Errors (严重错误严重错误 )提示有错误,修改源程序后重新汇编,直至通过并提示
9、有错误,修改源程序后重新汇编,直至通过并产生产生 .OBJ文件为止。文件为止。4.4 汇编程序及上机过程汇编程序及上机过程3、用、用LINK将将.OBJ文件连接成可执行的文件连接成可执行的.EXE文件。文件。 4、程序的执行、程序的执行状态下运行状态下运行X.EXE文件。文件。5、若不能达到预期结果。用、若不能达到预期结果。用DEBUG检查程序。检查程序。 找找到逻辑错误,再用文字编辑工具修改、汇编、连接,到逻辑错误,再用文字编辑工具修改、汇编、连接,直到达到预期目的。直到达到预期目的。4.5 DOS及及BIOS功能调用功能调用DOSDOS系统功能调用和系统功能调用和BIOSBIOS中断调用中
10、断调用 BIOS:最底层,最底层, 硬件系统管理,中断硬件系统管理,中断类型号类型号81FH。 BIOSDOS应用程序应用程序软件结构:软件结构:DOS:BIOS之上的系统管理,硬件和软之上的系统管理,硬件和软件更完整管理,特别是磁盘文件的管理。中件更完整管理,特别是磁盘文件的管理。中断类型号断类型号20H2FH 。DOS和和BIOS由几十个独立的中断服务程序组成,为汇编由几十个独立的中断服务程序组成,为汇编语言程序设计提供了方便,可以完成语言程序设计提供了方便,可以完成I/O设备管理,内存管理,设备管理,内存管理,文件管理等功能,在汇编语言中可用软中断指令调用它们。文件管理等功能,在汇编语言
11、中可用软中断指令调用它们。 4.5 DOS及及BIOS功能调用功能调用DOSDOS系统功能调用和系统功能调用和BIOSBIOS中断调用中断调用 (1)MOVMOV REGREG,XXXX;传送入口参数到指定寄存器中传送入口参数到指定寄存器中;(部分;(部分无无入口参数)入口参数) (2)MOVMOV AHAH,功能号功能号;功能号送入;功能号送入AH寄存器中寄存器中(3)INT 21H;调用调用DOSDOS调用方法:调用方法:(4)返回信息)返回信息: :CF=1表示有错误发生表示有错误发生, , AX=返回错误代码返回错误代码CF=表示调用成功表示调用成功, ,AX返回参数返回参数4.5 D
12、OS及及BIOS功能调用功能调用1、键盘单字符输入(键盘单字符输入(1号)号)MOVAH,1INT21H功能:等待从键盘输入一个字符。功能:等待从键盘输入一个字符。返回:(返回:(AL)=ASCII码,并回显在显示器上。码,并回显在显示器上。常用常用DOS功能调用功能调用 :2、键盘输入字符串(、键盘输入字符串(0AH号)号)MOVDX,OFFSET BUF;DS:DX为键盘缓冲区为键盘缓冲区MOVAH,0AHINT21H功能:等待从键盘输入一串字符,回车结束。字符串存入键盘缓冲区。功能:等待从键盘输入一串字符,回车结束。字符串存入键盘缓冲区。键盘缓冲区定义:键盘缓冲区定义:BUFDB 81;
13、缓冲区的大小缓冲区的大小DB ?;实际输入的字符个数不含实际输入的字符个数不含0DHDB 80 DUP (?)(?) ;字符串存放区字符串存放区 DEBUG演示演示4.5 DOS及及BIOS功能调用功能调用3、输出单字符(、输出单字符(2号)号)MOVDL,AMOVAH,02INT21H功能:将功能:将DL中字符从屏幕上输出。中字符从屏幕上输出。返回:无返回返回:无返回 DEBUG演示演示常用常用DOS功能调用功能调用 :4、输出字符串(、输出字符串(09号)号)MOVDX,OFFSET BUFMOVAH,09INT21H功能:功能:BUF中以中以$为结束标志的字符串显示在屏幕上。当无结束标志
14、为结束标志的字符串显示在屏幕上。当无结束标志时会出现乱码。时会出现乱码。DATASEGMENTASCSDB 808X86 CPU $DATAENDS DEBUG演示演示4.5 DOS及及BIOS功能调用功能调用5、控制台输入、控制台输入/输出单字符(输出单字符(06)MOVAH,06MOVDL,0FFH;当为当为0FFH时从键盘读一字符到时从键盘读一字符到ALINT21H;否则将否则将DL中的字符送显示器中的字符送显示器这一功能调用给输入输出有更方便应用。这一功能调用给输入输出有更方便应用。 常用常用DOS功能调用功能调用 :6、无回显控制台输入单字符(、无回显控制台输入单字符(08)MOVA
15、H,08INT21H功能:键盘读入一个字符不在显示器上显示,常用于口令的和控制键的输入。功能:键盘读入一个字符不在显示器上显示,常用于口令的和控制键的输入。7、1、返回操作系统(、返回操作系统(4CH)MOVAH,4CHINT21H;将控制权交给操作系统。将控制权交给操作系统。 4.5 DOS及及BIOS功能调用功能调用常用常用BIOS功能调用功能调用 :(1 1)MOVMOV AH,AH,功能号功能号;功能号送入;功能号送入AH寄存器中寄存器中(2 2)INT XH;中断中断调用调用屏幕显示模式中断调用屏幕显示模式中断调用INT 10HINT 10H例如:例如:功能:读取当前显示模式号功能:
16、读取当前显示模式号MOV AX,0FH INT 10H;中断调用中断调用功能:设置屏幕显示模式功能:设置屏幕显示模式MOVMOVAXAX,0006H0006H;功能号送功能号送AHAH,ALAL中为模式号中为模式号INT 10H;中断中断调用调用P222P222有关部分自阅。有关部分自阅。4.5 DOS及及BIOS功能调用功能调用DATASEGMENTKEYBUF DB 12,?,?,11 DUP(?)(?)DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADX,KEYBUFMOVAH,0AHINT21H;输
17、入一串字符输入一串字符LEASI,KEYBUF;字串结束地址字串结束地址MOVAL,SI+1MOVAH,0ADDSI,AXMOVSI,$;9号功能标志号功能标志LEADX,KEYBUF+2MOVAH,09INT21H;输出一串字符输出一串字符EXIT:MOVAH,4CH;返回返回DOSINT21HCODEENDSENDSTART;程序汇编结束程序汇编结束例例1,从键盘输入字符串,从键盘输入字符串“PENTIUM CPU”并显显在屏上。并显显在屏上。4.5 DOS及及BIOS功能调用功能调用程序设计举例程序设计举例例例2:将:将16位二进制数转换成用位二进制数转换成用ASCII码表示的码表示的5
18、位十进位十进制数。制数。CX-1=0?终 止起 始AL=ASCII码AX=DX:AX /SIDX=余数DX:AX=被除数YNADD SI,2 INC DIDI=AL显示结果初如化DI=ASDECSI=PWTABCX=5算法算法1: 用除法指令完成,被除数送用除法指令完成,被除数送DX:AX与与PWTAB的的数数10000、1000、100、10 、1相除,利用循环程序相除,利用循环程序分别可得到对应位的十进制数的分别可得到对应位的十进制数的ASCII码。调用码。调用DOS的的9号功能显示这个十进制数。流程图如图所示。号功能显示这个十进制数。流程图如图所示。DATA SEGMENT BIN DW
19、 358CH ASDEC DB 5 DUP(?) ,$PWTAB DW 10000, 1000, 100, 10, 1DATA ENDS显示调用专用显示调用专用DATA SEGMENT BIN DW 358CH ASDEC DB 5 DUP(?) ,$PWTAB DW 10000, 1000, 100, 10, 1DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATASTART: MOV AX, DATA MOV DS, AX MOV DI, OFFSET ASDEC MOV SI, OFFSET PWTAB MOV CX,5MOV DX, BINLOP
20、1: MOV AX,DXMOV DX,0DIV WORD PTR SIADD AL,30HMOV DI, AL INC SI INC SI INC DILOOP LOP1MOV AH,09LEA DX,ASDECINT 21H MOV AH, 4CH INT 21HCODE ENDS END STARTCX-1=0?终 止起 始AL=ASCII码AX=DX:AX /SIDX=余数DX:AX=被除数YNADD SI,2 INC DIDI=AL显示结果初如化DI=ASDECSI=PWTABCX=5汇编连接EXE13 例例3:编制完成两个:编制完成两个4字节的字节的BCD码码(8位十进制数位十进制数
21、)的加法运算的加法运算程序。程序。 算法:将算法:将4字节的字节的BCD码分为码分为4个单字节数相加,从低字节开个单字节数相加,从低字节开始,进行始,进行4次次 循环操作,注意循环操作,注意BCD修正。修正。 程序:程序:CODE SEGMENT ASSUME CS: CODE, DS: DATAMULADD:MOV AX, DATAMOV DS, AX LEA SI, BCD1 LEA BX, BCD2 LEA DI, SUM MOV CL, 4 CLCAGAIN: MOV AL, SI ADC AL, BX DAA MOV DI, AL INC SI INC BX INC DI DEC C
22、L JNZ AGAIN MOV AH, 4CH INT 21HCODE ENDS END MULADDDATA SEGMENTBCD1 DB 76H,54H,38H,29HBCD2 DB 49H,37H,65H,17HSUM DB 4 DUP(?)DATA ENDS 29 38 54 7617 65 37 49 47 03 92 25例例 BUF中有中有N个有符号数,分离其中的正负数,分别送入个有符号数,分离其中的正负数,分别送入BUF1和和BUF2中。中。 这是一个循环次数已知的程序设计,用计数循环完成。这是一个循环次数已知的程序设计,用计数循环完成。DATASEGMENTBUFDB 12H
23、, 34H, -56H, -58H, 96H, 68H, 56H N=$-BUFBUF1DB N DUP(0)BUF2DB N DUP(?) DATAENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV DX,DATAMOVDS,DXLEASI,BUFLEADI,BUF1LEABX,BUF2MOVCX,NAA:MOVAL,SIINCSICMPAL,0JGEBBMOVBX,AL(1)若)若DW定义定义BUF怎样修改?怎样修改?(2)能改为条件控制循环吗?)能改为条件控制循环吗?汇编连接演示汇编连接演示X42INCBXJMPCCBB:MOVDI,ALINCDICC:LOOP AAMOVAH,4CHINT21HCODEENDSENDSTART课后作业:课后作业:1. P229 12