4.1
Download
1 / 56

第四章 汇编语言 - PowerPoint PPT Presentation


  • 157 Views
  • Uploaded on

4.1 汇编语言语句种类及其格式 1. 基本语句 机器指令语句:对应机器的一种操作,产生对应的目标代码。 伪指令语句:不产生对应的目标代码,伪汇编程序服务。 宏指令语句:用一条语句定义一组语句指令,产生一组机器 指令的目标代码或一组伪指令定的功能。 2. 指令语句 格式: [ 标号: ] 指令助记符 [ 操作数 [ ,操作数 ]] [ ;注释 ] 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 ' 第四章 汇编语言' - cicily


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

4.1 汇编语言语句种类及其格式

1.基本语句

机器指令语句:对应机器的一种操作,产生对应的目标代码。

伪指令语句:不产生对应的目标代码,伪汇编程序服务。

宏指令语句:用一条语句定义一组语句指令,产生一组机器

指令的目标代码或一组伪指令定的功能。

2.指令语句

格式:[标号:] 指令助记符 [操作数[,操作数]] [;注释]

3.伪指令语句

格式:[符号名] 伪指令 [参数,……,参数] [;注释]

第四章 汇编语言

汇编语言程序设计


  • 4.标识符(Identifier)

  • 指令语句中的标号和伪指令语句中的符号名统称为标识符。它们是由若干字符构成的。标识符的组成规则如下:

  • 字符个数不多于31个;

  • 第一个字符必须是字母,问号“?”,“@”或下划线“_”这四种字符中的一个;

  • 从第二个字符开始,可以是字母,数字,?,@或_;

  • 不能使用属于系统专用保留字(Reserved word)。

汇编语言程序设计


4.2汇编语言数据及伪指令

一、汇编语言数据

1.常数

(1)数值常数:

二进制常数:以字母B结尾,0和1组成的序列:0111001B

十进制常数:以字母D结尾(或省略),由0-9的数字组成

的序列。

十六进制常数:以字母H结尾,由0-F组成的序列。

八进制常数:以字母Q结尾,由0-7组成的序列,如:12345Q

(2)串常数:由单引号括起来的一个或多个字符组成。

如:‘A’ , ’ABC’

汇编语言程序设计


常数主要出现在

(1)在指令语句的源操作数中作立即数,它应与目的操作数的位数相一致,可以是8位或16位二进制数。

(2)在指令语句的寻址方式中作位移量。如:

(3)在数据定义伪指令中。

汇编语言程序设计


2.变量

定义:数据存放地址的符号表示

变量有三种属性:

段属性:变量所在段的段首址

偏移地址属性:段首址到变量处的字节个数

类型属性:字节或字等类型,由类型定义伪指令定义。

DB:字节类型--1个字节

DW:字类型--2个字节

DD:双字节类型--4个字节

DQ:四字类型--8个字节

DT:十字节类型--1个数据占10个字节

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下几种情况:

①数值表达式:例如:

DA_BYTE DB 23H,23

DA_WORD DW 0ABFH,1234H

②?表达式:不带引号的 ? 表示可预置任何内容。 例如

DA_B DB ?,?

DA_W DW ?,?

汇编语言程序设计


  • 在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下字符串表达式:

  • 对于DB伪指令,为字符串中每一个字符分配一个字节单元。字符串必须是用引号括起来的不超过255个字符。字符串自左至右以字符的ASCII编码按地址递增的排列顺序依次存放。例如:

  • STRl DB ‘ABCDEF’

  • 在存储器中存放的情况如图4.1(a)所示。

  • 对于DW伪指令,可以给两个字符组成的字符串分配两个字节存储单元,而且这两个字符ASCII码的存储顺序是前一字符在高字节,后一字符在低字节。每一个数据项只能是1~2个

  • STR2 DW ‘AB’,‘CD’,‘E’

