微型计算机原理与应用:第四章 汇编语言程序设计方法_第1页
微型计算机原理与应用:第四章 汇编语言程序设计方法_第2页
微型计算机原理与应用:第四章 汇编语言程序设计方法_第3页
微型计算机原理与应用:第四章 汇编语言程序设计方法_第4页
微型计算机原理与应用:第四章 汇编语言程序设计方法_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章汇编语言程序设计方法本章学习目标熟练掌握汇编语言常用的语法知识和编程技巧;熟练使用DOS和BIOS提供的中断调用,解决 实际的问题;提示:在学习中可以参考C语言的功能用法,看看汇编中有什么一样和不一样的地方。内容分布4.1 汇编语言基本概念4.2 8086/8088 指令系统4.3汇编语言程序设计的基本方法4.4汇编语言程序的编辑、 汇编与连接4.1汇编语言基本概念4.1.1 汇编语言与机器语言4.1.2 汇编语言中语句的组成4.1.3 汇编语言中的常数与表达式4.1.4 变量定义4.1.1汇编语言与机器语言汇编语言与高级语言的区别:汇编语言中的语句与机器的种类和型号密切相关;使用汇编语

2、言需要对处理器的结构有更加深入的了解;机器语言:它的每条语句是计算机可以直接执行的一条指令, 这些指令以二进制码的形式表示。汇编语言:采用一组字母、数字或符号来代替一条二进制码表示的指令。汇编语言的特点:依赖具体机器:不同的计算机系统有各自的汇编语言;助记符语言:要记住指令符号的意义,熟悉语法规则;指令具体化:操作的每一个步骤要干什么及怎么干都要一一详细用指令说明;细致全面:对计算机硬件必须全面了解(如CPU,内存组织,I/O组织等);汇编语言指令组成(以8086宏汇编为例):指令:用以指示计算机完成的具体操作,具有可操作性,将被汇编成机器指令;伪指令:用以指示系统如何进行汇编,不形成机器指令

3、;宏指令:将若干指令组织在一起构成的一种新指令。 返回本节首页4.1.2汇编语言中语句的组成名称或标号 空格或: 操作助记符 空格 操作数;注释 例如: CYCLE: ADD AX, 02; (AX)(AX)+2 DATA1 DB 20H, 30H, 40H, 50H 1. 名称或标号 名称不是所有语句都必需的,但若语句带有名称,通常都表示该名称后面的部分存储在内存中的第一个存储单元的地址。 名称的命名规则:可由字母(a、b、c、z),数字(0、9)以及特殊符号(?、-、$)组成。2. 操作助记符(或称助记符) 操作助记符是汇编语言中规定了明确含义的一组符号,所以不能随意使用; 例如:ADDA

4、X,53. 操作数 操作数不是每条语句所必须的;当语句中具有2个以上的操作数时,操作数之间应用逗号“,”分隔,而操作数与操作助记符之间必须以空格分隔。4. 注释 汇编语言的注释是单行注释,注释必须以分号“;”开头,它不是程序的可执行部分,汇编时不形成任何目标码。返回本节首页返回本节首页 5、标号属性: 标号是由标识符表示的指令名称,用以指示对应指令的位置(地址)。它有三个属性:段地址、偏移地址和类型; 标号的类型属性有两种,即NEAR和FAR; 标号的基本定义方法是在指令的操作助记符前加上标识符和冒号,该标识符就是我们所要定义的标号。 例如: START: PUSH DS 4.1.3汇编语言中

5、的常数与表达式1. 常数-数值和字符 数值常数 B: 表示二进制数。 例如, 10110011B。 D: 表示十进制数。 例如, 179D或 179。 O: 表示八进制数。 例如, 263O。 H: 表示十六进制数。 例如, B3H。 当一个数值数据后面没有后缀时,将默认为十进制数。 汇编语言中的数值常数的第一位必须是数字,否则汇编时将被看成是标识符。例如十六进制数FFH应表示成 0FFH。 字符常量:A 41H 65 01000001B 字符串常数: 是由单引号“”括起来的一串字符。 THIS IS A SUBROUTINE 179 此处的179并不代表十进制179,而是字符1、7、9的AS

