收藏 分享(赏)

第七章 汇编语言程序设计.ppt

上传人:dcjskn 文档编号:5957326 上传时间:2019-03-22 格式:PPT 页数:135 大小:1.23MB
下载 相关 举报
第七章 汇编语言程序设计.ppt_第1页
第1页 / 共135页
第七章 汇编语言程序设计.ppt_第2页
第2页 / 共135页
第七章 汇编语言程序设计.ppt_第3页
第3页 / 共135页
第七章 汇编语言程序设计.ppt_第4页
第4页 / 共135页
第七章 汇编语言程序设计.ppt_第5页
第5页 / 共135页
点击查看更多>>
资源描述

1、第七章 汇编语言程序设计,本章教学目的,理解源程序的结构 理解为各种语句的功能和格式 掌握程序设计的基本方法 掌握上机过程,7.1 汇编语言源程序基本框架,汇编语言源程序若干个段构成、数据段、附加段和堆栈段组成。P178 每个段都有段定义语句和其它有关语句设置,长短按需要而定。用段名标识一个段,并确定段的首地址。 一个段的大小一般可以是1-64KB,占据从段首开始的一片连续存储单元。 源程序的大小和结构不同,所包含的逻辑的数目也不想等,但至少有一个代码段。 源程序一般在DOS操作系统上运行,程序运行完毕应返回DOS。,其一般结构如下: SEGMENT STACK堆栈段的内容STACK ENDS

2、SEGMENT DATA数据段的内容DATA ENDSSEGMENT CODE代码段的内容CODE ENDSEND 启动标号对于一般程序来说,定义太多的段只会增加程序设计的复杂性,通常需要一个代码段、一个数据段和一个堆栈段,有时可包含一个附加段。,DSEG SEGMENTA DB 1234567890DSEG ENDSESEG SEGMENTB DB 10 DUP(?)ESEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,ES:ESEGSTART: MOV AX,DSEGMOV DS,AXMOV AX,ESEGMOV ES,AXLEA SI,ALEA DI,B

3、ADD DI,9MOV CX,10MOVE: CLDLODSBSTDSTOSBLOOP MOVEMOV AH,4CHINT 21HCSEG ENDSEND START,例:在数据段定义首地址为A的10个字符,将这10个字符以相反次序传送到附加段首地址为B的内存单元中。,数据段,附加段,代码段,返回DOS,上机举例,data segmentaa db this is my programe$data endscode segmentassume cs: code, ds: databegin: mov ax, datamov ds,axmov dx, offset aamov ah, 9int

4、21hmov ah,4chint 21hcode endsend begin,一、段定义伪指令P161,段定义伪操作的格式如下:segment-name SEGMENTsegment-name ENDS 其中省略号号部分 数据段、附加段和堆栈段,一般是存贮单元的定义、分配等伪操作 代码段则是指令及伪操作。,例180页4行和10行 例180页16行和181页第66行,二、段寄存器分配说明伪指令P162,必须明确段和段寄存器的关系,其格式为: ASSUME , ,其中 段寄存器名须是CS、DS、ES和SS之一。 段名必是由前面的段定义语句定义过的段的段名。 此语句写在代码段的开始处。,例180页

5、17行,三、过程定义伪指令P162,定义格式: 过程名 PROC NEAR/FARRET过程名 ENDP,例181页 51行、64行、65行,例181页 49行,调用格式: CALL 过程名,四、返回操作系统方式,2、将主程序定义为操作系统的远过程主过程名 PROC FARRETEND 主过程名,例180页 19行、 181页 50行、 67行,1、使用4CH号DOS功能调用MOV AH, 4CHINT 21H,特别注意和一般过程定义的区别,四、返回操作系统方式(续),4、使用0号DOS功能调用MOV AH, 0HINT 21H,3、使用20号BIOS功能调用INT 20H,第3和第4中方法只

6、有在.COM类型的文件中才可以使用,例191页 35行,五、模块开始伪指令/列表伪指令,NAME :P163为模块起名。 TITLE : P163制定了在每一页上打印的标题 NAME和TITLE不是必须的 :如果程序中没有name,则MASM将用TITLE中的标题的前6个字符做为模块名,如果既无NAME,也没有TITLE,则用源文件名作为模块名。,六、模块结束伪指令,格式:END 标号或主过程名 功能:告诉汇编程序源文件结束,并给出了执行程序的启动单元地址。 标号:给定了程序开始执行的启动单元地址。如果有多个模块相连接,只有主模块中的END语句代标号,举例,Name exp_1 data se

