一、伪指令系统
1. 伪指令
指示引导指令运行的语句
2. 汇编语言语句(4部分)
通常汇编语言一条指令包括操作码和操作数两部分。
[ 名 字 符 ] { 伪 指 令 ( 变 量 / 标 号 ) 指 令 ( 标 号 ) [名字符]\begin{cases} 伪指令(变量/标号)\\ 指令(标号) \end{cases} [名字符]{伪指令(变量/标号)指令(标号)
变量和标号的三个属性:
- 变量(属性):段属性、偏移量属性和类型属性(对应数据(数据项的存储单位))
- 标号(属性):段属性、偏移量属性和类型属性(对应指令(距离属性,指标号和转移指令的距离))
助
记
符
{
伪
指
令
语
句
(
D
B
/
D
W
)
指
令
语
句
(
操
作
码
(
M
O
V
、
A
D
D
.
.
.
)
)
助记符\begin{cases} 伪指令语句(DB/DW)\\ 指令语句(操作码(MOV、ADD...)) \end{cases}
助记符{伪指令语句(DB/DW)指令语句(操作码(MOV、ADD...))
[
操
作
数
项
]
(
三
种
情
况
)
{
2
个
操
作
数
:
双
地
址
指
令
1
个
操
作
数
:
单
地
址
指
令
0
个
操
作
数
:
零
地
址
指
令
[操作数项](三种情况)\begin{cases} 2个操作数:双地址指令\\ 1个操作数:单地址指令\\ 0个操作数:零地址指令 \end{cases}
[操作数项](三种情况)⎩⎪⎨⎪⎧2个操作数:双地址指令1个操作数:单地址指令0个操作数:零地址指令
3. 五种伪指令
(1)数据定义伪指令
{ D B 定 义 字 节 ( 8 位 ) D W 定 义 字 ( 16 位 ) D D 定 义 双 字 ( 32 位 ) \begin{cases} DB\ 定义字节(8位)\\ DW\ 定义字(16位)\\ DD\ 定义双字(32位) \end{cases} ⎩⎪⎨⎪⎧DB 定义字节(8位)DW 定义字(16位)DD 定义双字(32位)
DB
例: b u f D B 1 , 2 , 3 buf\ DB\ 1,2,3 buf DB 1,2,3
b u f 1 D B ′ A ′ , ′ B ′ buf1\ DB\ 'A','B' buf1 DB ′A′,′B′
b u f 2 D B ′ 5 ′ , ? buf2\ DB\ '5',? buf2 DB ′5′,?
b u f 3 D B ′ C D ′ , ′ 5 6 ′ , 8 buf3\ DB\ 'CD','56',8 buf3 DB ′CD′,′56′,8
b u f 4 D B 100 ( ? ) buf4\ DB\ 100(?) buf4 DB 100(?)
b u f 5 D B 3 D U P ( 15 , 16 , ? ) buf5\ DB\ 3\ DUP(15,16,?) buf5 DB 3 DUP(15,16,?)
b u f 6 D B D U P ( 1 , 3 D U P ( 2 ) ) buf6\ DB\ DUP(1,3DUP(2)) buf6 DB DUP(1,3DUP(2))
01H | ← b u f \leftarrow buf ←buf |
---|---|
02H | |
03H | |
41H | ← b u f 1 \leftarrow buf1 ←buf1 |
42H | |
35H | ← b u f 2 \leftarrow buf2 ←buf2 |
43H | ← b u f 3 \leftarrow buf3 ←buf3 |
44H | |
35H | |
36H | |
08H | |
← b u f 4 \leftarrow buf4 ←buf4 | |
. | |
100个 | |
. | |
. | |
0FH | ← b u f 5 \leftarrow buf5 ←buf5 |
10H | |
0FH | |
10H | |
0FH | |
10H | |
1 | ← b u f 6 \leftarrow buf6 ←buf6 |
2 | |
2 | |
2 | |
1 | |
2 | |
2 | |
2 |
DW
例: a r 1 D W 1234 H , 5678 H ar1\ DW\ 1234H,5678H ar1 DW 1234H,5678H
a r 2 D W ′ A B ′ , ′ C D ′ ar2\ DW\ 'AB','CD' ar2 DW ′AB′,′CD′
a r 3 D W 2 D U P ( ? ) ar3\ DW\ 2DUP(?) ar3 DW 2DUP(?)
a r 4 D W ′ A ′ , ′ B ′ ar4\ DW\ 'A','B' ar4 DW ′A′,′B′
34H | ← a r 1 \leftarrow ar1 ←ar1 |
---|---|
12H | |
78H | |
56H | |
42H | ← a r 2 \leftarrow ar2 ←ar2 |
41H | |
44H | |
43H | |
← a r 3 \leftarrow ar3 ←ar3 | |
41H | ← a r 4 \leftarrow ar4 ←ar4 |
00H | |
42H | |
00H |
DD
例: A 1 D D 5 , 6 A1\ DD\ 5,6 A1 DD 5,6
05H | ← A 1 \leftarrow A1 ←A1 |
---|---|
00H | |
00H | |
00H | |
06H | |
00H | |
00H | |
00H |
(2)符号定义伪指令
①
符
号
名
E
Q
U
表
达
式
① 符号名 EQU 表达式
①符号名EQU表达式
x
E
Q
U
5
;
x
=
5
x\ EQU\ 5\qquad\color{DeepSkyblue}{;x=5}
x EQU 5;x=5
M
O
V
A
L
,
x
;
A
L
=
5
MOV\ AL,x\qquad\color{DeepSkyblue}{;AL=5}
MOV AL,x;AL=5
E
Q
U
不
占
用
内
存
空
间
EQU不占用内存空间
EQU不占用内存空间
②
O
R
G
指
明
下
一
变
量
的
偏
移
地
址
ORG 指明下一变量的偏移地址
ORG指明下一变量的偏移地址
③
O
F
F
S
E
T
取
得
标
号
的
偏
移
地
址
(
[
B
X
,
B
P
,
S
I
,
D
I
]
)
OFFSET取得标号的偏移地址([BX,BP,SI,DI])
OFFSET取得标号的偏移地址([BX,BP,SI,DI])
(3)段定义伪指令
①
{
段
名
S
e
g
m
e
n
t
.
.
.
段
名
e
n
d
s
①\begin{cases} 段名\ Segment\\ .\\ .\\ .\\ 段名\ ends \end{cases}
①⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧段名 Segment...段名 ends
②
a
s
s
u
m
e
D
S
:
段
名
,
C
S
:
段
名
,
S
S
:
段
名
,
E
S
:
段
名
② assume\ DS:段名,CS:段名,SS:段名,ES:段名
②assume DS:段名,CS:段名,SS:段名,ES:段名
③
汇
编
语
言
源
程
序
的
基
本
格
式
:
③ 汇编语言源程序的基本格式:
③汇编语言源程序的基本格式:
变
量
位
置
(
数
据
)
{
{
d
a
t
a
s
e
g
m
e
n
t
.
.
.
d
a
t
a
e
n
d
s
{
s
t
a
c
k
s
e
g
m
e
n
t
.
.
.
s
t
a
c
k
e
n
d
s
{
e
x
t
r
a
s
e
g
m
e
n
t
.
.
.
e
x
t
r
a
e
n
d
s
变量位置(数据)\begin{cases} \begin{cases} data\ segment\\ .\\ .\\ .\\ data\ ends \end{cases}\\ \begin{cases} stack\ segment .\\ .\\ .\\ stack\ ends \end{cases}\\ \begin{cases} extra\ segment .\\ .\\ .\\ extra\ ends \end{cases} \end{cases}
变量位置(数据)⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧data segment...data ends⎩⎪⎪⎪⎨⎪⎪⎪⎧stack segment...stack ends⎩⎪⎪⎪⎨⎪⎪⎪⎧extra segment...extra ends
定义一个大小为32个字的堆栈。
S S E G s e g m e n t s t a c k SSEG\ segment\ stack SSEG segment stack
D W 32 D U P ( ? ) \qquad DW\ 32\ DUP(?) DW 32 DUP(?)
S S E G e n d s SSEG\ ends SSEG ends
指
令
位
置
{
c
o
d
e
s
e
g
m
e
n
t
a
s
s
u
m
e
D
S
:
d
a
t
a
,
S
S
:
s
t
a
c
k
,
E
S
:
e
x
t
r
a
,
C
S
:
c
o
d
e
s
t
a
r
t
:
M
O
V
A
X
,
d
a
t
a
M
O
V
D
S
,
A
X
M
O
V
A
X
,
s
t
a
c
k
M
O
V
S
S
,
A
X
M
O
V
A
X
,
e
x
t
r
a
M
O
V
E
S
,
A
X
.
.
.
M
O
V
A
H
,
4
C
H
I
N
T
21
H
;
返
回
操
作
系
统
c
o
d
e
e
n
d
s
e
n
d
s
t
a
r
t
;
整
个
程
序
汇
编
结
束
指令位置\begin{cases} code\ segment\\ \qquad\quad assume\ DS:data,SS:stack,ES:extra,CS:code\\ start:MOV\ AX,data\\ \qquad\quad MOV\ DS,AX\\ \qquad\quad MOV\ AX,stack\\ \qquad\quad MOV\ SS,AX\\ \qquad\quad MOV\ AX,extra\\ \qquad\quad MOV\ ES,AX\\ \qquad\quad .\\ \qquad\quad .\\ \qquad\quad .\\ \qquad\quad MOV\ AH,4CH\\ \qquad\quad INT\ 21H\qquad\color{DeepSkyblue}{;返回操作系统}\\ code\ ends\\ end\ start\qquad\color{DeepSkyblue}{;整个程序汇编结束} \end{cases}
指令位置⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧code segmentassume DS:data,SS:stack,ES:extra,CS:codestart:MOV AX,dataMOV DS,AXMOV AX,stackMOV SS,AXMOV AX,extraMOV ES,AX...MOV AH,4CHINT 21H;返回操作系统code endsend start;整个程序汇编结束
④
段
属
性
:
[
定
位
类
型
]
[
组
合
类
型
]
[
类
别
]
④ 段属性:[定位类型] [组合类型] [类别]
④段属性:[定位类型][组合类型][类别]
⑤
一
个
程
序
中
,
至
少
有
一
个
代
码
段
⑤ 一个程序中,至少有一个代码段
⑤一个程序中,至少有一个代码段
定位类型
段起始边界要求
提供给连接程序,安排段在存储器中的链接方式
4种:PARA、BYTE、WORD、PAGE
定位类型 | 物理地址(20位,二进制) | 作用 |
---|---|---|
PARA(节边界) | XXXX XXXX XXXX XXXX 0000B | 默认值。段从一个节的边界开始,起始地址可被16整除。段之间最大间隙为15字节。 |
WORD(字边界) | XXXX XXXX XXXX XXXX XXX0B | 段从偶地址开始,段之间最大间隙为1字节 |
BYTE(字节边界) | XXXX XXXX XXXX XXXX XXXXB | 段从任一个物理地址开始。段之间无空隙 |
PAGE(页边界) | XXXX XXXX XXXX 0000 0000B | 段基址从—个页的边界开始,页大小为:256字节。段基址可被256整除。段之间最大空隙为256个字节 |
(4)过程定义伪指令
{
过
程
名
p
r
o
c
[
N
e
a
r
/
F
a
r
]
.
.
.
R
E
T
过
程
名
e
n
d
p
\begin{cases} 过程名\ proc\ [Near/Far] .\\ .\\ .\\ RET\\ 过程名\ endp \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧过程名 proc [Near/Far]...RET过程名 endp
汇编程序中,子程序定义中的最后一条可执行语句是RET指令。
(5) 结束伪指令
e n d [ 标 号 ] end\ [标号] end [标号]
二、汇编程序设计
程序结构
1. 顺序结构
例:屏幕显示字符串’hello world’
d a t a s e g m e n t data\ segment data segment
s t r i n g D B ′ h e l l o w o r l d \qquad\ string\ DB\ 'hello\ world string DB ′hello world$’
d a t a e n d s data\ ends data ends
c o d e s e g m e n t code\ segment code segment
a s s u m e D S : d a t a , C S : c o d e \qquad\ assume\ DS:data,CS:code assume DS:data,CS:code
s t a r t : start: start:
M O V A X , d a t a M O V D S , A X } ; 用 到 了 数 据 段 , 则 需 要 把 d a t a ( 数 据 ) 转 到 D S 数 据 段 寄 存 器 , 让 数 据 段 指 向 正 确 的 位 置 。 d a t a 不 是 指 令 , 而 是 伪 指 令 , 实 际 上 是 一 个 动 态 的 内 存 地 址 , 要 想 运 行 , 必 须 先 放 入 到 D S 中 , 但 是 内 存 数 不 能 放 入 段 地 址 。 M O V A X , D A T A 起 到 过 渡 作 用 \color{DeepSkyblue}{\left. \begin{matrix} \qquad\ \color{black} {MOV\ AX,data}\\ \qquad\ \color{black} {MOV\ DS,AX} \end{matrix} \right\};用到了数据段,则需要把data(数据) 转到 DS 数据段寄存器,让数据段指向正确的位置。data不是指令,而是伪指令,实际上是一个动态的内存地址,要想运行,必须先放入到DS中,但是内存数不能放入段地址。MOV AX,DATA起到过渡作用} MOV AX,data MOV DS,AX};用到了数据段,则需要把data(数据)转到DS数据段寄存器,让数据段指向正确的位置。data不是指令,而是伪指令,实际上是一个动态的内存地址,要想运行,必须先放入到DS中,但是内存数不能放入段地址。MOVAX,DATA起到过渡作用
L E A D X , s t r i n g M O V A H , 09 H I N T 21 H } ; 在 数 据 段 中 定 义 被 显 示 的 字 符 串 \color{DeepSkyblue}{\left. \begin{matrix} \qquad\ \color{black} LEA\ DX,string\\ \qquad\ \color{black} MOV\ AH,09H\\ \color{black} INT\ 21H\\ \end{matrix} \right\}\qquad\color{DeepSkyblue}{;在数据段中定义被显示的字符串}} LEA DX,string MOV AH,09HINT 21H⎭⎬⎫;在数据段中定义被显示的字符串
M O V A H , 4 C H \qquad\ MOV\ AH,4CH MOV AH,4CH
I N T 21 H ; 返 回 D O S \qquad\ INT\ 21H\qquad\color{DeepSkyblue}{;返回DOS} INT 21H;返回DOS
c o d e e n d s code\ ends code ends
e n d s t a r t end\ start end start
例:从键盘接收的小写转换为大写字母,并在屏幕显示
c o d e s e g m e n t code\ segment code segment
a s s m e C S : c o d e \qquad\ assme\ CS:code assme CS:code
s t a r t : start: start:
M O V A H , 01 H I N T 21 H } ; 从 键 盘 接 收 单 个 字 符 , 该 字 符 的 A S C I I 存 入 A L \color{DeepSkyblue}{\left. \begin{matrix} \qquad\ \color{black}MOV\ AH,01H\\ \color{black} INT\ 21H \end{matrix} \right\}\qquad{;从键盘接收单个字符,该字符的ASCII存入AL}} MOV AH,01HINT 21H};从键盘接收单个字符,该字符的ASCII存入AL
S U B A L , 20 H ; 小 写 字 母 的 A S C I I 码 ( 16 进 制 ) − 20 H 就 是 大 写 字 母 \qquad\ SUB\ AL,20H\qquad\color{DeepSkyblue}{;小写字母的ASCII码(16进制)-20H就是大写字母} SUB AL,20H;小写字母的ASCII码(16进制)−20H就是大写字母
M O V D L , A L M O V A H , 02 H I N T 21 H } ; 在 屏 幕 上 显 示 单 个 字 符 , 该 字 符 的 A S C I I 码 提 前 存 入 D L 中 \color{DeepSkyblue}{\left. \begin{matrix} \qquad \color{black}{MOV\ DL,AL}\\ \qquad\ \color{black}{MOV\ AH,02H}\\ \color{black}{INT\ 21H} \end{matrix} \right\}\qquad{;在屏幕上显示单个字符,该字符的ASCII码提前存入DL中}} MOV DL,AL MOV AH,02HINT 21H⎭⎬⎫;在屏幕上显示单个字符,该字符的ASCII码提前存入DL中
M O V A H , 4 C H I N T 21 H } ; 返 回 D O S 系 统 , 程 序 结 束 \color{DeepSkyblue}{\left. \begin{matrix} \qquad\ \color{black}MOV\ AH,4CH\\ \color{black}INT\ 21H \end{matrix} \right\}\qquad{;返回DOS系统,程序结束}} MOV AH,4CHINT 21H};返回DOS系统,程序结束
c o d e e n d s code\ ends code ends
e n d s t a r t end\ start end start
2. 分支结构
例:键盘接收小写字母转换成大写字母,若输入的不是小写字母,则结束
c o d e s e g m e n t code\ segment code segment
a s s u m e C S : c o d e \qquad\ assume\ CS:code assume CS:code
s t a r t : start: start:
M O V A H , 01 H I N T 21 H } ; 从 键 盘 接 收 单 个 字 符 , 该 字 符 的 A S C I I 存 入 A L \color{DeepSkyblue}{\left. \begin{matrix} \qquad\ \color{black}MOV\ AH,01H\\ \color{black} INT\ 21H \end{matrix} \right\}\qquad{;从键盘接收单个字符,该字符的ASCII存入AL}} MOV AH,01HINT 21H};从键盘接收单个字符,该字符的ASCII存入AL
C M P A L , ′ a ′ J B L 1 C M P A L , ′ z ′ J A L 1 } ; A S C I I 小 于 a 大 于 z 的 直 接 跳 转 L 1 \color{DeepSkyblue}{\left. \begin{matrix} \qquad\ \color{black}{CMP\ AL,'a'}\\ \color{black}{JB\ L1}\\ \qquad\ \color{black}{CMP\ AL,'z'}\\ \color{black}{JA\ L1}\\ \end{matrix} \right\}\qquad{;ASCII小于a大于z的直接跳转L1}} CMP AL,′a′JB L1 CMP AL,′z′JA L1⎭⎪⎪⎬⎪⎪⎫;ASCII小于a大于z的直接跳转L1
S U B A L , 20 H \qquad\ SUB\ AL,20H SUB AL,20H
M O V D L , A L M O V A H , 02 H I N T 21 H } ; 在 屏 幕 上 显 示 单 个 字 符 , 该 字 符 的 A S C I I 码 提 前 存 入 D L 中 \color{DeepSkyblue}{\left. \begin{matrix} \qquad \color{black}{MOV\ DL,AL}\\ \qquad\ \color{black}{MOV\ AH,02H}\\ \color{black}{INT\ 21H} \end{matrix} \right\}\qquad{;在屏幕上显示单个字符,该字符的ASCII码提前存入DL中}} MOV DL,AL MOV AH,02HINT 21H⎭⎬⎫;在屏幕上显示单个字符,该字符的ASCII码提前存入DL中
L 1 : M O V A H , 4 C H I N T 21 H } ; 返 回 D O S 系 统 , 程 序 结 束 \color{DeepSkyblue}{\left. \begin{matrix} \color{black}L1:MOV\ AH,4CH\\ \color{black}INT\ 21H \end{matrix} \right\}\qquad{;返回DOS系统,程序结束}} L1:MOV AH,4CHINT 21H};返回DOS系统,程序结束
c o d e e n d s code\ ends code ends
e n d s t a r t end\ start end start
上面L1则是标号
- 汇编语言中的标号是:符号地址
- 标号由1~8字符组成,头—个字符必须是字母。(标号长度不能超过31个字符)
- 不能使用汇编语言已定义的符号。
- 标号后必须跟冒号;
- 同一标号在一个程序中只能定义一次。
- ?和$不能单独作为记号
例:内存数据段buf为首地址的10个有符号字节数,求最小数,并存入MIN单元
d a t a s e g m e n t data\ segment data segment
b u f D B − 1 , 2 , 3 , 4 , − 5 , 6 , − 7 , 8 , 9 , 10 \qquad\ buf\ DB\ -1,2,3,4,-5,6,-7,8,9,10 buf DB −1,2,3,4,−5,6,−7,8,9,10
M I N D B ? \qquad\ MIN\ DB\ ? MIN DB ?
d a t a e n d s data\ ends data ends
c o d e s e g m e n t code\ segment code segment
a s s u m e D S : d a t a , C S : c o d e \qquad\ assume\ DS:data,CS:code assume DS:data,CS:code
s t a r t : start: start:
M O V A X , d a t a M O V D S , A X } ; 用 到 了 数 据 段 , 则 需 要 把 d a t a ( 数 据 ) 转 到 D S 数 据 段 寄 存 器 , 让 数 据 段 指 向 正 确 的 位 置 。 d a t a 不 是 指 令 , 而 是 伪 指 令 , 实 际 上 是 一 个 动 态 的 内 存 地 址 , 要 想 运 行 , 必 须 先 放 入 到 D S 中 , 但 是 内 存 数 不 能 放 入 段 地 址 。 M O V A X , D A T A 起 到 过 渡 作 用 \color{DeepSkyblue}{\left. \begin{matrix} \qquad\ \color{black} {MOV\ AX,data}\\ \qquad\ \color{black} {MOV\ DS,AX} \end{matrix} \right\};用到了数据段,则需要把data(数据) 转到 DS 数据段寄存器,让数据段指向正确的位置。data不是指令,而是伪指令,实际上是一个动态的内存地址,要想运行,必须先放入到DS中,但是内存数不能放入段地址。MOV AX,DATA起到过渡作用} MOV AX,data MOV DS,AX};用到了数据段,则需要把data(数据)转到DS数据段寄存器,让数据段指向正确的位置。data不是指令,而是伪指令,实际上是一个动态的内存地址,要想运行,必须先放入到DS中,但是内存数不能放入段地址。MOVAX,DATA起到过渡作用
B X , b u f \qquad\\ BX,buf BX,buf
M O V C X , 9 \qquad\ MOV\ CX,9 MOV CX,9
M O V A L , [ B X ] \qquad\ MOV\ AL,[BX] MOV AL,[BX]
L 2 : I N C B X L2:INC\ BX L2:INC BX
C M P A L , [ B X ] \qquad\ CMP\ AL,[BX] CMP AL,[BX]
J L E L 1 \qquad\ JLE\ L1 JLE L1
M O V A L , [ B X ] \qquad\ MOV\ AL,[BX] MOV AL,[BX]
L 1 : L O O P L 2 { D E C C X ; C X − 1 ➡ C X = 98 J N Z L 1 ; C X ≠ 0 时 跳 转 L 2 L1:LOOP\ L2 \color{DeepSkyblue}{\begin{cases} DEC\ CX\quad ;CX-1➡CX=98\\ JNZ\ L1\quad ;CX\not=0时跳转L2 \end{cases}} L1:LOOP L2{DEC CX;CX−1➡CX=98JNZ L1;CX=0时跳转L2
M O V M I N , A L \qquad\ MOV\ MIN,AL MOV MIN,AL
M O V A H , 4 C H I N T 21 H } ; 返 回 D O S 系 统 , 程 序 结 束 \color{DeepSkyblue}{\left. \begin{matrix} \color{black}\qquad MOV\ AH,4CH\\ \color{black}INT\ 21H \end{matrix} \right\}\qquad{;返回DOS系统,程序结束}} MOV AH,4CHINT 21H};返回DOS系统,程序结束
c o d e e n d s code\ ends code ends
e n d s t a r t end\ start end start
例:
Y { 1 , x > 0 0 , x = 0 − 1 , x < 0 Y \begin{cases} 1 &,x>0\\ 0 &,x=0\\ -1&,x<0 \end{cases} Y⎩⎪⎨⎪⎧10−1,x>0,x=0,x<0
d a t a s e g m e n t data\ segment data segment
X D B 5 \qquad\qquad X\ DB\ 5 X DB 5
Y D B ? \qquad\qquad Y\ DB\ ? Y DB ?
d a t a e n d s data\ ends data ends
c o d e s e g m e n t code\ segment code segment
a s s u m e D S : d a t a , C S : c o d e \qquad\qquad assume\ DS:data,CS:code assume DS:data,CS:code
s t a r t : start: start:
M O V A X , d a t a \qquad\qquad MOV\ AX,data MOV AX,data
M O V D S , A X \qquad\qquad MOV\ DS,AX MOV DS,AX
M O V A L , X \qquad\qquad MOV\ AL,X MOV AL,X
C M P A L , 0 \qquad\qquad CMP\ AL,0 CMP AL,0
J G L 1 \qquad\qquad JG\ L1 JG L1
C M P A L , 0 \qquad\qquad CMP\ AL,0 CMP AL,0
J Z L 2 \qquad\qquad JZ\ L2 JZ L2
L 1 : M O V A L , 1 \qquad L1:MOV\ AL,1 L1:MOV AL,1
J M P E X I T \qquad \qquad JMP\ EXIT JMP EXIT
L 2 : M O V A L . 0 \qquad L2:MOV\ AL.0 L2:MOV AL.0
E X I T : M O V A H , 4 C H I N T 21 H } ; 返 回 D O S 系 统 , 程 序 结 束 \color{DeepSkyblue}{\left. \begin{matrix} \color{black}EXIT:MOV\ AH,4CH\\ \color{black}INT\ 21H \end{matrix} \right\}\qquad{;返回DOS系统,程序结束}} EXIT:MOV AH,4CHINT 21H};返回DOS系统,程序结束
c o d e e n d s code\ ends code ends
e n d s t a r t end\ start end start
3. 循环结构
(循环程序设计中,要考虑的核心问题是循环的次数)
例:编程实现2+4+6+…+100累加和,并把和存入S单元。
d a t a s e g m e n t data\ segment data segment
S D W ? \qquad S\ DW\ ? S DW ?
d a t a e n d s data\ ends data ends
c o d e s e g m e n t code\ segment code segment
a s s u m e D S : d a t a , C S : c o d e \qquad assume\ DS:data,CS:code assume DS:data,CS:code
s t a r t : start: start:
; 初 始 化 \qquad\color{DeepSkyblue}{;初始化} ;初始化
M O V A X , d a t a \qquad MOV\ AX,data MOV AX,data
M O V D S , A X \qquad MOV\ DS,AX MOV DS,AX
M O V C X , 50 \qquad MOV\ CX,50 MOV CX,50
X O R A X , A X ; 自 身 和 自 身 异 或 ➡ 清 零 \qquad XOR\ AX,AX\qquad\color{DeepSkyblue}{;自身和自身异或}➡清零 XOR AX,AX;自身和自身异或➡清零
M O V B X , 2 \qquad MOV\ BX,2 MOV BX,2
; 循 环 体 \qquad\color{DeepSkyblue}{;循环体} ;循环体
L 1 : A D D A X , B X ; A X = 0 + 2... L1:ADD\ AX,BX\qquad\color{DeepSkyblue}{;AX=0+2...} L1:ADD AX,BX;AX=0+2...
I N C B X \qquad INC\ BX INC BX
I N C B X ; B X = 4... \qquad INC\ BX\qquad\color{DeepSkyblue}{;BX=4...} INC BX;BX=4...
L O O P L 1 ; C X 不 等 于 零 则 循 环 ( 跳 转 ) \qquad LOOP\ L1\qquad\color{DeepSkyblue}{;CX不等于零则循环(跳转)} LOOP L1;CX不等于零则循环(跳转)
M O V S , A X \qquad MOV\ S,AX MOV S,AX
M O V A H , 4 C H I N T 21 H } ; 返 回 D O S 系 统 , 程 序 结 束 \color{DeepSkyblue}{\left. \begin{matrix} \color{black}\qquad MOV\ AH,4CH\\ \color{black}INT\ 21H \end{matrix} \right\}\qquad{;返回DOS系统,程序结束}} MOV AH,4CHINT 21H};返回DOS系统,程序结束
c o d e e n d s code\ ends code ends
e n d s t a r t end\ start end start
三、汇编上机步骤
- 汇 编 源 文 件 扩 展 名 : . a s m 汇编源文件扩展名:.asm 汇编源文件扩展名:.asm
- . a s m M A S M . e x e 汇 编 语 言 > . o b j .asm\ \frac{MASM.exe\quad }{汇编语言}>\ .obj .asm 汇编语言MASM.exe> .obj
- . o b j L I N K . e x e 连 接 程 序 > . e x e .obj\ \frac{LINK.exe\quad }{连接程序}>\ .exe .obj 连接程序LINK.exe> .exe
- 运 行 : . e x e 运行:.exe 运行:.exe
- 调 试 : D e b u g . e x e { − R ; 显 示 寄 存 器 − U ; 反 汇 编 − D ; 显 示 内 存 区 − Q ; 退 出 调 试 调试:Debug.exe\begin{cases} -R\qquad\color{DeepSkyblue}{;显示寄存器}\\ -U\qquad\color{DeepSkyblue}{;反汇编}\\ -D\qquad\color{DeepSkyblue}{;显示内存区}\\ -Q\qquad\color{DeepSkyblue}{;退出调试}\\ \end{cases} 调试:Debug.exe⎩⎪⎪⎪⎨⎪⎪⎪⎧−R;显示寄存器−U;反汇编−D;显示内存区−Q;退出调试
四、宏
Macro
.
.
.endm
本文仅供本人学习总结使用,文中观点,均为本人拙见,如有错误或不妥之处,请及时指正。