微机原理与接口技术 第三章 汇编指令系统(河北专升本计算机)

一、指令的寻址方式

寻址方式:寻找操作数地址的方式

找 操 作 数 { 1.   C P U 的 寄 存 器 中 2.   主 存 找操作数\begin{cases} 1.\ CPU的寄存器中\\ 2.\ 主存 \end{cases} {1. CPU2. 

以下都是针对源操作数来说的寻址方式,(按目的操作数来说,需要将操作数颠倒进行判断。)
源操作数:源即起始的意思,指被操作的数据;
目的操作数:顾名思义,目的即到达的意思,指命令操作数据最终要存放的地方。

1. 立即数寻址

  1. 在主存的代码段中,紧挨着操作码的下一个单元中存放。
    (操作码其实就是指令序列号,用来告诉CPU需要执行哪─条指令。)

M O V A L , 5 ; A L = 5 MOV AL,5\qquad \color{DeepSkyblue}{;AL=5} MOVAL,5;AL=5 (分号是注释)

  1. 立即数只能出现在源操作数(目的操作数不允许使用立即数寻址)

A D D   A L , 8 ADD\ AL,8 ADD AL,8

  1. 双操作数一致

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;ALBH
M O V   A X , D H ; 错 , 长 度 不 一 致 A X 16 位 , D H 8 位 MOV\ AX,DH\qquad \color{DeepSkyblue}{;错,长度不一致AX16位 ,DH8位} MOV AX,DH;AX16DH8
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]

  1. 指令中直接给出操作数的有效地址(EA)
  2. 物理地址=段地址*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=DS16+EA=32000H
④ ( 32000 H ) = 1234 H ➡ A X ④(32000H)=1234H ➡AX 32000H=1234HAX

4. 寄存器间接寻址

M O V   A X , [ B X ] MOV\ AX,[BX] MOV AX,[BX]

  1. 指令中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

  1. [ ]中括号中只能使用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}SSBXSIDIDS

  2. 以寄存器的内容(内存单元)作为操作数的寻址方式

例: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 SS16+BP=16000H
④ ( 16000 H ) = 5678 H → A X ④(16000H)=5678H\rightarrow AX 16000H=5678HAX

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=1234HAX

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]

  1. 基址寄存器:BX、BP
    [BX+SI][BX+DI] → \rightarrow DS(数据段寄存器)
  2. 变址寄存器: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=SS16+EA=33000H
④ ( 33000 H ) = 5389 H → A X ④(33000H)=5389H\rightarrow AX 33000H=5389HAX

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=DS16+EA=33005H
④ ( 33005 H ) = 1234 H → A X ④(33005H)=1234H\rightarrow AX 33005H=1234HAX

8. 隐含寻址

  1. 指令中不出现操作数地址

M U L   B L ; A L ∗ B L → A X MUL\ BL\qquad \color{DeepSkyblue}{;AL*BL\rightarrow AX} MUL BL;ALBLAX
(隐含了被乘数AL,积在AX中)

  1. 隐含操作数在寄存器中,常用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]
答:

  1. 基址加变址寻址
    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=DS16+EA=21A0H
  2. 寄存器寻址(没有物理地址)
  3. 直接寻址
    E A = 1000 H EA=1000H EA=1000H
    P A = D S ∗ 16 + E A = 21000 H PA=DS*16+EA=21000H PA=DS16+EA=21000H
  4. 寄存器间接寻址
    E A = 0100 H EA=0100H EA=0100H
    P A = D S ∗ 16 + E A = 20100 H PA=DS*16+EA=20100H PA=DS16+EA=20100H
  5. 寄存器相对寻址
    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=DS16+EA=20150H
  6. 相对基址加变址寻址
    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=DS16+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
  1. 双操作数(地址码)指令
  2. 功能:在CPU与主存之间进行数据传送
    源操作数src➡物理(目的)操作数dst
  3. 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]

  1. dst: 寄存器操作数,存储器操作数,不可以是立即数(CS、IP)
  2. 双操作数,不能同时为存储器操作数

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

  1. 双操作数指令长度要匹配

M O V   A X , B L ; 错 , A X MOV\ AX,BL \qquad \color{DeepSkyblue}{;错,AX} MOV AX,BL;AX

  1. 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;

  1. 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

  1. 不影响标志位
  2. CPU➡主存: MOV [ ],AX/BX等
    主存➡CPU: MOV AX/BX等, [ ]
