slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
微型计算机系统 PowerPoint Presentation
Download Presentation
微型计算机系统

Loading in 2 Seconds...

play fullscreen
1 / 89

微型计算机系统 - PowerPoint PPT Presentation


  • 137 Views
  • Uploaded on

微型计算机系统. 第三章:汇编语言程序设计. 教学提示: 汇编语言程序设计是开发微机系统软件的基本功,在程序设计中具有十分重要的地位。在该章中我们将介绍汇编语言的基本概念、基本语法规则和语句结构,以及汇编语言程序设计的基本方法。. 教学要求: 掌握汇编语言的程序设计方法。汇编语言主要用于帮助我们深入地了解计算机的体系结构;编制控制硬件的底层程序。对于本章中出现的基础程序,必须熟练地掌握;对于本章中出现的偏向高层应用的程序,则要进行必要的了解。. 本章主要内容 :. 3.1 汇编语言语句 3.2 伪指令 3.3 宏指令

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '微型计算机系统' - bendek


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2

第三章:汇编语言程序设计

教学提示:

汇编语言程序设计是开发微机系统软件的基本功,在程序设计中具有十分重要的地位。在该章中我们将介绍汇编语言的基本概念、基本语法规则和语句结构,以及汇编语言程序设计的基本方法。

教学要求:

掌握汇编语言的程序设计方法。汇编语言主要用于帮助我们深入地了解计算机的体系结构;编制控制硬件的底层程序。对于本章中出现的基础程序,必须熟练地掌握;对于本章中出现的偏向高层应用的程序,则要进行必要的了解。

Company Logo

slide3

本章主要内容:

3.1 汇编语言语句

3.2 伪指令

3.3 宏指令

3.4 常用的DOS与BIOS中断功能调用

3.5 顺序程序设计

3.6 分支程序设计

3.7 循环程序设计

3.8 子程序设计

Company Logo

slide4

第三章:汇编语言程序设计

§3.1 汇编语言语句

一、机器语言、汇编语言和高级语言

机器语言:用0、1代码表示的机器指令形式,是机器硬件唯一能识别和执行的语言。

例:机器指令0100 0000;表示(AX)+1→AX

汇编语言 :用符号表示指令的操作码、操作数。又称符号语言。

例:INC AX ;增1指令

Company Logo

slide5

第三章:汇编语言程序设计

  • 汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。
  • 汇编指令与机器代码是一一对应的。
  • 汇编语言、机器语言均属于低级语言。

高级语言:

接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,Java语言等。

Company Logo

slide6

第三章:汇编语言程序设计

二、汇编语言的特点

  • 代码长度短,执行速度最快
  • 可直接有效的控制机器的运行
  • 准确掌握机器运行时间
  • 可最有效的利用CPU、内存、I/O资源

直接控制机器运行的场合

汇编语言常用于: 需要准确控制运行时间的场合

运行速度要求很高的场合

Company Logo

slide7

第三章:汇编语言程序设计

三、语句的类别与结构

1. 汇编语句的类别

指令语句:

由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。

宏指令语句:

允许用户为多次重复使用的程序段命名的一个名字。包括指令语句和伪指令语句,即将一个程序段定义为一宏指令。

Company Logo

slide8

第三章:汇编语言程序设计

伪指令语句:

伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。

  • 伪指令与指令性语句的区别:
    • 伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码;
    • 伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。

Company Logo

slide9

第三章:汇编语言程序设计

2、汇编语言的语句格式

[名字项] 操作项 [操作数] [;注释项]

操作项:指明操作的性质,说明计算机要执行的具体操作。

用助记符表示。可以是指令、宏指令语句、伪指

    令的助记符。

操作数:指明指令执行过程中所需的数据。可有0个、1个

或者多个表达式组成,并由它提供执行指定操作

所需要的操作数或地址。

Company Logo

slide10

第三章:汇编语言程序设计

注释项:必须以分号开头,主要用来说明程序或重要语句的

功能。

名字项:是用标识符表示的符号

在指令和宏指令中,称为标号。且对应的标识符后面必须跟有冒号,标号在汇编以后分配有地址。标号又称为符号地址,可作为转移指令或子程序调用的目标地址。

若名字项出现在伪指令语句前,则该名字项称为符号名,根据不同的伪指令,这些符号名又可分为变量名、符号常数名、子程序名或段名等。

Company Logo

slide11

第三章:汇编语言程序设计

名字项的书写规定,可使用下列字符:

字母:A~Z,a~z

数字:0~9

特殊字符:?、@、$等。

名字不能使用汇编语言的专用保留字、寄存器名、汇编语言中的指令助记符等。

名字最多由31个字符组成,打头的必须是字母、?、@、-,不能是数字。

Company Logo

slide12

第三章:汇编语言程序设计

四、指令语句的操作数

操作数项的常见形式有:常数、寄存器、标号、变量或表达式。

常数:常数分为数值常数、字符串常数和符号常数。

数字常数:若数的最高位以字母A~F开头,则必须在它前面加一个0。

字符串常数:是指用单引号括起来的一个字符或多个字符的序列。

如:MOV AH,`B`指令和MOV AH,42H是等价的。