汇编语言程序设计


  • 在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下带DUP表达式:DUP是定义重复数据操作符。在表达式中,使用DUP操作符格式是:

  • DB

  • DW

  • [变量名] DD 表达式1 DUP(表达式2) ;注释

  • DF

  • DQ

  • DT

  • 其中表达式1是重复的次数,表达式2是重复的内容。

  • 例如:

  • D_DB1 DB 10H DUP(?)

  • D_DB2 DB 10H DUP(‘AB’)

  • D_DWl DW 10H DUP(9)

  • DUP操作符可以嵌套使用,即表达式2可以又是一个带DUP的表达式。例如

  • D_DB3 DB 10H DUP(3,2 DUP(8),6)

  • 表示重复10H个数据序列“3,8,8,6”,共占有40H个字节单元

汇编语言程序设计


  • 变量的使用在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

  • 在指令语句中:如要对某存储单元进行存取操作,就可直接引用它的变量名(即符号地址), 例如:

  • DA1 DB 0ABH

  • DA2 DW 34A5H

  • MOV AL ,DA1

  • MOV BX ,DA2

  • 在许多指令语句中,无论在源操作数还是目的操作数中,采用了寄存器相对寻址或相对基址变址寻址。这时,引用一个变量名就是取用它的偏移量。例如:

  • DA3 DB 10H DUP(?)

  • DA4 DW 10H DUP(1)

  • MOV DA3[SI],BL

  • ADD AX,DA4[BX][DI]

汇编语言程序设计


  • 在伪指令语句中:例如:在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

  • NUM DB 26H

  • SZ1 DW 10H DUP(0)

  • DZl DW NUM

  • DZ2 DD NUM

  • DZ3 DW SZ1[2]

汇编语言程序设计


例:在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下DATA SEGMENT

A DW M

BUF DB ‘AB’,0AH,0DH

CON EQU 500H

B DW 0FFAAH

D DD BUF

M DB 2 DUP(1),2 DUP(2,’B’),’123’,1,2,3

DATA ENDS

问:(1)若执行下列指令后,(AX)=?

LEA BX,M

MOV AX,[BX+4] ;(AX)= 4202H

(2)变量A,BUF,B,D,M的EA=?分别为:0,2,6,8,12

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下DW存

地址,则

取它的EA

初始化变量

A+0 0CH

+1 00

BUF+0 ’A’

+1 ’B’

+2 0AH

+3 0DH

B+0 0AAH

+1 0FFH

D+0 2

+1 0

+2

+3

M+0 01

+1 01

+2 2

+3 ’B’

+4 2

+5 ’B’

若用DD存地址,

则取它的EA初始化

前一个字单元,取

段首址初始化第二

字单元。

+6 ‘1’

+7 ‘2’

+8 ‘3’

+9 1

+0AH 2

+0BH 3

DATA

汇编语言程序设计


3.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下标号

定义:机器指令语句存放地址的符号表示,也可表示过程名。

用于:转移指令和CALL语句的操作数项。

标号有三种属性:段,偏移地址及类型。

段属性:指定义该标号所在段的段首址。

偏移地址属性:标号的偏移地址为16位无符号数,它表示段

起始地址到定义符号的位置之间的字节数。

类型属性:制定符号在本段使用,还是在其它段中使用:

NEAR:本段使用

FAR:段外使用

汇编语言程序设计


设置标号距离属性可以有以下两个办法在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

①隐含方式:当在指令语句中,使用标号后,它就隐含有NEAR属性。如:

LOPl:MOV AX,30H

这时,标号LOPl的距离属性为NEAR,表示它只能被本段的转移和调用指令所访问。隐含方式不可能有FAR属性。

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下用LABEL伪指令赋予标号的距离属性。LABEL伪指令格式是:

名称 LABEL 类型

其中名称是一个标识符,它可作为一个标号,也可作为一个变量名。伪指令LABEL通常要与指令语句或用DB、DW、DD伪指令的数据定义语句连用。这时,名称就为与之连用的指令或变量建立一个新的标识符(即新的标号或变量名),以便补充或设置与之连用的指令或变量的类型属性。因此,这个伪指令的名称同样有段、偏移量、类型三个属性。若与指令连用,类型属性分为NEAR和FAR两种;若与变量连用,类型属性就分为BYTE、WORD和DWORD等。它的段和偏移量同与之连用的指令或变量相同。

