第04章汇编语言程序设计(1)_第1页
第04章汇编语言程序设计(1)_第2页
第04章汇编语言程序设计(1)_第3页
第04章汇编语言程序设计(1)_第4页
第04章汇编语言程序设计(1)_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章第四章 汇编语言程序设计汇编语言程序设计概述概述l汇编语言汇编语言l用指令助记符、符号地址、用指令助记符、符号地址、标号等编写的程序。标号等编写的程序。l为机器语言的符号表示为机器语言的符号表示 l汇编语言的特点汇编语言的特点l高级语言高级语言可移植性好可移植性好程序易编程序易编/ /易读易读/ /易学易学应用:科学计算、信息应用:科学计算、信息管理等管理等l汇编语言汇编语言面向机器面向机器/ /硬件硬件程序代码效率高程序代码效率高执行速度快执行速度快, ,占内存少占内存少应用:实时控制、仪器应用:实时控制、仪器仪表、系统软件等仪表、系统软件等汇编语言源程序汇编语言源程序(.ASM)(.

2、ASM)汇编汇编(MASM)(MASM)目标程序目标程序(.OBJ)(.OBJ)链接链接(LINK)(LINK)可执行程序可执行程序(.EXE)(.EXE)例:在屏幕上显示例:在屏幕上显示“This is a sample program.”DATA SEGMENT ;数据段数据段DA1 DB This is a sample program.,0DH,0AH,$DATA ENDSSTACK SEGMENT ;堆栈段堆栈段ST1 DB 100 DUP(?)STACK ENDSCODE SEGMENT ;代码段代码段MAIN PROC FAR ;过程定义过程定义ASSUME CS:CODE,DS

3、:DATA,SS:STACK ;段分配段分配 ORG 1000H START: MOV AX,STACK MOV SS,AX ;SS堆栈段段地址堆栈段段地址 PUSH DS ;返回返回DOS所需的段地址所需的段地址 MOV AX,0 ; 偏移地址偏移地址 PUSH AX MOV AX,DATA MOV DS,AX ;DS数据段段地址数据段段地址 MOV AH,9 ;设置设置DOS 9号功能调用,显号功能调用,显示字符串示字符串 MOV DX,OFFSET DA1 ;DS:DX 串首地址,串首地址,$为为结束符结束符 INT 21H ;DOS功能调用功能调用 RETMAIN ENDP ;过程结束

4、过程结束CODE ENDS ;代码段结束代码段结束 END START 回车回车换行换行结束符结束符l分段结构分段结构 段名段名 SEGMENTSEGMENT 段名段名 ENDSENDSlMAIN为一过程为一过程 由由DOSDOS调用,调用,RETRET返回返回DOSDOSl两种语句两种语句 指令语句指令语句 :汇编后产生目标代码:汇编后产生目标代码 伪指令语句:不产生目标代码,仅提供汇编信息伪指令语句:不产生目标代码,仅提供汇编信息程序结构:程序结构:4.1 汇编语言的语句格式汇编语言的语句格式一、指令性语句:一、指令性语句:可执行语句,有对应的机器码可执行语句,有对应的机器码 格式:标号:

5、助记符标号:助记符 操作数操作数1 1,操作数,操作数2 2;注释;注释二、指示性语句二、指示性语句:伪指令,无机器码伪指令,无机器码 格式:名字名字 指示符指示符 操作数操作数1 1,操作数,操作数2 2;注释;注释三、数据项三、数据项: 操作数:常量、变量、标号操作数:常量、变量、标号l常量常量:01101101B,38,5AH,0FEH,ABl变量与标号变量与标号:有有3 3个属性:个属性:段值:变量段值:变量/ /标号所在段的段地址标号所在段的段地址偏移地址:偏移地址:1.1.类型:变量类型:变量/ /标号:标号:BYTE,WORD,DWORD/NEAR,FARBYTE,WORD,DW

6、ORD/NEAR,FAR符号地址,由字母打头的字母数字串组成符号地址,由字母打头的字母数字串组成变量名、段名、过程名、符号名等变量名、段名、过程名、符号名等4.2 MASM中的运算符及表达式中的运算符及表达式一、算术运算符:一、算术运算符:,MOD,SHL,SHR例:例:DA EQU 300 MOV AX,DA80 MOV BX,DA MOD 100 MOV CX,DA/100 MOV DH,01100100B SHR 2二、逻辑运算符:二、逻辑运算符:AND,OR,XOR,NOT例:例:MOV AL,NOT 0FFH MOV BL,8CH AND 73H MOV AH,8CH OR 73H