7、gmentaa db this is test1$data endscode segmentassume cs: code, ds: databegin: mov ax, datamov ds,axmov dx, offset aamov ah, 9int 21hmov ah,4chint 21hcode endsend begin,Name exp_2 data segmentaa db this is a procedure$data endscode segmentassume cs: code, ds: data start proc far push dsxor ax,axpush

8、axmov ax, datamov ds,axmov dx, offset aamov ah, 9int 21hretcode endsend start,7.2 汇编语言语句,一、构成汇编程序语句可分为两大类 指令性语句指令性语句来自于系统提供的指令集,是CPU要执行的语句部分。汇编后产生目标代码,与机器指令一一对应。 标号: 指令助记符 操作数,操作数 ;注释 指示性语句不是计算机指令系统提供的,也不是CPU要执行的部分。故而称为伪指令。每种汇编程序都有自己的为指令集,用于汇编时指示源程序如何汇编、变量怎样定义、过程怎么设置等,汇编后不产生机器代码。名字 伪指令定义符 操作数,操作数,;注

9、释,二、汇编语言语句格式,指令性语句 标号: 指令助记符 操作数,操作数;注释 指示性语句名字 伪指令定义符 操作数,操作数,;注释,汇编源程序语句最多由4部分组成,各部分间要有空格,养成良好的书写习惯。,三、语句中各项说明,标号和名字 标号:在代码段中设置,表示本语句的符号地址。可用作转移指令的目标地址。 名字:可以是变量名、段名、过程名、符号名等, 标号和名字有三种属性 段属性 偏移属性 类型属性,三、语句中各项说明,助记符和定义符 指令性语句中助记符表示该指令的操作类型码,规定了语句的操作功能 伪指令中的定义符规定了该语句的伪操作功能,有汇编程序处理 注释: 以分号开始,用来对一段程序或

10、一两条指令在程序中的作用加以说明,增加程序的可读性。,三、语句中各项说明,操作数 内容可以是常数、寄存器、标号、变量或表达式 操作数的多少由指令本身决定 在指令性语句中,通常给出操作数地址,通常是2个,对于伪指令,可以有多个 操作书中的常熟可以是二、八、十六、十进制,分别在数值为加标记,不加标记默认做十进制,四、汇编语言的运算符 P158,算术运算符+、*、/ 、MOD、SAL、SAR 逻辑运算符AND、OR、XOR、NOT、SHR及SHL。逻辑操作符是按位操作的,它只能用于数字表达式中。,关系运算符关系运算符主要包括EQ(相等时为真)、NE(不相等时为真)、LT(小于时为真)、GT(大于时为

11、真)、LE(小于或等于时为真)、GE(大于或等于时为真)等6种运算结果只有“0”和“1”两种。例如:MOV AX, 4 EQ 3 ;AX 0MOV AX, 4 NE 3 ;AX 1 分析操作符它有TYPE、LENGTH、SIZE、OFFSET、SEG 5种。这些操作符把一些特征或存储器地址的一部分作为数值回送。下面分别说明各个操作符的功能。,(1)TYPE格式:TYPE Variable或label如果是变量,则汇编程序将回送该变量的以字节数表示的类型,DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为1,FAR为2。下面是使用TY

12、PE运算符的例子,DW ? ;变量VAR的类型为字 DD 10 DUP(?) ;变量ARRAR的类型为双字 DB THIS IS TEST ;变量STR的类型为字节MOV AX, TYPE VAR ;AX 2 MOV BX, TYPE ARRAR ;BX 4 MOV CX, TYPE STR ;CX 1,VAR ARRAR STR,(2)LENGT格式为:LENGTH Variable对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元个数。若没有用DUP说明, 则回送1。 (3)SIZE格式为:SIZE Variable其汇编的值为LENGTH Variable * TYPE Var

13、iable,即回送直接分配给该变量的总的字节数。,(,4)OFFSET格式为:OFFSET Variable或label汇编程序将回送变量或标号的偏移地址值。 (5)SEG格式为:SEG Variable或label汇编程序将回送变量或标号的段地址值。,组合运算符用来建立或改变变量或标号的新类型 (1)PTR (2)THIS(不要求),分离运算符 HIGH和LOW称为字节分离操作符,它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。例 STUFF EQU 0ABCDHMOV AH, HIGH STUFFMOV AL, LOW STUFF,7.3 伪指令,伪指令 符号定义伪指令

