燕山大学微机原理第三章_第1页
燕山大学微机原理第三章_第2页
燕山大学微机原理第三章_第3页
燕山大学微机原理第三章_第4页
燕山大学微机原理第三章_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 汇编语言程序设计 汇编语言是一种以汇编语言是一种以处理器指令系统处理器指令系统为基础的为基础的低级程序设计语言。低级程序设计语言。 汇编语言的主要优点是汇编语言的主要优点是可以直接、有效地控制计算机可以直接、有效地控制计算机硬件硬件,容易创建代码序列容易创建代码序列短小短小、运行、运行快速快速的程序。的程序。第三章学习内容 汇编语言源程序格式汇编语言源程序格式 常量、变量常量、变量 汇编语言程序设计方法汇编语言程序设计方法 顺序程序设计顺序程序设计 分支程序设计分支程序设计 循环程序设计循环程序设计 子程序设计子程序设计汇编语言源程序格式 源程序可包含若干个源程序可包含若干个代码段代码

2、段/数据段数据段/附加段附加段/堆栈段堆栈段段与段之间的顺序可随意排列段与段之间的顺序可随意排列 独立运行的程序必须包含一个代码段独立运行的程序必须包含一个代码段并在代码段中指示程序执行的起始点并在代码段中指示程序执行的起始点一个程序只有一个起始点一个程序只有一个起始点 执行性语句必须位于某一个代码段内执行性语句必须位于某一个代码段内说明性语句可根据需要位于任一段内说明性语句可根据需要位于任一段内执行性语句格式 用于表达处理器指令用于表达处理器指令( (也称为硬指令也称为硬指令) )汇编后对应一条指令代码汇编后对应一条指令代码 标号:硬指令助记符标号:硬指令助记符 操作数,操作数操作数,操作数

3、 ;注释;注释 NEXTNEXT:MOV AXMOV AX,1234H 1234H ;初值为;初值为1234H1234H说明性语句格式 用于表达伪指令用于表达伪指令指示源程序如何汇编、变量怎样定义、过程怎指示源程序如何汇编、变量怎样定义、过程怎么设置等么设置等 名字名字 伪指令助记符伪指令助记符 参数,参数,参数,参数,;注释;注释 X1 DB 12HX1 DB 12H,34H34H,56H56H;标识符 标识符最多由标识符最多由3131个字母个字母、数字及规定的特殊符、数字及规定的特殊符号(如号(如_ _、$ $、? ?、 )组成,不能以数字开头。)组成,不能以数字开头。 默认情况下,不区别

4、标识符中的字母默认情况下,不区别标识符中的字母大小写大小写。 一个源程序中,每个标识符的一个源程序中,每个标识符的定义是唯一定义是唯一的,的,且不能是汇编系统所采用的保留字。且不能是汇编系统所采用的保留字。简化段定义格式 .MODEL SMALL .MODEL SMALL ;定义程序的存储模式定义程序的存储模式 .STACK .STACK ;定义堆栈段定义堆栈段 .DATA.DATA ;定义数据段定义数据段 ;数据定义数据定义 .CODE .CODE ;定义代码段定义代码段START: MOV AX, DATA START: MOV AX, DATA ;程序执行起始;程序执行起始 MOV DS

5、, AXMOV DS, AX ;给给DSDS赋值赋值 ;主程序主程序 MOV AH, 4C00HMOV AH, 4C00H INT 21H INT 21H ;程序执行结束程序执行结束 ;子程序子程序 END START END START ;汇编结束汇编结束简化段定义格式.MODEL SMALL .MODEL SMALL ;定义程序的存储模式;定义程序的存储模式.STACK.STACK ;定义堆栈段;定义堆栈段.DATA.DATA ;定义数据段;定义数据段 ;数据定义;数据定义.CODE.CODE ;定义代码段;定义代码段.STARTUP.STARTUP ;程序执行起始;程序执行起始 ;主程序

