一、指令的寻址方式
寻址方式:寻找操作数地址的方式
找 操 作 数 { 1. C P U 的 寄 存 器 中 2. 主 存 找操作数\begin{cases} 1.\ CPU的寄存器中\\ 2.\ 主存 \end{cases} 找操作数{1. CPU的寄存器中2. 主存
以下都是针对源操作数来说的寻址方式,(按目的操作数来说,需要将操作数颠倒进行判断。)
源操作数:源即起始的意思,指被操作的数据;
目的操作数:顾名思义,目的即到达的意思,指命令操作数据最终要存放的地方。
1. 立即数寻址
- 在主存的代码段中,紧挨着操作码的下一个单元中存放。
(操作码其实就是指令序列号,用来告诉CPU需要执行哪─条指令。)
M O V A L , 5 ; A L = 5 MOV AL,5\qquad \color{DeepSkyblue}{;AL=5} MOVAL,5;AL=5 (分号是注释)
- 立即数只能出现在源操作数(目的操作数不允许使用立即数寻址)
A D D A L , 8 ADD\ AL,8 ADD AL,8
- 双操作数一致
A D D A L , 100 ; 64 H ADD\ AL,100\qquad\color{DeepSkyblue}{;64H} ADD AL,100;64H
M O V A X , 5 MOV\ AX,5 MOV AX,5
2. 寄存器寻址(最快)
不需要访问内存的寻址方式
M O V A L , B H ; 对 , A L ⬅ B H MOV\ AL,BH\qquad \color{DeepSkyblue}{;对,AL⬅BH} MOV AL,BH;对,AL⬅BH
M O V A X , D H ; 错 , 长 度 不 一 致 A X 16 位 , D H 8 位 MOV\ AX,DH\qquad \color{DeepSkyblue}{;错,长度不一致AX16位 ,DH8位} MOV AX,DH;错,长度不一致AX16位,DH8位
M O V C S , 5 ; 错 , C S 代 码 段 寄 存 器 不 是 用 户 能 使 用 的 MOV\ CS,5\qquad \color{DeepSkyblue}{;错,CS代码段寄存器不是用户能使用的} MOV CS,5;错,CS代码段寄存器不是用户能使用的
M O V D S , A X MOV\ DS,AX MOV DS,AX
3. 直接寻址
M O V A X , [ 2000 H ] MOV\ AX,[2000H] MOV AX,[2000H]
- 指令中直接给出操作数的有效地址(EA)
- 物理地址=段地址*16+EA
例:已知DS=3000H,(32000H)=1234H,执行MOV AX,[2000H]后,AX= 1234 H \color{DeepSkyblue}{1234H} 1234H
① E A = 2000 H ①EA=2000H ①EA=2000H
② 默 认 使 用 D S = 3000 H ②默认使用DS=3000H ②默认使用DS=3000H
③ 物 理 地 址 P A = D S ∗ 16 + E A = 32000 H ③物理地址PA=DS*16+EA=32000H ③物理地址PA=DS∗16+EA=32000H
④ ( 32000 H ) = 1234 H ➡ A X ④(32000H)=1234H ➡AX ④(32000H)=1234H➡AX
4. 寄存器间接寻址
M O V A X , [ B X ] MOV\ AX,[BX] MOV AX,[BX]
- 指令中EA=BX
已知DS=3000H,BX=2000H,AX=1234H
E A = B X = 2000 H EA=BX=2000H EA=BX=2000H
DS=3000H
物理地址PA=DS*16+EA
(32000H)=1234H → \rightarrow →AX
-
[ ]中括号中只能使用BX、BP、SI、DI
{ 基 址 指 针 寄 存 器 B P } 默 认 堆 栈 段 寄 存 器 S S 基 址 寄 存 器 B X 源 变 址 寄 存 器 S I 目 标 变 址 寄 存 器 D I } 默 认 数 据 段 寄 存 器 D S \begin{cases} \left. \begin{array}{l} 基址指针寄存器BP \end{array} \right\}默认堆栈段寄存器SS\\\\ \left. \begin{array}{l} 基址寄存器BX\\ 源变址寄存器SI\\ 目标变址寄存器DI\\ \end{array} \right\}默认数据段寄存器DS \end{cases} ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧基址指针寄存器BP}默认堆栈段寄存器SS基址寄存器BX源变址寄存器SI目标变址寄存器DI⎭⎬⎫默认数据段寄存器DS -
以寄存器的内容(内存单元)作为操作数的寻址方式
例:MOV AX,[BP]
已知DS=2000H,SS=1500H,BP=1000H,(21000)=1234H,(16000H)=5678H, A X = 5678 H AX=\color{DeepSkyblue}{5678H} AX=5678H
① E A = B P = 1000 H ① EA=BP=1000H ①EA=BP=1000H
② S S = 1500 H ②SS=1500H ②SS=1500H
③ 物 理 地 址 S S ∗ 16 + B P = 16000 H ③物理地址SS*16+BP=16000H ③物理地址SS∗16+BP=16000H
④ ( 16000 H ) = 5678 H → A X ④(16000H)=5678H\rightarrow AX ④(16000H)=5678H→AX
5. 寄存器相对寻址
M O V A X , a r r y [ B X ] ; a r r a y 变 量 MOV\ AX,arry[BX]\qquad \color{DeepSkyblue}{;array}变量 MOV AX,arry[BX];array变量
已知array=5,BX=2000H,DS=3000H,(32005H)=1234H,则AX= 1234 H \color{DeepSkyblue}{1234H} 1234H
① E A = B X + a r r a y = 2000 H + 5 = 2005 H ① EA=BX+array=2000H+5=2005H ①EA=BX+array=2000H+5=2005H
② D S = 3000 H ② DS=3000H ②DS=3000H
③ 物 理 地 址 P A = 32005 H ③ 物理地址PA=32005H ③物理地址PA=32005H
④ ( 32005 H ) = 1234 H → A X ④(32005H)=1234H\rightarrow AX ④(32005H)=1234H→AX
6. 基址加变址寻址
M O V A X , [ B X ] [ S I ] ; [ B X + S I ] MOV\ AX,[BX][SI]\qquad \color{DeepSkyblue}{;[BX+SI]} MOV AX,[BX][SI];[BX+SI]
- 基址寄存器:BX、BP
[BX+SI][BX+DI] → \rightarrow →DS(数据段寄存器) - 变址寄存器:SI(源变址寄存器)、DI(目标变址寄存器)
[BP+SI][BP+DI] → \rightarrow →SS(堆栈段寄存器)
M O V A X , [ B P ] [ D I ] MOV AX,[BP][DI] MOVAX,[BP][DI]
已知SS=3000H,BP=1000H,DI=2000H,33000H=(5389)H
AX= 5389 H \color{DeepSkyblue}{5389H} 5389H
① E A = B P + D I = 3000 H ①EA=BP+DI=3000H ①EA=BP+DI=3000H
② S S = 3000 H ②SS=3000H ②SS=3000H
③ 物 理 地 址 P A = S S ∗ 16 + E A = 33000 H ③物理地址PA=SS*16+EA=33000H ③物理地址PA=SS∗16+EA=33000H
④ ( 33000 H ) = 5389 H → A X ④(33000H)=5389H\rightarrow AX ④(33000H)=5389H→AX
7.相对基址加变址
M O V A X , b u f [ B X ] [ D I ] MOV\ AX,buf[BX][DI] MOV AX,buf[BX][DI]
已知 buf=5, BX=1000H,DI=2000H,DS=3000H, (33005H)=1234H, 则AX= 1234 H \color{DeepSkyblue}{1234H} 1234H
① E A = b u f + B X + D I = 3005 H ①EA=buf+BX+DI=3005H ①EA=buf+BX+DI=3005H
② D S = 3000 H ②DS=3000H ②DS=3000H
③ 物 理 地 址 P A = D S ∗ 16 + E A = 33005 H ③物理地址PA=DS*16+EA=33005H ③物理地址PA=DS∗16+EA=33005H
④ ( 33005 H ) = 1234 H → A X ④(33005H)=1234H\rightarrow AX ④(33005H)=1234H→AX
8. 隐含寻址
- 指令中不出现操作数地址
M U L B L ; A L ∗ B L → A X MUL\ BL\qquad \color{DeepSkyblue}{;AL*BL\rightarrow AX} MUL BL;AL∗BL→AX
(隐含了被乘数AL,积在AX中)
- 隐含操作数在寄存器中,常用AX、DX表示
(隐含操作数在堆栈中)
P U S H A X ; A X → 栈 PUSH\ AX \color{DeepSkyblue}{;AX\rightarrow 栈} PUSH AX;AX→栈
设DS=2000H,SI=00A0H,BX=0100H,变量VAL=0050H
请指出下列指令的源操作数字段是什么寻址,他们的物理地址是多少?
(1)MOV AX, [BX][SI]
(2)MOV AX, BX
(3)MOV AX, [1000H]
(4)MOV AX, [BX]
(5)MOV AX, VAL[BX]
(6)MOV AX, VAL[BX][SI]
答:
- 基址加变址寻址
E A = B X + S I = 01 A 0 H EA=BX+SI=01A0H EA=BX+SI=01A0H
P A = D S ∗ 16 + E A = 21 A 0 H PA=DS*16+EA=21A0H PA=DS∗16+EA=21A0H- 寄存器寻址(没有物理地址)
- 直接寻址
E A = 1000 H EA=1000H EA=1000H
P A = D S ∗ 16 + E A = 21000 H PA=DS*16+EA=21000H PA=DS∗16+EA=21000H- 寄存器间接寻址
E A = 0100 H EA=0100H EA=0100H
P A = D S ∗ 16 + E A = 20100 H PA=DS*16+EA=20100H PA=DS∗16+EA=20100H- 寄存器相对寻址
E A = V A L + B X = 0150 H EA=VAL+BX=0150H EA=VAL+BX=0150H
P A = D S ∗ 16 + E A = 20150 H PA=DS*16+EA=20150H PA=DS∗16+EA=20150H- 相对基址加变址寻址
E A = V A L + B X + S I = 01 F 0 H EA=VAL+BX+SI=01F0H EA=VAL+BX+SI=01F0H
P A = D S ∗ 16 + E A = 201 F 0 H PA=DS*16+EA=201F0H PA=DS∗16+EA=201F0H
二、指令格式及功能
1. 指令格式
[标号:] 助记符 [操作数1(dst),操作数2(src)][;注释]
dst:物理(目的)操作数
src:源操作数
2. 指令类型
(1)传送类
通用数据传送指令 | - |
---|---|
MOV | 字节或字的传送指令 |
PUSH | 入栈指令 |
POP | 出栈指令 |
XCHG ( E x c h a n g ) (Exchang) (Exchang) | 交换字或字节 |
累加器专用指令 | - |
---|---|
IN | 输入 |
OUT | 输出 |
XLAT ( T a b l e L o o k u p T r a n s l a t i o n ) (Table Lookup Translation) (TableLookupTranslation) | 换码指令 |
地址目标传送指令 | - |
---|---|
LEA ( L o a d E f f e c t i v e ) (Load Effective) (LoadEffective) | 取有效地址指令 |
LDS ( L o a d P o i n t e r u s i n g D S ) (Load Pointer using DS) (LoadPointerusingDS) | 将双字指针送到寄存器和DS指令 |
LES ( L o a d P o i n t e r u s i n g E S ) (Load Pointer using ES) (LoadPointerusingES) | 将双字指针送到寄存器和ES指令 |
标志传送指令 | - |
---|---|
LAHF ( L o a d A H f r o m F l a g s ) (Load AH from Flags) (LoadAHfromFlags) | 读取标志指令 |
SAHF ( S t o r e A H i n t o F l a g s ) (Store AH into Flags) (StoreAHintoFlags) | 设置标志指令 |
PUSHF ( P u s h F l a g s o n t o S t a c k ) (Push Flags onto Stack) (PushFlagsontoStack) | 标志寄存器的入栈指令 |
POPF ( P o p F l a g s o f f S t a c k ) (Pop Flags off Stack) (PopFlagsoffStack) | 标志寄存器的出栈指令 |
本数据传送 MOV dst, src
- 双操作数(地址码)指令
- 功能:在CPU与主存之间进行数据传送
源操作数src➡物理(目的)操作数dst - src可以为立即数,常见:寄存器操作数,存储器操作数
M O V A X , 5 MOV\ AX, 5 MOV AX,5
M O V A X , B X MOV\ AX, BX MOV AX,BX
M O V A X , [ 2000 H ] MOV\ AX, [2000H] MOV AX,[2000H]
- dst: 寄存器操作数,存储器操作数,不可以是立即数(CS、IP)
- 双操作数,不能同时为存储器操作数
M O V A X , [ B X ] MOV\ AX,[BX] MOV AX,[BX]
M O V [ 2000 H ] , A X MOV\ [2000H],AX MOV [2000H],AX
- 双操作数指令长度要匹配
M O V A X , B L ; 错 , A X MOV\ AX,BL \qquad \color{DeepSkyblue}{;错,AX} MOV AX,BL;错,AX
- src为立即数时,dst不能为段寄存器
M O V D S , d a t a ; 错 MOV\ DS, data\qquad \color{DeepSkyblue}{;错} MOV DS,data;错
M O V A X , d a t a ; 对 MOV\ AX, data \qquad \color{DeepSkyblue}{; 对} MOV AX,data;对
M O V D S , A X ; 对 MOV\ DS, AX \qquad \color{DeepSkyblue}{; 对} MOV DS,AX;对
- dst为存储器操作数时,src为立即数,dst必须指派
M O V [ 2000 H ] , 5 ; 错 MOV\ [2000H], 5 \qquad \color{DeepSkyblue}{;错} MOV [2000H],5;错
M O V B Y T E P T R [ 2000 H ] , 5 ; 对 MOV\ BYTE\ PTR[2000H],5 \qquad \color{DeepSkyblue}{;对} MOV BYTE PTR[2000H],5;对
M O V W O R D P T R [ 2000 H ] , 5 ; 对 0005 H MOV\ WORD\ PTR[2000H],5 \qquad \color{DeepSkyblue}{;对 0005H} MOV WORD PTR[2000H],5;对0005H
- 不影响标志位
- CPU➡主存: MOV [ ],AX/BX等
主存➡CPU: MOV AX/BX等, [ ]
堆栈操作 PUSH src
压栈指令 PUSH src
- 单操作数(地址码)数指令,隐含了一个堆栈操作数
- 功能:src → \rightarrow → 堆栈
- 堆栈是内存中开辟的用于存放数据的区域
- SP 栈顶 地址值
执行PUSH时,先移动指针,再存放数据
SP-2 → \rightarrow → SP
(src) → \rightarrow → ((SP+1),SP)
例:已知AX=1234H,BX=5678H,SP=1000H
执行PUSH AX,PUSH BX后
SP= 78 H \color{DeepSkyblue}{78H} 78H
(SP)= 0 F F C H \color{DeepSkyblue}{0FFCH} 0FFCH
- src必须是字,可以是寄存器操作数,存储器操作数
PUSH [SI]
出栈指令 POP dst
- 功能:栈顶的一个字 → \rightarrow → dst
- 先取出数据,再移动指针
((SP+1), (SP)) → \rightarrow → dst
SP+2 → \rightarrow → SP
已知SP=0FFCH
执行POP AX
POP BX后 SP= 1000 H \color{DeepSkyblue}{1000H} 1000H
AX= 5678 H \color{DeepSkyblue}{5678H} 5678H
BX= 1234 H \color{DeepSkyblue}{1234H} 1234H
交换 XCHG opr1,opr2
- 双操作数,长度要匹配,不能同时为存储器操作数
- opr2 不能为立即数
- 功能:opr1 ⇔ \Leftrightarrow ⇔ opr2交换
x c h g [ 2000 H ] , [ S I ] ; 错 xchg\ [2000H],[SI]\qquad \color{DeepSkyblue}{;错} xchg [2000H],[SI];错
{ M O V A X , [ S I ] M O V B X , [ 2000 H ] M O V [ S I ] , B X M O V [ 2000 H ] , A X \begin{cases} MOV\ AX,[SI]\\ MOV\ BX,[2000H]\\ MOV\ [SI],BX\\ MOV\ [2000H],AX\\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧MOV AX,[SI]MOV BX,[2000H]MOV [SI],BXMOV [2000H],AX
⇓ \Downarrow ⇓
{ M O V A X , [ S I ] M O V B X , [ 2000 H ] X C H G A X , B X \begin{cases} MOV\ AX,[SI]\\ MOV\ BX,[2000H]\\ XCHG\ AX,BX \end{cases} ⎩⎪⎨⎪⎧MOV AX,[SI]MOV BX,[2000H]XCHG AX,BX
⇓ \Downarrow ⇓
{ M O V A X , [ S I ] X C H G A X , [ 2000 H ] \begin{cases} MOV\ AX,[SI]\\ XCHG\ AX,[2000H] \end{cases} {MOV AX,[SI]XCHG AX,[2000H]
换码 XLAT 查表转换指令
- 可以不带操作数
- 隐含默认 BX:表首地址 AL:表的位移量
((BX)+(AL)) → \rightarrow → AL
地址传送 LEA dst src
- dst:寄存器(16位)
src:存储器 - 功能把存储器的 EA(有效地址) 传送给字寄存器
L E A A L , [ 2000 H ] ; 错 LEA \ AL,[2000H] \qquad \color{DeepSkyblue}{;错} LEA AL,[2000H];错
L E A A X , B X ; 错 LEA\ AX,BX\qquad \color{DeepSkyblue}{;错} LEA AX,BX;错
① L E A B X , [ 2000 H ] ; B X = 2000 H ①LEA\ BX,[2000H] \qquad \color{DeepSkyblue}{;BX=2000H} ①LEA BX,[2000H];BX=2000H
② M O V B X , [ 2000 H ] ; B X = 1234 H ②MOV\ BX,[2000H]\qquad \color{DeepSkyblue}{;BX=1234H} ②MOV BX,[2000H];BX=1234H
③ { L E A B X , [ 2000 H ] M O V C X , [ B X ] ; C X = 1234 H ③\begin{cases} LEA\ BX,[2000H]\\ MOV\ CX,[BX]\qquad \color{DeepSkyblue}{;CX=1234H} \end{cases} ③{LEA BX,[2000H]MOV CX,[BX];CX=1234H
CPU与外设接口进行传送
1. I N A X / A L , p o r t { 8 位 地 址 { 直 接 寻 址 间 接 寻 址 — — 端 口 号 → D X 16 位 地 址 { 间 接 寻 址 — — 端 口 号 → D X 1.\ \pmb{IN}\ AX/AL,port\begin{cases} 8位地址\begin{cases} 直接寻址\\ 间接寻址——端口号\rightarrow DX \end{cases}\\ 16位地址\begin{cases} 间接寻址——端口号\rightarrow DX \end{cases}\\ \end{cases} 1. INININ AX/AL,port⎩⎪⎪⎨⎪⎪⎧8位地址{直接寻址间接寻址——端口号→DX16位地址{间接寻址——端口号→DX
直 接 寻 址 { I N A X , 20 H ; A X = 3412 H ( 表 示 从 外 部 设 备 输 入 数 据 给 累 加 器 ) I N A L , 20 H ; A L = 12 H 直接寻址\begin{cases} IN AX, 20H \qquad \color{DeepSkyblue}{;AX=3412H (表示从外部设备输入数据给累加器)}\\ IN\ AL, 20H \qquad \color{DeepSkyblue}{;AL=12H} \end{cases} 直接寻址{INAX,20H;AX=3412H(表示从外部设备输入数据给累加器)IN AL,20H;AL=12H
I N A X , 1000 H ; 错 IN\ AX, 1000H\qquad \color{DeepSkyblue}{;错} IN AX,1000H;错
I N A L , 1000 H ; 错 IN\ AL,1000H\qquad \color{DeepSkyblue}{;错} IN AL,1000H;错
间
接
寻
址
{
M
O
V
D
X
,
1000
H
I
N
A
L
,
D
X
;
D
X
端
口
号
,
A
L
=
56
H
I
N
A
X
,
D
X
;
A
X
=
7856
H
间接寻址\begin{cases} MOV\ DX, 1000H\\ IN\ AL,DX \qquad \color{DeepSkyblue}{;DX端口号,AL=56H}\\ IN\ AX,DX \qquad \color{DeepSkyblue}{;AX=7856H} \end{cases}
间接寻址⎩⎪⎨⎪⎧MOV DX,1000HIN AL,DX;DX端口号,AL=56HIN AX,DX;AX=7856H
2.
O
U
T
p
o
r
t
,
A
X
/
A
L
;
p
o
r
t
{
8
位
地
址
:
直
接
寻
址
16
位
地
址
:
间
接
寻
址
\pmb{OUT}\ port, AX/AL\ ;port\begin{cases} 8位地址:直接寻址\\ 16位地址:间接寻址 \end{cases}
OUTOUTOUT port,AX/AL ;port{8位地址:直接寻址16位地址:间接寻址
直
接
寻
址
{
O
U
T
20
H
,
A
X
;
(
I
/
O
端
口
通
过
20
H
端
口
输
出
A
L
的
内
容
)
C
P
U
的
A
X
中
的
字
送
给
20
H
端
口
上
O
U
T
20
H
,
A
L
直接寻址\begin{cases} OUT\ 20H,AX \qquad \color{DeepSkyblue}{;(I/O端口通过20H端口输出AL的内容)CPU的AX中的字送给20H端口上}\\ OUT\ 20H,AL \end{cases}
直接寻址{OUT 20H,AX;(I/O端口通过20H端口输出AL的内容)CPU的AX中的字送给20H端口上OUT 20H,AL
间
接
寻
址
{
M
O
V
D
X
,
1000
H
;
C
P
U
的
A
L
中
字
节
送
给
1000
H
端
口
上
O
U
T
D
X
,
A
L
间接寻址\begin{cases} MOV\ DX,1000H \qquad \color{DeepSkyblue}{;CPU的AL中字节送给1000H端口上}\\ OUT\ DX,AL \end{cases}
间接寻址{MOV DX,1000H;CPU的AL中字节送给1000H端口上OUT DX,AL
例:分别用2种方法写出
(1)从88H端口读入信息的指令
- I N A L , 88 H IN\ AL,88H IN AL,88H
- M O V D X , 88 H MOV\ DX,88H MOV DX,88H
I N A L , D X IN\ AL, DX IN AL,DX(2)从42H端口输出100H的指令
- M O V A X , 1000 H MOV AX, 1000H MOVAX,1000H
O U T 42 H , A X OUT 42H, AX OUT42H,AX- M O V A X , 100 H MOV AX,100H MOVAX,100H
M O V D X , 42 H MOV DX, 42H MOVDX,42H
O U T D X , A X OUT DX,AX OUTDX,AX
(2)算数运算
加法 | - |
---|---|
ADD ( A d d ) (Add) (Add) | 加法 |
ADC ( A d d w i t h C a r r y ) (Add\ with\ Carry) (Add with Carry) | 带进位的加法 |
INC ( I n c r e n e n t ) (Increnent) (Increnent) | 加1指令 |
AAA ( A S C I I A d j u s t f o r A d d i t i o n ) (ASCII\ Adjust\ for\ Addition) (ASCII Adjust for Addition) | 非组合十进制加法调整指令 |
DAA ( D e c i n a l A d j u s t f o r A d d i t i o n ) (Decinal\ Adjust\ for\ Addition) (Decinal Adjust for Addition) | 组合十进制加法调整指令 |
减法 | - |
---|---|
SUB ( S u b t r a c t ) (Subtract) (Subtract) | 减法 |
SBB ( S u b t r a c t w i t h B o r r o w ) (Subtract\ with\ Borrow) (Subtract with Borrow) | 带进位的减法 |
DEC ( D c c r e m e n t ) (Dccrement) (Dccrement) | 减1指令 |
NEG ( N e g a t e ) (Negate) (Negate) | 求补指令(取负指令) |
CMP ( C o m p a t e ) (Compate) (Compate) | 比较 |
AAS ( A S C I I A d j u s t f o r S u b t r a c t ) (ASCII\ Adjust\ for\ Subtract) (ASCII Adjust for Subtract) | 非组合十进制减法调整指令 |
DAS ( D e c i m a l A d j u s t f o r S u b r a c t ) (Decimal\ Adjust\ for\ Subract) (Decimal Adjust for Subract) | 组合十进制减法调整指令 |
乘法 | - |
---|---|
MUL ( M u l t i p l y , u n s i g n e d ) (Multiply,unsigned) (Multiply,unsigned) | 无符号乘法 |
IMIL ( I n t e g e r M u l t i p l y , u n s i g n e d ) (Integer\ Multiply,unsigned) (Integer Multiply,unsigned) | 带符号数乘法 |
AAM ( A S C I I A d j u s t f o r M u l t i p l y ) (ASCII\ Adjust for Multiply) (ASCII AdjustforMultiply) | 乘法的ASCII码调整 |
除法 | - |
---|---|
DIV ( D i v i s i o n , u n s i g n e d ) (Division,unsigned) (Division,unsigned) | 无符号数除法 |
IDIV ( I n t e g e r D i v i s i o n , s i g n e d ) (Integer\ Division,signed) (Integer Division,signed) | 带符号除法 |
AAD ( A S C I I A d j u s t f o r D I v i s i o n ) (ASCII\ Adjust\ for\ DIvision) (ASCII Adjust for DIvision) | 除法的ASCII码调整 |
CBW ( C o n v e r t B y t e t o W o r d ) (Convert\ Byte\ to\ Word) (Convert Byte to Word) | 将字节扩展成字 |
CWD ( C o n v e r t W o r d t o D o u b l e W o r d ) (Convert\ Word\ to\ Double\ Word) (Convert Word to Double Word) | 将字扩展成双字 |
MOD | 取余 |
加法
① A D D d s t , s r c \pmb{ADD\ dst,src} ADD dst,srcADD dst,srcADD dst,src
- 功能:dst+src → \rightarrow → dst
- 双操作数长度匹配
- 影响6个状态位
例: M O V A L , 12 H ; A L = 12 H MOV\ AL,12H\qquad \color{DeepSkyblue}{;AL=12H} MOV AL,12H;AL=12H
M O V C H , 78 H ; C H = 78 H MOV\ CH,78H\qquad \color{DeepSkyblue}{;CH=78H} MOV CH,78H;CH=78H
A D D A L , C H ; A L = A L + C H = 8 A H C H = 78 H \pmb{ADD}\ AL,CH\qquad \color{DeepSkyblue}{;AL=AL+CH=8AH\quad CH=78H} ADDADDADD AL,CH;AL=AL+CH=8AHCH=78H
C F = 0 S F = 1 Z F = 0 P F = 0 A F = 0 O F = 1 \color{DeepSkyblue}{CF= 0\quad SF= 1\quad ZF= 0\quad PF= 0\quad AF= 0\quad OF= 1} CF=0SF=1ZF=0PF=0AF=0OF=1
② A D C d s t , s r c \pmb{ADC\ dst,src} ADC dst,srcADC dst,srcADC dst,src
- 功能:dst+src+CF → \rightarrow → dst
- 用于多字节运算时高字节的运算
例 : A X = 5678 H , B X = 9 A B C H 例:AX=5678H,BX=9ABCH 例:AX=5678H,BX=9ABCH
M O V A X , 5678 H MOV\ AX,5678H MOV AX,5678H
M O V B X , 9 A B C H MOV\ BX,9ABCH MOV BX,9ABCH
A D D A L , B L ; A L = 34 C F = 1 ADD\ AL,BL\qquad \color{DeepSkyblue}{;AL=34\ CF=1} ADD AL,BL;AL=34 CF=1
A D C A H , B H ; A H = F 1 H \pmb{ADC}\ AH,BH\qquad \color{DeepSkyblue}{;AH=F1H} ADCADCADC AH,BH;AH=F1H
例 : S T C ; C F = 1 例:STC\qquad \color{DeepSkyblue}{;CF=1} 例:STC;CF=1
M O V C L , 05 H ; C L = 05 H MOV\ CL,05H\qquad \color{DeepSkyblue}{;CL=05H} MOV CL,05H;CL=05H
M O V D H , 1 F H ; D H = 1 F H MOV\ DH,1FH\qquad \color{DeepSkyblue}{;DH=1FH} MOV DH,1FH;DH=1FH
A D C C L , D H ; C L = 25 H C F = 0 \pmb{ADC}\ CL,DH\qquad \color{DeepSkyblue}{;CL=25H\quad CF=0} ADCADCADC CL,DH;CL=25HCF=0
A D C D H , 8 ; D H = 27 H C F = 0 \pmb{ADC}\ DH,8\qquad \color{DeepSkyblue}{;DH=27H\quad CF=0} ADCADCADC DH,8;DH=27HCF=0
③ I N C d s t \pmb{INC\ dst} INC dstINC dstINC dst
- 单操作数
- 功能:dst+1 → \rightarrow → dst
- 不影响CF,影响其它5个状态位
- 常用于改变循环变量和地址递增
M O V S I , 2000 H MOV SI,2000H MOVSI,2000H
A D D S I , 2 { I N C S I I N C S I ; S I = 2002 H ADD\ SI,2\begin{cases} \pmb{INC}&SI\\ \pmb{INC}& SI\qquad \color{DeepSkyblue}{;SI=2002H} \end{cases} ADD SI,2{INCINCINCINCINCINCSISI;SI=2002H
例:已知内存buf开始的内存单元存放了5个有符号字节数,求5个数的和,并且把结果放入AX/AL中
L E A B X , b u f LEA\ BX,buf LEA BX,buf
M O V A L , [ B X ] MOV\ AL,[BX] MOV AL,[BX]
I N C B X \pmb{INC}\ BX INCINCINC BX
A D D A L , [ B X ] ADD\ AL,[BX] ADD AL,[BX]
I N C B X \pmb{INC}\ BX INCINCINC BX
A D D A L , [ B X ] ADD\ AL,[BX] ADD AL,[BX]
I N C B X \pmb{INC}\ BX INCINCINC BX
A D D A L , [ B X ] ADD\ AL,[BX] ADD AL,[BX]
I N C B X \pmb{INC}\ BX INCINCINC BX
A D D A L , [ B X ] ADD\ AL,[BX] ADD AL,[BX]
例: A X = 1 + 2 + 3 + . . . + 100 AX=1+2+3+...+100 AX=1+2+3+...+100
M O V A X , 1 MOV\ AX,1 MOV AX,1
M O V B X , 2 MOV\ BX,2 MOV BX,2
A D D A X , B X ; A X = 1 + 2 ADD\ AX,BX\qquad \color{DeepSkyblue}{;AX=1+2} ADD AX,BX;AX=1+2
I N C B X ; B X = 3 INC\ BX\qquad \color{DeepSkyblue}{;BX=3} INC BX;BX=3
A D D A X , B X ; A X = 1 + 2 + 3 ADD\ AX,BX\qquad \color{DeepSkyblue}{;AX=1+2+3} ADD AX,BX;AX=1+2+3
…
…
减法
{ ① S U B d s t , s r c ( ( d s t ) ← ( d s t ) − ( s r c ) ) ⇔ A D D ② S B B d s t , s r c ⇔ A D C } 影 响 6 个 状 态 位 ③ D E C d s t ⇔ I N C { 不 影 响 C F \begin{cases} \left. \begin{array}{l} ①\pmb{SUB\ dst,src((dst)\leftarrow(dst)-(src))}\Leftrightarrow ADD\\ ②\pmb{SBB\ dst,src}\Leftrightarrow ADC\\ \end{array} \right\}影响6个状态位\\ ③\pmb{DEC\ dst}\Leftrightarrow INC \begin{cases} 不影响CF \end{cases} \end{cases} ⎩⎪⎨⎪⎧①SUB dst,src((dst)←(dst)−(src))SUB dst,src((dst)←(dst)−(src))SUB dst,src((dst)←(dst)−(src))⇔ADD②SBB dst,srcSBB dst,srcSBB dst,src⇔ADC}影响6个状态位③DEC dstDEC dstDEC dst⇔INC{不影响CF
④ C M P d s t , s r c \pmb{CMP\ dst,src} CMP dst,srcCMP dst,srcCMP dst,src
- 影响6个状态位
- 不回送结果 dst-src
- 下一条指令常跳转
判断大小:
a . { Z F = 1 两 数 相 等 Z F = 0 两 数 不 相 等 a.\begin{cases} ZF=1& 两数相等\\ ZF=0& 两数不相等 \end{cases} a.{ZF=1ZF=0两数相等两数不相等
b . C F 判 无 符 号 数 大 小 { C F = 1 d s t < s r c C F = 0 d s t > s r c b.CF判无符号数大小\begin{cases} CF=1& dst<src\\ CF=0& dst>src \end{cases} b.CF判无符号数大小{CF=1CF=0dst<srcdst>src
c . S F 、 O F 判 有 符 号 数 大 小 { S F ⨁ O F = 1 d s t < s r c S F ⨁ O F = 0 d s t > s r c c.SF、OF判有符号数大小\begin{cases} SF\bigoplus OF=1& dst<src\\ SF\bigoplus OF=0& dst>src \end{cases} c.SF、OF判有符号数大小{SF⨁OF=1SF⨁OF=0dst<srcdst>src
J C L 1 { C F = 1 时 跳 转 L 1 C F = 0 时 不 跳 转 \pmb{JC}\ L_1\begin{cases} CF=1时跳转L_1\\ CF=0时不跳转 \end{cases} JCJCJC L1{CF=1时跳转L1CF=0时不跳转
J N C L 1 { C F = 1 时 不 跳 转 C F = 0 时 跳 转 L 1 \pmb{JNC}\ L_1\begin{cases} CF=1时不跳转\\ CF=0时跳转L_1 \end{cases} JNCJNCJNC L1{CF=1时不跳转CF=0时跳转L1
有符号数 | |
---|---|
JG | >则跳转 |
JL | <则跳转 |
无符号数 | |
---|---|
JA | >则跳转 |
JB | <则跳转 |
例:在数据段data开始的存储单元中,分别存放了2个8位无符号数,比较其大小,并把大的数送MAX单元。
L E A B X , d a t a LEA\ BX,data LEA BX,data
M O V A L , [ B X ] ; A L = 26 H MOV\ AL,[BX]\qquad \color{DeepSkyblue}{;AL=26H} MOV AL,[BX];AL=26H
I N C B X INC\ BX INC BX
C M P A L , [ B X ] ; 26 H − 17 H CMP\ AL,[BX]\qquad \color{DeepSkyblue}{;26H-17H} CMP AL,[BX];26H−17H
J C L 1 ; C F = 1 转 L 1 , A L < [ B X ] JC\ L_1\qquad \color{DeepSkyblue}{;CF=1转L_1 ,AL<[BX]} JC L1;CF=1转L1,AL<[BX]
M O V C L , A L ; C L = 26 H MOV\ CL,AL\qquad \color{DeepSkyblue}{;CL=26H} MOV CL,AL;CL=26H
J M P L 2 ; 无 条 件 转 移 JMP\ L_2\qquad \color{DeepSkyblue}{;无条件转移} JMP L2;无条件转移
L 1 : M O V C L , [ B X ] L_1:MOV\ CL,[BX] L1:MOV CL,[BX]
L 2 : M O V M A X , C L ; M A X = 26 H L_2:MOV\ MAX,CL\qquad \color{DeepSkyblue}{;MAX=26H} L2:MOV MAX,CL;MAX=26H
⑤ N E G : 求 补 / 求 绝 对 值 / 求 反 ⑤NEG:求补/求绝对值/求反 ⑤NEG:求补/求绝对值/求反
- NEG OPR
- 0-OPR➡OPR
- 影响6个状态位
只有OPR为0时 CF=0 否则CF=1
例:内存buf数据区存有10个有符号字节数,要求:将各数取绝对值后依次送入result为首地址的内存区。
L E A B X , b u f LEA\ BX,buf LEA BX,buf
L E A D I , r e s u l t LEA\ DI,result LEA DI,result
M O V C X , 10 ; C X = 10 MOV\ CX,10\qquad\color{DeepSkyblue}{;CX=10} MOV CX,10;CX=10
L 2 : M O V A L , [ B X ] ; A L = 6 L_2:MOV\ AL,[BX]\qquad\color{DeepSkyblue}{;AL=6} L2:MOV AL,[BX];AL=6
C M P A L , 0 CMP\ AL,0 CMP AL,0
J G L 1 JG\ L_1 JG L1
N E G A L NEG\ AL NEG AL
L 1 : M O V [ D I ] , A L L_1:MOV\ [DI],AL L1:MOV [DI],AL
I N C B X INC\ BX INC BX
I N C D I INC\ DI INC DI
D E C C X ; C X = 9 DEC\ CX\qquad\color{DeepSkyblue}{;CX=9} DEC CX;CX=9
J N Z L 2 JNZ\ L_2 JNZ L2
H L T HLT HLT
乘法
① M U L s r c ; 无 符 号 数 相 乘 ① MUL\ src\qquad\color{DeepSkyblue}{;无符号数相乘} ①MUL src;无符号数相乘
- 单操作数,隐含了被乘数(AX/AL)
- 功能: { s r c 字 节 : A L ∗ s r c → A X ( 字 节 ∗ 字 节 → 字 ) s r c 字 : A X ∗ s r c → D X , A X ( 字 ∗ 字 → 双 字 ) \begin{cases}src字节:AL*src\rightarrow AX(字节*字节\rightarrow字)\\ src字:AX*src\rightarrow DX,AX(字*字\rightarrow 双字)\end{cases} {src字节:AL∗src→AX(字节∗字节→字)src字:AX∗src→DX,AX(字∗字→双字)
- 影响CF和OF
字 节 ∗ 字 节 { 字 节 C F = O F = 0 字 C F = O F = 1 字节*字节\begin{cases} 字节 CF=OF=0\\ 字 CF=OF=1 \end{cases} 字节∗字节{字节CF=OF=0字CF=OF=1
字 ∗ 字 { 字 C F = O F = 0 双 字 C F = O F = 1 字*字\begin{cases} 字 CF=OF=0\\ 双字 CF=OF=1 \end{cases} 字∗字{字CF=OF=0双字CF=OF=1
例:BL=8,AL=7,执行MUL BL
M U L B L ; A L ∗ B L = 56 ➡ A X C F = O F = 0 MUL\ BL\qquad\color{DeepSkyblue}{;AL*BL=56➡AX}\quad CF=OF=0 MUL BL;AL∗BL=56➡AXCF=OF=0
例:BL=80,AL=70,执行MUL BL
M U L B L ; A X = 5600 C F = O F = 1 MUL\ BL\qquad\color{DeepSkyblue}{;AX=5600\quad CF=OF=1} MUL BL;AX=5600CF=OF=1
② I M U L s r c ; 带 符 号 数 乘 法 ②IMUL\ src\qquad\color{DeepSkyblue}{;带符号数乘法} ②IMUL src;带符号数乘法
例:已知BL=-8,AL=+4,执行IMUL BL后,AX=
I M U L B L ; A X ( 16 位 ) = F F E O H ( 负 数 在 计 算 机 中 是 以 补 码 的 形 式 存 储 ) IMUL\ BL\qquad\color{DeepSkyblue}{;AX(16位)=FFEOH(负数在计算机中是以补码的形式存储)} IMUL BL;AX(16位)=FFEOH(负数在计算机中是以补码的形式存储)
除法
①
D
I
V
s
r
c
;
无
符
号
相
除
DIV\ src\qquad\color{DeepSkyblue}{;无符号相除}
DIV src;无符号相除
②
I
D
I
V
s
r
c
;
有
符
号
相
除
IDIV\ src\qquad\color{DeepSkyblue}{;有符号相除}
IDIV src;有符号相除
s
r
c
为
字
节
A
X
÷
s
r
c
{
商
存
在
A
L
余
数
存
在
A
H
src为字节\ AX\div src\begin{cases} 商存在AL\\ 余数存在AH \end{cases}
src为字节 AX÷src{商存在AL余数存在AH
s
r
c
为
字
D
X
A
X
(
双
字
)
÷
s
r
c
{
商
存
在
A
X
余
数
存
在
D
X
src为字\ DX AX(双字)\div src\begin{cases} 商存在AX\\ 余数存在DX \end{cases}
src为字 DXAX(双字)÷src{商存在AX余数存在DX
如被除数位为16位,那么商存在AL、余数存在AH,分别是8位。
符号扩展指令
扩展原则:
将
符
号
位
扩
展
到
整
个
高
位
将\pmb{符号位}扩展到整个高位
将符号位符号位符号位扩展到整个高位
③
C
B
W
;
字
节
→
字
(
A
L
→
A
X
)
CBW\qquad\color{DeepSkyblue}{;字节\rightarrow 字(AL\rightarrow AX)}
CBW;字节→字(AL→AX)
例: M O V A L , 05 H ; A L = 0100 B = 05 H MOV\ AL,05H\qquad\color{DeepSkyblue}{;AL=\pmb{0}100B=05H} MOV AL,05H;AL=000100B=05H
C B W ; A X = 0000 0000 0000 0100 B = 0005 H CBW\qquad\color{DeepSkyblue}{;AX=\pmb{0000\ 0000\ 0000}\ 0100B=0005H} CBW;AX=0000 0000 00000000 0000 00000000 0000 0000 0100B=0005H
例: M O V A L , 80 H ; A L = 1000 000 B = 80 H MOV AL,80H\qquad\color{DeepSkyblue}{;AL=\pmb{1}000\ 000B=80H} MOVAL,80H;AL=111000 000B=80H
C B W ; A X = 1111 1111 1000 0000 B = F F 80 H CBW\qquad\color{DeepSkyblue}{;AX=\pmb{1111\ 1111}\ 1000\ 0000 B=FF80H} CBW;AX=1111 11111111 11111111 1111 1000 0000B=FF80H
④ C W D ; 字 → 双 字 ( A X → D X , A X ) CWD\qquad\color{DeepSkyblue}{;字\rightarrow 双字(AX\rightarrow DX,AX)} CWD;字→双字(AX→DX,AX)
例: M O V A X , 5 MOV\ AX,5 MOV AX,5
C W D ; D X = 0000 H A X = 0005 H CWD\qquad\color{DeepSkyblue}{;DX=0000H\ AX=0005H} CWD;DX=0000H AX=0005H
例: M O V A X , 9500 H MOV AX,9500H MOVAX,9500H
C W D ; D X = F F F F H A X = 9500 H CWD\qquad\color{DeepSkyblue}{;DX=FFFFH\ AX=9500H} CWD;DX=FFFFH AX=9500H
已知字节变量x,y,z,自变量w,编程x*y+z → \rightarrow → w
M O V A H , 0 MOV\ AH,0 MOV AH,0
M O V A L , X MOV\ AL,X MOV AL,X
M O V B L , y MOV\ BL,y MOV BL,y
M U L B L MUL\ BL MUL BL
M O V D X , A X MOV\ DX,AX MOV DX,AX
M O V A L , z MOV\ AL,z MOV AL,z
C B W CBW CBW
A D D D X , A X ADD\ DX,AX ADD DX,AX
M O V w , D X MOV\ w,DX MOV w,DX
⑤MOD
(AX)MOD OPRD 表示AX除以OPRD的余数
AX与OPRD相除的所得的余数存到AH ,商存到AL
例如:10 MOD 7 ;AH=3,AL=1
(3)位操作
逻辑运算类 | - |
---|---|
NOT | 取反 |
AND | 逻辑与 |
OR | 逻辑或 |
XOR | 异或 |
TEST | 测试 |
算术逻辑移位类 | - |
---|---|
SHL | 逻辑/算术左移 |
SHR | 逻辑右移 |
SAR | 算术右移 |
循环移位类 | - |
---|---|
ROL | 循环左移 |
ROR | 循环右移 |
RCL | 带进位的逻辑左移 |
RCR | 带进位的循环右移 |
AND | OR | NOT | XOR | TEST | |
---|---|---|---|---|---|
格式 | d s t ⋀ s r c ➡ d s t dst\bigwedge src➡dst dst⋀src➡dst | d s t ⋁ s r c ➡ d s t dst\bigvee src➡dst dst⋁src➡dst | O P R ‾ ➡ O P R \overline{OPR}➡OPR OPR➡OPR | d s t ∀ s r c ➡ d s t dst\forall src➡dst dst∀src➡dst | d s t ⋀ s r c 不 返 回 结 果 dst\bigwedge src不返回结果 dst⋀src不返回结果 |
影响 | CF=OF=0,AF值不定SF、PF、ZF有影响 | CF=OF=0,AF值不定SF、PF、ZF有影响 | 不影响任何标志位 | CF=OF=0,AF值不定SF、PF、ZF有影响 | CF=OF=0,AF值不定SF、PF、ZF有影响 |
功能 | 清0 | 置1 | 取反 |
逻辑运算指令中NOT不允许使用 立即数 作 操作数
逻辑运算类
① A N D ① AND ①AND
{ A N D A L , 0 ; A L = 0 C F = O F = 0 M O V A L , 0 ; A L = 0 \begin{cases}AND\ AL,0\qquad\color{DeepSkyblue}{;AL=0\quad CF=OF=0}\\ MOV AL,0\qquad\color{DeepSkyblue}{;AL=0}\end{cases} {AND AL,0;AL=0CF=OF=0MOVAL,0;AL=0
A N D A L , A L ; A L = A L 不 变 C F = O F = 0 AND\ AL,AL\qquad\color{DeepSkyblue}{;AL=AL不变\quad CF=OF=0} AND AL,AL;AL=AL不变CF=OF=0
{ M O V A L , 12 H A N D A L , O F H ; A L = 02 H , 展 开 二 进 制 : 0001 0010 和 0000 1111 逐 位 与 \begin{cases} MOV\ AL,12H\\ AND\ AL,OFH\qquad\color{DeepSkyblue}{;AL=02H, 展开二进制:0001\ 0010和0000\ 1111逐位与} \end{cases} {MOV AL,12HAND AL,OFH;AL=02H,展开二进制:0001 0010和0000 1111逐位与
②
O
R
A
L
,
A
L
;
A
L
不
变
C
F
=
O
F
=
0
②OR\ AL,AL\qquad\color{DeepSkyblue}{;AL不变\ CF=OF=0}
②OR AL,AL;AL不变 CF=OF=0
③
N
O
T
取
反
③NOT 取反
③NOT取反
{ M O V A L , 0 F H N O T A L ; A L = F 0 H \begin{cases}MOV\ AL,0FH\\ NOT\ AL\qquad\color{DeepSkyblue}{;AL=F0H} \end{cases} {MOV AL,0FHNOT AL;AL=F0H
{ M O V A L , 12 H N O T A L ; A L = 0 E D H , 展 开 二 进 制 按 位 取 反 \begin{cases} MOV AL,12H\\ NOT AL\qquad\color{DeepSkyblue}{;AL=0EDH,展开二进制按位取反}\end{cases} {MOVAL,12HNOTAL;AL=0EDH,展开二进制按位取反
④ X O R ④XOR ④XOR
{ X O R A X , A X ; A X = 0 , C F = O F = 0 M O V A X , 0 \begin{cases}XOR\ AX,AX\qquad\color{DeepSkyblue}{;AX=0,CF=OF=0}\\ MOV AX,0\end{cases} {XOR AX,AX;AX=0,CF=OF=0MOVAX,0
{ M O V A L , F F H X O R A L , 3 ; A L = F C H \begin{cases} MOV\ AL,FFH\\ XOR\ AL,3\qquad\color{DeepSkyblue}{;AL=FCH} \end{cases} {MOV AL,FFHXOR AL,3;AL=FCH
{ M O V A L , 00 H X O R A L , 3 ; A L = 03 H \begin{cases}MOV\ AL,00H\\ XOR\ AL,3\qquad\color{DeepSkyblue}{;AL=03H} \end{cases} {MOV AL,00HXOR AL,3;AL=03H
⑤Test 测试
- 测试某位是否为0
{ T e s t A L , 01 H ; A L = 12 H J Z L 1 ; Z F = 1 转 L 1 \begin{cases} Test\ AL,01H\qquad\color{DeepSkyblue}{;AL=12H}\\ JZ\ L_1\qquad\color{DeepSkyblue}{;ZF=1转L_1} \end{cases} {Test AL,01H;AL=12HJZ L1;ZF=1转L1
{ T e s t A L , 80 H ; A L = 12 H , A L 与 80 H 二 进 制 逐 位 想 与 , 测 是 否 为 0 , 0 则 Z F = 1 J Z L 2 ; Z F = 1 转 L 2 \begin{cases} Test\ AL,80H\qquad\color{DeepSkyblue}{;AL=12H,AL与80H二进制逐位想与,测是否为0,0则ZF=1}\\ JZ\ L_2\qquad\color{DeepSkyblue}{;ZF=1转L_2} \end{cases} {Test AL,80H;AL=12H,AL与80H二进制逐位想与,测是否为0,0则ZF=1JZ L2;ZF=1转L2
- 测某位是否为1
{ T e s t A L , 01 H J N Z L 3 ; 当 A L 的 D 0 = 1 转 L 3 , Z F = 0 \begin{cases} Test\ AL,01H\\ JNZ\ L_3\qquad\color{DeepSkyblue}{;当AL的D_0=1转L_3,ZF=0} \end{cases} {Test AL,01HJNZ L3;当AL的D0=1转L3,ZF=0
{ T e s t A L , 04 H J N Z L 4 ; 当 A L 的 D 2 = 1 转 L 4 \begin{cases} Test\ AL,04H\\ JNZ\ L_4\qquad\color{DeepSkyblue}{;当AL的D_2=1转L_4} \end{cases} {Test AL,04HJNZ L4;当AL的D2=1转L4
{ T e s t A L , 03 H J Z L 5 ; 当 A L 的 D 0 D 1 同 时 为 0 时 转 L s \begin{cases} Test\ AL,03H\\ JZ\ L_5\qquad\color{DeepSkyblue}{;当AL的D_0D_1同时为0时转L_s} \end{cases} {Test AL,03HJZ L5;当AL的D0D1同时为0时转Ls
算术移位逻辑类
① 算 术 左 移 S A L d s t , 1 / C L ①算术左移\ SAL\ dst,1/CL ①算术左移 SAL dst,1/CL
{ M O V A L , 12 H S A L A L , 1 ; A L = 24 H 0001 0010 → 0010 0100 \begin{cases} MOV\ AL,12H\\ SAL\ AL,1\qquad\color{DeepSkyblue}{;AL=24H\ 0001\ 0010\rightarrow 0010\ 0100} \end{cases} {MOV AL,12HSAL AL,1;AL=24H 0001 0010→0010 0100
{ M O V A L , 12 H M O V C L , 2 S A L A L , C L \begin{cases}MOV\ AL,12H\\ MOV\ CL,2\\ SAL\ AL,CL \end{cases} ⎩⎪⎨⎪⎧MOV AL,12HMOV CL,2SAL AL,CL
② 算 术 右 移 S A R d s t , 1 / C L ②算术右移\ SAR\ dst,1/CL ②算术右移 SAR dst,1/CL
M O V A L , − 8 MOV AL,-8 MOVAL,−8
S A R A L , 1 ; A L = − 4 右 移 一 位 / 2 SAR\ AL,1\qquad\color{DeepSkyblue}{;AL=-4\ 右移一位/2} SAR AL,1;AL=−4 右移一位/2
-
算 术 移 位 : 有 符 号 数 运 算 { 左 移 ∗ 2 右 移 / 2 算术移位:\pmb{有符号}数运算\begin{cases}左移*2\\ 右移/2\end{cases} 算术移位:有符号有符号有符号数运算{左移∗2右移/2
-
对 C F 有 影 响 { S A L A L , 1 J C L 1 ; C F = 1 时 转 L 1 对CF有影响\begin{cases} SAL\ AL,1\\ JC\ L_1\qquad\color{DeepSkyblue}{;CF=1时转L_1} \end{cases} 对CF有影响{SAL AL,1JC L1;CF=1时转L1
③
逻
辑
左
移
:
S
H
L
d
s
t
,
1
/
C
L
③逻辑左移:SHL\ dst,1/CL
③逻辑左移:SHL dst,1/CL
④
逻
辑
右
移
:
S
H
R
d
s
t
,
1
/
C
L
④逻辑右移:SHR\ dst,1/CL
④逻辑右移:SHR dst,1/CL
- 逻 辑 移 位 : 无 符 号 数 运 算 { 左 移 ∗ 2 右 移 / 2 逻辑移位:\pmb{无符号}数运算\begin{cases}左移*2\\ 右移/2\end{cases} 逻辑移位:无符号无符号无符号数运算{左移∗2右移/2
- 移出后,补‘0’
⑤
循
环
移
位
⑤循环移位
⑤循环移位
{
循
环
左
移
R
O
L
d
s
t
,
1
/
C
L
循
环
右
移
R
O
R
d
s
t
,
1
/
C
L
\begin{cases}循环左移ROL\ dst,1/CL\\ 循环右移ROR\ dst,1/CL \end{cases}
{循环左移ROL dst,1/CL循环右移ROR dst,1/CL
{ M O V A L , 89 H R O L A L , 1 ; C F = 1 ( 最 左 边 的 数 做 了 进 位 ) A L = 13 H \begin{cases} MOV\ AL,89H\\ ROL\ AL,1\qquad\color{DeepSkyblue}{;CF=1(最左边的数做了进位)\quad AL=13H} \end{cases} {MOV AL,89HROL AL,1;CF=1(最左边的数做了进位)AL=13H
{ M O V A L , 89 H R O R A L , 1 ; C F = 1 ( 最 右 边 的 数 做 了 进 位 ) A L = 0 C 4 H \begin{cases} MOV\ AL,89H\\ ROR\ AL,1\qquad\color{DeepSkyblue}{;CF=1(最右边的数做了进位)\quad AL=0C4H} \end{cases} {MOV AL,89HROR AL,1;CF=1(最右边的数做了进位)AL=0C4H
⑥带进位循环
{ C L C ; C F = 0 M O V A L , 56 H ; A L = 56 H R C L A L , 1 ; C F = 0 A L = 0 A C H \begin{cases}CLC\qquad\color{DeepSkyblue}{;CF=0}\\ MOV\ AL,56H\qquad\color{DeepSkyblue}{;AL=56H}\\ RCL\ AL,1\qquad\color{DeepSkyblue}{;CF=0\quad AL=0ACH} \end{cases} ⎩⎪⎨⎪⎧CLC;CF=0MOV AL,56H;AL=56HRCL AL,1;CF=0AL=0ACH
{ S T C ; C F = 1 M O V A L , 56 H R C R A L , 1 ; C F = 0 A L = 0 A B H \begin{cases} STC \qquad\color{DeepSkyblue}{;CF=1}\\ MOV\ AL,56H\\ RCR\ AL,1\qquad\color{DeepSkyblue}{;CF= 0\quad AL=0ABH} \end{cases} ⎩⎪⎨⎪⎧STC;CF=1MOV AL,56HRCR AL,1;CF=0AL=0ABH
例:AX=1234X DX=5678H 经过下列指令求AX和DX
M O V C L , 4 ; C L = 4 MOV\ CL,4\qquad\color{DeepSkyblue}{;CL=4} MOV CL,4;CL=4
S H L D X , C L ; D X = 6780 H SHL\ DX,CL\qquad\color{DeepSkyblue}{;DX=6780H} SHL DX,CL;DX=6780H
M O V B L , A H ; B L = 12 H MOV\ BL,AH\qquad\color{DeepSkyblue}{;BL=12H} MOV BL,AH;BL=12H
S H L A X , C L ; A X = 2340 H SHL\ AX,CL\qquad\color{DeepSkyblue}{;AX=2340H} SHL AX,CL;AX=2340H
S H R B L , C L ; B L = 01 H SHR\ BL,CL\qquad\color{DeepSkyblue}{;BL=01H} SHR BL,CL;BL=01H
O R D L , B L ; 80 H ⋁ 01 H D L = 81 H OR\ DL,BL\qquad\color{DeepSkyblue}{;80H \bigvee 01H\quad DL=81H} OR DL,BL;80H⋁01HDL=81H
A X = 2340 H D X = 6781 H \color{DeepSkyblue}{AX=2340H\quad DX=6781H} AX=2340HDX=6781H
功能: 双 字 D X 、 A X 左 移 4 位 \color{DeepSkyblue}{双字DX、AX左移4位} 双字DX、AX左移4位
已知有符号数x为字节,求10X,存入AX
( 1 ) 移 位 (1)移位 (1)移位
M O V A H , 0 MOV\ AH,0 MOV AH,0
M O V A L , x MOV\ AL,x MOV AL,x
S A L A X , 1 ; 2 x → A X SAL\ AX,1\qquad\color{DeepSkyblue}{;2x\rightarrow AX} SAL AX,1;2x→AX
M O V B X , A X ; B X = 2 x MOV\ BX,AX\qquad\color{DeepSkyblue}{;BX=2x} MOV BX,AX;BX=2x
S A L A X , 2 ; A X = 8 x SAL\ AX,2\qquad\color{DeepSkyblue}{;AX=8x} SAL AX,2;AX=8x
A D D A X , B X ; A X = 10 x ADD\ AX,BX\qquad\color{DeepSkyblue}{;AX=10x} ADD AX,BX;AX=10x
( 2 ) 加 法 (2)加法 (2)加法
M O V A H , 0 MOV\ AH,0 MOV AH,0
M O V A L , x MOV\ AL,x MOV AL,x
A D D A X , A X ; A X = 2 X ADD\ AX,AX\qquad\color{DeepSkyblue}{;AX=2X} ADD AX,AX;AX=2X
M O V B X , A X ; B X = 2 X MOV\ BX,AX\qquad\color{DeepSkyblue}{;BX=2X} MOV BX,AX;BX=2X
A D D A X , A X ; A X = 4 X ADD\ AX,AX\qquad\color{DeepSkyblue}{;AX=4X} ADD AX,AX;AX=4X
A D D A X , A X ; A X = 8 X ADD\ AX,AX\qquad\color{DeepSkyblue}{;AX=8X} ADD AX,AX;AX=8X
A D D A X , B X ; A X = 10 X ADD\ AX,BX\qquad\color{DeepSkyblue}{;AX=10X} ADD AX,BX;AX=10X
( 3 ) 乘 法 (3)乘法 (3)乘法
M O V A H , 0 MOV\ AH,0 MOV AH,0
M O V A L , x MOV\ AL,x MOV AL,x
M O V B L , 10 MOV\ BL,10 MOV BL,10
I M U L B L ; A X = 10 IMUL\ BL\qquad\color{DeepSkyblue}{;AX=10} IMUL BL;AX=10
(4)控制转移
无条件转移和过程调用 | - |
---|---|
J M P JMP JMP | 无条件转移 |
C A L L CALL CALL | 过程调用 |
R E T RET RET | 过程调用 |
条件转移 | - |
---|---|
J Z / J E 等 10 条 指 令 JZ/JE等10条指令 JZ/JE等10条指令 | 直接标志转移 |
J A / J N B E 等 8 条 指 令 JA/JNBE等8条指令 JA/JNBE等8条指令 | 间接标志转移 |
条件循环控制 | |
---|---|
L O O P LOOP LOOP | C X ≠ 0 则 循 环 CX\not=0则循环 CX=0则循环 |
L O O P E / L O O P Z LOOPE/LOOPZ LOOPE/LOOPZ | C X ≠ 0 和 Z F = 1 则 循 环 CX\not=0和ZF=1则循环 CX=0和ZF=1则循环 |
L O O P N E / L O O P N Z LOOPNE/LOOPNZ LOOPNE/LOOPNZ | C X ≠ 0 和 Z F = 0 则 循 环 CX\not=0和ZF=0则循环 CX=0和ZF=0则循环 |
J C X Z JCXZ JCXZ | C X = 0 则 转 移 CX=0则转移 CX=0则转移 |
中断 | - |
---|---|
INT n | N号中断 |
INTO | 溢出中断 |
IRET | 中断返回 |
无条件转移和过程调用
①
J
M
P
标
号
;
标
号
(
字
母
+
数
字
)
:
指
明
指
令
地
址
①JMP\ 标号\qquad\color{DeepSkyblue}{;标号(字母+数字):指明指令地址}
①JMP 标号;标号(字母+数字):指明指令地址
②
C
A
L
L
子
程
序
名
字
;
主
程
序
调
用
子
程
序
②CALL\ 子程序名字\qquad\color{DeepSkyblue}{;主程序调用子程序}
②CALL 子程序名字;主程序调用子程序
③
R
E
T
;
子
程
序
返
回
主
程
序
③RET\qquad\color{DeepSkyblue}{;子程序返回主程序}
③RET;子程序返回主程序
条件转移
①
间
接
标
志
寻
址
{
无
符
号
{
J
A
:
大
于
J
N
A
:
不
大
于
(
小
于
等
于
)
J
A
E
:
大
于
等
于
J
N
A
E
:
小
于
J
B
:
小
于
J
N
B
:
不
小
于
(
大
于
等
于
)
J
B
E
:
小
于
等
于
J
N
B
E
:
大
于
有
符
号
{
J
G
:
大
于
J
N
G
:
不
大
于
(
小
于
等
于
)
J
G
E
:
大
于
等
于
J
N
G
E
:
小
于
J
L
:
小
于
J
N
L
:
不
小
于
(
大
于
等
于
)
J
L
E
:
小
于
等
于
J
N
L
E
:
大
于
①\pmb{间接标志寻址}\begin{cases} 无符号\begin{cases} \pmb{JA}:大于\\ JNA:不大于(小于等于)\\ JAE:大于等于\\ JNAE:小于\\ \pmb{JB}:小于\\ JNB:不小于(大于等于)\\ JBE:小于等于\\ JNBE:大于\\ \end{cases}\\ 有符号\begin{cases} \pmb{JG}:大于\\ JNG:不大于(小于等于)\\ JGE:大于等于\\ JNGE:小于\\ \pmb{JL}:小于\\ JNL:不小于(大于等于)\\ JLE:小于等于\\ JNLE:大于\\ \end{cases} \end{cases}
①间接标志寻址间接标志寻址间接标志寻址⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧无符号⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧JAJAJA:大于JNA:不大于(小于等于)JAE:大于等于JNAE:小于JBJBJB:小于JNB:不小于(大于等于)JBE:小于等于JNBE:大于有符号⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧JGJGJG:大于JNG:不大于(小于等于)JGE:大于等于JNGE:小于JLJLJL:小于JNL:不小于(大于等于)JLE:小于等于JNLE:大于
②
直
接
标
志
寻
址
{
J
E
:
相
等
J
N
E
:
不
相
等
{
J
O
:
溢
出
,
O
F
=
1
J
N
O
:
无
溢
出
,
O
F
=
0
J
Z
:
零
(
相
等
)
,
Z
F
=
1
J
N
Z
:
不
是
零
,
Z
F
=
0
J
C
:
有
进
位
,
C
F
=
1
J
N
C
:
无
进
位
,
C
F
=
0
J
S
:
负
数
,
S
F
=
1
J
N
S
:
正
数
,
S
F
=
0
J
P
/
J
P
E
:
偶
数
,
P
F
=
1
J
N
P
/
J
P
O
:
奇
数
,
P
F
=
0
②\pmb{直接标志寻址}\begin{cases} \pmb{JE}:相等\\ JNE:不相等\\ \begin{cases} \pmb{JO}:溢出,OF=1\\ JNO:无溢出,OF=0\\ \pmb{JZ}:零(相等),ZF=1\\ JNZ:不是零,ZF=0\\ \pmb{JC}:有进位,CF=1\\ JNC:无进位,CF=0\\ \pmb{JS}:负数,SF=1\\ JNS:正数,SF=0\\ \pmb{JP}/JPE:偶数,PF=1\\ JNP/JPO:奇数,PF=0 \end{cases} \end{cases}
②直接标志寻址直接标志寻址直接标志寻址⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧JEJEJE:相等JNE:不相等⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧JOJOJO:溢出,OF=1JNO:无溢出,OF=0JZJZJZ:零(相等),ZF=1JNZ:不是零,ZF=0JCJCJC:有进位,CF=1JNC:无进位,CF=0JSJSJS:负数,SF=1JNS:正数,SF=0JPJPJP/JPE:偶数,PF=1JNP/JPO:奇数,PF=0
在数据段buf开始的存储单元中存放了2个8位无符号数,比较其大小,并把小的数送MIN单元
L E A B X , b u f LEA\ BX,buf LEA BX,buf
M O V A L , [ B X ] MOV\ AL,[BX] MOV AL,[BX]
I N C B X INC\ BX INC BX
C M P A L , [ B X ] CMP\ AL,[BX] CMP AL,[BX]
J B E L 1 ; 当 A L ≤ [ B X ] 时 转 L 1 JBE\ L_1\qquad\color{DeepSkyblue}{;当AL\leq[BX]时转L_1} JBE L1;当AL≤[BX]时转L1
M O V A L , [ B L ] MOV\ AL,[BL] MOV AL,[BL]
L 1 : M O V M I N , A L L_1:MOV\ MIN,AL L1:MOV MIN,AL
H L T HLT HLT
循环转移指令
① L O O P 标 号 ; 等 效 { D E C C X ; C X − 1 → C X J N Z 标 号 ; C X ≠ 0 时 ①LOOP\ 标号\qquad\color{DeepSkyblue}{;等效 \begin{cases} DEC\ \pmb{CX}\qquad;CX-1 \rightarrow CX\\ JNZ\ 标号\qquad;CX\not=0时 \end{cases}} ①LOOP 标号;等效{DEC CXCXCX;CX−1→CXJNZ 标号;CX=0时
s = 1 + 2 + 3 + . . . + 100 s=1+2+3+...+100 s=1+2+3+...+100
M O V C X , 99 MOV\ CX,99 MOV CX,99
M O V A X , 1 MOV\ AX,1 MOV AX,1
M O V B X , 2 MOV\ BX,2 MOV BX,2
L 1 : A D D A X , B X ; 1 + 2 → A X L1:ADD\ AX,BX \qquad\color{DeepSkyblue}{;1+2\rightarrow AX} L1:ADD AX,BX;1+2→AX
I N C B X ; B X = 3 INC\ BX \qquad\color{DeepSkyblue}{;BX=3} INC BX;BX=3
L O O P L 1 { D E C C X ; C X − 1 → C X = 98 J N Z L 1 ; C X ≠ 0 时 跳 转 L 1 LOOP\ L1 \color{DeepSkyblue}{\begin{cases} DEC\ CX\qquad;CX-1\rightarrow CX=98\\ JNZ\ L1\qquad;CX\not=0时跳转L1 \end{cases}} LOOP L1{DEC CX;CX−1→CX=98JNZ L1;CX=0时跳转L1
M O V S , A X MOV\ S,AX MOV S,AX
中断指令(DOS系统功能调用)
所有系统功能的调用格式都是一致的,步骤如下:
- 在AH寄存器中设置系统功能调用号。
- 在指定的寄存器中设置入口参数。
- 用INT 21H指令执行功能调用。
- 根据出口参数分析功能调用执行情况。
I
N
T
21
H
;
内
指
令
中
断
,
21
H
是
中
断
类
型
号
INT\ 21H\qquad\color{DeepSkyblue}{;内指令中断,21H是中断类型号}
INT 21H;内指令中断,21H是中断类型号
;
I
N
T
n
的
中
断
号
由
指
令
直
接
给
出
\color{DeepSkyblue}{;INT\ n的中断号由指令直接给出}
;INT n的中断号由指令直接给出
① { M O V A H , 01 H I N T 21 H ; 从 键 盘 接 收 单 个 字 符 , 该 字 符 的 A S C I I 存 入 A L ①\begin{cases} MOV\ AH,01H\\ INT\ 21H\qquad\color{DeepSkyblue}{;从键盘接收单个字符,该字符的ASCII存入AL} \end{cases} ①{MOV AH,01HINT 21H;从键盘接收单个字符,该字符的ASCII存入AL
② { M O V D L , ′ A ′ M O V A H , 02 H I N T 21 H ; 在 屏 幕 上 显 示 单 个 字 符 , 该 字 符 的 A S C I I 码 提 前 存 入 D L 中 ②\begin{cases} MOV\ DL,'A'\\ MOV\ AH,02H\\ INT\ 21H\qquad\color{DeepSkyblue}{;在屏幕上显示单个字符,该字符的ASCII码提前存入DL中} \end{cases} ②⎩⎪⎨⎪⎧MOV DL,′A′MOV AH,02HINT 21H;在屏幕上显示单个字符,该字符的ASCII码提前存入DL中
③ 在 数 据 段 中 定 义 被 显 示 的 字 符 串 ③在数据段中定义被显示的字符串 ③在数据段中定义被显示的字符串
{ L E A D X , S t r i n g M O V A H , 09 H I N T 21 H \begin{cases} LEA\ DX,String\\ MOV\ AH,09H\\ INT\ 21H \end{cases} ⎩⎪⎨⎪⎧LEA DX,StringMOV AH,09HINT 21H
④ { M O V A H , 4 C H I N T 21 H ; 返 回 D O S 系 统 , 程 序 结 束 ④\begin{cases} MOV\ AH,4CH\\ INT\ 21H\qquad\color{DeepSkyblue}{;返回DOS系统,程序结束} \end{cases} ④{MOV AH,4CHINT 21H;返回DOS系统,程序结束
(5)处理器控制指令
指令类型 | 指令格式 | 指令功能 | 指令完成的操作 |
---|---|---|---|
标志位处理指令 | S T C STC STC | 进位标志CF置1 | C F = 1 CF=1 CF=1 |
C L C CLC CLC | 进位标志CF清0 | C F = 0 CF=0 CF=0 | |
C M C CMC CMC | 进位标志CF取反 | C F = C F ‾ CF=\overline{CF} CF=CF | |
S T D STD STD | 方向标志DF置1 | D F = 1 DF=1 DF=1 | |
C L D CLD CLD | 方向标志DF清0 | D F = 0 DF=0 DF=0 | |
S T I STI STI | 中断标志IF置1 | I F = 1 IF=1 IF=1 | |
C L I CLI CLI | 中断标志IF置0 | I F = 0 IF=0 IF=0 | |
其他控制指令 | H L T HLT HLT | 暂停指令,使CPU进入暂停状态 | |
W A I T WAIT WAIT | 等待指令 | ||
E S C ESC ESC | 交权指令 | ||
L O C K LOCK LOCK | 封锁指令 | ||
N O P NOP NOP | 空操作 |
Macro
endm
(6)串操作
- 传送∶从源存储区到目的区。
MOVSB (传字节)
MOVSW (传字) - 存入串:将AX的内容存入目的存储区。
STOSB(AL) / STOSW(AX) - 从串取︰将源存储区的内容送AX。
LODSB(AL) / LODSW(AX) - 比较源和目的串:
CMPSB (8位和8位比较)
CMPSW (16位和16位比较) - 串扫描:将AX的内容与目的串的一个数据比较。
SCASB(AL) / SCASW(AX) - REP
C X ← C X − 1 CX\leftarrow CX-1 CX←CX−1
判断(CX) =0 ?如(CX)=0,退出 - REPE/ REPZ
C X ← ( C X ) − 1 CX\leftarrow(CX) -1 CX←(CX)−1
判断CX=O或ZF=O则退出 - 串重复前缀REPNE/ REPNZ
C X ← ( C X ) − 1 CX\leftarrow(CX) -1 CX←(CX)−1
判断CX=0或ZF=1则退出
以上串操作指令具有下列共性:
1、DS:SI指向源串,ES:DI指向目的串
2、SI和DI自动增加或者减少1,2,4,关键要看DF的值以及操作类型是字节、字、双字。若DF=0,则SI和DI增加,否则减少。
本文仅供本人学习总结使用,文中观点,均为本人拙见,如有错误或不妥之处,请及时指正。