符号常数:数据段中用EQU伪指令或“=”伪指令定义的

Company Logo

slide13

第三章:汇编语言程序设计

变量:变量是一个数据存储单元的名字,即数据存放地址

的符号表示。定义变量实际上就是给变量分配内存

单元。 如:ARRAYT DW 1,0,3,49

变量有3种属性:段属性、偏移属性和类型属性

段属性表示变量所在段的起始地址。

偏移属性表示变量在段内的偏移地址。用16位无符号表示偏移地址。

类型属性表示该变量能存放的数据长度。长度为1B的变量,类型为 ,长度为2B的变量,类型为 等。

WORD

BYTE

Company Logo

slide14

第三章:汇编语言程序设计

标号:在指令语句前面,后面跟冒号(:) ,表示指令的符

号地址,指示汇编后该指令代码在内存中的位置。

它也有3种属性:段属性、偏移属性和类型属性。

  • 段属性表示该标号的段起始地址,该地址一定在CS段中
  • 偏移属性表示标号在代码段中的段内偏移地址。是一个16位的无符号数。

类型属性表示该标号是在本段内引用,还是在其它段中引用。在段内引用的标号为NEAR属性,在段外引用的标号为FAR属性。

Company Logo

slide15

第三章:汇编语言程序设计

表达式:由常数、变量、标号通过运算符或操作符连接而成

的,可分为数值表达式和地址表达式。

数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。

  • 地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式

Company Logo

slide16

第三章:汇编语言程序设计

五、指令语句中的运算符和操作符

数值表达式中进行算术运算的符号称运算符,地址表达式中的运算符称为操作符。

1、运算符

算术运算符有+、―、*、/、MOD、右移SHR和左移SHL运算符。要求参加运算的数(或地址)均为整数,运算的结果也为整数,除法运算的结果是商的整数部分。

逻辑运算符依次为NOT、AND、OR和XOR。按位进行操作,其结果为整数常量。

Company Logo

slide17

第三章:汇编语言程序设计

关系运算符有6种,它们分别是:

EQ相等(Equal)

NE 不等(Not Equal)

LT 小于(Less)

LE 小于或等于(Less or Equal)

GT 大于(Greater)

GE 大于或等于(Greater or Equal)

用于两个表达式值的比较,表达式的值一定是常数或是同一段内的偏移地址,比较的结果为逻辑值,关系成立,结果为真,用全“1”表示;关系不成立,结果为假,用全“0”表示

Company Logo

slide18

第三章:汇编语言程序设计

2. 操作符

1) 数值回送操作符(5个)

OFFSET——取偏移地址操作符

格式:OFFSET 变量或标号

功能:返回该变量或标号在其段内的偏移地址。

例:MOV SI,OFFSET BUF ;将BUF在数据段内的偏移地址作为立即数送到SI中。

等效于指令 : LEA SI,BUF

SEG——取段址操作符。

格式:SEG 变量或标号

功能:返回变量或标号所在段的段基址。

例: MOV AX,SEG BUF

Company Logo

slide19

第三章:汇编语言程序设计

TYPE——取类型操作符

格式:TYPE 变量或标号

功能:当TYPE置于变量前面时,返回变量的类型数字。

即DB为1,DW为2,DD为4,DQ为8,DT为10。

当TYPE置于标号前面时,返回标号的类型属性值;当该

标号为NEAR属性时,返回值为-1,标号为FAR属性时,

返回值为-2。

例:数据段中有如下定义:DATA DW 75H,134H。

执行:ADD SI,TYPE DATA。

该语句在汇编后相当于指令ADD SI,2。

Company Logo

slide20

第三章:汇编语言程序设计

LENGTH——取变量所含的数据个数操作符

格式:LENGTH 变量

功能:只对变量起作用,取值根据定义该变量时数据定义伪指令后面第一个表达式的形式而定。如为重复子句“n DUP(表达式)”,返回外层重复因子n,其它形式的表达式,则返回1。

例: DATA SEGMENT

A1 DB ‘ABCD’,5 DUP(0)

A2 DB 10 DUP(1),1234H

A3 DW 10,20 DUP(?)

A4 DW 5 DUP(3 DUP(2),5)

DATA ENDS

汇编后相当于指令:

MOV AL,1

MOV CX,10

MOV BX,1

MOV DX,5

MOV AL,LENGTH A1

MOV CX,LENGTH A2

MOV BX, LENGTH A3

MOV DX,LENGTH A4

Company Logo

slide21

第三章:汇编语言程序设计

SIZE——取变量所含的数据存储区大小操作符

格式:SIZE 变量

功能:汇编程序用该操作符返回的值表示该变量所分配的总字

节数。

SIZE=LENGTH×TYPE

例:A2 DW 10 DUP(1),1234H

MOV CX,SIZE A2

汇编后相当于有指令: MOV CX, 14H

Company Logo

slide22

第三章:汇编语言程序设计

2) 属性修改操作符

属性修改操作符主要用于临时修改变量、标号或某个内存单元中的操作数的类型属性,它们共有5种(看书)。

PTR——属性定义操作符

格式:类型 PTR 地址表达式