14、 数据定义伪指令 段定义伪指令 过程定义伪指令 宏处理伪指令 模块定义与连接伪指令 处理器方式伪指令 条件伪指令 列表伪指令,作用:用来为数据分配内存空间,并设置相应内存单元的初始值。 形式: 变量名 定义符 数据项表;注释 变量名 定义符 常数表达式 Dup( 数据项表);注释 (1) 变量名是一个可选项,用符号地址表示,标记该语句数据项表中的第一个数据的偏移地址,变量的值就是段中该偏移地址单元的存储内容,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。,一、 数据定义伪指令,定义符主要包括下列几种: (1)DB(Define Byt

15、e):定义字节,后面的每个操作数占1个字节。 (2)DW(Define Word):定义字,后面的每个操作数占1个字。 (3)DD(Define DWord):定义双字,后面的每个操作数占2个字。 (4)DQ(Define QWord):定义四字,后面的每个操作数占4个字。 (5)DT(Define Tbyte):定义十字节,后面的每个操作数占10个字节。,数据项可以为: (1)数值表达式; (2)ASC码字符串; (3)地址表达式; (4)?(只保存内存空间,未定义初始值); (5)DUP 子句,其格式为: 重复次数 DUP (操作数,操作数),DUP子句可以嵌 套。,例 FILLER DB

16、 ? ;给FILLER分配1个内存单元SUM DW ? DB ?, ?, ? ;给SUM分配5个内存单元BUFFER DB 10 DUP(?) ;给BUFFER分配10个字节的内存空间ZERO DW 30 DUP(0) ;给ZERO分配30个字的数据区,且内容均为0MASK DB 5 DUP(OK!) ;ARRAY DB 100 DUP(3DUP(8),6),功能:把表达式值赋给符号名。 符号定义伪指令的基本形式为: 符号名 EQU 表达式 符号名 = 常数表达式 符号名 LABLE 类型 说明: (1)=后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。 (2) EQU后的表达式可

17、以是数值、字符串,甚至可以是寄存器名、指令的助记符等。 (3) EQU不能重复定义,而“=”伪指令可以重复定义,其作用域从定义点到重新定义之前。,二、符号定义伪指令,例 CR EQU 0DH ;常数LF EQU 0AH ;常数A EQU ASCII-TABLE ;变量STR EQU 64*1024 ;数值表达式ADR EQU ES:BP+DI+5 ;地址表达式CBD EQU AAM ;指令助记符 例COUNT=10MOV CX, COUNTCOUNT=COUNT-1MOV BX, COUNT, 符号名 LABLE 类型功能:用来给已经定义的变量或符号名取一个别名,并可重新定义它的类型属性变量的

18、类型可以是BYTE、WORD、DWORD标号的类型可以使NEAR、FAR例 AREAW LABEL WORD AREAB DB 100 DUP(?) MOV AREAW, AX MOV AREAB49, AL,三、段定义伪指令,作用:为程序的汇编和连接说明了段名、分段的各种属性以及分段的开始和结束。 基本形式:段名 SEGMENT 定位类型组合类型类别 语句序列段名 ENDS,(1)定位类型(ALIGN)告诉汇编程序如何确定逻辑段的起始地址边界。有以下四种: BYTE(1字节) WORD(2字节) PARA(16字节,缺省方式) PAGE(256字节),例STACK SEGMENT STACK

19、DB 100 DUP(?)STACK ENDSDATA1 SEGMENT BYTESTRING DB This is an example!DATA1 ENDSDATA2 SEGMENT WORDBUFFER DW 40 DUP(0)DATA2 ENDSCODE1 SEGMENT PAGECODE1 ENDSCODE2 SEGMENT ;没有定位类型(PARA)START: MOV AX, STACKMOV SS, AXCODE2 ENDSEND START,(2)组合类型(Combine Type)又称连接方式,规定连接程序LINK处理本段与其它逻辑段时如何进行相互连接。可以有一下六种: P