堆栈操作 PUSH src

压栈指令 PUSH src

  1. 单操作数(地址码)数指令,隐含了一个堆栈操作数
  2. 功能:src → \rightarrow 堆栈
  3. 堆栈是内存中开辟的用于存放数据的区域
  4. 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

  1. src必须是字,可以是寄存器操作数,存储器操作数

PUSH [SI]

出栈指令 POP dst
  1. 功能:栈顶的一个字 → \rightarrow dst
  2. 先取出数据,再移动指针
    ((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
  1. 双操作数,长度要匹配,不能同时为存储器操作数
  2. opr2 不能为立即数
  3. 功能: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 查表转换指令
  1. 可以不带操作数
  2. 隐含默认 BX:表首地址 AL:表的位移量
    ((BX)+(AL)) → \rightarrow AL
地址传送 LEA dst src
  1. dst:寄存器(16位)
    src:存储器
  2. 功能把存储器的 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,port8{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=3412HIN 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;DXAL=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{816
直 接 寻 址 { 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/O20HALCPUAX20HOUT 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;CPUAL1000HOUT DX,AL

例:分别用2种方法写出
(1)从88H端口读入信息的指令

  1. I N   A L , 88 H IN\ AL,88H IN AL,88H
  2. 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的指令

  1. M O V A X , 1000 H MOV AX, 1000H MOVAX,1000H
    O U T 42 H , A X OUT 42H, AX OUT42H,AX
  2. 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

  1. 功能:dst+src → \rightarrow dst
  2. 双操作数长度匹配
  3. 影响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

  1. 功能:dst+src+CF → \rightarrow dst
  2. 用于多字节运算时高字节的运算

例 : A X = 5678 H , B X = 9 A B C H 例:AX=5678H,BX=9ABCH AX=5678HBX=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

  1. 单操作数
  2. 功能:dst+1 → \rightarrow dst
  3. 不影响CF,影响其它5个状态位
  4. 常用于改变循环变量和地址递增

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)ADDSBB dst,srcSBB dst,srcSBB dst,srcADC}6DEC dstDEC dstDEC dstINC{CF

C M P   d s t , s r c \pmb{CMP\ dst,src} CMP dst,srcCMP dst,srcCMP dst,src

  1. 影响6个状态位
  2. 不回送结果 dst-src
  3. 下一条指令常跳转
    判断大小:
    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.SFOF{SFOF=1SFOF=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=1L1CF=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=1CF=0L1

有符号数
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];26H17H
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=1L1AL<[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
Y
开始
取第一个数
取第二个数
AL>[BX]
MAX⬅[BX]
MAX⬅AL
结束

⑤ N E G : 求 补 / 求 绝 对 值 / 求 反 ⑤NEG:求补/求绝对值/求反 NEG//

  1. NEG OPR
  2. 0-OPR➡OPR
  3. 影响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

N
Y
开始
取数
BX>0
BX⬅NEG
DI⬅BX
乘法

① M U L   s r c ; 无 符 号 数 相 乘 ① MUL\ src\qquad\color{DeepSkyblue}{;无符号数相乘} MUL src;

  1. 单操作数,隐含了被乘数(AX/AL)
  2. 功能: { 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} {srcALsrcAX()srcAXsrcDX,AX()
  3. 影响CF和OF
    字 节 ∗ 字 节 { 字 节 C F = O F = 0 字 C F = O F = 1 字节*字节\begin{cases} 字节 CF=OF=0\\ 字 CF=OF=1 \end{cases} {CF=OF=0CF=OF=1
    字 ∗ 字 { 字 C F = O F = 0 双 字 C F = O F = 1 字*字\begin{cases} 字 CF=OF=0\\ 双字 CF=OF=1 \end{cases} {CF=OF=0CF=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;ALBL=56AXCF=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{ALAH
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{AXDX
如被除数位为16位,那么商存在AL、余数存在AH,分别是8位。

符号扩展指令
扩展原则: 将 符 号 位 扩 展 到 整 个 高 位 将\pmb{符号位}扩展到整个高位 符号位
C B W ; 字 节 → 字 ( A L → A X ) CBW\qquad\color{DeepSkyblue}{;字节\rightarrow 字(AL\rightarrow AX)} CBW;(ALAX)

例: 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;(AXDX,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带进位的循环右移
ANDORNOTXORTEST
格式 d s t ⋀ s r c ➡ d s t dst\bigwedge src➡dst dstsrcdst d s t ⋁ s r c ➡ d s t dst\bigvee src➡dst dstsrcdst O P R ‾ ➡ O P R \overline{OPR}➡OPR OPROPR d s t ∀ s r c ➡ d s t dst\forall src➡dst dstsrcdst d s t ⋀ s r c 不 返 回 结 果 dst\bigwedge src不返回结果 dstsrc
影响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=ALCF=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 00100000 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=0CF=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 测试

  1. 测试某位是否为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=1L1

{ 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=12HAL80H00ZF=1JZ L2;ZF=1L2

  1. 测某位是否为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;ALD0=1L3ZF=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;ALD2=1L4
{ 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;ALD0D10Ls

算术移位逻辑类

① 算 术 左 移   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 00100010 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

  1. 算 术 移 位 : 有 符 号 数 运 算 { 左 移 ∗ 2 右 移 / 2 算术移位:\pmb{有符号}数运算\begin{cases}左移*2\\ 右移/2\end{cases} 有符号{2/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=1L1

③ 逻 辑 左 移 : 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

  1. 逻 辑 移 位 : 无 符 号 数 运 算 { 左 移 ∗ 2 右 移 / 2 逻辑移位:\pmb{无符号}数运算\begin{cases}左移*2\\ 右移/2\end{cases} 无符号{2/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/CLROR 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;80H01HDL=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位} DXAX4

已知有符号数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;2xAX
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/JE10直接标志转移
J A / J N B E 等 8 条 指 令 JA/JNBE等8条指令 JA/JNBE8间接标志转移
条件循环控制
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=0ZF=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=0ZF=0
J C X Z JCXZ JCXZ C X = 0 则 转 移 CX=0则转移 CX=0
中断-
INT nN号中断
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} 间接标志寻址JAJAJAJNAJAEJNAEJBJBJBJNBJBEJNBEJGJGJGJNGJGEJNGEJLJLJLJNLJLEJNLE
② 直 接 标 志 寻 址 { 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} 直接标志寻址JEJEJEJNEJOJOJOOF=1JNOOF=0JZJZJZZF=1JNZZF=0JCJCJCCF=1JNCCF=0JSJSJSSF=1JNSSF=0JPJPJP/JPEPF=1JNP/JPOPF=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;CX1CXJNZ ;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+2AX
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;CX1CX=98JNZ L1;CX=0L1
M O V   S , A X MOV\ S,AX MOV S,AX

Y
N
开始
CX=99,AX=1,BX=2
L1:AX=AX+BX,BX=BX+1
CX-1➡CX
CX不等于0
AX➡S
结束
中断指令(DOS系统功能调用)

所有系统功能的调用格式都是一致的,步骤如下:

  1. 在AH寄存器中设置系统功能调用号。
  2. 在指定的寄存器中设置入口参数。
  3. 用INT 21H指令执行功能调用。
  4. 根据出口参数分析功能调用执行情况。

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;ASCIIAL
② { 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,AMOV AH,02HINT 21H;ASCIIDL
③ 在 数 据 段 中 定 义 被 显 示 的 字 符 串 ③在数据段中定义被显示的字符串
{ 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)串操作

  1. 传送∶从源存储区到目的区。
    MOVSB (传字节)
    MOVSW (传字)
  2. 存入串:将AX的内容存入目的存储区。
    STOSB(AL) / STOSW(AX)
  3. 从串取︰将源存储区的内容送AX。
    LODSB(AL) / LODSW(AX)
  4. 比较源和目的串:
    CMPSB (8位和8位比较)
    CMPSW (16位和16位比较)
  5. 串扫描:将AX的内容与目的串的一个数据比较。
    SCASB(AL) / SCASW(AX)
  6. REP
    C X ← C X − 1 CX\leftarrow CX-1 CXCX1
    判断(CX) =0 ?如(CX)=0,退出
  7. REPE/ REPZ
    C X ← ( C X ) − 1 CX\leftarrow(CX) -1 CX(CX)1
    判断CX=O或ZF=O则退出
  8. 串重复前缀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增加,否则减少。

本文仅供本人学习总结使用,文中观点,均为本人拙见,如有错误或不妥之处,请及时指正。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值