功能:PTR操作符的作用是将地址表达式的原类型属性临时修改成PTR操作符前面所指定的类型。指定的类型可以是BYTE、WORD或DWORD。

例:MOVBYTE PTR [SI], 20H;占一个字节

或 MOVWORD PTR [SI], 20H ;占两个字节

Company Logo

slide23

第三章:汇编语言程序设计

运算符的优先顺序

Company Logo

slide24

第三章:汇编语言程序设计

§3.2 伪指令

伪指令又称伪操作,它不像机器指令那样是在程序运行期间由计算机来执行的,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如数据定义、分配存储区、指示程序结束等功能。

§3.2.1 数据定义与符号定义伪指令

1. 数据定义伪指令

格式:[变量名] 数据定义伪指令 操作数项表

功能:定义数据存储区,其类型由伪指令指定。

Company Logo

slide25

第三章:汇编语言程序设计

  • 数据定义伪指令常用的有以下五种:
      • [变量名] DB 操作数项表;定义字节
      • [变量名] DW 操作数项表;定义字
      • [变量名] DD 操作数项表;定义双字
      • [变量名] DQ 操作数项表;定义8个字节
      • [变量名] DT 操作数项表;定义10个字节

操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。

Company Logo

slide26
给变量赋初值或指定变量类型

例:COUNT DB 100

ARRAY DW -1,1024

64H

100

-1

1024

存储形式:COUNT→

ARRAY→

FFH

FFH

00H

04H

第三章:汇编语言程序设计

Company Logo

slide27

STR:

41H

STR1:

42H

42H

41H

43H

44H

定义一个ASCⅡ码的字符串

第三章:汇编语言程序设计

为字符串的每个字符分配一个存储单元,并从左到右

将字符的ASCⅡ码按地址递增顺序存放在内存中。

例1: STR DB ‘ABCD’ 例2: STR1 DW ‘AB’

Company Logo

slide28

SUB1:

RESU:

第三章:汇编语言程序设计

  • 用?号预留内存单元
  • 例: SUB1 DB ? ;预留一个字节单元
  • RESU DW ? ;预留二个字节单元

Company Logo

1 da1 db 2 dup 0 da2 db 2 dup ab da3 dw 2 dup 1

00

DA1

00

41

DA2

42

41

42

01

DA3

00

01

00

例1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1)

第三章:汇编语言程序设计

  • 用DUP重复因子初始化一个数据区
  • 格式:N DUP (表达式)

?、数值、 数值表达式 字符等

重复次数重复装入的内容

例2:DUP的嵌套使用DATA DB 10 DUP(10 DUP(0))定义了100个字节全部初始化为0。

Company Logo

slide30

第三章:汇编语言程序设计

2. 符号定义伪指令

EQU——赋值伪指令

格式:变量名 EQU 表达式

功能:将右边表达式的值赋给左边的变量。表达式可以是常

数、变量、标号、指令助记符、数值表达式、地址表达

式。

例:PORT1 EQU 100 ;符号PORT1代表常数100

CONT EQU CX ;为CX重新命名

ABDR EQU PORT1+1

ABC EQU DAA

注:同一程序中,不能重复定义

Company Logo

slide31

第三章:汇编语言程序设计

=——等号伪指令

格式:符号名 = 表达式

功能:与EQU基本相同,两者的区别在于“=”伪指令可对同

一标识符作重新定义。

例:EMP = 12 ;定义EMP等于12

EMP = EMP+1

可以对同一个符号名重复定义。

Company Logo

slide32

第三章:汇编语言程序设计

§ 3.2.2 段定义伪指令

1. 段定义伪指令

存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。

格式如下:

段名 SEGMENT [定位类型] [组合类型][‘类别’]

段名ENDS

Company Logo

slide33

第三章:汇编语言程序设计

一般情况下,定位类型、组合类型和类别说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。

注意:SEGMENT和ENDS语句必须成对使用。

例:定义一数据段DATA

DATA SEGMENT

A DB '1234'

B DW 12H

DATA ENDS

Company Logo

slide34

第三章:汇编语言程序设计

2. 指定段址伪指令

格式:ASSUME 段寄存器:段名[,段寄存器:段名,...]

功能:指明段和段寄存器的对应关系,且段名必须是由

SEGMENT定义的段名。

注意:ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器CS的值是由系统负责设置的。

Company Logo

slide35

第三章:汇编语言程序设计

例:DATA SEGMENT

X DB 12H

DATA ENDS

STACK SEGMENT

DW 100 DUP(?)

STACK ENDS

CODE SEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACK

START:MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

CODE ENDS

END START

Company Logo

slide36

第三章:汇编语言程序设计

§ 3.2.3 模块定义伪指令

1. 模块定义伪指令NAME/END(程序开始与结束语句)

格式:NAME 模块名

END 标号

功能:由NAME和END定义一个程序模块。标号为模块执行时

的起始地址。

说明:① 如果程序中没有NAME伪指令,则将用源程序文件名

作为模块名。

② 标号指示程序开始执行的起始地址的标号。

Company Logo

slide37

第三章:汇编语言程序设计

NAME ABSOLT