6、;主程序.EXIT.EXIT ;程序执行结束;程序执行结束 ;子程序;子程序 ENDEND ;汇编结束;汇编结束存储模式TINYTINY微型模式微型模式SMALLSMALL小型模式小型模式COMPACTCOMPACT紧凑模式紧凑模式MEDIUMMEDIUM中型模式中型模式LARGELARGE大型模式大型模式HUGEHUGE巨型模式巨型模式FLATFLAT平坦模式平坦模式微型和小型模式 TINYTINY微型模式微型模式只有一个小于只有一个小于64KB64KB的逻辑段的逻辑段 SMALLSMALL小型模式小型模式一个代码段、一个数据段,每个段不大于一个代码段、一个数据段,每个段不大于64KB64K

7、B定义堆栈段 .STACK .STACK 大小大小 段名:段名:STACKSTACK可用可用STACKSTACK预定义操作符表示。预定义操作符表示。 默认是默认是1KB1KB空间。空间。定义数据段 .DATA.DATA 段名:段名:_DATA_DATA可用可用DATADATA预定义操作符表示预定义操作符表示定义代码段 .CODE .CODE 段名段名 默认段名:默认段名:_TEXT_TEXT可用可用CODECODE预定义操作符表示预定义操作符表示执行开始 语句语句.STARTUP.STARTUP指明程序开始执行的位置,同时指明程序开始执行的位置,同时将数据段地址赋给将数据段地址赋给DSDS。

8、可用如下两条语句代替可用如下两条语句代替.STARTUP.STARTUP语句。语句。STARTSTART:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX 语句标号语句标号STARTSTART用于指明程序开始执行的位置。用于指明程序开始执行的位置。执行结束 语句语句.EXIT.EXIT终止应用程序执行终止应用程序执行。 语句语句.EXIT.EXIT利用利用4CH4CH号号DOSDOS系统功能调用实现。系统功能调用实现。MOV AHMOV AH,4CH4CHINT 21HINT 21H汇编结束 语句语句ENDEND表示汇编过程到此结束。表示汇编过程到此结束。源程序

9、的最后必须有一条源程序的最后必须有一条ENDEND语句语句。 汇编程序不处理汇编程序不处理ENDEND语句之后的任何内容语句之后的任何内容。 ENDEND伪指令后面可以有一个标号参数,伪指令后面可以有一个标号参数,指定程序开始执行的起点。指定程序开始执行的起点。END STARTEND START常量、变量 常量表示一个固定的数值。常量表示一个固定的数值。可用作硬指令的立即数操作数或伪指令的参数。有可用作硬指令的立即数操作数或伪指令的参数。有常数常数/字符串字符串/符号常量符号常量/数值表达式数值表达式等多种形式。等多种形式。 变量实质上是指内存单元的数据。变量实质上是指内存单元的数据。主要用

10、作存储器操作数。主要用作存储器操作数。常数 常数是指由各种进制形式表示的数值。常数是指由各种进制形式表示的数值。默认为十进制。默认为十进制。 MOV AXMOV AX,1234H1234HADD ALADD AL,-77-77CMP AHCMP AH,10010001B10010001B字符串 字符串是指:字符串是指:用单引号或双引号括起来的单个或多个字符,用单引号或双引号括起来的单个或多个字符,其数值是每个字符对应的其数值是每个字符对应的ASCIIASCII码。码。 例如:例如:d= 64Hd= 64H、AB= 4142HAB= 4142H MOV ALMOV AL, A A MOV ALM

11、OV AL, 41H 41H符号常量 符号常量是使用标识符表达一个固定的数值。符号常量是使用标识符表达一个固定的数值。 符号名符号名 EQU EQU 数值数值表达式表达式符号名符号名 EQU EQU 符号名符号名 数值数值表达式表达式 EQUEQU不能重复不能重复定义符号名,定义符号名,“”则允许。则允许。 符号常量可以提高程序的可读性。符号常量可以提高程序的可读性。符号常量示例 COUNT EQU 100COUNT EQU 100DOSCALL EQU DOSCALL EQU MOV CXMOV CX,COUNT COUNT ;MOV CXMOV CX,100100 MOV AHMOV AH

12、, 01H 01H DOSCALL DOSCALL ;INT 21HINT 21H数值表达式 数值表达式一般是指:数值表达式一般是指:由运算符连接的由运算符连接的各种各种常数常数所构成的表达式。所构成的表达式。 数值表达式可增强程序的可读性。数值表达式可增强程序的可读性。 运算符有:运算符有:算术算术操作符操作符/ /逻辑逻辑操作符操作符/ /移位移位操作符操作符/ /关系关系操作符。操作符。运算符(1) 算术运算符:算术运算符:+ +、* *、/ /、MODMOD 逻辑运算符:逻辑运算符:ANDAND、OROR、XORXOR、NOTNOT运算符(2) 移位运算符:移位运算符:SHLSHL、S