20、UBLIC(与同名同类名的逻辑段顺序联结成一个逻辑段) STACK(PUBLIC的堆栈特例) NONE(不组合,缺省方式) COMMON MEMORYAT表达式(定位结果段基址),(3)类别(Class)连接时决定各逻辑段的装入顺序。 例如,假设一个主程序中有五个逻辑段,段名 类别名STK1 STACKCODE1 无DATA1 BUFFERDATA2 TABLEDATA3 BURRER 子程序DATA4 TABLEDATA5 BUFFERSTK2 STACKCODE2 无,装入内存顺序如下:,STK1 STK2 CODE1 CODE2 DATA1 DATA3 DATA5 DATA2 DATA4

21、,STACK,无,BUFFER,TABLE,ASSUME功能:告诉汇编程序,将某个段寄存器设置为某个逻辑段的段基址,明确指出源程序中逻辑段与物理地址之间的关系。例 CODE SEGMENTASSUME CS: CODE, DS: DATA1, SS: STACKMOV AX, DATA1MOV DS, AXMOV AX, STACKMOV SS, AXCODE ENDS,四、段寄存器说明伪指令,定义格式: 过程名 PROC NEAR/FARRET过程名 ENDP 调用格式: 过程名 CALL,五、 过程定义伪指令,过程定义和调用都可以嵌套 例: NAME1 PROC FARCALL NAME2

22、RETNAME2 PROC NEARRETNAME2 ENDPNAME1 ENDP,在程序的开始可以用NAME或TITLE为模块的名字,如果程序中没有NAME 伪操作,则也可使用TITLE伪操作。 NAME module_name 作为模块的名字。 TITLE text 表示源程序结束的伪操作的格式为:END 启动标号 其中标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用END而不必指定标号。,六、模块开始与结束为指令,1、ORG 表达式 格式: ORG ORG $+ 作用:用来指定数据或指令的偏移地址。是下一字节地址为制定的值或从当前位置跳

23、过偏移量表达式的值。 $: 代表地址计数器的当前值,七、 定位伪指令,1 已知(BX)=2,指出下列程序执行后AL寄存器的内容。 DATA SEGMENT VAR1=10 MOD 7 VAR2 EQU 10H VAR3 DB VAR2 DUP(30H) VAR4 DB 20H, 10H, 80H VAR5 =$-VAR4 DATA ENDS (1) MOV AL, VAR1 (AL)=( ) (2) MOV AL, VAR2 (AL)=( ) (3) MOV AL, VAR3 (AL)=( ) (4) MOV AL, VAR4BX (AL)=( ) (4) MOV AL, VAR5 (AL)=

24、( ),2 阅读程序段,完成指定问题 NUM DB ABCDEFGHI MOV AH, 01 ; 从键盘输入1-9任意字符 INT 21H AND AL,0FH DEC AL XOR AH, AH MOV BX, OFFSET NUM ADD BX, AX MOV DL,BX MOV AH,02H ; 显示输出 INT 21H (1)程序段的功能是什么? (2)如从键盘输入字符5,程序段有什么结果?,3 下列程序是完成3与5的和并存入DATA1单元,指出下列程序中的错误,并改正. STAKSG SEGMENTDB 100 DUP(?) STAKSG ENDS DTSG SEGMENT DATA

25、1 DB ? DTSG END CDSG SEGMENT START: MOV DS,DTSGMOV AL,3ADD AL,5MOV DATA, AL CDSG ENDS END,4 设某程序段: DATA SEGMENT ORG 1020H NUM1=10 NUM2=NUM1+10H DAI DB 12345678DB 09H,0AH COUNT EQU $-DAI DA2 DW AB,CD, EF,GH DATA ENDS DAI的偏移地址是( ) COUNT的值是( ) DA2+5字节单元的内容是( ),八、宏指令,1、宏定义 宏是源程序中一段有独立功能的程序代码。它只需要在源程序中定义

26、一次,就可以多次调用它,调用时只需要有一个宏指令语句就可以了。 格式:宏名 MACRO 形参1,形参2. (宏定义体)ENDM,2、宏调用,宏调用的格式:宏指令名实参1,实参2当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,而且由实参取代宏定义中的形参。,例 用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数,作为结果宏定义:,MULTIPLY MACRO OPR1,OPR2,RESULTPUSH DXPUSH AXMOV AX,opr1IMUL opr2MOV RESULT,AXPOP AXPOP DXENDM 宏调用: MULTIPLY