6、CII码,即31H,37H和39H。提示:这里的数据类型和C语言中有什么不同?2. 表达式(非重点) 表达式由操作数和操作符组成,操作数可以是常数或标识符,也可以是子表达式。算术操作符: +, -, *, /, MOD; 算术运算都是双操作数,操作数必须为数字操作数,例如:59 其中MOD运算的两个操作数必须都为正整数,该运算是取两数相除的余数,例如:79 MOD 16150B5H MOD 10H05H逻辑操作符:AND、OR、NOT、XOR; 逻辑运算的两个操作数的值也应为数字,两数进行逻辑运算的时候按位进行。 逻辑操作符同时又是逻辑运算指令的操作助记符,只有当它们出现在指令的操作数部分时,

7、才是操作符。 AND AL, 0CH OR 0FH关系操作符:EQ、EN、LT、 GT、 LE、 GE; 关系运算的操作数也必须是数字。当关系成立时,其结果为全1;否则,其结果为全0。提示: 汇编语言中的表达式不能构成单独语句,只能是语句的一个部分,例如: MOV AX, BUF+2 ADD AL, VAL AND 0FH JMP AGAIN+3 MOV BL, VB LE VA 语句中表达式的求值不是在执行指令时完成的,而是在对源程序进行汇编连接时完成的;返回本节首页4.1.4变量定义1、数值变量定义 汇编语言的变量定义是通过伪指令定义的,其格式如下: 变量名 DB 表达式; 定义字节变量

8、变量名 DW 表达式; 定义字变量 变量名 DD 表达式; 定义双字变量 变量名 DQ 表达式; 定义长字变量 变量名 DT 表达式; 定义一个十字节变量 DATA1 DB 20H DATA2 DW 0204H, 1000H; DATA3 DB (-1*3),(15/3); DATA4 DD 12345H; DATA5 DB 0123; DATA6 DW AB,C,D; DATA7 DB ?; DATA8 DD ?; DATA9 DB 5 DUP(00); DATA10 DW 3 DUP(?)提示:对比C语言中的变量、方式数组的定义2、地址变量定义 地址表达式(只适用DW和DD两个伪指令) 如

9、果该地址表达式为一变量(或标号)名,用DW伪指令则是取它的偏移地址来初始化变量,用DD伪指令则是取它的段首址和偏移地址来初始化变量。 例如: A1 DB 12H B2 DW 5DUP(0) BUF1DWA 1 BUF2DDB 23、 变量的属性 (1) 段地址(SEG): 变量所在段的段地址; (2) 偏移地址(OFFSET): 变量所在段内的偏移地址; (3) 类型(TYPE): 变量所占据的字节数; (4) 长度(LENGTH):一个变量名所定义的变量个数。在含有DUP操作符的变量定义中,变量名所定义的变量个数为定义格式中的重复次数。在其它各种变量定义中,每个变量名所定义的变量个数均为 1

10、。 (5) 大小(SIZE): 分配给同一变量名的所有变量的总的字节数;变量的部分属性值DATA101000000111DATA201000001212DATA301000005111DATA401000007414DATA50100000B111DATA60100000F212DATA100100001F236变量名段地址偏移地址类型长度大小返回本节首页4. 获取属性的操作符提示:哪些C语言中有,哪些没有?例如我们可以有: MOV AX,SIZE DATA9 MOV AX,SEG DATA1 MOV BL, TYPE DATA9我们还可以有如下的变量定义: DAT1 DB 02H DAT2

11、DW 0F00H DAT3 DW 5 DUP(?) DAT4 DB LENGTH DAT3 DAT5 DW DAT3 5. PTR操作符 格式: 类型 PTR 表达式 格式中的类型可以是:BYTE、WORD、DWORD、 NEAR和FAR。 PTR操作符的功能是用来重新定义已定义的变量或标 号的类型。 MOV BYTE PTR DAT3, AL 变量DAT3 仅在该语句中作为字节变量使用,DAT3 原来定义的字变量类型并没有修改。提示:此操作相当于C语言中的什么运算?返回本节首页4.2 8086/8088 指令系统8086/8088 CPU指令系统可分成下面几类: (1) 数据传送指令; (2

12、) 算术运算指令; (3) 逻辑运算指令; (4) 移位指令; (5) 标志处理指令和CPU控制指令; (6) 转移和循环控制指令; (7) 调用和返回指令; (8) 字符串操作指令; (9) 输入、 输出指令。 提示:记住哪一类指令用于哪些编程应用,可以对照C语言。各就各位数值运算序列调整中断设置分支循环子程序数组移动针对接口缩写与符号缩写与符号意义OPR操作数SRC源操作数DST目的操作数REG寄存器RSRC源寄存器RDST目的寄存器CNT计数DISP位移量D88位位移量D1616位位移量ADDR地址缩写与符号意义EA有效地址SEG段DATA立即数互相交换替代(X)X的内容逻辑与逻辑或异或