13、HRSHR其格式为:数值表达式其格式为:数值表达式 SHL/SHR SHL/SHR 移位次数移位次数 关系运算符:关系运算符:EQEQ、NENE、GTGT、LTLT、GEGE、LELE用用FFFFHFFFFH表示条件为真,表示条件为真,用用0000H0000H表示条件为假。表示条件为假。数值表达式示例ADD AXADD AX,100100* *4+2 4+2 ;ADD AXADD AX,402402OR ALOR AL,3 AND 47H 3 AND 47H ;OR ALOR AL,3 3 MOV AXMOV AX,1024 SHR 4 1024 SHR 4 ;MOV AXMOV AX,40H

14、40HMOV AXMOV AX,1234H GT 1024H 1234H GT 1024H ;MOV AXMOV AX,0FFFFH0FFFFH变量的定义 变量实质上是指内存单元的数据,变量实质上是指内存单元的数据,因而可以改变。因而可以改变。 变量需要事先定义才能使用。变量需要事先定义才能使用。 变量定义方法:变量定义方法:变量名变量名 伪指令伪指令 初值表初值表变量名 变量名变量名是是用户自定义用户自定义的标识符,的标识符,用来表示该变量所占用的内存单元的用来表示该变量所占用的内存单元的首地址首地址。 一个变量可以没有变量名一个变量可以没有变量名。 这种情况汇编程序将直接为初值表分配空间。

15、这种情况汇编程序将直接为初值表分配空间。设置变量名是为了方便存取它指示的存储单元。设置变量名是为了方便存取它指示的存储单元。变量定义伪指令 变量定义伪指令为变量分配或变量定义伪指令为变量分配或预留内存单元预留内存单元。DB DB :定义:定义 字节字节 伪指令伪指令DW DW :定义:定义 字字 伪指令伪指令DD DD :定义:定义 双字双字 伪指令伪指令DF DF :定义:定义 3 3 字字 伪指令伪指令DQ DQ :定义:定义 4 4 字字 伪指令伪指令DT DT :定义:定义 1010字节伪指令字节伪指令初值表 初值表是用逗号分隔的参数,初值表是用逗号分隔的参数,是用户为所申请的内存单元

16、赋的初值。是用户为所申请的内存单元赋的初值。 初值表主要由常量或?等组成。初值表主要由常量或?等组成。其中?表示初值不确定,即未赋初值。其中?表示初值不确定,即未赋初值。若多个存储单元初值相同,可用若多个存储单元初值相同,可用DUPDUP进行定义。进行定义。复制操作符DUP重复次数重复次数 DUP (DUP (重复参数重复参数) )X1 DB 3 DUP (12H)X1 DB 3 DUP (12H)X1 DB 12HX1 DB 12H,12H12H,12H12HY1 DB 34H,56,01100001B,ABY1 DB 34H,56,01100001B,AB变量的定位 ORG ORG 参数参

17、数 ;偏移地址为该参数值;偏移地址为该参数值 EVENEVEN ;从偶地址开始;从偶地址开始 ALIGN nALIGN n ;从;从n n的整数倍地址开始的整数倍地址开始 $ $ ;表示当前偏移地址值;表示当前偏移地址值变量名和语句标号的属性逻辑地址逻辑地址属性:属性:变量名和标号对应的存储单元的变量名和标号对应的存储单元的逻辑地址逻辑地址,含有段地址和偏移地址。含有段地址和偏移地址。类型类型属性:属性:变量名的类型可以是变量名的类型可以是BYTE/WORD/DWORDBYTE/WORD/DWORD标号标号( (段名段名/ /子程序名子程序名) )的类型可以是的类型可以是NEAR/FARNEA