汇编语言程序设计


二、表达式与运算符在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

• 表达式

• 算术运算符

• 逻辑运算符

• 关系运算符

• 分析操作符

• 属性操作符

• 运算符优先级

表达式是操作数常见的形式,它是由常数、变量、标号通过操作运算符连接而成的。任一表达式的值是在程序汇编过程中进行计算确定的,不是在程序运行时求得的。

(1)算术运算符:+,-,×, /,MOD,SHR (右移),SHL(左移)

其中:SHR,SHL表示将常量右移或左移运算符,右边所规定的

次数(正数),空出的数位均补0。

汇编语言程序设计


如:在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下MOV AL,A SHR 3 (立即数)

若A=11111111B,则:

表达式:A SHR 3, 结果为00011111BAL

(2)逻辑运算符

按位操作运算符:AND(与),OR(或),XOR(异或),NOT(非)

注:运算法则同对应的指令运算

参加运算的必须是数字,结果是数字,只用于数值表达式中。

如:AND DX,789AH AND 0FH(立即数)

(3)关系运算符:EQ , NE , LT , GT , LE , GE

参加运算的两个对象必须是数字,或同一段中两个单元地址(EA)

结果:真值为:0FFFFH(全“1”),假值为0(全“0”)

如:MOV BX,3 LT 5 ;(BX)=0FFFFH

立即数

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下4)分析操作符

  • TYPE

  • 格式:TYPE变量或标号

  • 功能:若是变量:回送该变量以字节数表示的类型:DB为1,

  • DW为2,DD为4,DQ为8,DT为10。

  • 若是标号:回送代表该标号类型的数值:NEAR为0FFFFH,

  • FAR为0FFFEH。

  • LENGTH:取存贮单元个数算符

  • SIZE:取存贮区大小算符

  • SEG:取段首址算符

  • OFFSET:取偏移地址算符

汇编语言程序设计


例:在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下MOV BX,SEG OPE ;将OPE所在段的段首址送BX。

例子:

DAT SEGMENT

A DW 50,100,-70H

B DB ‘ABCDEF’,5 DUP(0)

C DW C-B ;变量C中的内容为以B为首址的数据存贮区

所占的字节数

DAT ENDS

:

:

MOV AX,SEG B ;DAT AX,将B所在段的段首址AX

MOV BX,OFFSET B ;6 BX,将B偏移地址是BX

MOV CX,TYPE B ;回送B变量的类型表示的字节数;即1 CX

MOV AX,A+2 ;(A+2)=100 AX,以A为首址再向下位移2个

: 字节的内容 AX

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下5)属性操作符PTR

格式:类型 PTR 地址表达式

其中:类型为:

BYTE 字节

WORD字

DWORD双字

NEAR段内

FAR段外

汇编语言程序设计


例如:在上例中在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

:

:

MOV AX,WORD PTR OPE ;0201H AX

MOV AL,BYTE PTR OPER ;34H AL

在运算时重新定义OPE的类型为字

(但OPE类型并没有改变)

重新定义OPER类型为字节

PTR是用来指派操作数的类型。

例:MOV [BX],0 ×;0是立即数没有类型,[BX]类型不明确

MOV WORD PTR [BX],0

汇编程序规定:

单操作指令中的操作数的类型必须明确,且不能为立即数。

双操作指令中,

如果两个操作数的类型均明确,则类型必须一致。

如果一个操作数的类型明确,另一个模糊,则两个操作数类型

以明确的那一个为准。

汇编语言程序设计


例:在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下DATA SGEMENT

NUM DB 11H,22H,33H

DATA ENDS

:

MOV AX,NUM ;×类型不一致

MOV AX,WORD PTR NUM ;(NUM)=2211H AX

MOV BL,NUM ;(NUM)=11H BL

MOV SI,0FFSET NUM ;NUM的EA SI

ADD 2[SI],2 ;×类型均不明确

INC [SI] ;类型不明确

DEC BYTE PTR [SI] ;OPD=[SI]=NUM

MOV BYTE PTR 2[SI],’A’

:

不能用PTR改变寄存器的类型MOV AL,BYTE PTR SI ×