13、XX的反码4.2.1数据传送类指令 1. 通用传送指令(MOV) 该类指令的功能是在CPU中的寄存器之间,或者寄存器与存储单元之间传送数据。 MOV DST,SRC立即数存储器寄存器AXBXCXDXSIDISPBPAXBXCXDXSIDISPBP段寄存器DSESSSCS 提示:指令操作数的多种书写形式 立即寻址 MOV AX, 1234H MOV AX, OFFSET 变量 MOV AX, TYPE 变量 寄存器间接寻址 寄存器相对寻址和寄存器基址变址相对寻址方式中的位移量DISP可以是常量,也可以是变量,并且可以有多种书写格式: MOV AX, DISPBX MOV AX, BX+DISP

14、MOV AX, BX.DISP MOV AX, BX+DISPMOV AX,12H MOV AH,12H MOV DI,ES:3SI MOV BP,3BX+SIMOV BUFA,DL MOV BP,AX MOV DS:BP,DLMOV BUF,DS MOV AX,BXMOV DATA1,BL MOV DATA2,BX MOV AX,WORD PTR VALUE;VALUE为字节变量MOV BX,DX MOV DS,AX提示:注意段地址的默认和类型匹配。提示:找出下列指令错误原因MOV BX,SI MOV 3000H,2000HMOV 34H,ALMOV CS,AXMOV AL,2000HMOV

15、 DS,1234H MOV BX,2000H MOV BXSI,23H MOV AH,3064H MOV BX,AHMOV AX,DATA1 ;DATA1为字节变量MOV AX, CX MOV AX, BXBP MOV AX, SI+DI MOV DS,ESMOV DATA3SI, 02MOV 4DI, 02 DATA1 DW 05H, 15H, 20H DATA2 DB 0FH, 10H, 0AH DATA3 DB 5 DUP(?) MOV AX, BL MOV AL, DATA1 MOV BX, DATA3SI MOV AL, BYTE PTR DATA1 2. 取有效地址指令(LEA)

16、LEA DST,SRC 指令的功能是将源操作数SRC的有效地址(偏移地址)送入寄存器REG中。这里的REG不允许是段寄存器,源操作数的寻址方式不允许是立即数和寄存器方式。 LEA DI, DATA1 LEA BX, AGAIN MOV AX, OFFSET DATA1 LEA AX, DATA1提示:相当于C语言中的什么运算?3. 取地址指针指令(LDS, LES) LDS DST,SRC LES DST,SRC 该指令的功能是将源操作数SRC的有效地址所对应的内存单元中的 32 位内容分别送入DS(或ES)和指令中所指出的寄存器REG中。同样,这里的REG不允许为段寄存器,源操作数的寻址方式

17、不允许是立即数和寄存器方式。例1. LDS DI,2130H 设(DS)=3000H 32130H DI DS 偏移量 段基址 TABLE DB 10H, 20H, 30H, 40H, 50H POINT1 DD 02001000H POINT2 DD TABLE LDS DI, POINT1 LES SI, POINT2MOV BX, TABLE MOV BX, OFFSET TABLELEA BX, TABLE LDS BX, TABLE LES BX, TABLEBX=?40H00H00H30HTABLEDS:1000H4. 堆栈操作指令 1) 堆栈 当信息存入堆栈时,堆栈指针将自动减量

18、并将信息存入堆栈指针所指出的存储单元,当需要从堆栈中取出信息时,也将从堆栈指针所指出的存储单元中读取信息,并自动将堆栈指针增量。所以,堆栈指针始终指向堆栈中最后存入信息的那个单元,我们称该单元为堆栈顶。在信息的存与取的过程中,栈顶是不断移动的,也称它为堆栈区的动端,而堆栈区的另端则是固定不变的,这端我们又称其为栈底。堆栈示意图08070605040302010000H00F8H00F9H00FAH00FBH00FCH00FDH00FEH00FFH0100H堆栈区SP栈底 2) 堆栈操作指令(1)压入指令 PUSH OPR ; (SP)(SP)2, PUSHF; (SP)1,(SP)(SRC)/