27、 CX,VAR,XYZBX MULTIPLY 240,BX,SAVE ,宏展开:,+ PUSH DX + PUSH AX + MOV AX,CX + IMUL VAR + MOV XYZBX,AX + POP AX + POP DX + PUSH DX + PUSH AX + MOV AX, 240 + IMUL BX + MOV SAVE,AX + POP AX + POP DX,九、 条件汇编,汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这里就用到条件伪操作。条件伪操作的一般格式是:IF argument 自变量满足给定条件汇编此块ELSE 自变量不满足给定条件汇编

28、此块ENDIF,7.4 汇编程序及汇编工具,程序设计语言通常分为3类: 机器语言(Machine Language) 汇编语言(Assembler Language) 高级语言(High Level Language),一、各种语言简介,1机器语言 (1)机器指令机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作对象(数据或数据地址)。 (2)指令系统和机器语言指令系统是指特定计算机上机器指令的集合。机器语言是由指令系统以及机器指令的使用规则构成的。机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计算机才能直接执行。,(3)机器语言的主要特点 机器语言与机器密切相关

29、机器语言设计程序非常困难,但容易实现高性能,2 汇编语言以助记符描述的指令称作汇编格式指令或符号指令,通常简称指令。指令和伪指令的集合及其程序设计规则便构成了汇编语言。用汇编语言编写的程序就是汇编语言源程序。机器语言和汇编语言都是面向机器的,是低级语言。,汇编语言的特点,汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 汇编程序设计的过程是与其他高级语言程序设计大致相同

30、,3、高级语言在程序设计的简易性与代码的可移植性等方面有了质的飞跃。当然,用高级语言编写的源程序必须经过编译和连接,将其转变为可执行程序或借助于解释程序方可在计算机上运行。,二、程序的编辑、汇编与连接,1.汇编程序 汇编是把汇编语言程序翻译成机器语言描述的目标程序 的过程。汇编程序是完成汇编任务的程序。2.连接程序 连接程序的主要功能是实现多个目标文件及库文件的连接,并完成浮动地位的重定位。从汇编语言源程序到可执行程序的生成过程如图所示。,汇编语言上机过程,编辑程序,源程序文件 .asm,MASM宏汇编的提示信息及回答,LINK程序的提示信息及回答,练习:,语言翻译程序是一种_(31)_,编译

31、程序和_(32)_是两类高级语言翻译程序,它们的根本区别在于_(33)_。使用_(34)_可实现汇编语言到机器语言的翻译。程序员在源程序中增加注释,可以_(35)_。 (31) A. 系统软件 B. 应用软件 C. 编辑软件 D. 测试软件 (32) A. 汇编程序 B. 目标程序 C. 连接程序 D. 解释程序 (33) A. 是否进行优化处理 B. 执行效率不同 C. 对源程序中的错误处理不同 D. 是否形成目标程序 (34) A. 汇编程序 B. 编译程序 C. 反汇编程序 D.解释程序 (35) A. 降低执行效率 B. 提高执行效率C. 推行程序设计的标准化 D. 捉高程序的可读性,

32、7.5 系统功能调用,中断 软中断 P105 BIOS、DOS BIOS和DOS功能调用 INT 21中断 调用方法 几种常用的调用,一、BIOS和DOS,基本输入输出系统BIOS是Basic Iput Output System的缩写,是固化在只读存储器ROM中的基本输入输出程序。BIOS保存着微机系统最重要的基本输入输出程序、系统信息设置、开机自检程序和系统启动自举程序等,用来进行系统测试、初始化引导程序、对I/O设备进行控制。,一、BIOS和DOS,磁盘操作系统DOS是Disk Operating System的缩写, 是PC机上最重要的操作系统,用来控制和管理计算机的硬件资源、方便用户

33、使用的程序集合。由于这些软件程序存放在磁盘上,而且主要功能是进行文件管理和输入输出设备管理,故称磁盘操作系统。磁盘操作系统是人和机器交互的界面,用户通过操作系统使用和操作计算机。,一、BIOS和DOS,DOS由三个层次的程序文件及一个BOOT引导程序构成。三个层次模块文件是: IO.SYS 输入/输出管理系统 MSDOS.SYS 文件管理系统 COMMAND.COM 命令处理系统,二、BIOS中断和DOS中断,DOS和BIOS提供了大量的可供用户直接使用的系统服务程序。DOS系统中的IO.SYS基本输入/输出管理模块通过BIOS控制管理外部设备。DOS与BIOS之间的关系如图所示,MSDOS.