地址表达式中不允许出现不带方括号的寄存器号

MOV AX,SI+5 ×

汇编语言程序设计


(6)在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下算符优先级:

括号(圆括号,方括号,尖括号),SIZE,LENGTH

:

PTR OFFSET,SEG,TYPE,THIS

HIGH,LOW

*,/,MOD,SHL,SHR

+,-

EQ,NE,LT,LE,GT,GE

NOT

AND

OR,XOR

SHORT

汇编语言程序设计


三、 伪指令语句在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

包括:符号定义语句

数据定义语句

段定义语句

过程定义语句

结束语句

作用:为汇编程序服务,如给变量按类型分配存贮单元,说明

段和过程属性等。

汇编语言程序设计


  • 1.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下符号定义伪指令

  • 等价伪指令

  • 格式:符号名 EQU 表达式

  • 用途:给符号名定义一个值,别的符号名,一条可执行命令

  • 等。

  • 例如:PORT EQU 256

  • BUF EQU PORT+2

  • 等号伪指令

  • 格式:符号名=表达式

  • 如:EMP=6

  • EMP=9

  • 注:•等号伪指令可以给已定义符号名重新定义值,而等

  • 价伪指令不能对符号名重新定义值。

  • •不为已定义的符号名分配存贮单元。

汇编语言程序设计


2.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下过程定义伪指令

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

:

RET

过程名 ENDP

汇编语言程序设计


3.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下置汇编地址计数器伪指令

汇编地址计数器用$符号表示。每汇编一个新段,则把汇编地

址计数器置为0,然后按语句汇编后的长度增值。段内的所有

标号或变量的偏移地址就是$的值。

如:DATA SEGMENT

BUF DB ‘12345’

COUN EQU $-BUF ;COUN的值为BUF数据区所占的字节数,

即COUN=5

A DB ‘$’

DATA ENDS

汇编语言程序设计


设置汇编地址计数器的值的伪指令在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下ORG

格式:ORG 数值表达式

功能:将汇编地址计数器设置成数值表达式之值(其值为

0-65535之间的非负整数)

如:DATA SEGMENT

ORG 10

BUF DB ‘ABCD’

ORG $+5

NUM DW 50

DATA ENDS

;设置$的值为10,即该段的目标代码从偏移地址10处开始产生

;变量BUF的偏移地址为10

;$的值增5,即空出5个字节

;变量NUM的偏移地址为19

其它伪指令:命令伪指令,结束伪指令等见书。

汇编语言程序设计


4.3在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下汇编语言程序的段结构

一、完整的段结构

1.段定义伪指令

格式:段名 SEGMENT [定位类型] [组合类型] [‘类型’]

段名 ENDS

其中:• 段名为用户自己定义的标识符:可以定义数据段,

附加数据段,堆栈段和程序代码段。

• 定位类型,组合类型,类别分别用来指明段名的属性,

一般在特定情况下选用,它们提供段的属性给连接装配

程序,用于对各段装配时使用。

如:

定位类型:告诉连接程序,前段放完后,后一段将从

什么起始地址边界存放。

汇编语言程序设计


PAGE在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下(页):表示此段物理地址起始地址后8位为0

即×××× ×××× ×××× 0000 0000

PARA(节):表示此段物理地址起始地址后4位为0

即×××× ×××× ×××× ×××× 0000

WORD(字):表示此段必须从字的边界开始

即×××× ×××× ×××× ×××× ×××0

BYTE(字节):表示此段可以从任何地址开始

即×××× ×××× ×××× ×××× ××××

省略定位类型,即为PARA

组合类型:告诉连接程序,本段与其它段的关系。

汇编语言程序设计


NONE在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下:本段与其它段在逻辑上不发生关系,每段有自己的

基地址:隐含的组合类型。

PUBLIC:把本段与同类别的其它段相邻地连在一起,给定

一个共同段基地址,大小不超过64K。

STACK:指定该段在运行时为堆栈的一部分。

COMMON:连接程序为本段与其它同名同类别段指定相同

的基地址,产生覆盖存贮。

AT表达式:连接程序把本段装在表达式的值所指定的段地址