7、MOV CH,8CH XOR 73H三、关系运算符:三、关系运算符:EQ、NE、LT、LE、GT、GE例:例:MOV AX,10H GT 16 ADD BL,6 EQ 0110B四、数值返回运算符:四、数值返回运算符:OFFSET,SEG,TYPE,LENGH,SIZE例:例:MOV BX,OFFSET DA1 MOV AX,SEG M1 MOV DS,AXnTYPE返回值:返回值: 变量:变量:DB/DW/DD/DQ:1248 标号:标号:NEAR/FAR:12例:例:A1 DB 20H,30H A2 DW 0438H A3 DD ? 返回值返回值 L1:MOV AH,TYPE A1 ; 1

8、 MOV BH,TYPE A2 ; 2 ADD AL,TYPE A3 ; 4 MOV BL,TYPE L1 ; 0FFHnLENGTH:使用使用DUPDUP时时, ,返回其单元数返回其单元数; ;其它情况返回其它情况返回1 1例:例:M1 DW 100 DUP(?)(?) M2 DW 1,2,3 MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV CX,SIZE M1 MOV BL,SIZE M2 ;SIZELENGTHTYPE五、修改属性运算符:五、修改属性运算符:PTR,THIS,HIGH,LOW,SHORT例:例:MOV AX,ES:BX N1 DB 15H,36

9、H N2 DW 1122H,3344H MOV AX,WORD PTR N1 JMP SHORT L2 K1 EQU 1234H MOV AH,HIGH K14.2 伪指令语句伪指令语句一、数据定义语句:一、数据定义语句:DB,DW,DD,DUP( )例:例:DA1 DB 10H,52H DA2 DW 1122H,34H FIRST DB HELLOSECOND DW OK M1 DB ? M2 DW 0D55H,?,? ONE DB 3 DUP(0) TWO DW 10 DUP(?)二、表达式赋值语句:二、表达式赋值语句:EQU例:例:COUNT EQU 100 DATA EQU COUNT

10、+2 B1 EQU OFFSET A1 C1 EQU ADDTHREE DB 4DUP(1,2DUP(20H)三、段定义语句三、段定义语句段定义语句段定义语句格式:段名格式:段名 SEGMENT 定义类型定义类型 组合类型组合类型 类别类别 段名段名 ENDS(1)定位类型:)定位类型:表示该段的起始边界要求表示该段的起始边界要求 有有PAGE/PARA/WORD/BYTEPAGE/PARA/WORD/BYTE四种四种, ,分别以页分别以页/ /节节/ /字字/ /字节为边界。字节为边界。(2)组合类型:)组合类型:告诉链接程序告诉链接程序, ,本段与其它段的组合关系本段与其它段的组合关系 共

11、共6 6种:种:nNONENONE: 本段与其它同名段不进行连接本段与其它同名段不进行连接, ,各段独立(缺省值)各段独立(缺省值)nPUBLICPUBLIC:该段与其它同名段相邻地连在一起:该段与其它同名段相邻地连在一起, ,组成一个逻辑段组成一个逻辑段nCOMMONCOMMON:链接程序为本段与其它同名段指定相同的段基址:链接程序为本段与其它同名段指定相同的段基址, ,采用覆盖采用覆盖 方式存放方式存放, ,连接长度为各段中最大长度。连接长度为各段中最大长度。nATAT表达式:链接程序把本段装在表达式的值所指定的段地址上表达式:链接程序把本段装在表达式的值所指定的段地址上nSTACKSTA

12、CK:指定该段的堆栈段:指定该段的堆栈段, ,在堆栈段中不可省略在堆栈段中不可省略, ,多个模块只需设多个模块只需设 置一个堆栈段置一个堆栈段, ,采用覆盖方式组合。采用覆盖方式组合。nMEMORYMEMORY:将本段定位在被连接的其它同名段上:将本段定位在被连接的其它同名段上, ,其它同名段按其它同名段按 COMMONCOMMON方式处理。方式处理。(3)类别类别:使所有类别相同的段组成一个段组使所有类别相同的段组成一个段组 典型类别:典型类别:STACKSTACK、CODECODE、DATADATA。nASSUME 段分配语句段分配语句 告诉汇编程序各段与段寄存器的关系告诉汇编程序各段与段