34、SYS,IO.SYS,BIOS,外部设备,二、BIOS中断和DOS中断,在一般情况下,用户程序通过MSDOS.SYS使用外部设备。应用汇编语言编程,可以直接使用BIOS中的软中断指令对应的中断调用程序,若对内部硬件比较熟悉,可以用IN和OUT指令对设备进行端口编程。,二、BIOS中断和DOS中断,一般来说,用户可以用四种方式控制PC的硬件。 应用高级语言的相应功能语句进行控制。但高级语言中的I/O语句比较少,执行速度慢。 应用DOS提供的功能程序来控制硬件。可对显示器、键盘、打印机、串行通信等字符设备提供输入/输出服务。DOS提供了近百种I/O功能服务程序,编程者无须对硬件有太深的了解,即可调

35、用。这是一种高层次的调用,使用DOS调用,编程简单,调试方便,可移植性好。 应用BIOS提供的功能程序来控制硬件。这是低层次控制,要求编程者对硬件有相当深入的了解。当BIOS与DOS提供的功能相同时,应首先选用DOS。BIOS固化在ROM中,不依赖于DOS操作系统,使用BIOS软中断调用子程序可直接控制系统硬件。BIOS调用速度快,适用于高速运行的场合。中断调用可用软件中断指令“INT n”来实现,n为中断类型码。使用BIOS调用的汇编语言和C语言的程序可移植性比较差。 直接使用汇编语言编程进行控制。要求编程者对I/O设备的地址、功能比较熟悉。,二、BIOS中断和DOS中断,三、INT 21H

36、软中断,DOS操作系统为程序设计者提供了可以直接调用的软中断处理程序,每一个中断处理程序完成一个特定的功能操作。依据编程需要选择适当的处理程序,编程者不需再重新编写程序,而是使用INT n软中断指令。每执行一种不同类型码n的软中断指令,就执行一个中断处理程序,其主要功能如下 磁盘的读/写控制。 内存管理、文件操作和目录管理。 基本输入/输出(对键盘、打印机和显示器等)控制,另外还有日期、时间管理等。,1、INT 21H软中断是一个具有几十种功能的大型中断服务程序,给这些子功能程序分别予以编号,称为功能号。每个功能程序完成一种特定的操作和处理。对INT 21H软中断指令对应的功能子程序的调用称为

37、DOS系统功能调用。DOS启动成功后,INT 21H的中断向量(中断处理程序首地址)被初始化在中断向量表中向量地址为 84H87H的4个存储单元内。,2. INT 21H调用方法: 准备入口参数 功能调用号送AH寄存器 软中断指令 INT 21H,注意:有的子功能程序不需要入口参数,但大部分需要把参数送入指定位置。程序员只要给出这三方面的信息,不必关心程序具体如何执行,在内存中的存放地址如何,DOS就会根据所给的参数信息自动转入相应的子程序去执行并产生相应结果。,字符I/O系统功能调用,时间日期系统功能调用,程序结束系统功能调用,1. 从键盘接收一个字符(01H号功能),功能:从键盘读一字符,

38、并将该字符回显在显示器上 入口参数:无 出口参数:AL=读到字符的ASCII码 说明:如果读到的字符是Ctrl+c或Ctrl+Break则结束程序,例: MOV AH,1INT 21H,2. 从键盘接收一串字符(0AH号功能),功 能:从键盘读一字符串。 入口参数: DS:DX=缓冲区首址,缓冲区的第 一个字节放缓冲区最大容量数 出口参数:接收到的字符串在缓冲区中第三个字节开始 说 明: 缓冲区第二个字节存放实际读入的字符数。 字符串以回车结束 如果输入字符串超过了缓冲的区容量, 超出的部分丢失,同时响铃 如果在输入时按Ctrl+C或Ctrl+Break,则结束程序,例:BUF DB 20DB

39、 ?DB 20 DUP(?)MOV DX,OFFSET BUFMOV AH,0AHINT 21H,3. 显示一个字符(02H号功能),功能:寄存器DL中的字符从屏幕上显示输出 入口参数:DL=要输出字符的ASCII码 出口参数:无,例: MOV DL,AMOV AH,2INT 21H,4. 显示一串字符(09H号功能),功 能:将指定缓冲区中的字符串从屏幕上显示输出 入口参数:DS:DX=要输出字符的首址,字符串以字符为结束标志 出口参数:无,5. 返回操作系统(4CH号功能),功 能:结束当前正在执行的程序,并返回操作系统 入口参数:无 出口参数:无,回到DOS提示符下C:,例: MOV A