上,它不能指定代码段。

MEMORY:连接程序将把本段定位在被连接一起的其它所有

段之上。

例:DAT1 SEGMENT

A DB 55H DUP(0FFH)

DAT1 ENDS

DAT2 SEGMENT

DB 64H DUP(0)

DAT2 ENDS

它们均未指定定位方式,即

定位方式为PARA,连接后:

一般选用PARA定位形式。

汇编语言程序设计


1000H:0000H 0FFH在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

1000H:0001H 0FFH

: :

: :

1000H:0054H 0FFH

1000H:0055H :

: :

1000H:005FH :

1006H:0000H 00

: :

1006H:0063H 00

DAT1 DS

DAT1段

共55H个

字节

1000H

两个段

之间浪费

1个字节

DAT2 ES

DAT2段

共64H

字节

1006H

若选用WORD,说明DAT2物理首址为偶数开始

即1000H:0056H,只浪费1个字节单元

若用BYTE,不浪费单元

若DAT2选用PAGE,则DAT1与DAT2之间浪费171个字节单元。

汇编语言程序设计


例:组合类型:在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

一个大型汇编源程序可能会有若干个模块组成(一个以END结束

为一个模块),模块内可能包含若干个段,当把模块连接装配

起来时,会出现多个代码数据段或堆栈段的情况。给程序编号

与调试带来不变,加之PC的CPU一次只能同时访问4个段,因此

可利组合类型指示连接程序,将各模块的相同性质的段组合成

一个数据段,一个堆栈段,在编写程序时不考虑段的连接问题。

类别为单引号括起来的字符串,一般为:‘CODE’,’DATA’,

‘DATA’,’STACK’

功能:按类别名相同的段(段名不一定相同)组织起来存放

在连接的存贮区中。

如:A SEGMENT ‘DATA’连接后,在生成.EXE中,位置为:

B SEGMENT ‘CODE’ A SEGMENT ‘DATA’

C SEGMENT ‘DATA’ C SEGMENT ‘DATA’

B SEGMENT ‘CODE’

汇编语言程序设计


模块在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下1

0000H:0000H 00

: :

0000H:0054H 00

空11个字

节单元

0000H:0060H 0FFH

:

0000H:0162H 0FFH

空13个字

节单元

0017H:0000H 00

:

0017H:0201H 00

:

:

:

A SEGMENT PARA PUBLIC ‘S’

A1 DB 55H DUP(0)

A ENDS

B SEGMENT PARA COMMON ‘S1’

B1 DB 202H DUP(0)

B ENDS

邻接

存放

不超

过64K

A段

模块2

B1和

B2公

共存

贮区

(覆

盖存

放)

:

A SEGMENT PARA PUBLIC ‘S’

A2 DB 103H DUP(0FFH)

A ENDS

B SEGMENT PARA COMMON ‘S1’

B2 DB 104H DUP(0)

B ENDS

B段

汇编语言程序设计


2.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下ASSUME伪指令

指明定义的当前段与段寄存器的关系

格式 :ASSUME段寄存器名:段名,段寄存器:段名,……

例:A SEGMENT

:

AA DW 0FFH

A ENDS

B SEGMENT STACK

:

B ENDS

C SEGMENT

C1 DB ‘A’

C ENDS

D SEGMENT

:

DD1 DW 11H

:

D ENDS

E SEGMENT

ASSUME CS:E,SS:B,DS:A,ES:D

MOV AX,A

MOV DS,AX

MOV AX,D

MOV ES,AX

E1:MOV AX,AA

E2:MOV DD,AX

ASSUME DS:NOTHING

ASSUME DS:C

MOV AX,C1

:

E ENDS

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下:(1)每一次CPU最多访问4个段。

(2)必须用ASSUME建立CS,SS与代码段和堆栈段的关系。以

避免写跨段前缀。

(3)对于数据段,可用ASSUME建立与DS,ES的关系,也可不

用。同时,不必写跨段前缀。否则需写跨段前缀。

如:上例:如不用ASSUME建立A,D与DS,ES的联系,则必

在EI处写:EI:MOV AX,DS:AA