19、(FLAG) MOV AX,8000H MOV SS,AX MOV SP,2000H MOV DX,3E4AH PUSH DX PUSH AX MOV AX, 0FFFFH PUSH AX(2) 弹出指令 POP OPR; (DST)/(FLAG)(SP)+1,(SP) POPF; SPSP+2 MOV SP, 0100H PUSH AX PUSH BX POP AX POP BX返回本节首页4.2.2算术运算类指令1. 加法与减法指令 ADD DST, SRC (DST)(SRC)+(DST) ADC DST, SRC (DST)(SRC)+(DST)+CF SUB DST, SRC (DS

20、T)(DST)-(SRC) SBB DST, SRC (DST)(DST)-(SRC)-CF NEG DST(DST)0-(DST)加、减运算操作数之间的关系 ADD AL, BL ADD CX, 08H ADD AX, SI ADD AX, BXDI SUB AL, CL SUB BX, DX ADC AX, 0 SBB CX, DATA1 带进位的加、减法指令主要用于多位数的加、减运算。例如在内存中偏移地址为ADR1 开始的连续单元中存放着两个 4 字节操作数A和B, 求该两数之和 C, 并将结果存放于偏移地址为ADR2 开始的连续单元中,如图所示。 假设操作数由变量定义的方式存入内存,并

21、且其段地址已送入DS,偏移地址ADR1 已送入寄存器DI。 2. 比较指令 CMP DST, SRC 比较指令执行后的结果仅仅体现在标志寄存器中, 它是为后面的具有判别功能的指令提供条件的。3. 增量和减量指令 INC DST DEC DST 其操作数的寻址方式可采用除立即数外的各种寻址方式,但不能是段寄存器。指令的功能是对目的操作数加 1 或减 1。指令除对进位标志CF不影响外,其余标志都受影响。 INC AL INC WORD PTR 4BX DEC CX4 . 乘法指令与除法指令5. 符号扩展指令 为了保证参加运算的两个操作数的类型是一致的,有时需要将一个 8 位或 16 位数进行扩展。

22、对于一个无符号数来说,这种扩展是简单的,只要将其高位补“0”就可以,但对一个带符号数来说就不一样了,扩展时高位补“0”还是补“1”取决于被扩展数的符号位,也就是,当被扩展数是正数时高位应补 0, 为负数时高位应补 1。 CBW 用于将AL扩展到AX CWD 用于将AX扩展到DX+AX 6. BCD数调整指令4.2.3逻辑运算类指令 除了NOT指令对标志位不产生影响外,其余指令将使CF、OF置 0,并以正常规则设置SF、ZF和PF的状态。 (AX)=5555H(BX)=0FF00H 逻辑运算指令可以通过选用不同的源操作数的各位代码, 使目的操作数的某些位置位、清零和测试目的操作数的某些位。例如:

23、 OR CL, 03H AND AL, 0F5H XOR AH, 0FH TEST AL, 02H JZ ZER XOR AL, TEST-CODE JZ PROC1返回本节首页4.2.4移位指令和循环移位指令 CNT可以是立即数或寄存器CL。当CNT为立即数时,其值只能为1;当移位的次数超过1时,CNT应为寄存器CL,CL中的内容为移位次数。1.移位指令 (1) SAL/SHL指令 这两条指令的操作结果是完全一样的。每移位一次在右面最低位补一个0,而左面的最高位则移入标志位CF,如图所示。 (2) SAR指令 该指令每执行一次移位操作,就使操作数右移一位,但符号位保持不变,而最低位移至标志位

24、CF,如图所示。(3) SHR指令 该指令每执行一次移位操作,就使操作数右移一位,最低位移至标志位CF中。与SAR不同的是,左面的最高位将补0,如图所示。2. 循环移位指令4.2.5处理器控制指令与标志处理指令返回本章首页4.3汇编语言程序设计的基本方法4.3.1 汇编语言程序设计的基本步骤4.3.2 IBM PC汇编语言源程序的完整结构及伪指令4.3.3 程序流程控制4.3.4 系统功能调用4.3.8 字符串处理4.3.9 宏指令 4.3.1汇编语言程序设计的基本步骤 1.分析问题 明确求解问题的意义和任务,经过详细地了解和分析,将一个实际问题转换成计算机可以处理的问题。 2.确定算法 确定