DATA SEGMENT

OPER1 DW 12

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

HLT

CODE ENDS

END START

Company Logo

slide38

第三章:汇编语言程序设计

§ 3.2.4 过程定义伪指令

格式为:过程名 PROC [NEAR/FAR]

RET

过程名 ENDP

功能:过程定义伪指令用于定义子程序。段内调用使用NEAR

属性,段间调用使用FAR属性。省略为NEAR。

Company Logo

slide39

第三章:汇编语言程序设计

CODE SEGMENT

COUNT PROC NEAR

ADD CX,1

RET

COUNTENDP

START:MOV AX,100

CALL COUNT

CALL COUNT

HLT

CODE ENDS

END START

子程序:

COUNT PROCE

RET

Company Logo

slide40

12H

DS: 0100 0101

0102 0103

0104 0105

0106 0107

22H

11H

00

00

第三章:汇编语言程序设计

§ 3.2.5 其他伪指令

1. ORG伪指令

格式:ORG 数值表达式。

功能:指定在它之后的程序段或数据块所存放的起始地址的

偏移量。

  • 无ORG语句时,段偏移地址从0000H开始。

例1. DATA SEGMENT

ORG 100H

X DB 12H

Y DW ?

Z DD 1122H

DATA ENDS

  • $-表示汇编地址计数器的当前值

$

Company Logo

slide41

第三章:汇编语言程序设计

利用$-变量名,动态确定数据区字节

例2. DATA SEGMENT

DA1 DB 1,2,3,4

DA2 DW 4 DUP(?)

COUNT EQU $-DA1 ;

DATA ENDS

Count=?

12-0→COUNT

Company Logo

slide42

第三章:汇编语言程序设计

§ 3.2.6 汇编语言源程序的结构

一般格式如下:

NAME 模块名(可有可无)

数据段名SEGMENT

变量定义

数据空间预置

数据段名ENDS

附加段名SEGMENT

变量定义

数据空间预置

附加段名ENDS

堆栈段名SEGMENT PARA STACK ‘STACK’

堆栈段空间预置

堆栈段名ENDS

代码段名SEGMENT

ASSUME CS:代码段名,DS:数据段名,ES:附加段名,SS:堆栈段名

Start: 指令1

指令2

指令n

代码段名ENDS

END start

Company Logo

slide43
§3.3 宏指令

第三章:汇编语言程序设计

  • 宏定义:

格式: 宏指令名 MACRO [形式参数表]

ENDM

  • 宏调用:

格式: 宏指令名 [实际参数,…]

宏指令——源程序中一个能多次可重复使用的具有独立功能

的代码段。

1、宏指令的定义和使用

宏指令的使用过程有宏定义、宏调用、宏展开。

宏指令体

Company Logo

slide44

第三章:汇编语言程序设计

例:完成AX的内容乘以2X的宏定义及宏调用

定义宏:MULX MACRO PX 形式参数

宏指令名 MOV CL,PX

SAL AX,CL

ENDM

实际参数

宏调用: ┆

MULX 2 ;

MULX 4 ;

MULX 5 ;

AX←(AX)*22

AX←(AX)*24

AX←(AX)*25

Company Logo

slide45

第三章:汇编语言程序设计

宏调用:

MULT 120,BL,SAVE

宏展开:在汇编宏指令时,宏汇编程序将宏指令体插入到宏指

令所在的位置,并用实际参数代替形式参数。

例:两数相乘,返回积。

宏定义:MULT MACRO OPR1,OPR2,RESULT

MOV AL,OPR1

IMUL OPR2

MOV RESULT,AX

ENDM

MOV AL,120

IMUL BL

MOV SAVE,AX

Company Logo

slide46

第三章:汇编语言程序设计

§ 3.4 常用的DOS与BIOS中断功能调用

§3.4.1 DOS中断与系统功能调用

1. DOS中断

DOS除了给用户提供了命令行服务以外,还为汇编语言程序员提供了大量的子程序,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于DOS提供的这些子程序被看作是DOS系统功能的一部分,因而人们把对这些子程序的调用又称为DOS功能调用。

Company Logo

slide47

第三章:汇编语言程序设计

DOS提供的这些子程序位于DOS的基本系统文件IBMBIO.COM和IBMDOS.COM中,随着DOS的加载而进入内存,即只要能启动DOS就可以使用。DOS的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须采用软中断指令INT进行调用。

随着DOS的发展,所提供的功能(子程序)越来越多,不可能每一个子程序都占用一个中断号,于是采用让它们共用一个中断号,即21H号的办法,进入这一个中断后,DOS再根据应用户程序中子程序编号的设置来确定用户程序到底想调用哪一个子功能。

Company Logo

slide48

第三章:汇编语言程序设计

  • 2. DOS系统功能调用
  • DOS功能调用的方法
    • 调置入口参数,如果所调用的子程序不需参数,则可省略此步。
    • 欲调用的子程序编号→AH。
    • 发中断调用指令INT 21H。
  • DOS基本I/O功能调用
    • 01功能——键盘输入

入口参数:无

  • 出口参数:所读取的字符ASCII码在AL内。

Company Logo