汇编语言程序设计


  • 3.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下段寄存器的装入

  • DS和ES的装入

  • 在程序中,引用段名就是以立即数形式获取该段的段基值,而立即数又不能直接传送给段寄存器,所以一个段的段基值要经过通用寄存器传送给DS,ES。例如:

  • DATA_DS SEGMENT

  • DAl DB ?

  • DATA_DS ENDS

  • DATA_ES SEGMENT

  • DA2 DB ?

  • DATA_ES ENDS

  • CODE SEGMENT

  • ASSUME CS:CODE,DS:DATA_DS,ES:DATA_ES

  • START: MOV AX,DATA_DS

  • MOV DS,AX

  • MOV AX,DATA_ES

  • MOV ES,AX

  • CODE ENDS

汇编语言程序设计


  • SS在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下的装入

  • 装入办法有两个:

  • (1)段定义伪指令的组合类型项选择“STACK”参数,且在段寻址伪指令(Assume)语句中,把堆栈用的这个段指派给段寄存器SS。例如:

  • STACK1 SEGMENT PARA STACK

  • DB 60H DUP(?)

  • STACKl ENDS

  • CODE SEGMENT

  • ASSUME CS:CODE,SS:STACKl

  • 这样,当这个程序目标代码装入存储器后,SS中已自动装入STACK段的段基值,且堆栈指针SP也指向堆栈底部+1的存储单元(在上例中(SP)=60H)。

汇编语言程序设计


(2)在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下若在段定义伪指令的组合类型中,未选用“STACK”参数项,或在程序中要调换另一个堆栈段,可用类似于DS,ES的装入办法,且需几条指令来实现对SS和SP的装入。例如:

STACK1 SEGMENT

DW 50H DUP(?)

TOP LABEL WORD

STACK1 ENDS

CODE SEGMENT

MOV AX,STACK1

MOV SS,AX

MOV SP,OFFSET TOP

上述示例中,假设STACK1段是程序中要使用的堆栈段(50H个字),那么TOP就是该堆栈的初始堆栈顶部。待用前两条指令把堆栈段的段基值装入SS后,紧接着必须用一条指令初始化堆栈指针SP(在示例中(SP)=100H)。中间不要插入另外的指令。

汇编语言程序设计


  • CS在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下的装入

  • 在程序执行过程中,CS提供了当前执行目标代码的段基值,而IP提供下一条目标代码的偏移量。为保证程序的正确执行,CS和IP装入新值必须一起完成。对CS,IP的装入通常是:

  • (1)按照结束伪指令END指定地址装入CS和IP。任何一个源程序都以END伪指令来结束。这个伪指令的格式是:

  • END 起始地址

  • 起始地址可以是一个标号或表达式。该起始地址是程序装入内存后,开始执行的起始点。通常,程序执行的第一条语句(不一定是源程序的第一条指令语句!)设置一个标号。如:

  • CODE SEGMENT

  • ASSUME CS:CODE

  • BEGIN: MOV AX,DATA

  • CODE ENDS

  • END BEGIN

汇编语言程序设计


(2)在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下在程序运行期间,当执行某些指令或操作时,CPU自动修改CS和IP使它们指向新的代码段,例如:

·执行段间过程调用指令CALL和段间返回指令RET;

·执行段间无条件转移指令JMP;

·响应中断及中断返回指令IRET;

·执行硬件复位(RESET)操作。

以上几种情况,不需要程序员干预,程序自动修改CS、IP的内容。

汇编语言程序设计


二、简化的段结构 在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

1、模式选择伪指令.MODEL

模式选择伪指令用来指定该汇编程序所使用的内存模式,内存模式说明了程序中的数据及代码的缺省长度。使用简化的段定义的程序必须使用.MODEL指出内存模式,格式如下:

.MODEL 模式

模式可选择TINY、SMALL、MEDIUM、COMPACT、LARGE中的一种,一般选用SMALL模式。

2、数据段定义伪指令.DATA

伪指令.DATA定义数据段,格式如下:

.DATA [段名]

若段名缺省,则隐含段名为_DATA。如果有多个数据段,就要用段名来区分。