25、计算机能够实现的有限的解题步骤,即算法。一般可以使用自然语言、类程序设计语言或流程图来描述。 3.编写程序采用程序设计语言来实现上面确定的算法。采用汇编语言应注意以下几个问题:详细了解所用CPU的编程模型、指令系统、寻 址方式及有关的伪指令;进行存储空间和工作单元的合理分配;多次使用的程序段可采用子程序或宏指令;尽可能采用标号或变量来代替绝对地址和常数。4.程序的检验程序编好以后,必须通过书面的检查和上机调试。5.编写说明文件完整的说明文件,不仅便于用户使用,也便于对程序的维护和扩充。返回本节首页4.3.2 IBM PC汇编语言源程序的完整结构及伪指令1. 段定义伪指令 段名 SEGMENT定

26、位类型组合类型类别 指令语句或伪指令语句 段名 ENDS 段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。 一个源程序中典型的段结构:STACK SEGMENTSTACK ENDS定义堆栈段DATA SEGMENTDATA ENDS定义数据段DATA1 SEGMENTDATA1 ENDS定义堆栈段CODE SEGMENTCODE ENDS定义代码段定义变量与数组DATA SEGMENT A1 DB A A2 DW 1234H B1 DB 100DUP(?) B2 DW 10DUP(0) C1 DB I am a student!$DATA ENDS定义堆栈 STACK SEG

27、MENT PARA STACK STACK DB 256 DUP(?) TOP LABEL WORD STACK ENDS定义主程序 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFEST TOP MOV AH, 4CH INT 21H CODE ENDS END START定义子程序(与主程序同段或异段)CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,

28、DATA CALL P1 ;子程序调用 MOV AH, 4CH INT 21H P1 PROC NEAR MOV AL, BL RET ;返回主程序 P1 ENDP CODE ENDS END STARTCODE1 SEGMENT ASSUME CS:CODE1 P1 PROC NEAR MOV AL, BL RET P1 ENDP CODE1 ENDS4.3.2程序流程控制语句 顺序程序 是指程序中每一条指令都是按指令的排列顺序执行的,是最简单的一种程序结构。 例 1 写出计算y=a*b+c-18 的程序。 题中a=2, b=32, c=-3。 STACK SEGMENT STACK DW

29、256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT a DB 2 b DB 20H c DB 0FDH y DW ? DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP MOV AL, a MOV BL, b IMUL BL MOV BX, AX MOV AL, c CBW ADD AX, BX SUB AX, 18 MOV y, AX MO

30、V AH, 4CH INT 21H CODE ENDS END START 程序的分支结构开始结束ANP1P2P3单分支结构开始结束P1P2P3P49B015B10多分支结构无条件转移指令:(范围大) JMP A1 ;A1为同一段内的指令标号 JMP FAR PTR B1 ;B1为异段内指令标号 条件转移指令:(距离短)条件转移指令只有当指令中给定的条件满足时才发生转移,条件判定的依据是F寄存器的标志位当前状态,这些标志位的状态是由其他指令运行时产生的。条件转移指令的格式及转移条件列表如下: 条件转移指令的寻址方式只有一种,即位移量为8位的相对寻址方式。当程序中要求转移的范围超出-128+12

31、7个字节时需将条件转移与无条件转移结合使用。指令助记符格式条件说明测试标志JZ/JE OPRJNZ/JNE OPRJS OPRJNS OPRJP/JPE OPRJNP/JPO OPRJO OPRJNO OPRJB/JNAE,JC OPRJNB/JAE,JNC OPR结果为零结果不为零结果为负结果为正结果中1个数为偶数结果中1个数为奇数结果溢出结果无溢出结果低于/不高于或不等于(无符号)结果不低于/大于或等于(无符号)ZF1ZF0SF1SF0PF1PF0OF1OF0CF1CF0指令助记符格式条件说明测试标志JBE/JNA OPRJNBE/JA OPRJL/JNGE OPRJNL/JGE OPRJ