slide49

第三章:汇编语言程序设计

功能:扫描键盘,若有按键按下,将字符ASCII码放入AL

中,同时在屏幕上显示这个字符,然后返回。若无键

按下,该调用等待直到有键按下为止。

例: MOV AH , 01

INT 21H

  • 08功能——键盘输入。
  • 同01号类似,但是不在屏幕上显示输入的字符,在读取密码时常用本功能。

例: MOV AH , 08

INT 21H

Company Logo

slide50

第三章:汇编语言程序设计

  • 4CH功能——终止当前程序并返回操作系统。
  • 调用方法: MOV AH,4CH
  • INT 21H
  • 02H功能——显示字符(一个字符)
  • 调用方法:DL←要显示的字符或其ASCⅡ代码
  • AH←02H(调用号)
  • INT 21H
  • 注:如果字符是控制符,则实际执行相应的功能,如:在屏幕上显示一个换行符(0AH),实际上将光标转到下一行上去。

Company Logo

slide51

第三章:汇编语言程序设计

例:MOV DL ,‘0A'

MOV AH ,2

INT 21H

  • 09H功能——字符串输出显示
  • 调用方法:DX←要显示的字符串首地址
  • AH←09H(调用号)
  • INT 21H

注:预先将字符串存放于DX表示的首地址区域,字符串必须以

“$”作为结束符

Company Logo

slide52

第三章:汇编语言程序设计

例: DATA SEGMENT

BUF DB 'THIS IS A TEST ! $'

DATA ENDS

CODE SEGMENT

START: MOV AX , DATA

MOV DS , AX

MOV DX , OFFSET BUF

MOV AH , 9

INT 21H

MOV AH , 4CH

INT 21H

CODE ENDS

END START

Company Logo

slide53

第三章:汇编语言程序设计

  • 10号功能——字符串输入
  • 入口参数:DS:DX指向输入缓冲区。
  • 输入缓冲区具有如下格式:
    • 第一个字节:指明准备接收的最大字符数,包括回车符
    • 第二个字节保留,由DOS在功能调用结束后填入实际输入的字符个数(不包括最后的回车符)。
    • 用户输入的字符串从第三个单元开始存放

出口参数:用户实际输入字符个数在缓冲区第二个单元中。

Company Logo

slide54

第三章:汇编语言程序设计

DATA SEGMENT

BUF DB 8 ;指明最大字符数

DB ? ;保留,供DOS填入实际字符数

DB 8 DUP(?) ;用户输入的字符存放区

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE , DS:DATA

START: MOV AX , DATA

MOV DS , AX

MOV DX , OFFSET BUF

MOV AH , 10

INT 21H

… ;其他操作

MOV AH , 4CH

INT 21H

CODE END

Company Logo

slide55

第三章:汇编语言程序设计

【例3.13】 字符串的输入输出。

编一段程序先提示用户输入一个字符串,然后读取用户的输入,并将用户输入的数据在下行输出。

程序如下:

DATA SEGMENT

MESSAGE DB ‘PLEASE INPUT A STRING: $’ ;定义输入提示

BUF DB 255 , ? , 255 DUP(0)

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE , DS: DATA

START: MOV AX , DATA

MOV DS , AX

MOV DX , OFFSET MESSAGE

MOV AH , 9

INT 21H ;显示输入提示信息

Company Logo

slide56

第三章:汇编语言程序设计

MOV DX , OFFSET BUF

MOV AH , 10

INT 21H ;接收用户输入

MOV AH , 2

MOV DL , 0AH ;0AH为换行符ASCII码

INT 21H ;屏幕换行

MOV BL , BUF+1 ;用户实际输入字符数→BL

MOV BH , 0 ;将BX高8位清0,使BX=用户实际输入字符数

MOV BYTE PTR BUF+2[BX],'$’;在用户输入的字符结束处放置一个“$”

MOV DX , OFFSET BUF+2 ;用户实际输入字符起始处→DX

MOV AH , 9

INT 21H ;显示用户输入的字符

MOV AH , 4CH

INT 21H

CODE ENDS

END START

Company Logo

slide57

第三章:汇编语言程序设计

§ 3.5 顺序程序设计

程序有3种基本结构,即顺序结构、分支结构和循环结构。任何复杂的程序都是由基本结构组成的。顺序程序是最简单程序设计,这种程序不使用分支、循环结构,程序按顺序执行,只能完成相对简单的操作。限于这种特点,在进行顺序程序设计时应合理安排指令的先后顺序,以完成相应的功能。

§3.5.1 存储单元内容移位

存储单元移位是指其中的内容左移或右移若干位。

Company Logo

slide58

第三章:汇编语言程序设计

【例3.26】 将AX寄存器中的内容左移2位,字存储单元DAT中的内容右移3位(移位后的空位补0)。

分析:内容移位一般由移位指令实现,但要求移后空位为0,故应使用逻辑移位指令。当移位次数大于1时,可将移位次数放至CL中进行移位。操作如下:

MOV CL,2

SHL AX,CL

INC CL

SHR DAT,CL

Company Logo

slide59

第三章:汇编语言程序设计

§ 3.5.2 乘法运算