40、H,4CHINT 21H,7.5 汇编程序设计,顺序 分支 循环 子程序,一、 顺序程序设计,顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。 因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。,没有分支、 没有循环 的直线运行程, 即顺序结构。,DATA SEGMENTA DW 1234HB DW 5678HC DW ? DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATAST

41、ART:MOV AX,DATAMOV DS,AXMOV AX,AADD AX,BMOV C,AXMOV AH,4CHINT 21HCODE ENDSEND START,最简单的程序,练习,用查表的方法将一位十六进制数转换成与它相应的ASCII码。 既然指定用查表的方法,那么首先要建立一个表TABLE。 我们在表中按照十六进制数从小到大的顺序放入它们对应的ASCII码值。,DATA SEGMENTTABLE DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HHEX DB 4;十六进制数ASCI DB ?;存放结

42、果ascii码 DATA ENDSSTACK1 SEGMENT PARA STACKDW 20H DUP(0) STACK1 ENDS,COSEG SEGMENTASSUME CS: COSEG, DS: DATA, SS: STACK1BEING: MOV AX, DATAMOV DS, AXMOV BX, OFFSET TABLEMOV AH,0MOV AL, HEXADD BX, AXMOV AL, BXMOV ASCI, ALMOV AH, 4CHINT 21HCOSEG ENDSEND BEING,MOV AL,HEX XLAT TABLE,思考:如果从键盘上输入一个数,如何实现?,

43、二、 分支程序设计,(a) IF-THEN-ELSE结构; (b) CASE结构,例 求补码数X补的绝对值,并送回原处。根据补码的定义:,X0,X0,可得如下关系式:,X0,X0,已知补码求绝对值的流程图,当X0时,算式0-X补实际上是对X补再求补。因而,可画出如上图所示的流程图。可以看出,这是一个典型的IF-THEN-ELSE程序结构。 程序清单如下:,STACK SEGMENT STACK DW 256 DUP (?) ; 定义堆栈段, 预留256个单元TOP LABLE WORDSTACK ENDSDATA SEGMENTXADR DW 3456H ;设X补=3456H DATA END

44、S,CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK MAIN PROC FARPUSH DS ;将PSP中INT 20H指令的存放地址压入栈。XOR AX, AXPUSH AXMOV AX, DATA ;将数段段址送DS。MOV DS, AXMOV AX, STACK ;将堆栈段段址送SS。MOV SS, AX,MOV SP, OFFSET TOP ;设置栈指针, 使其指向栈底地址。MOV AX, XADR ;取x补到AX。AND AX, AX ;设置标志位。JNS DONE ;若x0, 转DONE。NEG AX ;若0, 求补得到|x|。M

45、OV XADR, AX ;将|x|送回原处。 DONE: RET ;返回PC-DOS状态。CODE ENDSEND MAIN,分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。,练习,题目:设内存中有三个互不相等的无符号字数据,分别是放在ARG开始的字单元,编制程序将其中最大值存入MAX单元。 分析:求三个无符号数中的最大值,只要把三个数据两两比较,用JA/JNB/JNA/JC等指令就可判断两数的大小,从而选出其中最大值。,DSEG SEGMENTARG DW 7138H,84A6H,29EHMAX D

46、W ? DESG ENDS CSEG SEGMENTASSUME CS:CSEG,DS:DSEG FMAX: MOV AX,DSEGMOV DS,AXLEA SI, ARGMOV AX, SIMOV BX,SI+2CMP AX, BXJAE FMAX1MOV AX, BX,FMAX1 : CMP AX,SI+4JAE FMAX2MOV AX,SI+4 FMAX2 : MOV MAX,AXMOV AH,4CHINT 21H CSEG ENDSEND FMAX,例 利用跳转表法实现下述要求:设有一组(8个)选择项存于AL寄存器中,试根据AL中哪一位为 1 把程序分别转移到相应的分支去。跳转表法是一种很有用的程序设计方法, 主要设计思想是: 首先将 8 个选择项所对应的 8 个分支程序的标号存放在一个数据表(即跳转表)中, 然后采用移位指令将AL中内容逐位移到CF标志位中,并判CF是否为 1。若为 1,就根据分支程序标号在跳转表中的存放地址将程序转入相应的分支。若CF为 0,则继续判下一个选择项是否为 1, 可以看出这是一个典型的CASE程序结构,程序清单如下:,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 开发文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报