32、LE/JNG OPRJNLE/JG OPR结果低于或等于/不高于(无符号)结果不低于或不等于/高于(无符号)小于/不大于或不等于(带符号)不小于/大于或等于(带符号)小于或等于/不大于(带符号)不小于或等于/大于(带符号)CFZF1(CF0)(ZF=0)SFOF1SFOF0(SFOF)ZF1(SFOF)ZF0分支程序设计时必须注意下面几个要点:正确选择判定条件和相应的条件转移指令;编程时必须保证每条分支都能有完整的结果;在检查和调试时必须逐条分支进行,一条或其中几条分支正确还不足以说明整个程序正确。例2求某数X的绝对值,并送回原处。则有公式如下:XX 0XX 0F开始结束X0FXYN DATA

33、 SEGMENT XADR DW 3456H, 8192H DATA ENDS CODE SEGMENT ASSUME S:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV AX, XADR AND AX, AX ;由于MOV不影响标志位 JNS DONE NEG AX MOV XADR, AX DONE: MOV AH, 4CH INT 21H CODE ENDS END STARTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX, DATA MOV DS, AX MOV AX,

34、 STACK MOV SS, AX MOV SP, OFFEST TOP MOV AX, XADR AND AX, AX JS NEGX ;对照用JNS的差别 JMP DONE NEGX: NEG AX MOV XADR, AX DONE: MOV AH, 4CH INT 21H CODE ENDS END START 例: 写出将一位十六进制数转换成对应的ASCII码的程序(只考虑大写字母)。ASCII码表如下:十六进制数ASCII码0123456730H31H32H33H34H35H36H37H十六进制数ASCII码89ABCDEF38H39H41H42H43H44H45H46H流程图:开

35、始结束N(AL)(AL)0(AL)9(AL)15(AL)7(AL)(AL)30(AL)0FFH(AL)YYYNNN STACK SEGMENT STACK DW 256 DUP(?) TOP LAEBL WORD STACK ENDS DATA SEGMENT N DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFEST TOP MOV AL, N CMP AL, 0 JL G1 ;小于 CMP

36、 AL, 09 JLE D1 ;小于等于 CMP AL, 15 JA G1 ;大于 ADD AL, 07 ;字符A到9的距离 D1: ADD AL, 30H DONE: MOV AH, 4CH INT 21H G1: MOV AL, 0FFH JMP SHORT DONE CODE ENDS END START返回本节首页循环程序循环程序的基本结构:开始结束准备部分循环工作部分循环调整部分出口判定YN循环控制指令:助记符格式功能说明LOOP OPRLOOPZ/LOOPE OPRLOOPNZ/LOOPNE OPRJCXZ(CX)(CX)1,(CX)0时,转到OPR(CX)(CX)1,(CX)0且

37、ZF1时,转到OPR(CX)(CX)1,(CX)0且ZF0时,转到OPR(CX)0时转到OPR 指令的寻址方式均为相对寻址方式,且相对位移量为 8 位, 所以其转移范围不能超过 -128+127。指令中的OPR指出指令的转向地址,它可以为语句标号或语句标号加常量。 单重循环: LEA SI, ADRS LEA DI, ADRD MOV CX, 100;循环次数 AGAIN: MOV AL, SI MOV ES:DI, AL INC SI INC DI LOOP AGIAN 多重循环: MOV CX, 100;大循环次数 AGAIN1: MOV AL, AH MOV BL,20;小循环次数 AG

38、AIN2:MOV SI,DI DEC BL CMP BL, 0 JNZ AGAIN2;小循环返回 LOOP AGIAN1;大循环返回 多重循环: MOV CX, 100;大循环次数 AGAIN1: MOV AL, AH PUSH CX;大循环次数保护 MOV CX,20;小循环次数 AGAIN2:MOV SI,DI LOOP AGAIN2;小循环返回 POP CX ;大循环次数恢复 LOOP AGIAN1;大循环返回 要求将ADRS开始存放的100个字节的数据传送到ADRD开始的连续内存区,假设它们的段地址分别存放在DS和ES中,程序如下: LEA SI, ADRS LEA DI, ADRD