乘法运算可用乘法指令直接完成,也可以由移位指令或加法指令完成。

例: 将寄存器AL的内容乘10,结果存至DX寄存器。

分析:对一个数进行乘10运算,可以直接使用乘法指令实现,也可由移位指令或加法指令实现。

1、用乘法指令实现

MOV BL, 10

MUL BL ;AX←AL×BL=AL×10

MOV DX,AX

Company Logo

slide60

第三章:汇编语言程序设计

2. 用移位指令实现

  • XOR AH,AH ;AH清零
    • SHL AX,1 ;AX←AX×2
    • MOV BX,AX ;存至BX寄存器
    • MOV CL,2
    • SHL AX,CL ;AX←AX×8
    • ADD AX,BX ;AX←AX×10
    • MOV DX,AX

3. 用加法指令实现

  • MOV AH,0
  • ADD AX,AX ;AX←AX×2
  • MOV BX,AX ;存至BX寄存器
  • ADD AX,AX ;AX←AX×4
  • ADD AX,AX ;AX←AX×8
  • ADD AX,BX ;AX←AX×10
  • MOV DX,AX

Company Logo

slide61

第三章:汇编语言程序设计

§ 3.5.3 屏蔽与置位

对字节或字变量中的某些位进行置0操作,称为屏蔽操作。使某些位强迫置1则是置位操作。

例: 将字节类型变量DAT的高4位置0,其余各位保持不变

  • 解:屏蔽操作多用逻辑运算指令实现。
      • MOV AL,DAT
      • AND AL,0FH ;屏蔽高四位
      • MOV DAT,AL
  • 一般使用逻辑或指令实现置位操作。
  • 例如把上例中DAT变量的高四位置1,用下面指令即实现即可:
  • OR DAT,0F0H

Company Logo

slide62

第三章:汇编语言程序设计

§3.5.4 拆字与合字

可以将一个存储单元中的内容拆开分别存放,也可以将两个单元的内容合在一起。

例: 将存储单元DAT中两位压缩的BCD数拆成两个非压缩BCD数(高位放在DAT+1单元,低位放在DAT+2单元)。

分析:可用移位的方法和逻辑与运算来实现。

程序如下:

MOV AL,DAT

MOV CL,4

SHR AL,CL ;得到高位BCD数

MOV DAT+1,AL

MOV AL,DAT

AND AL,0FH ;得到低位BCD数

MOV DAT+2,AL

Company Logo

slide63

第三章:汇编语言程序设计

§ 3.5.5 数据与ASCII码的相互转换

如果要将一个数据显示在屏幕上,就要将显示的数据转换为ASCII码后,再调用相关的中断来显示。从键盘上输入的数据,是以ASCII码形式输入的,通常转换为数据本身再进行处理。

例: 在字节存储单元DAT中有2位十六进制的数据为65H,要求将该数据显示到屏幕上。

分析:先将每一位数转换为ASCII码,再调用DOS 02 功能,把数据显示在屏幕上。

Company Logo

slide64

第三章:汇编语言程序设计

DATA SEGMENT

DAT DB 65H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV DL,DAT

MOV AL,DL ;暂存至AL寄存器

MOV CL,4

SHR DL,CL

ADD DL,30H ;高位十六进制数据‘6’转换为ASCII码

MOV AH,02H

INT 21H ;显示

MOV DL,AL

AND DL,0FH

OR DL,30H ;低位十六进制数据‘A’转换为ASCII码

INT 21H ;显示

MOV AH,4CH

INT 21H

CODE ENDS

END START

Company Logo

slide65

第三章:汇编语言程序设计

§ 3.5.6 查表

利用表格进行数据检索处理,是数据处理的重要方法之一,一般称之为查表法。当表格不太复杂时,可采用顺序程序设计。

【例3.33】 在以TABLE为首地址的内存中顺序存有0~10的平方数表。从键盘上输入一位数,求其平方值,结果保存至RSLT单元。

分析:只要把输入数据作为位移量与首址相加,就指向了表中平方值的地址,取其内容即为该数的平方值。

程序如下:

Company Logo

slide66

第三章:汇编语言程序设计

DATA SEGMENT

TABLE DB 0,1,4,9,16,25,36,49,64,81,100

RSLT DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:cODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AH,08H

INT 21H ;输入数据

AND AL,0FH ;将ASCII码转换为数据

XOR BX,BX

MOV BL,AL ;存至BX

LEA SI,TABLE

MOV AL,[SI+BX] ;查表

MOV RSLT,AL ;保存结果

MOV AH,4CH

INT 21H

CODE ENDS

END START

Company Logo

slide67

第三章:汇编语言程序设计

§ 3.6 分支程序设计

分支程序使计算机具备判断能力,计算机可以根据给定的条件进行断断,并作出相应的处理。从而使计算机具有一定的“思维”能力。汇编语言的分支主要由转移指令实现。

§ 3.6.1 单重分支

如果条件成立则完成某项操作,否则执行其他操作或后续指令。

(b)条件不同执行不同操作

(a) 条件不成立执行后续指令

Company Logo

slide68

第三章:汇编语言程序设计