18、R/FARSTAR: MOV AX, 1234HSTAR: MOV AX, 1234HSTAR DB 32H,76,10111011B,ASSTAR DB 32H,76,10111011B,AS地址操作符 OFFSET OFFSET 变量名变量名/ /标号标号返回变量名或标号的返回变量名或标号的偏移地址偏移地址 SEG SEG 变量名变量名/ /标号标号返回变量名或标号的返回变量名或标号的段地址段地址类型操作符1 类型名类型名 PTR PTR 变量名变量名/ /标号标号将变量名将变量名/ /标号按指定类型使用标号按指定类型使用类型操作符PTR用法示例 VARW DW 1234HVARW DW

19、1234HMOV AXMOV AX,WORD PTR VARW WORD PTR VARW ;AX=1234HAX=1234HMOV BLMOV BL,BYTE PTR VARW BYTE PTR VARW ;BL=34HBL=34HMOV BHMOV BH,BYTE PTR VARW+1BYTE PTR VARW+1;BH=12HBH=12H MOV WORD PTR BXMOV WORD PTR BX,1 1 ;字传送;字传送MOV BYTE PTR BXMOV BYTE PTR BX,1 1 ;字节传送;字节传送 THIS 类型名类型名创建位于当前地址但为指定类型的操作数创建位于当前地址

20、但为指定类型的操作数类型名可为类型名可为BYTE/WORD/DWORD,或者,或者NEAR/FAR类型操作符THIS用法示例 MYBYTE EQU THIS BYTEMYBYTE EQU THIS BYTEMYWORD DW 1234HMYWORD DW 1234HMOV AXMOV AX, MYWORD MYWORD ;AX=1234HAX=1234HMOV BLMOV BL, MYBYTE MYBYTE ;BL=34HBL=34H MYWORD DW 1234HMYWORD DW 1234HMYBYTE1 EQU BYTE PTR MYWORDMYBYTE1 EQU BYTE PTR MY

21、WORDMYBYTE2 EQU BYTE PTR MYWORD+1MYBYTE2 EQU BYTE PTR MYWORD+1类型操作符2 TYPE TYPE 变量名变量名/ /标号;标号;返回一个数值返回一个数值,表明名字,表明名字/ /标号的类型。标号的类型。字节字节/ /字字/ /双字变量返回双字变量返回1/2/41/2/4。短短/ /近近/ /远标号为返回远标号为返回FF01H/FF02H/FF05HFF01H/FF02H/FF05H。 LENGTHOF LENGTHOF 变量名;返回整个变量的数据项数。变量名;返回整个变量的数据项数。 SIZEOF SIZEOF 变量名;返回整个变量占

22、用的字节数。变量名;返回整个变量占用的字节数。TYPE/LENGTHOF/SIZEOF用法示例 VARW DW 1234HVARW DW 1234H,5678H5678HVARD DD 12345678HVARD DD 12345678HBUFF DB HELLOBUFF DB HELLO MOV AXMOV AX,TYPE VARW TYPE VARW ;AX=2AX=2MOV BXMOV BX,LENGTHOF VARDLENGTHOF VARD;BX=1BX=1MOV CXMOV CX,SIZEOF BUFF SIZEOF BUFF ;CX=5CX=5变量和常量应用举例 例3.2 .MO

