汇编语言程序设计 1
4.1 汇编语言语句种类及其格式
1.基本语句机器指令语句:对应机器的一种操作,产生对应的目标代码。
伪指令语句:不产生对应的目标代码,伪汇编程序服务。
宏指令语句:用一条语句定义一组语句指令,产生一组机器指令的目标代码或一组伪指令定的功能。
2.指令语句格式,[标号,] 指令助记符 [操作数 [,操作数 ]] [;注释 ]
3.伪指令语句格式,[符号名 ] 伪指令 [参数,……,参数 ] [;注释 ]
第四章 汇编语言汇编语言程序设计 2
4.标识符 (Identifier)
指令语句中的标号和伪指令语句中的符号名统称为标识符。
它们是由若干字符构成的。标识符的组成规则如下:
字符个数不多于 31个;
第一个字符必须是字母,问号,?”,,@”或下划线,_”这四种字符中的一个;
从第二个字符开始,可以是字母,数字,?,@或 _;
不能使用属于系统专用保留字 (Reserved word)。
汇编语言程序设计 3
4.2汇编语言数据及伪指令一、汇编语言数据
1.常数
( 1)数值常数,
二进制常数:以字母 B结尾,0和 1组成的序列,0111001B
十进制常数:以字母 D结尾(或省略),由 0- 9的数字组成的序列。
十六进制常数:以字母 H结尾,由 0- F组成的序列。
八进制常数:以字母 Q结尾,由 0- 7组成的序列,如,12345Q
( 2)串常数,由单引号括起来的一个或多个字符组成。
如:‘ A’,’ABC’
汇编语言程序设计 4
常数主要出现在,
(1)在指令语句的源操作数中作立即数,它应与目的操作数的位数相一致,可以是 8位或 16位二进制数。
(2)在指令语句的寻址方式中作位移量。如:
(3)在数据定义伪指令中。
汇编语言程序设计 5
2.变量定义:数据存放地址的符号表示变量有三种属性:
段属性:变量所在段的段首址偏移地址属性:段首址到变量处的字节个数类型属性:字节或字等类型,由类型定义伪指令定义。
DB:字节类型-- 1个字节
DW:字类型-- 2个字节
DD:双字节类型-- 4个字节
DQ:四字类型-- 8个字节
DT:十字节类型-- 1个数据占 10个字节汇编语言程序设计 6
在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下 几种情况,
①数值表达式:例如:
DA_BYTE DB 23H,23
DA_WORD DW 0ABFH,1234H
②?表达式:不带引号的? 表示可预置任何内容。
例如
DA_B DB?,?
DA_W DW?,?
汇编语言程序设计 7
③ 字符串表达式:
对于 DB伪指令,为字符串中每一个字符分配一个字节单元。字符串必须是用引号括起来的不超过 255
个字符。字符串自左至右以字符的 ASCII编码按地址递增的排列顺序依次存放。例如:
STRl DB ‘ABCDEF’
在存储器中存放的情况如图 4.1(a)所示 。
对于 DW伪指令,可以给两个字符组成的字符串分配两个字节存储单元,而且这两个字符 ASCII码的存储顺序是前一字符在高字节,后一字符在低字节 。
每一个数据项只能是 1~ 2个
STR2 DW ‘AB’,‘ CD’,‘ E’
汇编语言程序设计 8
④ 带 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个字节单元汇编语言程序设计 9
变量的使用
在指令语句中:如要对某存储单元进行存取操作,就可直接引用它的变量名 (即符号地址 ),例如:
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]
汇编语言程序设计 10
在伪指令语句中:例如:
NUM DB 26H
SZ1 DW 10H DUP(0)
DZl DW NUM
DZ2 DD NUM
DZ3 DW SZ1[2]
汇编语言程序设计 11
例,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
汇编语言程序设计 12
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’
DATA
若 DW存地址,则取它的 EA
初始化变量若用 DD存地址,
则取它的 EA初始化前一个字单元,取段首址初始化第二字单元。
+ 6 ‘1’
+ 7 ‘2’
+ 8 ‘3’
+ 9 1
+ 0AH 2
+ 0BH 3
汇编语言程序设计 13
3.标号定义:机器指令语句存放地址的符号表示,也可表示过程名。
用于:转移指令和 CALL语句的操作数项。
标号有三种属性:段,偏移地址及类型。
段属性:指定义该标号所在段的段首址。
偏移地址属性:标号的偏移地址为 16位无符号数,它表示段起始地址到定义符号的位置之间的字节数。
类型属性:制定符号在本段使用,还是在其它段中使用:
NEAR:本段使用
FAR:段外使用汇编语言程序设计 14
设置标号距离属性可以有以下两个办法
①隐含方式:当在指令语句中,使用标号后,它就隐含有 NEAR属性。如:

LOPl,MOV AX,30H

这时,标号 LOPl的距离属性为 NEAR,表示它只能被本段的转移和调用指令所访问。隐含方式不可能有 FAR
属性。
汇编语言程序设计 15
② 用 LABEL伪指令赋予标号的距离属性 。 LABEL伪指令格式是:
名称 LABEL 类型其中名称是一个标识符,它可作为一个标号,也可作为一个变量名。伪指令 LABEL通常要与指令语句或用 DB、
DW,DD伪指令的数据定义语句连用。这时,名称就为与之连用的指令或变量建立一个新的标识符 (即新的标号或变量名 ),以便补充或设置与之连用的指令或变量的类型属性。因此,这个伪指令的名称同样有段、偏移量、类型三个属性。若与指令连用,类型属性分为 NEAR和 FAR两种;若与变量连用,类型属性就分为 BYTE,WORD和 DWORD
等。它的段和偏移量同与之连用的指令或变量相同。
汇编语言程序设计 16
二、表达式与运算符
表达式
算术运算符
逻辑运算符
关系运算符
分析操作符
属性操作 符
运算符优先级表达式 是操作数常见的形式,它是由常数、变量、标号通过操作运算符连接而成的。任一表达式的值是在程序汇编过程中进行计算确定的,不是在程序运行时求得的。
( 1)算术运算符,+,-,×,/,MOD,SHR (右移),SHL(左移)
其中,SHR,SHL表示将常量右移或左移运算符,右边所规定的次数(正数),空出的数位均补 0。
汇编语言程序设计 17
如,MOV AL,A SHR 3 (立即数)
若 A=11111111B,则:
表达式,A SHR 3,结果为 00011111B AL
( 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
立即数汇编语言程序设计 18
( 4)分析操作符
TYPE
格式,TYPE变量或标号功能:若是变量:回送该变量以字节数表示的类型,DB为 1,
DW为 2,DD为 4,DQ为 8,DT为 10。
若是标号:回送代表该标号类型的数值,NEAR为 0FFFFH,
FAR为 0FFFEH。
LENGTH,取存贮单元个数算符
SIZE,取存贮区大小算符
SEG,取段首址算符
OFFSET,取偏移地址算符汇编语言程序设计 19
例,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
汇编语言程序设计 20
( 5) 属性操作符 PTR
格式:类型 PTR 地址表达式其中:类型为:
BYTE 字节
WORD 字
DWORD 双字
NEAR 段内
FAR 段外汇编语言程序设计 21
例如:在上例中
:
:
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
汇编程序规定:
单操作指令中的操作数的类型必须明确,且不能为立即数。
双操作指令中,
如果两个操作数的类型均明确,则类型必须一致。
如果一个操作数的类型明确,另一个模糊,则两个操作数类型以明确的那一个为准。
汇编语言程序设计 22
例,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 ×
汇编语言程序设计 23
(6)算符优先级,
括号(圆括号,方括号,尖括号),SIZE,LENGTH
:
PTR OFFSET,SEG,TYPE,THIS
HIGH,LOW
*,/,MOD,SHL,SHR
+,-
EQ,NE,LT,LE,GT,GE
NOT
AND
OR,XOR
SHORT
高低汇编语言程序设计 24
三,伪指令语句包括,符号定义语句数据定义语句段定义语句过程定义语句结束语句作用,为汇编程序服务,如给变量按类型分配存贮单元,说明段和过程属性等。
汇编语言程序设计 25
1.符号定义伪指令
等价伪指令格式:符号名 EQU 表达式用途:给符号名定义一个值,别的符号名,一条可执行命令等。
例如,PORT EQU 256
BUF EQU PORT+2
等号伪指令格式:符号名=表达式如,EMP=6
EMP=9
注,? 等号伪指令可以给已定义符号名重新定义值,而等价伪指令不能对符号名重新定义值。
不为已定义的符号名分配存贮单元。
汇编语言程序设计 26
2.过程定义伪指令格式:过程名 PROC [NEAR]/FAR
:
RET
过程名 ENDP
汇编语言程序设计 27
3.置汇编地址计数器伪指令汇编地址计数器用 $符号表示。每汇编一个新段,则把汇编地址计数器置为 0,然后按语句汇编后的长度增值。段内的所有标号或变量的偏移地址就是 $的值。
如,DATA SEGMENT
BUF DB ‘12345’
COUN EQU $-BUF ;COUN的值为 BUF数据区所占的字节数,
即 COUN= 5
A DB ‘$’
DATA ENDS
汇编语言程序设计 28
设置汇编地址计数器的值的伪指令 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
其它伪指令:命令伪指令,结束伪指令等见书。
汇编语言程序设计 29
4.3汇编语言程序的段结构一、完整的段结构
1.段定义伪指令格式:段名 SEGMENT [定位类型 ] [组合类型 ] [‘类型 ’ ]

段名 ENDS
其中,? 段名为用户自己定义的标识符:可以定义数据段,
附加数据段,堆栈段和程序代码段。
定位类型,组合类型,类别分别用来指明段名的属性,
一般在特定情况下选用,它们提供段的属性给连接装配程序,用于对各段装配时使用。
如:
定位类型:告诉连接程序,前段放完后,后一段将从什么起始地址边界存放。
汇编语言程序设计 30
PAGE(页):表示此段物理地址起始地址后 8位为 0
即 ×××× ×××× ×××× 0000 0000
PARA(节):表示此段物理地址起始地址后 4位为 0
即 ×××× ×××× ×××× ×××× 0000
WORD(字):表示此段必须从字的边界开始即 ×××× ×××× ×××× ×××× ××× 0
BYTE(字节):表示此段可以从任何地址开始即 ×××× ×××× ×××× ×××× ××××
省略定位类型,即为 PARA
组合类型:告诉连接程序,本段与其它段的关系。
汇编语言程序设计 31
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定位形式。
汇编语言程序设计 32
1000H:0000H 0FFH
1000H:0001H 0FFH
:,
:,
1000H:0054H 0FFH
1000H:0055H,
:,
1000H:005FH,
1006H:0000H 00
:,
1006H:0063H 00
DAT1段共 55H个字节两个段之间浪费
1个字节
DAT2段共 64H
字节
DAT1 DS
1000H
DAT2 ES
1006H
若选用 WORD,说明 DAT2物理首址为偶数开始即 1000H:0056H,只浪费 1个字节单元若用 BYTE,不浪费单元若 DAT2选用 PAGE,则 DAT1与 DAT2之间浪费 171个字节单元。
汇编语言程序设计 33
例:组合类型:
一个大型汇编源程序可能会有若干个模块组成(一个以 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’
汇编语言程序设计 34
模块 1,
A SEGMENT PARA PUBLIC ‘S’
A1 DB 55H DUP(0)
A ENDS
B SEGMENT PARA COMMON ‘S1’
B1 DB 202H DUP(0)
B ENDS
模块 2
:
A SEGMENT PARA PUBLIC ‘S’
A2 DB 103H DUP(0FFH)
A ENDS
B SEGMENT PARA COMMON ‘S1’
B2 DB 104H DUP(0)
B ENDS
0000H:0000H 00
:,
0000H:0054H 00
空 11个字节单元
0000H:0060H 0FFH
:
0000H:0162H 0FFH
空 13个字节单元
0017H:0000H 00
:
0017H:0201H 00
:
:
A段
B段邻接存放不超过 64K
B1和
B2公共存贮区
(覆盖存放)
汇编语言程序设计 35
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
汇编语言程序设计 36
注,(1)每一次 CPU最多访问 4个段。
(2)必须用 ASSUME建立 CS,SS与代码段和堆栈段的关系。以避免写跨段前缀。
(3)对于数据段,可用 ASSUME建立与 DS,ES的关系,也可不用。同时,不必写跨段前缀。否则需写跨段前缀。
如:上例:如不用 ASSUME建立 A,D与 DS,ES的联系,则必在 EI处写,EI,MOV AX,DS:AA
汇编语言程序设计 37
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
汇编语言程序设计 38
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)。
汇编语言程序设计 39
(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)。 中间不要插入另外的指令 。
汇编语言程序设计 40
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
汇编语言程序设计 41
(2)在程序运行期间,当执行某些指令或操作时,CPU自动修改 CS和 IP
使它们指向新的 代码段,例如:
·执行段间过程调用指令 CALL和段间返回指令 RET;
·执行段间无条件转移指令 JMP;
·响应中断及中断返回指令 IRET;
·执行硬件复位 (RESET)操作 。
以上几种情况,不需要程序员干预,程序自动修改 CS,IP的内容 。
汇编语言程序设计 42
二,简化的段结构
1,模式选择伪指令,MODEL
模式选择伪指令用来指定该汇编程序所使用的内存模式,
内存模式说明了程序中的数据及代码的缺省长度 。 使用简化的段定义的程序必须使用,MODEL指出内存模式,格式如下:
.MODEL 模式模式可选择 TINY,SMALL,MEDIUM,COMPACT,LARGE中的一种,一般选用 SMALL模式 。
2,数据段定义伪指令,DATA
伪指令,DATA定义数据段,格式如下:
.DATA [段名 ]
若段名缺省,则隐含段名为 _DATA。 如果有多个数据段,就要用段名来区分 。
汇编语言程序设计 43
3,代码段定义伪指令,CODE
伪指令,CODE代码段,格式如下:
.CODE [段名 ]
若段名缺省,则隐含段名为 _CODE。 如果有多个代码段,就要用段名来区分 。
4,堆栈段定义伪指令,STACK
伪指令,STACK定义堆栈段,格式如下:
.STACK [长度 ]
长度的默认值为 1024。
汇编语言程序设计 44
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退出汇编语言程序设计 45
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中的字符打印汇编语言程序设计 46
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?
汇编语言程序设计 47
5.键盘输入字符串:(功能调用号,10(或 0AH))
调用格式,LEA DX,存放字符串的首偏移地址
MOV AH,10
INT 21H
功能:从键盘上往 DS:DX所指的输入缓冲区输入以回车键结束的字符串,并送显示器显示。
对缓冲区的要求:
例如:
BUF DB 80
DB?
DB 80 DUP(0);第一个字节存放缓冲区大小,不能为 0,用户确定;第二个字节存放实际输入的字符个数,
系统填入;从键盘上输入字符串从第三个字节存放(如果超过则多余去掉,响铃告警)
汇编语言程序设计 48
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
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
举例:编程完成
(1)在屏幕上显示一行提示信息,? WHAT IS YOUR NAME?”
(2)接受用户从键盘输入的信息,并存入内存缓冲区汇编语言程序设计 49
上机题
(1)从键盘上接受一个小号字母,将它变成对应大写字母并显示。
(2)从键盘上接受一个字符,显示它的前导字符和后继字符。
汇编语言程序设计 50
汇编程序上机过程及操作一,上机环境及过程
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
错 错错汇编语言程序设计 51
二,源程序编辑过程
建立汇编源程序
可用多种编辑软件(如,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,-
汇编语言程序设计 52
( a)在光标处输入文件名后回车,如,A:AB.ASM
( b)在光标处打入 *.*,则显示该盘上的全部目录文件。
通过移动光标选择文件,并按回车,就会调入编辑窗口。
存贮文件,<F2>键
2.退出窗口按 <ESC>键退出现行窗口(每按一次,退出一个现行窗口,直至退出 SK,退出主选择窗口时,必须插入 SK盘到 A驱动器中)
3.编辑命令
SK编辑命令与 wordstar,turbo编辑命令基本兼容。
(1)移动光标
↑,光标向上移一行
↓,光标向下移一行
←,光标向左移一个字符位置
→,光标向右移一个字符位置
<PgUp>:向前翻一页
<PgDn>:向后翻一页汇编语言程序设计 53
(2)插入与删除
<INS>键:在插入状态插入
<DEL>键:删除光标所在字符
<Backpace>键:删除光标左侧一个字符
<Ctrl>+<Y>:删除光标所在行
(3)设置字块设置字块以便对字块进行删除,移动或复制操作。做完操作必须山区字块标记
<F7>:设置 /去掉字块首标记
<F8>:设置 /去掉字块尾标记
<ctrl>+<k>+<v>:将字块移动到当前光标处
<ctrl>+<k>+<c>:将字块复制到当前光标处
<ctrl>+<k>+<y>:删除字块汇编语言程序设计 54
三,汇编源程序在 DOS状态下:启动宏汇编程序:
MASM
A>MASM
:
Source filename [.ASM]:EXAM↙
Object filename [EXAM.OBJ]:↙
Source listing [NUL.LST],EXAM↙
Cross reference [NUL.CRF]:EXAM↙
A>MASM EXAM;↙ (不建立,LST,.CRF文件)
输入汇编源程序名询问目标文件名,通常按回车表示与源文件同名询问是否建立列表文件,
不要直接按回车,产生
.LST文件,汇编后的列表询问是否建立符号对照文件,CRF此时,需 CRET文件汇编若有错,则指出有错的语句符号和错误代码及类型。
汇编语言程序设计 55
四,目标文件的连接在 DOS状态下,启动 LINK程序
(1)A>LINK
:
Object Modules[.OBJ]:EXAM↙
Run File[EXAM.EXE]:↙
List File[NUL.MAP]:EXAM↙
Lisbraries [.LIB]:↙;询问连接文件名,如果有多个文件连接则用+号连接键入;询问是否产生新的文件名,一般按回车,表示与源目标文件同名;询问是否产生地址分配文件
.MAP,否则直接按回车;询问是否用到用户自己建立的库文件汇编语言程序设计 56
五,目标文件运行在 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