汇编语言程序设计


3在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下、代码段定义伪指令.CODE

伪指令.CODE代码段,格式如下:

.CODE [段名]

若段名缺省,则隐含段名为_CODE。如果有多个代码段,就要用段名来区分。

4、堆栈段定义伪指令.STACK

伪指令.STACK定义堆栈段,格式如下:

.STACK [长度]

长度的默认值为1024。

汇编语言程序设计


3.4在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下常用的I/O系统功能调用

直接调用DOS中功能子程序(即在DOS级上调用):详见P405

系统功能 设备管理(I/O系统功能调用)

文件管理

目录管理

其它管理

调用的一般过程:•功能编号 AH,置入口参数

•执行软中断语句INT 21H

•判错

常用的I/O系统功能调用:

1.键盘输入(调用功能号1)

调用格式:MOV AH,1

INT 21H

功能:等待从键盘输入一个字符并将输入字符的

ASCII码⇒AL,若按CTRL+BREAK退出

汇编语言程序设计


2.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下显示输出(调用功能号2)

调用格式:MOV DL,’a’;待显示字符(如‘a’)的ASCII码 DL

MOV AH,2

INT 21H

功能:将DL中的字符送屏幕。若DL中为(CTRL+BREAK的ASCII

码,退出)

例:MOV DL,0DH

MOV AH,2

INT 21H

MOV DL,0AH

INT 21H

显示回车

显示换行

3.打印输出(功能调用号5)

调用格式:MOV DL,’a’ ;待打印字符 DL

MOV AH,5

INT 21H

功能:将DL中的字符打印

汇编语言程序设计


4.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下显示字符串(功能调用号9)

调用格式:LEA DX,字符串偏移地址

MOV AH,9

INT 21H

功能:将当前数据区中DS:DX所指向的以‘$’结尾的字符串送

屏幕显示。

注:若字符串中包含字符串‘$’,则不能采用本调用,只能循环

地使用2号调用。

例:DATA SEGMENT

BUF DB ‘HOW DO YOU DO?$’

DATA ENDS

:

LEA DX,BUF

MOV AH,9

INT 21H

输出字符串HOW DO YOU DO?

汇编语言程序设计


5.在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下键盘输入字符串:(功能调用号:10(或0AH))

调用格式:LEA DX,存放字符串的首偏移地址

MOV AH,10

INT 21H

功能:从键盘上往DS:DX所指的输入缓冲区输入以回车键结束

的字符串,并送显示器显示。

对缓冲区的要求:

例如:

BUF DB 80

DB ?

DB 80 DUP(0)

;第一个字节存放缓冲区大小,不能

为0,用户确定

;第二个字节存放实际输入的字符个数,

系统填入

;从键盘上输入字符串从第三个字节存

放(如果超过则多余去掉,响铃告警)

汇编语言程序设计


举例:编程完成在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

(1)在屏幕上显示一行提示信息:“WHAT IS YOUR NAME?”

(2)接受用户从键盘输入的信息,并存入内存缓冲区

S:MOV AX,DATA

MOV DS,AX

LEA DX,M

MOV AH,9

INT 21H

MOV DX,0FFSET P

MOV AH,10

INT 21H

MOV AH,4CH

INT 21H

CODE ENDS

END S

DATA SEGMENT

P DB 100

DB ?

DB 100 DUP(?)

M DB ‘WHAT IS YOUR NAME?$’

DATA ENDS

STACK SEGMENT STACK

DB 100 DUP(?)

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

汇编语言程序设计


上机题在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

(1)从键盘上接受一个小号字母,将它变成对应大写字母并显示。

(2)从键盘上接受一个字符,显示它的前导字符和后继字符。

汇编语言程序设计


汇编程序上机过程及操作在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下

一.上机环境及过程

1.环境:

必须准备下列软件:

操作系统:DOS(或UC-DOS)

编辑程序:WORDSTAR或SIDEKICK或TRURBO,EDIT等之一。

宏汇编程序:MASM.EXE,CREF

连接程序:LINK.EXE

调试程序:DEBUG.COM

库管理程序:LIB

2.过程

编辑TC产生