39、MOV CX, 100 AGAIN: MOV AL, SI MOV ES:DI, AL INC SI INC DI LOOP AGIAN 如上例要求,并稍作改变,即要求最多送100个字节,当传送过程中出现时,则随时结束传送 LEA SI, ADRS LEA DI, ADRD MOV CX, 100 MOV AL, SI CMP AL, # JE PEND AGAIN: MOV ES:DI, AL INC SI INC DI MOV AL, SI CMP AL, # LOOPNE AGAIN PEND: 要求比较ADRS和ADRD两个数据区中的数据是否相等,如果相等则执行SAME,否则执行NOT

40、_SAME; LEA SI, ADRS LEA DI, ADRD MOV CX, 100 AGAIN: MOV AL, SI MOV BL, ES:DI INC SI INC DI CMP AL, BL LOOPE AGAIN CMP CX, 0 JNZ NOT_SAME SAME: NOT_SAME: 4.3.4 系统功能调用 在我们的程序中,总会有数据的输入和输出。实现数据的输入和输出将涉及输入与输出设备的管理,而对输入、输出设备管理的具体操作是十分繁琐的,好在系统为我们提供了方便。PC DOS系统将输入、输出管理程序编写成一系列子程序,不仅系统可以使用,用户也可以像调子程序一样方便的使用

41、它们。在系统的ROM中也有一组输入、输出管理程序可供用户使用,这组程序通常称为ROM BIOS(ROM Input/Output System)。 调用系统提供的子程序,通常称为系统功能调用。 功能调用的基本方法是采用一条软中断指令INT n。所谓软中断是以指令的方式产生的中断,当CPU执行该指令时,就像响应外部中断一样的方式转入中断处理程序,中断处理程序结束后又返回到INT指令的下一条指令处。指令中的n为中断类型号,不同的n将转入不同的中断处理程序。所以,系统所提供的处理输入、输出的子程序是以中断处理程序的方式编写的。 DOS系统功能调用主要是由软中断指令INT 21H实现的。当累加器AH中

42、设置不同的值时, 指令将完成不同的功能,我们称AH中设置的内容为功能号。 该指令的功能大体可分为输入、输出设备管理、 文件管理及目录管理三个方面。 DOS系统功能调用的方法一般可分为以下几步: 设置所要调用功能的入口参数。 在AH寄存器中存入所要调用功能的功能号。 INT 21H指令自动转入中断子程序入口。 相应中断子程序运行完毕,可按规定取得出口参数。返回本节首页 返回本节首页MOV AH,1 INT 21H读键盘返回值在ALMOV DL, AMOV AH, 2INT 21H显示器输出字符MOV AH,4CHINT 21H返回DOS MOV DX,OFFSET STRINGMOV AH,09

43、HINT 21H将字符数组STRING输出显示器MOV AH, 0AHINT 21H从键盘读入字符串,放在DS:DXMOV AH, 01INT 16H中断调用,有键按下ZF=0 例 4.3.8 求一字符串的长度, 并要求滤去第一个非空格字符之前的所有空格。字符串以结束。 LEA DI, STRING MOV BX, 0 AGAIN1: MOV AL, DI INC DI CMP AL, 20H JE AGAIN1 AGAIN2: CMP AL, JE DONE INC BX MOV AL, DI INC DI JMP AGAIN2 DONE:MOV SLEN, BX 返回本节首页例 4.3.1

44、9 从键盘上输入一字符串, 将其送入输入缓冲区, 并显示这组字符串。STACK SEGMENT STACK DW 40 DUP(?) TOP LABEL WORDSTACK ENDS;定义堆栈段 DATA SEGMENTSTRING1 DB DO YOU WANT TO INPUT STRING? Y/N):$ CRLF DB 0DH, 0AH, $;回车换行 STRING2 DB PLEASE INPUT STRING., 0DH, 0AH, $ BUFIN DB 20H DB ? BUFIN1 DB 20H DUP(?) DATA ENDS ;定一数据段CODE SEGMENT ASSUM

45、E CS:CODE, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP LEA DX, STRING1 MOV AH, 09H INT 21H MOV AH, 01 INT 21H CMP AL, Y JE INPUT CMP AL, y JNE DONEINPUT:LEA DX, CRLF MOV AH, 09H INT 21H LEA DX, STRING2 MOV AH, 09H INT 21H LEA DX, BUFIN MOV AH, 0AH INT