【例3.34】 在存储单元DAT中存放着1位十六进制数,将其显示到屏幕上。

分析:本题只需对该位十六进制数进行判断,方法同前。程序如下:

DATA SEGMENT

DAT DB 0CH

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AL,DAT

CMP AL,9

JG OTHR

ADD AL,30H ;小于10则转换为数字(0~9)

JMP DISP

OTHR: ADD AL,37H ;大于10则转换为大写字母(A~F)

DISP: MOV DL,AL

MOV AH,2

INT 21H

DONE: MOV AH,4CH

INT 21H

CODE ENDS

END START

Company Logo

slide69

第三章:汇编语言程序设计

【例3.35】在字节存储单元X、Y中各有一个无符号数。根据这两个无符号数的大小,在屏幕显示X≥Y或X<Y。

分析:两个无符号数比大小用比较指令CMP,根据其对标志位的影响用无符号条件转移指令实现转移。

程序如下:

DATA SEGMENT

X DB 98H

Y DB 0A0H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

Company Logo

slide70

第三章:汇编语言程序设计

      • MOV AL,X
      • CMP Y,AL ;比较
      • JA YGX ;Y大于X则转YGEX
      • MOV AL,'≥'
      • JMP DISP
  • YGX: MOV AL,'<'
  • DISP: MOV DL,'X' ;显示比较结果
      • MOV AH,2
      • INT 21H
      • MOV DL,AL
      • INT 21H
      • MOV DL,'Y'
      • INT 21H
      • MOV AH,4CH
      • INT 21H
  • CODE ENDS
    • END START

Company Logo

slide71

第三章:汇编语言程序设计

3.6.2 多重分支

在程序设计中,对几个条件同时进行判断从而确定程序的转移方向,此时只能采用数个单重分支的组合来完成,这就是多重分支结构。

  • 例3.36】 求函数 :
    • X+10H (X<0)
    • Y= 32X (0≤X≤10) ;其中X、Y都是有符号字变量。
    • X- 90H (X>10)

分析:本题有3个条件进行判断,故属于多重分支程序设计。

DATA SEGMENT

X DW ?

Y DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE,DS:DATA

Company Logo

slide72

第三章:汇编语言程序设计

START:MOV AX , DATA

MOV DS , AX

MOV AX , X

CMP AX , 0

JGE CASE23

ADD AX , 10H ;第一种情况的计算结果

JMP RESULT

CASE23:CMP AX , 10D

JG CASE3

MOV BX,30D

IMUL BX ;第二种情况的计算结果

JMP RESULT

CASE3: SUB AX , 90H ;第三种情况的计算结果

RESULT:MOV Y , AX ;结果保存到变量Y中

MOV AH , 4CH

INT 21H

CODE ENDS

END START

Company Logo

slide73

第三章:汇编语言程序设计

§ 3.7 循环程序设计

在进行程序设计时,会出现某段程序反复多次执行的情况,则可用循环程序结构来实现。采用循环程序结构不仅使程序变得简洁清晰,而且减少程序对内存的占用。

§ 3.7.1 循环程序的结构

循环程序一般由4部分构成:

1. 初始化部分

为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。

2. 循环工作部分

是循环结构的主体。

Company Logo

slide74

第三章:汇编语言程序设计

3. 参数调整部分

地址指针或循环次数的修改等,以便继续循环。

4. 循环控制部分

循环条件的检查,以判断是否继续循环。

(a) 先工作后判断循环条件

(b) 先判断循环条件后工作

Company Logo

slide75

第三章:汇编语言程序设计

§3.7.2 单重循环

程序中只有一个循环体,循环体内不再含有其他循环体。

【例3.38】 求1~400的所有偶数的和,结果保存到RSLT存储单元。

分析:1~400间共有200个偶数,需循环200次。程序中CX寄存器同时充当了循环计数器和200个偶数值,使每一次循环CX的值减2,故CX初值为400。

程序如下:DATA SEGMENT

RSLT DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

Company Logo

slide76

第三章:汇编语言程序设计

    • START:MOV AX,DATA
  • MOV DS,AX
  • MOV CX,400
  • XOR AX,AX
  • NEXT:ADD AX,CX ;计算偶数和
  • DEC CX
  • DEC CX
  • JNZ NEXT ;200个数未完则继续循环
  • MOV RSLT,AX ;保存结果
  • MOV AH,4CH
  • INT 21H
  • CODE ENDS
  • END START

Company Logo

slide77

第三章:汇编语言程序设计

【例3.39】 在以DAT为首地址的字缓冲区中存有10个数,找出其最大的值,结果存入RSLT单元。

程序如下:

DATA SEGMENT

DAT DW 1234H,0ABH,0ABCDH,9999H,0

DW 1,5678H,0BBCCH,9876H,5678H

RSLT DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

Company Logo

slide78

第三章:汇编语言程序设计

      • LEA SI,DAT ;SI做地址指针
      • MOV AX,[SI]
      • MOV CX,9 ;10个数共比较9次
      • INC SI
      • INC SI
  • NEXT: CMP AX,[SI]
  • JGE GOON ;AX大于下一个数则转GOON
  • MOV AX,[SI] ;否则将大值付给AX
  • GOON:INC SI
  • INC SI ;修改地址指针
  • LOOP NEXT ;循环
  • MOV RSLT,AX ;保存结果
  • MOV AH,4CH
  • INT 21H
  • CODE ENDS
  • END START