.ASM文件

宏汇编MASM

产生.OBJ文件

连接LINK

产生.EXE

调试DEBUG

.EXE

DOS下运行

.EXE

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下.源程序编辑过程

•建立汇编源程序

•可用多种编辑软件(如:WORDSTAR,SK或TURBO等)之一编辑

源程序

现以SK编辑软件为例,说明SK的编辑软件的使用:

SK是一种多功能窗口软件,它提供全屏幕窗口,

配有:编辑,计算器,万年日历,ASCII表,电话自动拨号,

文件设置等窗口软件。其编辑功能与WORDSTAR,TURBO兼容。

1.启动SK

(1)在DOS状态下:A>SK

SK程序被装入内存,并常驻内存(指出软盘照样可运行SK)

(2)按下<ALT>+<CTRL>键,进入主选择窗口

(3)•按下<ALT>+<N>键,进入SK的编辑窗口

•按下<F3>键,建立或调入一个新文件

显示:New note file : -

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下a)在光标处输入文件名后回车,如:A:AB.ASM

(b)在光标处打入*.*,则显示该盘上的全部目录文件。

通过移动光标选择文件,并按回车,就会调入编辑窗口。

•存贮文件:<F2>键

2.退出窗口

按<ESC>键退出现行窗口(每按一次,退出一个现行窗口,直

至退出SK,退出主选择窗口时,必须插入SK盘到A驱动器中)

3.编辑命令

SK编辑命令与wordstar,turbo编辑命令基本兼容。

(1)移动光标

↑:光标向上移一行

↓:光标向下移一行

←:光标向左移一个字符位置

→:光标向右移一个字符位置

<PgUp>:向前翻一页

<PgDn>:向后翻一页

汇编语言程序设计


(2)在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下插入与删除

<INS>键:在插入状态插入

<DEL>键:删除光标所在字符

<Backpace>键:删除光标左侧一个字符

<Ctrl>+<Y>:删除光标所在行

(3)设置字块

设置字块以便对字块进行删除,移动或复制操作。做完操

作必须山区字块标记

<F7>:设置/去掉字块首标记

<F8>:设置/去掉字块尾标记

<ctrl>+<k>+<v>:将字块移动到当前光标处

<ctrl>+<k>+<c>:将字块复制到当前光标处

<ctrl>+<k>+<y>:删除字块

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下.汇编源程序

在DOS状态下:启动宏汇编程序:

MASM

A>MASM

:

Source filename [.ASM]:EXAM↙

Object filename [EXAM.OBJ]:↙

Source listing [NUL.LST]:EXAM↙

Cross reference [NUL.CRF]:EXAM↙

输入汇编源程序名

询问目标文件名,通常按

回车表示与源文件同名

询问是否建立列表文件,

不要直接按回车,产生

.LST文件,汇编后的列表

询问是否建立符号对照文

件.CRF此时,需CRET文件

A>MASM EXAM;↙(不建立.LST ,.CRF文件)

汇编若有错,则指出有错的语句符号和错误代码及类型。

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下.目标文件的连接

在DOS状态下,启动LINK程序

(1)A>LINK

:

Object Modules[.OBJ]:EXAM↙

Run File[EXAM.EXE]:↙

List File[NUL.MAP]:EXAM↙

Lisbraries [.LIB]:↙

;询问连接文件名,如果有多个

文件连接则用+号连接键入

;询问是否产生新的文件名,一

般按回车,表示与源目标文件

同名

;询问是否产生地址分配文件

.MAP,否则直接按回车

;询问是否用到用户自己建立的

库文件

汇编语言程序设计


在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下.目标文件运行

在DOS状态下运行

A>EXAM↙

上机题目:

在显示器上显示如下一行信息:HOW ARE YOU!

STACK SEGMENT STACK

DB 200 DUP(0)

STACK ENDS

DATA SEGMENT

BUF DB ‘HOW ARE YOU!$’

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:MOV AX,DATA

MOV DS,AX

LEA DX,BUF

MOV AH,9

INT 21H

MOV AH,4CH

INT 21H

CODE ENDS

END START

汇编语言程序设计


ad