46、 21H MOV AL, BUFIN+1 CBW LEA SI, BUFIN+2 ADD SI, AX MOV BYTE PTR SI, $ LEA DX, CRLF MOV AH, 09 INT 21H LEA DX, BUFIN+2 MOV AH, 09 INT 21HDONE:MOV AH, 4CH INT 21HCODE ENDS END START返回本节首页BIOS功能调用 教材8.3节显示系统及其编程本节自学实验一相关注意下列细节: 1.系统的显示方式单色/彩色、字符/图形 2.如何确定字符或像素位置 3.如何设置颜色 4.实现上述功能的调用命令BIOS功能调用举例(第二版P14

47、8)DATA SEGMENTSTRING1 DBHitting any key, the program is finished. C1 DB ADATA ENDSSTACK SEGMENT STACK DW 30H DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES: DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, 03H;彩色8025 INT 10H MOV AX, 0600H MOV BH, 07 MOV CX, 0 MOV DX, 184FH

48、 INT 10H MOV AH, 02 MOV BX, 07 MOV DX, 0A0AH INT 10H MOV AX, DATA MOV ES, AX PUSH BP MOV AH, 13H MOV AL, 01 MOV CX, 52 MOV BL, 074H LEA BP, STRING1 INT 10H POP BP MOV C1, A AGAINF:MOV AX, 0601H MOV BH, 3CH MOV CX, 1400H MOV DX, 174FH INT 10H MOV AH, 01 INT 16H JNE DOWN MOV AL, C1 MOV AH, 02 MOV BX,

49、0 MOV DX, 171CH INT 10H MOV AL, C1 MOV AH, 09H MOV BL, 3CH MOV CX, 015 INT 10HDELAY:MOV BX, 400AGAIND:MOV CX, 28000DLOOP:LOOP DLOOP DEC BX CMP BX, 0 JNE AGAIND CMP AL, Z JE D1 INC C1 JMP AGAINFDOWN: MOV AX, 03H INT 10H MOV AH, 4CH INT 21HCODE ENDS END START 返回本节首页程序举例:递归子程序, 实现N!的运算。 N!=N*(N-1)!=N*(

50、N-1)*(N-2)!=0!=1 STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT N DW ? RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS;STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP LEA AX,RESULT PUSH AX MOV AX,N PUSH AX CALL FAR PTR FACT MOV AH,4C

51、H INT 21H CODE ENDS CODES SEGMENT ASSUME CS:CODES FACT PROC FAR PUSH BP MOV BP,SP PUSH BX PUSH AX MOV BX,BP+8 MOV AX,BP+6 CMP AX ,0 JE DONE PUSH BX DEC AX CALL FACT MOV BX,BP+8 MOV AX,BX MUL WORD PTR BP+6 JMP SHORT RETURN DONE: MOV AX,01 RETURN:MOV BX,AX POP AX POP BX POP BP RET 4 FACT ENDP CODES EN

52、DS END STARTN1(2)RESULTAXBXBPIPCSN1(1)RESULTAXBXBP1IPCSN1(0)RESULTAXBXBP2IPCSBP1BP2BP3SPRESULT存储单元?12在N2时的递归调用过程中堆栈的内容:返回程序举例 编一子程序,实现给输出缓冲区BUFOUT中的一组字符的ASCII码加偶校验。 作为子程序,缓冲区的首址一般应由主程序提供, 并假设缓冲区中的字符个数由缓冲区中的第一个字节给出。 CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK STEV PROC NEAR PUSH DS PUSH DI PUSH CX

53、 PUSH AX MOV CL, DI MOV CH, 0 INC DI L1:MOV AL, DI OR AL, 80H JNP L2 MOVDI, AL L2:INC DI LOOP L1 POP AX POP CX POP DI POP DS RET STEV ENDPSTART:MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP LEA DI, BUFOUT CALL STEV MOV AH, 4CH INT 21HCODE ENDSSTACK SEGMENT STACK DW 256 DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENTBUFOUT DB 30H DUP(?)DATA ENDSEND START 返回本节首页4.3.5字符串处理(非重点)1)字符串传送指令MOVS 地址指针DI和SI的修正可以是递增的也可以是递减的, 当标志寄存器中方向标志位DF=0 时,地址指针以递增方式修正,反之,则以递减方式修正。递增或递减的值将根据指令是字操作还是字节操作而定。 LENG DW

温馨提示

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

评论

0/150

提交评论