23、DEL SMALL.STACK.DATA bvar1 db 100, 01100100b, 64h, d minit =5 bvar2 db -1, minit, minit+5 db ?, 2 dup(20h) wvar1 dw 2010h, 4*4 wvar2 dw ? dvar dd 12347777h, 87651111h, ? abc db a, b, c, ?maxint equ 0ah string db ABCDEFGHIJ crifs db 13, 10, $ array1 dw maxint dup(0) array db 2 dup(2,3,2 dup(4).CODEst

24、art: mov ax, data mov ds, ax mov dl, bvar1 dec bvar2+1 mov abc3, dl mov ax, word ptr dvar0 mov dx, word ptr dvar2 add ax, word ptr dvar4 adc dx, word ptr dvar6 mov word ptr dvar8, ax mov word ptr dvar10, dx mov cx, maxint mov bx, 0again: add stringbx, 3 inc bx loop again lea dx, abc mov ah, 09h int

25、21h mov ax, 4C00h int 21h end start属性及应用举例属性及应用举例 例3.3 .MODEL SMALL.STACK.DATA v_byte equ this byte v_word dw 3332h, 3735h target dw 5 dup(20h) crlf db 0dh, 0ah, $ flag db 0 n_point dw offset s_label .CODEstart: mov ax, data mov ds, ax mov al, byte ptr v_word dec al mov v_byte, al n_label: cmp flag,

26、 1 jz s_label inc flag jmp short n_label s_label: cmp flag, 2jz nextinc flagjmp n_point next: mov ax, type v-word mov cx, lengthof target mov si, offset target w_again: mov si, ax inc si inc siloop w_againmov cx, sizeof targetmov al, ?mov di, offset target b_again: mov di, alinc diloop b_againmov dx

27、, offset v_wordmov ah, 9int 21h mov ax, 4C00h int 21h end start程序设计顺序程序设计Hello! .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA MESSAGE DB HELLO MESSAGE DB HELLO!,0DH0DH,0AH0AH,$.CODE.CODE.STARTUP.STARTUP MOV AH MOV AH,09H09H MOV DX MOV DX,OFFSET MESSAGEOFFSET MESSAGE INT 21H INT 21H.EXIT.EXIT END E

28、ND例例3.4 采用查表法,实现一位采用查表法,实现一位16进进制数转换为制数转换为ASCII 码显示码显示.model small.stack.data ASCII db 30h,31h,32h,33h,34h,35h,36h,37h db 38h,39h,41h,42h,43h,44h,45h,46h hex db 04h, 0bh .code start: mov ax, data mov ds, ax mov bx, offset ASCIImov al, hexand al, 0fhxlatmov dl, almov ah, 2int 21hmov al, hex+1 and al,

29、 0fh xlatmov dl, al mov ah, 2int 21h mov ax, 4C00h int 21h end start分支程序设计分支程序设计 分支程序的基本特征是其中含有分支程序的基本特征是其中含有条件转条件转移指令或无条件转移移指令或无条件转移指令。指令。分支程序举例 比较无符号数的大小比较无符号数的大小 A1、B1无符号数比较大小1.MODEL SMALL.MODEL SMALL.STACK.STACK.DATA.DATA A1 DW 9676H A1 DW 9676H B1 DW 6769H B1 DW 6769H E1 E1 DB AB, $DB AB, $ E2

30、E2 DB AB, $DB AB, $ E3 E3 DB A=B, $DB A=B, $无符号数比较大小2.CODE.CODE.STARTUP.STARTUP MOV AX,A1 L1: MOV DX,OFFSET E3 MOV AX,A1 L1: MOV DX,OFFSET E3 CMP AX,B1 JMP L3 CMP AX,B1 JMP L3 JB L2 L2: MOV DX,OFFSET E2 JB L2 L2: MOV DX,OFFSET E2 JZ L1 L3: MOV AH,9 JZ L1 L3: MOV AH,9 MOV DX,OFFSET E1 INT 21H MOV DX,

31、OFFSET E1 INT 21H JMP L3 JMP L3 .EXIT.EXIT ENDEND循环程序设计循环次数的控制 计数计数控制法:用于循环次数已知的情况。又可分控制法:用于循环次数已知的情况。又可分为正计数法和倒计数法。为正计数法和倒计数法。 条件条件控制法:用于循环次数未知的情况,或者虽控制法:用于循环次数未知的情况,或者虽然次数已知,但有可能提前结束循环的情况。然次数已知,但有可能提前结束循环的情况。计数控制循环循环初始化循环初始化循环修改部分循环修改部分循环体循环体计数控制条件计数控制条件Y YN N 例:无符号字数组的最大最小值,要求把无符号字数组的最大最小值,要求把最大值

32、放入字变量最大值放入字变量A1A1,最小值放入,最小值放入B1.B1. 无符号字数组的最大最小值1 .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA W1 DW W1 DW 533,0A6H,77,A,20,-1533,0A6H,77,A,20,-1 A1 DW ? A1 DW ? B1 DW ? B1 DW ?无符号字数组的最大最小值2 .CODE .CODE .STARTUP .STARTUP MOV CX,5 JAE L3 MOV CX,5 JAE L3 LEA BX,W1 MOV DX,BX+2 LEA BX,W1 MOV DX,BX+2

33、MOV AX,BX L3: ADD BX,2 MOV AX,BX L3: ADD BX,2 MOV DX,BX; MOV DX,BX;小小 LOOP L1LOOP L1L1: CMP AX,BX+2 MOV A1,AX L1: CMP AX,BX+2 MOV A1,AX JBE L2 MOV B1,DX JBE L2 MOV B1,DX MOV AX,BX+2 .EXIT MOV AX,BX+2 .EXITL2: CMP DX,BX+2 L2: CMP DX,BX+2 ENDEND条件控制循环之先循环后判断循环初始化循环初始化循环修改部分循环修改部分循环体循环体循环条件满足循环条件满足Y YN

34、 N条件控制循环之先判断后循环循环初始化循环初始化循环修改部分循环修改部分循环体循环体循环条件满足循环条件满足Y YN N剔除以$结尾的结尾的字符串中的空格字符1 .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA S1 DB Let us have a try !$ S1 DB Let us have a try !$.CODE.CODE.STARTUP.STARTUP MOV DX, OFFSET S1 MOV DX, OFFSET S1 MOV DI, OFFSET S1 MOV DI, OFFSET S1剔除以$结尾的结尾的字符串中的空格字符

35、2L1: MOV AL,DI MOV BH,SI L1: MOV AL,DI MOV BH,SI CMP AL,$ CMP BH,$ CMP AL,$ CMP BH,$ JZ L4 JNZ L2 JZ L4 JNZ L2 CMP AL,20H JMP L1 CMP AL,20H JMP L1 JNZ L3 L3: INC DI JNZ L3 L3: INC DI MOV SI,DI JMP L1 MOV SI,DI JMP L1 L2: INC SI L4: MOV AH,09L2: INC SI L4: MOV AH,09 MOV AH,SI INT 21H MOV AH,SI INT 21

36、H MOV SI-1,AH .EXIT MOV SI-1,AH .EXIT END END例例:统计:统计AX寄存器中寄存器中1的个数,并将结果存放在的个数,并将结果存放在CL寄寄存器中。存器中。(3.11) MOV CL,0 L: AND AX,AX JZ EXIT SAL AX,1 ;将;将AX中的最高位移入中的最高位移入CF中中 JNC L ;如果;如果CF=0,转,转L INC CL ;如果;如果CF=1,则(,则(CL)+1CL JMP L ;转;转L处继续循环处继续循环 EXIT:子程序设计 子程序,是指能完成一定功能的指令序列。子程序,是指能完成一定功能的指令序列。调用子程序使用

37、调用子程序使用CALLCALL指令,指令,从子程序返回使用从子程序返回使用RETRET指令。指令。 子程序的基本特征是其中一定含有子程序的基本特征是其中一定含有RETRET指令。指令。保护断点 执行执行CALLCALL指令时指令时IP(IP(或或CS:IP)CS:IP)的值是的值是CALLCALL指令指令后面一条指令的地址,此即断点。后面一条指令的地址,此即断点。 在转入子程序前应将断点在转入子程序前应将断点( (地址地址) )保存到堆栈。保存到堆栈。这是由这是由CALLCALL指令自动完成的。指令自动完成的。 当子程序执行完成后,断点当子程序执行完成后,断点( (地址地址) )应从堆栈中应从

38、堆栈中弹出恢复到弹出恢复到IP(IP(或或CS:IP)CS:IP)中,以便能从子程序中,以便能从子程序返回到主程序。这是由返回到主程序。这是由RETRET指令自动完成的。指令自动完成的。保存现场 所谓现场,主要是指在调用子程序之前的有关所谓现场,主要是指在调用子程序之前的有关寄存器的内容。寄存器的内容。 若子程序使用的某个寄存器的内容对主程序而若子程序使用的某个寄存器的内容对主程序而言是不能被破坏的,则必须在子程序的入口处言是不能被破坏的,则必须在子程序的入口处将该寄存器的内容保存到堆栈将该寄存器的内容保存到堆栈( (或其他地方或其他地方) ),并在子程序的出口处从堆栈并在子程序的出口处从堆栈

39、( (或其他地方或其他地方) )恢复恢复相应的内容到原来的寄存器中。相应的内容到原来的寄存器中。主程序和子程序的参数传递 主程序在调用子程序时,通常要传递一些原始主程序在调用子程序时,通常要传递一些原始数据给子程序,这些数据称为子程序的入口参数据给子程序,这些数据称为子程序的入口参数;数; 子程序在返回主程序时,也常要传递一些处理子程序在返回主程序时,也常要传递一些处理结果给主程序,这些数据称为子程序的出口参结果给主程序,这些数据称为子程序的出口参数。数。参数传递方法 参数传递有三种方法:参数传递有三种方法:通过寄存器传递通过寄存器传递通过存储单元传递通过存储单元传递通过堆栈传递通过堆栈传递子

40、程序的嵌套与递归 在子程序中又调用其他的子程序,称为子程在子程序中又调用其他的子程序,称为子程序的嵌套调用。序的嵌套调用。 在子程序中调用其自身,称为子程序的递归在子程序中调用其自身,称为子程序的递归调用。调用。堆栈在子程序中的作用 堆栈在子程序的使用中有重要的作用:堆栈在子程序的使用中有重要的作用:主程序中可能使用堆栈传递入口参数主程序中可能使用堆栈传递入口参数主程序执行主程序执行CALLCALL指令时使用堆栈保存断点指令时使用堆栈保存断点子程序在入口处使用堆栈保护现场子程序在入口处使用堆栈保护现场子程序中可能进行堆栈操作子程序中可能进行堆栈操作子程序在出口处从堆栈中恢复现场子程序在出口处从

41、堆栈中恢复现场子程序执行子程序执行RETRET指令将堆栈中的断点恢复指令将堆栈中的断点恢复调用完成后主程序从堆栈中弹出出口参数调用完成后主程序从堆栈中弹出出口参数保持堆栈的平衡 子程序中必须保持堆栈的平衡。子程序中必须保持堆栈的平衡。 通常通常PUSHPUSH和和POPPOP指令应成对使用。指令应成对使用。用子程序完成累加求和A1 .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA W1 DW 100 DUP (10)W1 DW 100 DUP (10) W3 DW ? W3 DW ?.CODE.CODE.STARTUP.STARTUP LEA BX

42、,W1 LEA BX,W1 MOV CX,LENGTHOF W1 MOV CX,LENGTHOF W1 CALL P1 CALL P1 MOV W3,AX MOV W3,AX.EXIT.EXIT用子程序完成累加求和A2 P1 PROC NEAR P1 PROC NEAR PUSH BX PUSH BX PUSH CX PUSH CX MOV AX,0 MOV AX,0L1: ADD AX,BXL1: ADD AX,BX ADD BX,2 ADD BX,2 LOOP L1 LOOP L1 POP CX POP CX POP BX POP BX RET RETP1 ENDPP1 ENDP ENDE

43、NDread2:cmp al,0 jb read3 cmp al,9 ja read3 sub al,30h ; BX BX乘10sh1 bx,1 mov dx,bxshl bx,lshl bx,l add bx ,dx mov ah, 0 add bx ,ax jmp read1read2:cmp al,0 jb read3 cmp al,9 ja read3 sub al,30h ; BX BX乘乘10shl bx,1 mov dx,bxshl bx,lshl bx,l add bx ,dx mov ah, 0 add bx ,ax jmp read1例3.17 从键盘输入有从键盘输入有符

44、号符号10进制数的子进制数的子程序。程序。;数据段count =10array dw count dup(0);代码段mov cx,count mov bx,offset arrayagain:call readmov bx, axinc bxinc bxcall dpcrlfloop againmov ax,4c00hint 21hreadproc push bx;绝对值;绝对值push cx;符号;符号push dx;中间;中间xor bx,bxxor cx,cxmov ah,1int 21hcmp al,+jz readlcmp al,-jnz read2mov cx,-1read1:m

45、ov ah,1int 21hread3:cmp cx, 0 jz read4 neg bxread4:mov ax, bxpop dxpop cxpop bxretread endpdpcrlf proc push axpush dxmov ah,2mov d1,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlf endpcode endsend start read3:cmp cx, 0 jz read4 neg bxread4:mov ax, bxpop dxpop cxpop bxretread endpdpcrlf proc push axpush dxmov ah,2mov d1,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlf endpend start 例例3.18显示器输出有符号显示器输出有符号10进制数的子程序进制数的子程序。. Model small.stack.data count=10arraydw 1234, -1234, 0,1,-1 dw 32767,-32768, 5678 dw -5678,9000wtempdw ?mov ah, 2int 21hjmp write5write1

温馨提示

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

评论

0/150

提交评论