13、寄存器的关系, ,保证生成正确的目标程序保证生成正确的目标程序. . CS:指向代码段指向代码段 自动将段基址自动将段基址CSCSDS: 数据段数据段SS: 堆栈段堆栈段 不能自动装入段基址不能自动装入段基址, ,需初始化时装入需初始化时装入ES: 附加段附加段四、过程定义语句四、过程定义语句过程:过程:与子程序一样,用与子程序一样,用CALLCALL指令调用。指令调用。格式:过程名格式:过程名 PROC NEAR 或或 FAR RET 过程名过程名 ENDP五、开始与结束语句五、开始与结束语句 NAME 模块名模块名 TITLE 标题标题 ;指定每页打印的标题指定每页打印的标题 ORG 表达

14、式表达式 ;指定下面语句的起始偏移地址指定下面语句的起始偏移地址 END 标号;标号;汇编到此结束汇编到此结束不是必需的不是必需的主程序模块中第一条可执主程序模块中第一条可执行语句的标号,可省略行语句的标号,可省略lDOS不仅提供了许多命令让用户直接使用,还提供了一不仅提供了许多命令让用户直接使用,还提供了一批子程序供用户直接调用,实现设备管理、文件管理、批子程序供用户直接调用,实现设备管理、文件管理、目录管理等。(见附录目录管理等。(见附录F)lDOS规定用中断指令规定用中断指令INT 21H进入各功能调用总入口,进入各功能调用总入口,再为每个功能调用规定一个功能号,以便进入相应子程再为每个

15、功能调用规定一个功能号,以便进入相应子程序入口。序入口。lDOS功能调用的步骤:功能调用的步骤:l系统功能号系统功能号AHAHl调用参数调用参数指定寄存器指定寄存器lINT 21HINT 21H按规定取的按规定取的出口参数出口参数入口参数:或在寄存器中入口参数:或在寄存器中 或无参数或无参数返回参数:或在寄存器中返回参数:或在寄存器中 或直接显示等或直接显示等一、键盘功能调用一、键盘功能调用n1号功能调用:号功能调用:从键盘输入单字符并显示从键盘输入单字符并显示MOV AH,1 INT 21H;执行上述指令;执行上述指令, ,系统将扫描键盘系统将扫描键盘, ,一旦有键按下一旦有键按下, ,就将

16、键值就将键值(ASCII)(ASCII)读入读入, ,先检查是否为先检查是否为Ctrl-Break,Ctrl-Break,若是若是, ,则退出则退出; ;否则否则, ,将键值将键值 AL,AL,同时将字同时将字符显示在屏幕上。符显示在屏幕上。例:交互式程序:例:交互式程序:KEY:MOV AH,1 CMP AL,3 INT 21H JE THREE CMP AL,1 JMP KEY JE ONE ONE: CMP AL,2 TWO: JE TWO THREE: n0BH号功能调用:号功能调用:检查是否有键按下检查是否有键按下 LOOP: MOV AH,0BH INT 21H INC AL JN

17、Z LOOP CALL SOUNDAL=FFH, 有有AL=00H, 无无 DATA SEGMENT BUFF DB 100 ; ; 缓冲区第一字节存放字符串最大长度缓冲区第一字节存放字符串最大长度 DB ? ; ; 第二字节待存放实际输入的字符个数第二字节待存放实际输入的字符个数 DB 100 DUP(?) ; ;从第三字节开始存放从键盘接收的字符从第三字节开始存放从键盘接收的字符 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: PUSH DS SUB AX, AX PUSH AX MOV AX, DATA MOV DS, AX M

18、OV DX, OFFSET BUF MOV AH, 0AH INT 21H MOV BX, DX MOV CL, BX+1 ; ;输入字符个数输入字符个数CLCL ADD DX, 2 ; ;指向第一个字符指向第一个字符 DS:DX为缓为缓冲区首地址冲区首地址例例: : 开辟一个缓冲区开辟一个缓冲区, , 接收键盘输入的字符串接收键盘输入的字符串, , 将输入字符个数将输入字符个数CL,CL,并将指针指向第一个字符。并将指针指向第一个字符。n 0AH号功能调用:号功能调用:从键盘接收字符串存入内存指定缓冲区从键盘接收字符串存入内存指定缓冲区l其它键盘功能调用:其它键盘功能调用: 06H号:号:直

19、接键盘输入直接键盘输入/ /输出字符输出字符, ,不检查不检查Ctrl-BreakCtrl-Break 08H号:号:键盘输入一个字符键盘输入一个字符, ,无回显无回显 07H号:号:直接键盘输入直接键盘输入/ /输出字符输出字符, ,无回显无回显, ,不检查不检查Ctrl-BreakCtrl-Break 0CH号:号:清键盘缓冲区清键盘缓冲区, ,调用键盘输入功能调用键盘输入功能二、显示功能调用二、显示功能调用n2号功能调用:号功能调用: 将单字符送屏幕显示将单字符送屏幕显示 入口:字符入口:字符DLDLMOV DL, * *MOV AH, 2INT 21H ;在光标位置显示在光标位置显示

20、*n9号功能调用:号功能调用: 显示字符串显示字符串 入口:字符串首址入口:字符串首址DS:DXDS:DX $ $作结束符作结束符DATA SEGMENT CR EQU 0DH ;回车回车 LF EQU 0AH ;换行换行MES DB HOW DO YOU DO?,CR,LF,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN: MOV AX,DATAMOV DS,AXMOV DX,OFFSETOFFSET MESMOV AH,9INT 21HMOV AH,4CHINT 21HCODE ENDSEND MAIN例:在屏幕上显示:例:在屏幕上显示:

21、 HOW DO YOU DOHOW DO YOU DO?PUSH DSSUB AX, AXPUSH AX RET三、打印功能调用三、打印功能调用n5号功能调用:号功能调用:将将DL中字符中字符打印机打印机换页换页回车回车换行换行例:例:TEXT DB 0CH,Good morning!,0DH,0AH,$MOV BX,0MOV AH,5NEXT:MOV DL,TEXTBXCMP DL,$JE STOPINT 21HINC BXJMP NEXTSTOP: 四、设置日期与时间四、设置日期与时间n2BH功能调用:功能调用:设置日期设置日期 入口:入口:CX/DH/DL: CX/DH/DL: 年年/

22、/月月/ /日日 出口:出口:AL=0/0FFH:AL=0/0FFH:有效有效/ /无效无效n2AH功能调用:功能调用:取得日期取得日期 入口:无入口:无 出口:出口:CX/DH/DLCX/DH/DL:年:年/ /月月/ /日日n2DH功能调用:功能调用:设置时间设置时间入口:入口:CH/CL/DH/DL:CH/CL/DH/DL:时时/ /分分/ /秒秒/ /秒秒% %出口:出口:AL=0/0FFH:AL=0/0FFH:有效有效/ /无效无效n2CH功能调用:功能调用:取得时间取得时间入口:无入口:无出口:出口:CH/CL/DH/DL:CH/CL/DH/DL:时时/ /分分/ /秒秒/ /秒秒

23、% %n3号功能调用:号功能调用:异步通讯输入异步通讯输入 出口:出口:AL=AL=输入数据输入数据n4号功能调用:号功能调用:异步通讯输出异步通讯输出 入口:入口:DL=DL=输出数据输出数据COM1: 2400Bd/8COM1: 2400Bd/8位位/1/1位停止位位停止位 无校验无校验/ /无联络无联络五、异步通讯五、异步通讯BIOSBIOS中断调用中断调用 方法与方法与DOSDOS功能调用类似功能调用类似, ,自学。自学。4.5 程序设计方法程序设计方法n高质量程序的特点高质量程序的特点程序结构模块化程序结构模块化运行速度快运行速度快占内存空间少占内存空间少n程序的基本结构程序的基本结

24、构顺序结构顺序结构分支结构分支结构循环结构循环结构子程序结构子程序结构n 汇编语言源程序设计步骤汇编语言源程序设计步骤 分析问题:建模分析问题:建模, ,确定算法确定算法 绘制流程图:由粗到细绘制流程图:由粗到细 资源分配资源分配 编写程序编写程序 检查调试检查调试 运行分析运行分析一、顺序结构一、顺序结构DATA SEGMENT TAB DB 0,1,4,9,16,25,36,49,64,81 BUF DB Please input one number (09):,0DH,0AH,$DATA ENDSSTACK SEGMENT STACK STACK DB 50 DUP(?) ; 定义定义

25、50字节的堆栈区字节的堆栈区 TOP LABLE WORD ; 栈底别名为栈底别名为TOP, 类型为字类型为字STACK ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE, DS:DATA, SS:STACK例例1.1.查表程序查表程序 内存中内存中TABTAB开始存放开始存放0909的平方值,通过人机对话,查的平方值,通过人机对话,查给定数给定数X X的平方值,存入的平方值,存入ALAL中。中。START:MOV AX,DATA MOV DS,AX ;段初始化段初始化 MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP ;

26、栈指针栈指针 MOV BX,OFFSET TAB ;表头表头NEXT:MOV DX,OFFSET BUF MOV AH, 9 ;9号功能调用号功能调用 INT 21H ;提示输入一个数提示输入一个数 MOV AH,1 ;1号功能调用号功能调用 INT 21H ;扫描键盘扫描键盘,键值键值AL MOV AH,0 AND AL,0FH ;形成偏移量形成偏移量AXADD BX,AX ;查表查表MOV AL,BX ;存结果存结果RET MAIN ENDPCODE ENDS END STARTTAB00010409162536496481TAB+1+2+3+4+5+6+7+8+9二、分支结构二、分支结构

27、DATA SEGMENT BUF DB N DB 01H,38H,47H,60H,76H NUM DB 3 DUP(?);存结果存结果DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE, DS:DATASTART: PUSH DSSUB AX , AXPUSH AXMOV AX , DATAMOV DS , AX例例2.2.统计统计BUFBUF为首址的字符串中数字为首址的字符串中数字, ,字母及其它符号的个数。字母及其它符号的个数。数字数字: 09, ASCII:30H39H字母字母: AZ,ASCII:41H5AHMOV CH,N ;CH串个数串

28、个数MOV BX,1MOV DX,0 ;数字数字,字母个数字母个数LP:MOV AH,BUFBX ;取字符取字符CMP AH,30HJL NEXT ;9,转转INC DH ;数字个数数字个数+1JMP NEXTABC:CMP AH,41HJL NEXT ;Z,转转INC DL ;字母个数字母个数+1NEXT:INC BX ;地址地址+1DEC CH ;个数个数-1JNE LPMOV BUFBX,DHMOV BUFBX+1,DLMOV AH,NSUB AH,DHSUB AH,DLMOV BUFBX+2,AHRETMAIN ENDPCODE ENDSEND STARTMOV AH,1INT 21H

29、 ;1号功能调用,键值号功能调用,键值 ALCMP AL,0JE P0CMP AL,1JE P1 CMP AL,7JE P7 方法简单,但速度慢方法简单,但速度慢例例3. 3. 查询法实现多分支查询法实现多分支有有8 8个加工子程序,入口地址分别为:个加工子程序,入口地址分别为:P0,P1,P2,P0,P1,P2,P7P7。根据键盘输入命令根据键盘输入命令, ,依次转向依次转向8 8个子程序。个子程序。DATA SEGMENT BASE DW P0,P1,P2,P3,P4,P5,P6,P7DATA ENDS MOV AH,1INT 21H ; AL键值键值AND AL,0FHMOV BX,OF

30、FSET BASE ;BX表首址表首址MOV AH,0ADD AL,AL ;形成偏移量形成偏移量ADD BX,AX ;表地址表地址JMP WORD PTRBX ;转入口地址转入口地址 P0LP0HP1LP1HP2LP2HP3LP3HP7LP7HBASE+2+4+6+14偏移量偏移量例例4.4.跳转表实现多分支之一:根据表内地址分支跳转表实现多分支之一:根据表内地址分支 元素在表中的地址元素在表中的地址, ,即即: :表地址表首址偏移量表地址表首址偏移量DATA SEGMENTBASE DB E9,P0L,P0H,E9,P1L,P1H,DATA ENDSMOV AH,1INT 21H AND A

31、L,0FHMOV BL,ALADD AL,ALADD AL,BL ;偏移量偏移量=键值键值*3 MOV AH,0MOV BX,OFFSET BASE ;表首址表首址ADD BX,AX ;表地址表地址JMP BX ;跳入表内跳入表内,执行转移指令执行转移指令E9P0LP0HE9P1LP1HE9P2LP2HE9P7LP7HBASE+3+6+21 JMP P0JMP P1JMP P2JMP P7也可根据关键字跳转表实现分支也可根据关键字跳转表实现分支例例5.5.利用跳转表实现多分支之二:根据表内指令分支利用跳转表实现多分支之二:根据表内指令分支三、循环结构程序三、循环结构程序两种结构:两种结构:初始

32、化循环体修改参数控制条件出口 初始化循环体控制条件修改参数出口先执行,后判断先判断,后执行YYNN至少执行一次循环体至少执行一次循环体用于次数固定的程序用于次数固定的程序可能一次也不执行循环体可能一次也不执行循环体用于次数不固定的程序用于次数不固定的程序例例6. 十六进制数十六进制数ASCII将将BX中的中的16进制数转换为进制数转换为ASCII,存放到存放到BUF开始的单元中开始的单元中,并显示出来。并显示出来。 MOV SI,OFFSET BUF MOV CH,4NEXT:MOV CL,4 ROL BX,CL ;最高最高4位移右边位移右边 MOV AL,BL AND AL,0FH ADD

33、AL,30H CMP AL,3AH JL STORE ;09,转转 ADD AL,7 ;AF,+7 STORE:MOV SI,ALMOV AH,2MOV DL,ALINT 21HINC SIDEC CHJNZ NEXTHLT先循环先循环,后判断后判断 MOV CL,0 L1: AND AX,AX ; JZ STOP SAL AX,1 JNC L1 INC CL L2: JMP L1 STOP: HLT 例例7. AX7. AX寄存器中有一个寄存器中有一个1616位二进制数位二进制数, ,统计其中统计其中1 1的个数的个数, ,并存入并存入CLCL中。中。重置重置PSW先判断先判断,后循环后循环

34、例例8. 8. 逻辑尺控制循环逻辑尺控制循环 某采样系统某采样系统: :第第1,2,5,7,101,2,5,7,10次,按公式次,按公式FUN1=X+5FUN1=X+5计算计算 第第3,4,6,8,9 3,4,6,8,9 次,按公式次,按公式FUN2=X-3FUN2=X-3计算计算DATA SEGMENT LOGRUL EQU 0011010110000000B COUNT EQU 10 BUF DB 20 DUP(?) ;采样数据采样数据 BLOCK DB 20 DUP(?) ;存处理后的数据存处理后的数据DATA ENDS MOV DX,LOGRULMOV CX,COUNT MOV SI,

35、OFFSET BUF MOV DI,OFFSET BLOCKNEXT:MOV AX,WORD PTRSI ROL DX,1 JC FUN2 FUN1: ADD AX,5 JMP NEXT1 FUN2:SUB AX,3NEXT1:MOV DI,AX INC SI INC SI INC DI INC DI LOOP NEXT 编程思路编程思路:从第一个数开始从第一个数开始, ,顺序比较相邻两数顺序比较相邻两数, ,若顺序不对若顺序不对, ,则交换位置则交换位置, ,第一遍比较第一遍比较N-1N-1次次, ,最大数沉到数尾最大数沉到数尾; ;第二遍只需比第二遍只需比较较N-2N-2次次; ;共进行共

36、进行N-1N-1遍即可完成排序。(遍即可完成排序。(冒泡法冒泡法) 若设置交换标志若设置交换标志, ,可加快进程。(书中第二种方法)可加快进程。(书中第二种方法)STARTSTART:MOV DI,OFFSETOFFSET BUF MOV CX,DI DEC CX ;内循环次数内循环次数=N-1L1:MOV DX,CX ;DX=外循环次数外循环次数 MOV BH,0 ;交换标志交换标志L2:ADD DI,2 ;指向下一个字指向下一个字 MOV AX,DI CMP AX,DI+2 ;相邻两数比较相邻两数比较 JBE CONTI CONTI ;XiXi+1,不交换不交换 XCHG AX,DI+2

37、;XiXi+1,交换交换 MOV DI,AX MOV BH,1 ;交换标志置交换标志置1CONTICONTI:LOOP L2 CMP BH,0 JE STOPSTOP ;未发生交换未发生交换,结束结束 MOV CX,DX MOV DI,OFFSETOFFSET BUF LOOP L1 ;CX-1,DX-1STOPSTOP: RET 例例9. 9. 多重循环:给多重循环:给BUFBUF开始的字数组按从小到大的顺序排列。开始的字数组按从小到大的顺序排列。四、子程序结构四、子程序结构 子程序子程序(过程过程)调用应处理好三个问题:调用应处理好三个问题:n保护断点:保护断点:CS,IPCS,IP入栈及

38、出栈(入栈及出栈(CPUCPU自动完成)自动完成)n保护现场:保护现场:子程序中用到的寄存器子程序中用到的寄存器/ /存储单元需保护存储单元需保护n参数传递:参数传递: 寄存器传递寄存器传递: : 速度快速度快, ,参数少参数少 存储器传递存储器传递 堆栈传递堆栈传递可传递较多参数可传递较多参数例例10. 完整形式的子程序完整形式的子程序; ;名称:名称:BCD2BINBCD2BIN; ;功能:将一个字节功能:将一个字节BCDBCD码码; ; 转换成二进制数转换成二进制数; ;使用寄存器使用寄存器:CX:CX; ;入口参数:入口参数: ALAL存放两位存放两位BCDBCD码码; ;出口参数:出

39、口参数: ALAL存放二进制数存放二进制数; ;调用其它子程序:无调用其它子程序:无BCD2BIN PROC FARPUSH CXMOV CH,ALAND CH,0FHMOV CL,4SHR AL,CL MOV CL,10 MUL CL ADD AL,CH POP CX RETBCD2BIN ENDP通过寄存器传递参数通过寄存器传递参数DATA SEGMENTARY1 DW 100 DUP(?) ; 定义数组定义数组1 1SUM1 DW ? ; 和和ARY2 DW 100 DUP(?) ; 定义数组定义数组2 2SUM2 DW ? ; 和和DATA ENDS 例例11.11.数据段定义两个数组

40、数据段定义两个数组, ,分别求两数组元素之和分别求两数组元素之和( (不计溢出不计溢出) )。MAIN PROC FAR ;主程序主程序START: LEA SI,ARY1 MOV CX,LENGTH ARY1 CALL SUM LEA SI,ARY2 MOV CX,LENGTH ARY2 CALL SUM RET MAIN ENDPSUM PROC NEAR;求和子程序求和子程序 XOR AX,AX L1: ADD AX,WORD PTRSI INC SI INC SI LOOP L1 MOV WORD PTRSI,AX RETSUM ENDP 通过存储单元传递参数通过存储单元传递参数例例1

41、2. 12. 分别求两个十进制数组之和分别求两个十进制数组之和DATA SEGMENTDATA SEGMENTARY1 DB 20 DUP(?)ARY1 DB 20 DUP(?)SUM1 DW ?SUM1 DW ?ARY2 DB 100 DUP(?)ARY2 DB 100 DUP(?)SUM2 DW ?SUM2 DW ?DATA ENDSDATA ENDS MAIN PROC FAR ;MAIN PROC FAR ;主程序主程序START:START: MOV AX,OFFSET ARY1; MOV AX,OFFSET ARY1;数组数组1 1首址首址 PUSH AXPUSH AX MOV A

42、X,SIZE ARY1 ; MOV AX,SIZE ARY1 ;数组数组1 1个数个数 PUSH AXPUSH AX CALL FAR PTR PADD ; CALL FAR PTR PADD ;调子程序调子程序MOV AX,OFFSET ARY2MOV AX,OFFSET ARY2PUSH AXPUSH AXMOV AX,SIZE ARY2MOV AX,SIZE ARY2PUSH AXPUSH AXCALL FAR PTR PADDCALL FAR PTR PADDRETRET PCODE SEGMENT ; PCODE SEGMENT ;子程序子程序 ASSUMEASSUME CSCS:P

43、CODEPCODE,DSDS:DATA,DATA,与主程序不与主程序不在一个段在一个段堆栈传递参数堆栈传递参数PADD PROC FARPUSH BX ;保护现场保护现场PUSH CXPUSH BPMOV BP,SPPUSHFMOV CX,BP+10 ;数组长度数组长度MOV BX,BP+12 ;数组首址数组首址MOV AX,0NEXT:ADD AL,BXDAAMOV DL,ALMOV AL,0ADC AL,AH ; AL 0+CF+AHDAAMOV AH,AL ; AH 高位累加和高位累加和MOV AL,DLINC BXLOOP NEXTMOV BX,AXPOPFPOP BPPOP CXPOP BXRET 4;PADD ENDP弹出断点后弹出断点后,再弹出再弹出4个子节个子节,使使SIZE,ARY作废作废,恢复恢复SPPSWBPCXBXIPCSSIZEARY

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论