Company Logo

slide79

第三章:汇编语言程序设计

§ 3.7.3 多重循环

多重循环就是循环体内含有其他循环体的结构,也称为循环嵌套。多重循环以双重循环最为常用,内外层的循环由程序员用跳转指令控制,要注意不同循环体之间的界限。

【例3.41】 在以STRG为首地址的缓冲区中存放着十六进制数“0”~“4”的ASCII码,编程以下面的格式将这些数据显示到屏幕上。

0 1 2 3 4

1 2 3 4 0

2 3 4 0 1

3 4 0 1 2

4 0 1 2 3

分析:采用双重循环程序实现,内循环实现每行7个数据的显示(含回车与换行的ASCII码),外循环则控制显示的行数5。

Company Logo

slide80

第三章:汇编语言程序设计

程序如下:

DATA EGMENT

STRG DB 30H,31H,32H,33H,34H,30H,31H,32H,33H,34H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DI,5 ;显示行数为5

XOR BX,BX ;BX清零

Company Logo

slide81

第三章:汇编语言程序设计

NEXT: LEA SI,STRG

ADD SI,BX ;BX寄存器用于调整数据位置

MOV CX,5 ;每行显示数据数

MOV AH,2

DISP: MOV DL,[SI]

INT 21H

MOV DL,’’ ;数据间以空格相间隔

INT 21H

INC SI

LOOP DISP ;内循环

MOV DL,0AH ;换行

INT 21H

MOV DL,0DH ;回车

INT 21H

INC BX

DEC DI

JNZ NEXT ;外循环

MOV AH,4CH

INT 21H

CODE ENDS

END START

Company Logo

slide82

第三章:汇编语言程序设计

§3.8 子程序设计

如果在程序中,某程序段是连在一起反复执行的,则可用循环程序结构来实现。但如果这样的程序段是在程序的不同位置反复执行,则不能用循环程序结构,此时有两种方法可提高编程效率,即采用子程序或宏。

§ 3.8.1 子程序与调用程序

子程序是一个过程,它是由调用程序或主程序用CALL指令调用的。而子程序的返回是由RET指令实现的。主程序与子程序的调用关系如下所示:

Company Logo

slide84

第三章:汇编语言程序设计

1. 段内调用

供段内调用的子程序必须被定义为NEAR类型,并与主程序位于同一个代码段中。

【例3.42】 在以STRG为首地址的缓冲区中存放着一个字符串,以―1作为结束标志,编程统计字符串长度,并将结果存入LENTH单元。要求统计字符串用子程序完成。

DATA SEGMENT

STRG DB 'HFEUWINFD4632wjo#$4',-1

LENTH DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

Company Logo

slide85

第三章:汇编语言程序设计

LEA DX,STRG ;DX为字符串首地址,作入口参数

CALL SCONT ;调用子程序

MOV LENTH,BX ;保存结果

MOV AH,4CH

INT 21H

SCONT PROC NEAR

PUSH SI ;保护寄存器

XOR BX,BX ;DX寄存器用于统计结果

MOV SI,DX ;传递地址指针

NEXT: CMP BYTE PTR [SI],-1 ;是否结束标志

JZ OVER ;是则转OVER

INC BX ;统计

INC SI ;修改地址指针

JMP NEXT

OVER: POP SI

RET

SCONT ENDP

CODE ENDS

END START

Company Logo

slide86

第三章:汇编语言程序设计

2. 段间调用

供段间调用的子程序必须被定义为FAR类型,并与主程序位于不同的代码段中。

【例3.43】 从键盘上输入一个长度小于100的字符串,存入以BUFF为首地址的缓冲区,其中如有大写字母,要求用子程序转换为小写字母,字符串以回车键作为结束。

分析:子程序的功能是将大写字母转换为小写字母,并单独占用一个代码段。程序如下:

DATA SEGMENT

BUFF DB 100 DUP(?)

DATA ENDS

CODE1 SEGMENT

ASSUME CS:CODE1,DS:DATA

Company Logo

slide87

第三章:汇编语言程序设计

START:MOV AX,DATA

MOV DS,AX

LEA SI,BUFF ;置地址指针

NEXT: MOV AH,00H

INT 16H

CMP AL,0DH

JZ DONE ;是回车键则结束

CALL FAR PTR CHANG;调用子程序

MOV [SI],AL ;保存

INC SI ;修改地址指针

JMP NEXT

DONE: MOV AH,4CH

INT 21H

CODE1 ENDS

Company Logo

slide88

第三章:汇编语言程序设计

CODE2 SEGMENT

ASSUME CS:CODE2

CHANG PROC FAR

CMP AL,'A'

JB OVER

CMP AL,'Z'

JA OVER

ADD AL,20H ;是大写字母则转换为小写字母

OVER: RET

CHANG ENDP

CODE2 ENDS

END START

Company Logo