第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式
4.1 寻址方式寻址方式分类,1)与数据有关 的寻址方式2)与转移地址有关 的寻址方式,确定内存单元的地址有 7 种 与数据有关的寻址方式
,确定转移地址以 MOV指令为例,MOV 目的 操作数,源操作数对 源操作数 分别使用 7 种 寻址方式如下:
( 1) 立即寻址方式 ( Immediate Addressing )
特点,操作数包含在指令中操作数是指令的组成部分,可以是 8位或 16位,取出指令就立即获得 操作数 ——立即数例 1,MOV AL,5
执行指令后,(AL) = 05H B0
05
存储器指令
05
AL
例 2,MOV AX,3045H
执行指令后,(AX) = 3045H
指令
45
AX
OP
45
存储器
30
30
低地址高地址用途,给变量或寄存器赋常量值限制,只能用于源操作数
( 2) 寄存器寻址方式 ( Register Addressing )
特点,操作数存在寄存器中例,MOV AX,BX
执行指令前,(AX) = 3045H (BX) = 4000H
执行指令后,(AX) = 4000H (BX) = 4000H
用途,用寄存器提供操作数时存取速度快指令
2000H
50
30




存储器代码段
op
00
20
数据段30000H
32000H
AX
用途,用于存取单个变量中的操作数
30 50
例,设 ( DS ) = 3000H
MOV AX,[2000H]
( 3) 直接寻址方式 ( Direct Addressing )
特点,操作数的偏移地址包含在指令中要访问的存储单元 物理地址 为:
30000H+2000H=32000H
设,(32000H)=3050H
执行指令后,(AX)=3050H
如果 2000H单元在附加段,指令为,MOV AX,ES:[2000H]
段跨越前缀,段寄存器名,—— 改变默认使用的段寄存器
MOV AX,NUM
第一章 基础知识第四章 指令系统和寻址方式可以使用属性操作符 type PTR 来进行属性说明第一章 基础知识第四章 指令系统和寻址方式
1000H
AX
用途,可 用于处理数组
50 A0
A0
50



存储器数据段20000H
21000H
XX
XX
21002H
例,设 ( DS ) = 2000H
( BX ) = 1000H
指令为,MOV AX,[ BX ] 数组起始地址
( 4) 寄存器间接寻址方式 ( Register Indirect Addressing )
特点,(寄存器 ) = 操作数的偏移地址计算操作数物理地址的公式,
1) 操作数物理地址 =( DS)?16+
2) 操作数物理地址 =( SS)?16+( BP)
(BX)
(SI)
(DI)
20000H+1000H = 21000H
要访问的存储单元物理地址 为:
设,(21000H)=50A0H
执行指令后,(AX)=50A0H
指令
4000H
30000H
AX
(寄存器相对寻址方式)
12 34
例:设 ( DS ) = 3000H
ARRAY=4000H
( SI ) = 2000H
指令为,MOV AX,ARRAY[ SI ]
34
12…



存储器代码段
op
00
40
数据段
36000H
op
…2000H
数组起始地址
( 5) 变址寻址方式 ( Indexed Addressing )
特点,(变址、基址寄存器 ) +指令中的位移量 = 操作数的偏移地址计算操作数物理地址的公式,
1) 操作数物理地址 =(DS)?16+
2) 操作数物理地址 =( SS)?16+ (BP) + 8位位移量16位位移量
30000H+4000H +2000H= 36000H
要访问的存储单元物理地址 为:
设,(36000H)=1234H
用途,可 用于处理数组执行指令后,(AX)=1234H
+
(SI)
(DI)
(BX)
8位位移量
16位位移量
0158H
AX
12 34
例:设 ( DS ) = 2100H
( BX ) = 0158H
( DI ) = 1000H
指令为,MOV AX,[BX+DI]
34
12



存储器数据段21000H
22158H
1000H
数组起始地址
( 6) 基址 变址寻址方式 ( Based Index Addressing )
特点,(基址寄存器 ) + (变址寄存器 ) = 操作数的偏移地址计算操作数物理地址的公式,
1) 操作数物理地址 =(DS)?16+
2) 操作数物理地址 =( SS)?16+ (BP) +
(BX) + (SI)(DI)
(SI)
(DI)
21000H+0158H +1000H= 22158H
要访问的存储单元物理地址 为:
设,(22158H)=1234H
执行指令后,(AX)=1234H
用途,可 用于处理数组几种 可处理数组 的 寻址方式 的比较,
1,MOV AX,[BX]
2,MOV AX,ARRAY [SI]
3,MOV AX,[BX][SI]
寄存器间接寻址方式变址寻址方式基址变址寻址方式特点,可读性好,指令中明确指出了要处理的数组。
限制,写程序时必须清楚要处理什么数组。
特点,适用于要处理的数组需要在程序运行中动态确定,
并且修改 BX就可以处理不同的数组。
特点,适用于要处理的数组需要在程序运行中动态确定,
且形式简单。
上述 1.和 2.指令中的 [寄存器 ]还可被哪些寄存器替换?
DI SI BP (加 段跨越前缀 DS,或 ES)
上述 3.指令中的 BX寄存器是否可被其他寄存器替换?
DI BX BP (加 段跨越前缀 DS,或 ES)
next
指令
2000H
AX
12 34
例:设 ( SS ) = 3000H
( BP ) = 2000H
ARRAY = 0250H
( SI ) = 1000H
MOV AX,ARRAY[BP][SI]
1000H
30000H
34
12…



存储器代码段
op
50
02
堆栈段
33250H
op



0250H
栈顶数组首址
( 7)相对基址 变址寻址方式 ( Relative Based Index Addressing )
特点,(基址寄存器 ) + (变址寄存器 )+位移量 = 操作数的偏移地址
30000H+2000H +0250+1000H
= 33250H
要访问的存储单元 物理地址 为:
用途,便于访问堆栈中的数组第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式注意:高低地址写错第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式机器指令的一般构成格式:
1。前缀,共 4种,可以 0~ 4种结合起来。 4个字节
2。指令,1~ 2字节。
3。寻址方式,0~ 1字节,有的指令没有操作数或者不用指明操作数,所以就不必要有寻址方式了。
4。比例因子,0~ 1字节,16位指令是没有这个的,是 32位变址的一个附带系数。
5。偏移量,1,2,4字节。 16位是 1或 2,32位是 1或 4。
6。立即数,1,2,4字节。
第一章 基础知识第四章 指令系统和寻址方式
LockREP
REPEREPNE
第一章 基础知识第四章 指令系统和寻址方式
W位指示对字( W=1)还是对字节( W=0)操作
D值在双操作数才有效,如果双操作数中存在寄存器,D指定寄存器是目的操作数( D=1)还是源操作数( D=0)。
第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式根据 d的不同进行选取第一章 基础知识第四章 指令系统和寻址方式
d= 1时的操作第一章 基础知识第四章 指令系统和寻址方式
d= 0时的操作第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式
MOV指令注意事项:
MOV指令可以在 CPU内或 CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除 CS外的段寄存器 (注意立即数不能直接送段寄存器 ),从段寄存器到寄存器或存储单元。
MOV指令中的源操作数绝对不能是立即数和代码段 CS寄存器;
MOV指令中绝对不允许在两个存储单元之间直接传送数据;
MOV指令中绝对不允许在两个段寄存器之间直接传送数据;
MOV指令不会影响标志位例,MOV AX,DATA_SEG
MOV DS,AX
注意:段寄存器(段地址)必须通过寄存器如 AX寄存器进行立即数的初始化。
例,MOV BX,OFFSET TABLE
将 TABLE的偏移地址(而不是内容)送到 BX寄存器中。其中 OFFSET为属性操作符,表示的是将其后的符号地址的值(不是内容)作为操作数。
例 MOV AX,Y[BP][SI]
把地址为 16d× (SS)十 (BP)十 (SI)十位移量 Y的存储单元的内容送给 AX寄存器例,MOV AL,?E? 指令执行后,( AL) = 45H
例,判断下列指令是否合法:
MOV DS,AX?
不允许两个操作数都是存储器单元
MOV CS,AX?
MOV CH,4050H?
MOV DL,5BH?
MOV DX,5BH?
MOV DX,AL?
MOV VA1,VA2?
MOV 45,DL?
目的操作数不允许是 CS段寄存器目的操作数不允许是立即数数据类型不匹配数据类型不匹配
next
第一章 基础知识第四章 指令系统和寻址方式
( 2)堆栈传输指令
格式
PUSH进栈指令格式为 PUSH SRC
执行操作,(SP) <- (SP) - 2
((SP)十 1,(SP)) <- (SRC)
POP出栈指令格式为 POP DST
执行操作,(DST) <- ((SP)十 1,(SP))
(SP) <-〔 SP〕 十 2
这是两条堆栈的进栈和出栈指令。堆栈是以“后进先出”方式工作的一个存储区,它必须存在于堆栈段中,因而其段地址存放于 SS寄存器中。它只有一个出入口,所以只有一个堆栈指针寄存器 SP,SP的内容在任何时刻都是指向当前的栈顶,所以 PUSH和 POP指令都必须根据当前 SP的内容来确定进栈或出栈的存储单元,而且必须及时修改指针,以保证 (SP)指向当前的栈顶。
第一章 基础知识第四章 指令系统和寻址方式堆栈传输指令
堆栈的存取必须以字为单位,(IBM PC中不允许字节堆栈 ),所以 PUSH和
POP指令只能作字操作。
它们可以使用初立即数以外的其他寻址方式。
指令也可以指定段寄存器作为操作数,注意 POP绝对不能使用代码段( CS)
寄存器。
这两条指令不影响标志位。
例 PUSH AX 例 POP AX
第一章 基础知识第四章 指令系统和寻址方式堆栈传输指令堆栈在计算机工作中起着重要的作用,如果在程序中要用到某些寄存器,但是它的内容在将来工作中还有用,这时就可以利用堆栈把它们保存下来,然后到必要时恢复其原始内容。例如:
第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式
( 3)有效地址传输指令地址传送指令
LEA 有效地址送寄存器
LDS 指针送寄存器和 DS
LES 指针送寄存器和 ES
这一组指令完成把地址送到指定寄存器的功能。
1,LEA 有效地址送寄存器格式,LEA REG,SRC
执行过程,( REG) <- SRC
完成功能,指令将有效地址送到指定的寄存器中。
2,LDS 指针送寄存器和 DS
格式,LDS REG,SRC
执行的操作,(REG)〈 一 (SRC)
( DS) 〈 - (SRC十 2)
把源操作数指定的 4个相继字节送到由指令指定的寄存器及 DS寄存器中。该指令通常用来指定 SI寄存器。
3,LES 指针送寄存器和 ES
格式,LES REG,SRC
执行的操作,(REG)〈 一 (SRC)
( ES) 〈 - (SRC十 2)
把源操作数指定的 4个相继字节送到由指令指定的寄存器及 ES寄存器中。该指令通常用来指定 DI寄存器。
第一章 基础知识第四章 指令系统和寻址方式有效地址传输指令注意:以上三条指令,不能指定段寄存器,指令操作不影响标志位本组指令把变量的偏移地址 (LEA)或段地址和偏移地址 (LDS和 LES)送给寄存器,
以提供访问变量的工具。
例,LEA BX,[BX十 SI十 0F62H]
如指令执行前 (BX)= 0400H,(SI)= 003CH
则指令执行后 (BX)= 0400十 003C十 0F62= 139EH
必须注意,在这里 BX寄存器得到的是偏移地址而不是该存储单元的内容。
例,LDS SI,[10H]
如指令执行前 (DS)= C000H,(C0010H)= 0180H,(C0012H)= 2000H
则指令执行后 (S1)= 0180H,( DS)= 2000H
例 LES DI,[BX]
如指令执行前 (DS)= B000H,(BX)= 080AH,(0B080AH)= 05AEH,
(0B080CH)= 4000H
则指令执行后 (D1)= 05AEH,(ES)= 4000H
第一章 基础知识第四章 指令系统和寻址方式
( 4) XCHG交换指令格式为 XCHO OPRl,OPR2
执行操作,(OPRl) 〈 一一 〉 (OPR2)
其中 OPR表示操作数。该指令的两个操作数中必须有一个在寄存器中,因此,
它可以是寄存器之间;寄存器和存储器之间交换信息,注意不能使用段寄存器。
指令允许字和字节操作,且不会影响标志位。
例 XCHG BX,[BP+SI]
如指令执行前:
(BX)= 6F30H,(BP)= 0200H,(SI)=0046H,(SS)= 2F00H,(2F246H)=
4l54H
OPR2的物理地址= 2F000十 0200十 0046= 2F246
则指令执行后:
(BX)= 4154H (2F246H)= 6F30H
第一章 基础知识第四章 指令系统和寻址方式
( 5)累加器专用传送指令
IN (input) 输入
OUT (output) 输出
XLAT(Translate) 换码这组指令只限于使用累加器 AX和 AL传送信息。
1,IN 输入指令长格式:对于前 256个端口,可以在指令中直接指定,这就是常格式的端口
( PORT)。
短格式:当端口号大于等于 256时,则必须先将端口号置于 DX寄存器中,然后再利用 IN或 OUT进行信息的传递。
第一章 基础知识第四章 指令系统和寻址方式
( 5)累加器专用传送指令
2,OUT 输出指令
(1) 所有的 I/O端口与 CPU之间的通信都由 IN和 OUT指令来完成。其中 IN完成从 I/O到 CPU的信息传送,而 OUT完成从 CPU到 I/O的信息传送。
(2) CPU只和累加器( AX或 AL)进行接收或发送信息,外部最多可以有 64K
个端口,端口号为 0000H –FFFFH。
(3) 注意,在利用 IN/OUT进行信息传递时,所有的端口号(或 DX的内容)
均为地址,而传送的均为端口号的内容。
(4) 输入、输出指令不影响标志位第一章 基础知识第四章 指令系统和寻址方式
( 5)累加器专用传送指令例 IN AX,28H
MOV DATA_WORD,AX
这两条指令把地口 28的内容经过 AX传送到存储单元 DATA_WORD中。
例 MOV DX,3FCH
IN AX,DX
从端口 03FCH送一个字到 AX寄存器中。
例 OUT 5,AL
从 AL寄存器输出一个字节到端口 5
3,XLAT换码指令格式为; XLAT OPR
或 XLAT
执行的操作,(AL) 〈 一 ((BX)十 (AL))
功能:将一种代码转换为另一种代码。
第一章 基础知识第四章 指令系统和寻址方式
( 5)累加器专用传送指令
3,XLAT换码指令格式为; XLAT OPR
或 XLAT
执行的操作,(AL) 〈 一 ((BX)十 (AL))
功能:将一种代码转换为另一种代码。
在使用这条指令之前,应该先建立一个字节表格,表格的首地址提前存入 BX
寄存器,需要转换的代码应该是相对于表格首地址的位移量也提前存放在 AL
寄存器中,表格的内容则是需要转换的代码,该指令执行后就可在 AL中得到转换后的代码。
该指令可以使用 XLAT或 XLAT OPR两种格式中的任一种,使用 XLAT OPR
时,OPR为表格的首地址 (一般为符号地址 ),但在这里的 OPR只是为提高程序的可读性而设置的,指令执行时只使用预先已存入 BX中的表格首地址,而并不用汇编格式中指定的值。该指令不影后标志位。
第一章 基础知识第四章 指令系统和寻址方式
( 5)累加器专用传送指令例 如 (BX) = 0040H,(AL)= 0FH,( Ds)= F000H
所建立的表格如下图所示。
指令 XLAT
把 F0000H+0040H+0FH的内容送 AL,所以指令执行后,(AL) = 2CH
即指令把 AL中的代码 0FH转换为 2CH。
必须注意,由于 AL为 8位二进制位,所以表格的最大长度不能超过 256。
如果我们想把十进制数转换为 ASC码,如何进行转换呢?
第一章 基础知识第四章 指令系统和寻址方式
( 6)标志位寄存器传送指令
LAHF 标志寄存器的低字节送 AH
SAHF AH送标志寄存器的低字节
PUSHF 标志进栈
POPF 标志出栈
1,LAHF 标志送 AH指令格式为,LAHF
执行的操作,(AH)〈 - (PSW寄存器的低字节 )
2,SAHF AH送标志寄存器指令格式为,SAHF
执行的操作,(PSW的低字节 )一 〉 (AH)
3,PUSHF 标志进栈指令格式为; PUSHF
执行的操作,( SP) 〈 - ( SP) -2
( (SP)+1,(SP)) 〈 - ( PSW)
第一章 基础知识第四章 指令系统和寻址方式
( 6)标志位寄存器传送指令
4,POPF 标志出栈格式为,POPF
执行过程为,(PSW) 〈 -- ((SP)十 1,(SP))
(SP) 〈 一 (SP)十 2
这组指令中的 LAHF和 PUSHF不影响标志位。 SAHF相 POPF则由装入的值来确定标志位的值 。
第一章 基础知识第四章 指令系统和寻址方式
DF=0:递增指令 CLD DF=1:递减指令 STD
( 7)串操作指令串操作指令能对存贮区中一块 (串 )字节或字进行操作,其块的长度可达 64K字节,
任一个这样的基本操作指令前还能用一个重复前缀使它们重复地操作。
重复执行串操作指令 (由 CX控制次数 ),实现串操作 。
第一章 基础知识第四章 指令系统和寻址方式
( 7)串操作指令注意,所有的基本串操作指令都约定,源串用寄存器 SI进行寻址,在无超越前缀时,段地址取自于数据段寄存器 DS;
目的串则用寄存器 DI进行寻址,其段地址总是取自于附加段寄存器 ES中。
串操作指令在每一次操作之后能自动修改地址指针
SI,DI的值,以便指向串中下一个元素的地址。但按增量还是按减量来修改地址,则取决于方向标志 DF。若
DF=0,则 SI,DI自动增量 (字节操作加 1,字操作加 2);反之,SI,DI自动减量。 DF的状态由指令 STD(置方向标志)
和 CLD(清除方向标志)来控制。
注意,MOVS,LODS,STOS指令对标志位无影响,
CMPS,SCAS指令对标志位的影响同 CMP指令
(1) 串传送指令
MOVS DST,SRC
MOVSB ( 字节操作 )
MOVSW ( 字操作 )
执行操作,( (DI)) ← ( (SI))
完成操作后,(SI)←( SI)± 1,(DI)←( DI)± 1
(SI)←( SI)± 2,(DI)←( DI)± 2
DF=0,取 +
DF=1,取 -
串传送指令与 重复操作前缀 联用,就可以传送数据串 。
O
P
R
D
1
,
O
P
R
D
2

M
O
V
S
B
指针的目的串并相应的修改地址
,
以指向串中其中第二、三种格式明确地注释是传送字节和字,第一种格式则应在操作数中表明是字还是字节操作,例如,
MOV ES:BYTE PTR[DI],DS:[SI]
重复操作前缀 有下列三种形式:
1) 重复前缀
REP 应用指令,MOVS,STOS
2) 相等重复前缀
REPE/REPZ 应用指令,CMPS,SCAS
3) 不相等重复前缀
REPNE/REPNZ应用指令,CMPS,SCAS
(CX)=0?
执行串操作指令
(CX) (CX) -1
(SI) (SI) +1
(DI) (DI) +1
是否退出执行
(CX)=0 或 ZF=0? 或 ZF =1
以 REP MOVSB为例,串操作步骤:
( 1) 源串首地址 → SI
( 2) 目的串首地址 → DI
( 3) 串长度 → CX
( 4) 设置方向标志
( 5) 执行串操作指令,REP MOVSB
例,buffer l (4个字符 ) buffer2
程序如下,LEA SI,buffer1
LEA DI,buffer2
CLD
MOV CX,4
REP MOVSB
CLD DF=0 地址自动增
STD DF=1 地址自动减数据段附加段
REP MOVSB 指令操作
(CX)=0?
((DI)) ((SI))
(CX) (CX) -1
(SI) (SI) +1
(DI) (DI) +1
是否退出执行
v
e
m
o



存储器
o
v
e
buffer1m
buffer2
SI
DI
DS
ES …




DI
SI
串传送指令执行前、后的情况,
( 2) 串比较指令 CMPS SRC DST
CMPSB ( 字节操作 )
CMPSW (字操作)
完成操作,(( SI) ) - (( DI) )
例:比较存放在两个数组( string l和 string2)中的两个字符串
(14个字节 ) 是否相同,即比较 ( string l ) = ( string2 )?
程序如下,LEA SI,string l
LEA DI,string2
MOV CX,14
CLD
REPZ CMPSB 程序执行结果 如图所示
( 3) 串搜索指令
SCASB ( 字节操作 )
SCASW (字操作)
字节操作,( AL) -(( DI) ),( DI) ← ( DI) ± 1
字操作,( AX) -(( DI) ),( DI) ← ( DI) ± 2 next
如何体现搜索功能?
DISI


数据段
t
n
string1 sSI
DS


r
i


t
r
i
s
ES
g
-
m
20000H
20002H
20004H
20006H
20008H
附加段
DIstring2
n
g
-
c
o…
25000H
25002H
25004H
25006H
25008H
2500AH2000AH
(SI)=0008H (DI)=5008H
返回
…o
( 4) 存串指令
STOS DST
STOSB ( 字节操作 )
STOSW (字操作)
字节操作,(( DI) )← ( AL),( DI) ← ( DI) ± l
字操作,(( DI) )← ( AX),( DI) ← ( DI) ± 2
( 5) 取串指令
LODS
LODSB ( 字节操作 )
LODSW (字操作)
字节操作,( AL) ← (( SI) ),( SI) ← ( SI) ± 1
字操作,( AX) ← (( SI) ),( SI) ← ( SI) ± 2
例,取串指令举例
LEA SI,BUF
MOV CX,50
CLD
REP LODSB? MOV AL,[SI]INC SILODSB
第一章 基础知识第四章 指令系统和寻址方式与串操作指令配合使用的前缀指令:
串操作指令与重复操作前缀的搭配,
REP 存串、串传送指令
REPE/REPZ 串比较指令
REPNE/REPNZ 串搜索指令无 取串指令第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式
( 1) 加法指令 ( 完成 二进制 的加法,带进位加法,加 1)
1) 加法指令 ADD
ADD dst,src ( dst) ← (dst)+(src)
影响 CF,AF,OF,PF,SF,ZF 标志位 。
2) 带进位加法指令 ADC
ADC dst,src ( dst )←( dst )+( src )+CF( 进位标志位的值 )
3) 加 1指令 INC
INC opr ( opr) ← ( opr) +1 (不影响 CF )
CF=1:无符号数运算溢出 最高有效位有进位时,CF置 1
OF=1,带符号数运算溢出 两个同符号操作数的运算结果符号发生变化时,OF置 1
CF,OF标志位在加法运算中的作用,
第一章 基础知识第四章 指令系统和寻址方式无符号数 带符号数
S1 1 1 1 1 1 1 1
255 -1
1 1 1 1 1 1 1 1
例,用 ADD,ADC指令执行两个双字加法运算计算,0002F360H+0005E020H = 0008D380H
设执行指令前,(DX)=0002H,(AX)=F360H,(BX)=0005H,(CX)=E020H
ADD AX,CX
ADC DX,BX
执行第一条指令 ADD:
F360H
+ E020H
(AX)=D380H,SF=1,ZF=0
CF=1,OF=0
执行第二条指令 ADC,
0002H
+ 0005H
+ 1H ( CF )
(DX)=0008H,SF=0,ZF=0
CF=0,OF=0
对于双字加法,用 ADC指令:低位字加法的进位 —>高位字
1← D380H
0008H
0 ~ 255 127 ~ -128
8位数为例分析 ADD
( 1)带符号数和无符号数都不溢出
( 2)带符号数不溢出和无符号数溢出
8位数为例分析 ADD
( 3)带符号数溢出和无符号数不溢出
( 4)带符号数和无符号数都溢出第一章 基础知识第四章 指令系统和寻址方式减法的 CF值反映无符号数运算中的借位情况,因此当作为无符号数运算时,若减数>被减数,此时有借位则 CF= 1,否则 CF
= 0。
减法的 OF位的设置方法为:若两个数的符号相反,而结果的符号与减数相同则 OF= 1,除上述情况外 OF= 0。 OF= 1说明带符号数的减法溢出,结果是错误的。
第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式例:求补指令举例
NEG AL
设执行指令前,( AL) = 02H
执行指令时,计算 0FFH -( AL) +1
1111 1111B
- 0000 0010B
等效求反
4)求补指令 NEG
NEG opr ( opr) ← 0FFH-( opr) +1( 字节操作 )或 ( opr) ← 0FFFFH-( opr) +1( 字操作 )
1111 1101B
FEH的原码十进制值是 -2
1111 1101B
+ 0000 0001B (AL) = FEH
1111 1110B
加 1FFH –(AL)
等效求补
NEG指令的功能,改变操作数的符号可用于取操作数的绝对值例,SUB [SI十 14H],0136H
如指令执行前 (DS)= 3000H,(S1)= 0040H,(30054H)= 4336H
则指令执行后:
所以,( 30054H)= 4200H,SF= 0,ZF= O,CF= 0,0F= 0
例 SUB DH,[BP十 4]
如指令执行前 (DH)= 4lH,(SS)= 0000H,(BP)= 00E4H,
(000E8)= 5AH
则指令执行后所以,(DH)= 0E7H,SF= 1,ZF= 0,CF= 1,OF= 0
例 设 X,Y,Z均为双精度数,它们分别存放在地址为 X,X十 2;
Y,Y十 2; Z,Z+2的存储单元中,存放时,高位字在高地址中,
低位字在低地址中。下列指令序列实现:
并用 W和 W+2单元存放运算结果。
5)比较指令 CMP
CMP opr1,opr2 ( oprl) -( opr2)
例,比较指令 CMP 举例设指令为,CMP AX,CX
ZF =
CF =
指令执行后 如何判别 AX和 CX 的大小关系 (以无符号数为例 )?
1 即 ( AX) =( CX) (AX) - (CX) = 0
0 即 ( AX)?( CX) (AX) - (CX)? 0
1 即 ( AX) <( CX) 有借位
0 即 ( AX) >( CX) 无借位
CMP指令 仅仅做减法并设置标志位判别大小关系由 条件转移指令 完成(后边介绍)。
CMP和 SUB 的差别?(操作与用途)
第一章 基础知识第四章 指令系统和寻址方式乘法指令两条,无符号数 乘法指令和 带符号数 乘法指令
MUL src 字节操作,(AX) ← (AL) * (src)字操作,(DX (
高位字 ),AX (低位字 )) ←( AX)* (src)
2)带符号数乘法指令 IMUL
IMUL src
1)无符号数乘法指令标志位:影响 CF和 OF,其它标志位无定义。
操作与 MUL相似,不同处是 操作数为带符号数 。
MUL指令和 IMUL指令的使用条件是由数的格式决定的。很明显
(11111111b)*(11111111b)当把它看作无符号数时应为
255d× 255d=65025d;而把它看作带符号数时则为 (一 1)× (一 1)= 1。
因此必须根据所要相乘数的格式来决定选用哪一种指令。
如果 CF=OF=0,字节 乘 字节 的积 —>字节字 乘 字 的积 —>字如果 CF=OF=1,字节 乘 字节 的积 —>字字 乘 字 的积 —>双字
CF 和 OF 标志位可判定乘积的数据类型,
1,对于 MUL指令,如果乘积的高一半为 0、即字节操作的 (AH)或字操作的 (DX)为 0,则 CF和 OF均为 0;否则 (即字节操作时的 (AH)或字操作时的 (Dx)≠0)则 CF和 OF均为 1。这样的条件码设置可以用来检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。
2,对于 IMUL指令,如果乘积的高一半是低一半的符号扩展则 CF和
OF均为 0,否则就均为 1。
3,指令中的源操作数可以使用除立即数方式以外的任一种寻址方式。
例,如 (AL)= 0B4H,(BL)= 11H求执行指令
IMUL BL和 MUL BL 后的乘积值 。
(AL)= 0B4H为无符号数的 180D,带符号数的一 76D
(BL) =11H为无符号数的 17D,带符号数的 17D
执行 IMUL的结果为,( AX)= 0FAF4H= =-1292D
执行 MUL 的结果为,(AX)= 0BF4H= 3060D
CF = OF =1。
除法指令 ( 无符号数 和 带符号数 除法指令 )
1)无符号数除法指令
DIV src
字节操作,(AL)←(AX)/(src) 的 商
(AH)←(AX)/(src) 的 余数字操作,(AX)←( DX,AX)/(src)的 商
(DX)←( DX,AX)/(src)的 余数2) 带符号数除法指令
IDIV src (操作同 DIV,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号和被除数的符号相同。 )
注意,
除法指令的寻址方式与乘法指令相同。其目的操作数必须存放在 AX或 DX中。
其源操作数可以用除立即数以外的任何寻址方式。
除法指令对所有条件码均无定义。
如果操作数 不满足 除法指令的要求,怎么办?
例,93H/45H,被除数不是 16位,应当扩展为 16位,如何扩展?
简便起见,以 3为例,讨论二进制数位的扩展问题:
8位 的二进制 3 —> 0000 0011 扩展为 16位 0000 0000 0000 0011
8位 的二进制 -2—> 1111 1110 扩展为 16位 1111 1111 1111 1110
数据位扩展方法,用符号位进行数位的扩展 。
上述能保持符号的数据位扩展方法称为,符号扩展
3) 字节转换为字指令
CBW 执行操作,将 (AL)的符号扩展到 AH,构成字 (AX)
( AL ) 7 = 0 (AH)=00H1 (AH)=FFH
4) 字转换为双字指令
CWD 执行操作,将 ( AX) 的符号扩展到 DX,方法类似这两条指令都不影响条件码。
例,设 (AX)= 0400H,(DL)= 0B4H
即 (AX)为无符号数的 1024D,带符号数的十 1024D
(DL)为无符号数的 180D,带符号数的一 76D
执行 DIV BL
的结果是:
(AH) = 7CH = 124D 余数
(AL)= 05H= 5D 商
IDIV BL
的结果是:
(AH)= 24H= 36D 余数
(AL)= 0F3H= -13D 商例,算术运算综合举例,计算
(V一 (X*Y十 Z一 540))/ X
其中 X,Y,X和 V均为 16位带符号数,已分别装入 X,Y,Z,V
单元中,要求上式计算结果的商存入 AX,余数存入 DX寄存器前面提到的所有算术运算指令都是二进制数的运算指令,但是人们最常用的是十进制数,这样,当用计算机进行计算时,必须先把十进制数转换成二进制数,然后再进行二进制数的计算,计算结果又转换为十进制数输出。为了便于十进制数的计算,计算机还提供了一组十进制数调整指令,这组指令在二进制计算的基础上,给予十进制调整,可以直接得到十进制的结果。
十进制调整指令
BCD码 —>建立了二进制与十进制的联系算术运算指令只能完成二进制运算,十进制数调整指令可对二进制运算结果进行调整,得到用 BCD码表示的十进制数 。
BCD码有压缩和非压缩两种格式:
压缩的 BCD码:
4位二进制数 —>1位十进制数 ( 95,1001 0101 )BCD
非压缩的 BCD码:
8位二进制数 —> 1位十进制数 (95,0000 1001 0000 0101 )BCD
8位非压缩 BCD码的高 4位可以是任意值,因此数字字符的
ASCII码 —>看成一种非标准的压缩的 BCD码例,?5?的 ASCII码为 35H( 0011 0101)BCD —> 5 (非压缩的 BCD码 )
(一 )压缩的 BCD码调整指令
DAA 加法的十进制调整指令
DAS 减法的十进调调整指令我们知道,机器所提供的 ADD,ADC以及 SUB,SBB指令只适用于二进制加、减法,但压缩的 BCD码却是一个字节含有两个十进制数值的二进制数。在使用加、减法指令对 BCD码运算后必须经调整后才能得到正确的结果。
加法的调整规则是; 任意两个用 BCD码表示的十进制数位相加的结果,如数值在 10l0和 1111之间或者产生了向高位的进位,则在其上加 6就可得到正确的结果。
第一章 基础知识第四章 指令系统和寻址方式
DAA 加法的十进制调整指令:
执行的操作:
把从 AL中的和调整到压缩的 BCD格式,这条指令之前必须执行 ADD或 ADC指令,
加法指令必须把两个压缩的 BCD码相加,并把结果存放在 AL寄存器中。
本指令的调整方法是;
如果 AF标志 (辅助进位位 )为 1,或者 AL寄存器的低 4位是十六进制的 A – F,则
AL寄存器内容加 06H,且将 AF位置入 1。
如果 CF标志为 1,或者 AL寄存器的高 4位是十六进制的 A – F,则 AL寄存器内容加 60H,并将 CF位置 1。
DAA指令对 OF标志无定义,但影响所有其它条件标志 。
例如可见第一次得到的 1101不是 BCD码,根据调整规则应在其上加 6,得到个位为 3,并向高位进位的正确结果。
28H
+ 36H
5EH
分析,例 1,十进制计算 28+36=64
用指令进行二进制加法运算的结果为,
写成 BCD码为,
(0010 1000 )BCD + (0011 0110 )BCD = ( 0110 0100 )BCD
问题,逢十六进位解决方法,加 6补偿
5EH
+ 6H
64H ( 0110 0100 )BCD
例 2,十进制计算 28+69=97= ( 1001 0111 )BCD = 97H
28H
+ 69H
91H
问题,逢十六进位解决方法,加 6补偿
91H
+ 6H
97H ( 1001 0111 )BCD
例,ADD AL,BL
DAA
如指令执行前,(AL)= 28,(BL)= 68
28 0010 1000
68 0110 1000
+ 1001 0000
执行 ADD指令后 (AL)= 90,CF= 0,AF= 1
执行 DAA指令时.因 AF= 1而做
(AL)〈 一 (AL)+06
得 (AL)= 96,CF= 0,AF= 1 结果正确。
第一章 基础知识第四章 指令系统和寻址方式例 如 (BCDl)= 1834,(BCD2)= 2789
要求执行 (BCD3)〈 — (BCDl)十 (BCD2)
BCDl和 BCD2均为用压缩的 BCD码表示的十进制数,由于它们都是 4位数,所以每个数占有 2个字节,高位数占有高位字节,其存放方式为
(BCDl)= 34,(BCDl十 1)=18;
(BCD2)= 89,(BCD2十 1)= 27。
可写出指令序列如下:
第 —组四条指令把低位字节相加经调整后存入 BCD3,其中 ADD指令后 (AL)= 34+89
= BDH,CF= 0,AF= 0;经 DAA调整后,
(AL)= 23,CF= 1,AF=1。第二组四条指令把高位字节相加经调整后存入 BCD3十 1。
其中 ADC指令后 (AL)=8十 27十 CF= 40,
CF= 0,AF=1;经 DAA调整后 (AL)= 46,
CF= 0,AF= 1;最后 (DCD3)= 4623结果正确。
第一章 基础知识第四章 指令系统和寻址方式
DAS 减法的十进制调整指令执行操作:
把 AL中的差调整到压缩的 BCD格式 。 这条指令之前必须执行 SUB或 SBB指令,
减法指令必须把两个 BCD码相减,并把结果存放在 AL寄存器中 。
调整方法是:
如果 AF标志为 l,或者 AL寄存器的低 4位是十六进制的 A—F,则使 AL寄存器的内容减去 06H,并将 AF位置 1。
如果 CF标志为 1,或者 AL寄存器的高 4位是十六进制的 A—F,则使 AL寄存器的内容减去 60H,并将 CF位置 l。
DAS指令对 OF标志无定义,但影响所有其它条件标志。
第一章 基础知识第四章 指令系统和寻址方式例,SUB AL,AH
DAS
如指令执行前,(AL)= 86,(AH)= 07
86
1000 0110
- 07
0000 0111
↓↓
86
1000 0110
( -7)补
1111 1001
+
0111 1111
执行 SUB指令后,( AL) = 7FH,CF= 0,AF=1
执行 DAS指令时 。 因 AF= 1,需做:
(AL)= (AL) – 06
而得( AL)= 79,CF= 0,AF= 1,结果正确。
第一章 基础知识第四章 指令系统和寻址方式例,如 (DCD1)=1234,(BCD2)= 4612,试写出指令序列完成 (BLD3)〈 —
( BCD1) - (BCD2)。
BCDl和 BCD2均为用压缩的 BCD码表示的十进制数,由于它们都是 4位数,所以每个数占有 2个字节,高位数占有高位字节,其存放方式为
(BCDl)= 34,(BCDl十 1)=12;
(BCD2)= 12,(BCD2十 1)= 46。
指令序列如下:
第一组,四条指令把低位字节相减经十进制调整后存入 BCD3。其中 SUB指令后 (AL)=22,
CF=0,AF=0,所以 DAS并未做什么操作而把结果送往 BCD3。
第二组四条指令把高位字节相减经十进制调整后存入 BCD3+1。其中 SBB指今后,(AL)=
CCH,CF= 1,AF= 1经 DAS调整后 (AL)= 66,
CF= 1,AF= 1;最后 (BCD3) = 6622,到这里,
会说结果错了,其实,结果是对的,6622是一
3378的十的补码。
用 BCD码表示十进制数的符号问题,使用十的补码来表示,如十进制数的位数为 n、则任意整数 d的十的补码定义为 10n - d,数位为 n
的十进制数的表数范围为一 5× 10 n-1 一 5× 10 n-1-1。如 n= 8,则可用二个字 (32位 )来表示一个十进制数,其表数范围为 -5000 0000 -
49999999。 n= 4,用 16位表示一个带符号数,此时的表数范围是 -
5000一 十 4999,所以 6622应表示一个负数.它是 -3378。
第一章 基础知识第四章 指令系统和寻址方式
AAA 加法的 ASCII码调整指令:
执行的操作:
把 AL中的和调整到非压缩的 BCD格式,(AH) = (AH)十调整产生的进位值。这条指令之前必须执行 ADD或 ADC指令,加法指令必须把两个非压缩的 BCD码相加,并把结果存放在 AL寄存器中本指令的调整方法是;
(1)如 AL寄存器的低 4位在 0一 9之间,且 AF位为 0,则跳过第 (2)步,执行第 ( 3)
步;
(2)如 AL寄存器的低 4位在十六进制数 A — F之间或 AF为 1,则 AL寄存器的内容加 6,AH寄存器的内容加 1,并将 AF位置 1。
(3)清除 AL寄存器的高 4位:
(4)AF位的值送 CF位 。
AAA指令除影响 AF和 CF标志外,其余标志位均无定义 。
第一章 基础知识第四章 指令系统和寻址方式例,ADD AL,BL
AAA
如指令执行前,(AX) = 0535H,〔 BL〕 = 39H,可见 AL和 BL寄存器的内容分别为 5和 9的 ASCII。
35
0011 0101
39
0011 1001
+
0110 1110
第一条指令执行完后,(AL) = 6EH,AF= 0;
第二条指令进行 ASC调整的结果使 (AX)= 0604H,AF= 1,CF= 1。
第一章 基础知识第四章 指令系统和寻址方式
AAS 减法的 ASCII码调整指令:
执行的操作:
把 AL中的差调整到非压缩的 BCD格式 (AH)〈 — (AH) 一 调整产生的借位值这条指令之前必须执行 SUB或 SBB指令,减法指令必须把两个非压缩的 BCD码相减,
并把结果存放在 AL寄存器中。
本指令的调整方法是;
(1)如 AL寄存器的低 4位在 0一 9之间,且 AF位为 0,则跳过第 (2)步,执行第 (3)步 。
(2)如 AL寄存器的低 4位在十六进制数 A—F之间或 AF位为 1,则把 AL寄存器的内容减去 6,AH寄存器的内容减 1,并将 AF位置 1;
(3)清除 AL寄存器的高 4位;
(4)AF位的值送 CP位 。
AAS指令除影响 AP和 CF标志外,其余标志位均无定义第一章 基础知识第四章 指令系统和寻址方式例,编写程序段实现下式
(DX) 〈 — UPl十 UP2一 UP3
其中参加运算的数均为二位十进制数。如要求计算 25十 48一 19,每个十进制数以非压缩 BCD格式存入存储器,每个数占有一个字,所以 (UP1)= 0205H,(UP2)
= 0408H,(UP3)= 0109H。可写出指令序列如下图所示。
第一章 基础知识第四章 指令系统和寻址方式
AAM 乘法的 ASC调整指令:
执行的操作:
把 AL中的积调整到非压缩的 BCD格式。 这条指令之前必须执行 MUL指令把两个非压缩的 BCD码相乘 (此时要求其高 4位为 0),结果放在 AL寄存器中。
本指令的调整方法是;
把 AL寄存器的内容除以 0AH,商放在 AH寄存器中,余数保存在 AL寄存器中 。
本指令根据 AL寄存器的内容设置条件码 SF,ZF和 PF,注意,OF,CF和 AF位无定义 。
第一章 基础知识第四章 指令系统和寻址方式例 MUL AL,BL
AAM
如指令执行前,(AL)= 07H,(BL)= 09H
执行 MUL后,(AL) = 3FH
执行 AAM后,(AH)= 06H,(AL)= 03H
第一章 基础知识第四章 指令系统和寻址方式
AAD 除法的 ASCII调整指令,
执行的操作:
前面所述的加法、减法和乘法的 ASC调整指令都是用加法、减法和乘法指令对两个非压缩的 BCD码运算以后,再使用 AAA,AAS,AAM指令来对运算结果进行十进制调整的。除法的情况却不同,它是针对以下情况而设立的。
如果被除数是存放在 AX寄存器中的二位非压缩 BCD数。 AH中存放十位数,AL中存放个位数,而且要求 AH和 AL中的高 4位均为 0。除数是一位非压缩的 BCD数,同样要求高 4位为 0,在把这两个数用 DIV指令相除以前,必须先用 AAD指令把 AX中的被除数调整成二进制数,并存放在 AL寄存器中 。
本指令的调整方法是;
AAD指令执行的操作是:
(AL) 〈 — 10*(AH)十 (AL)
(AH) 〈 — 0
第一章 基础知识第四章 指令系统和寻址方式例 编写程序段实现:
C 〈 — B/ A的商
R 〈 — B/ A的余数其中 B字单元中存放着用非压缩 BCD码表示的二位十进制数 53,A字节单元中存放着用非压缩 BCD码表示的一位数 3。除法过程可表示如下:
第一章 基础知识第四章 指令系统和寻址方式结果的商存放在字单元 C中,余数存放在字节单元 R中。编制的程序及说明如下:
最后得到 (C)= 07H,( C十 1)= 01H,( C+3)= 02H,即商为 17,余数为 2,
结果正确。
第一章 基础知识第四章 指令系统和寻址方式逻辑运算指令逻辑运算指令可以对字或字节执行逻辑运算。由于逻辑运算是按位操作的,因此一般来说,其操作数是位串而不是数。
第一章 基础知识第四章 指令系统和寻址方式
1,AND 逻辑与指令格式; AND DST,SRC
执行的操作,(DST)〈 一 (DST) ∧ (SRC)
2,OR 逻辑或指令格式,OR DST,SRC
执行的操作,(DST)〈 — (DST)∨ (SRC)
3,NOT 逻辑非指令格式,NOT OPR
执行的操作,(OPR)〈 一 (OPR)
4,XOR 异或指令格式,XOR DST,SRC
执行的操作,(DST) <一 (DST) (SRC)
5,TEST 测试指令格式,TEST OPRl,OPR2
执行的操作; (OPR1)∧ (OPR2)
注意,两个操作数相与的结果不保存,只根据其特征置条件码 。
第一章 基础知识第四章 指令系统和寻址方式注意:
(1)以上五种指令中,NOT不允许使用立即数,其它 4条指令除非源操作数是立即数,
至少有一个操作数必须存放在寄存器中,另一个操作数则可以使用任意寻址方式 。
(2)它们对标志位的影响情况是,NOT指令不影响标志位,其它 4种指令将使 CF和 OF为 0
,AF位无定义,而 SF,ZF和 PF则根据运算结果设置 。
这些指令对处理操作数的某些位很有用,例如可屏蔽某些位 (将这些位置
0),或使某些位置 1或测试某些位等,下面举例说明:
例 要求屏蔽 0,l两位,可用 AND指令并设置常数 0FCH:
MOV AL,0BFH
AND AL,0FCH
这两条指令执行的结果使 (AL)= 0BCH
所以用 AND指令可以使操作数的某些位被屏蔽。只需要把 AND指令的源操作数设置成一个立即数,并把需要屏蔽的位置为 0,这样指令执行的结果就可把操作数的相应位置 0,其它各位保持不变。
第一章 基础知识第四章 指令系统和寻址方式例,要求第 5位置 1,可用 OR指令
MOV AL,43H
OR AL,20H
这两条指令执行后,(AL)= 63H
所以用 OR指令可以使操作数的某些位置 1,其它位则保持不变。 只需要把
OR指令的源操作数设置为一个立即数,并把需要置 1的位设为 1,就可达到目的。
例.要测试操作数的某位是否为 0,可用 TEST指令,同样把 TEST指令的源操作数设置成一个立即数,其中需要测试的位应设置为 1 。
MOV AL,40H;
TEST AL,0AFH
通过测试第 0,1,2,3,5,7是否为 0,根据测试结果设置条件码为 CF =
OF = 0,SF = 0 ; ZF= 1
第一章 基础知识第四章 指令系统和寻址方式例:上面提到测试操作数的某位是否为 0,现在要求测试操作数的某位是否为 1,
则可以进行如下处理:先把操作数求反,然后用 TEST指令测试。如要测试 AL
寄存器中第 2位是否为 1,如果为 1,则转移到 EXIT去执行,程序代码段如下:
MOV DL,AL
NOT DL
TEST DL,04H
JE EXIT
例:要使操作数的某些位变反可以使用 XOR指令,只要把源操作数立即数字段的相应位置为 1就可以达到目的。如果需要将 AX寄存器中第 0,1,2,3位变反,可以使用如下指令:
MOV AX 407BH
XOR AX,000FH
采用 XOR指令还可以测试两个参作数是否相等。
第一章 基础知识第四章 指令系统和寻址方式算术右移逻辑右移第一章 基础知识第四章 指令系统和寻址方式移位指令的作用:
1、改变操作数中,所有位的位置。
2、常常进行乘除 2的操作,运算速度快。逻辑用于无符号数运算,算术用于有符号数运算
1) 逻辑左移指令
SHL opr,count
2) 算术左移指令
SAL opr,count
oprCF
补 0
SHL / SAL 移位例:将 BL中的值逻辑左移 1位,设 ( BL) =AFH
SHL BL,1 1 0 1 0 1 1 1 10 指令执行前
0 1 0 1 1 1 1 01 指令执行后执行指令后,( BL) =5EH
3) 逻辑右移指令
SHR opr,count
4) 算术右移指令
SAR opr,count
opr CF
补 0 SHR 移位
S保持符号 SAR 移位第一章 基础知识第四章 指令系统和寻址方式例,将 BL中的值 逻辑右移 1位,设 ( BL) =AFH
SHR BL,1 1 0 1 0 1 1 1 1 0 指令执行前
0 1 0 1 0 1 1 1 1 指令执行后执行指令后,( BL) =57H
将 BL中的值 算术右移 1位,设( BL) =AFH
SAR BL,1 1 0 1 0 1 1 1 1 0 指令执行前执行指令后:
( BL) =D7H 1 1 0 1 0 1 1 1 1 指令执行后
CF
CF
移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元
后一个操作数表示移位位数,该操作数 为 1,表示移动一位;
当移位位数 大于 1时,则用 CL寄存器值表示,该操作数表达为 CL
移位指令对标志寄存器中条件码的影响:
OF:当移动次数为 1时有效。在移位后最高有效位发生变换,OF位置为 1,
否则为 0。
CF:根据指令的执行结果
PF,SF,ZF根据执行结果设定。
AF:没有具体定义。
第一章 基础知识第四章 指令系统和寻址方式循环右移循环右移
5) 循环左移指令
ROL opr,count
6) 带进位 循环左移指令
RCL opr,count RCL 移位
7) 循环右移指令
ROR opr,count
8) 带进位 循环右移指令
RCR opr,count RCR 移位
CFopr
ROR 移位
CF opr
ROL 移位例:将 BL中的值 循环左移 1位,设 ( BL) =AFH
ROL BL,1 1 0 1 0 1 1 1 10 指令执行前执行指令后:
( BL) =5FH 0 1 0 1 1 1 1 11 指令执行后
按照指令功能设置进位标志 CF
不影响 SF,ZF,PF,AF
如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则 OF = 1;否则
OF = 0。当移位次数大于 1时,OF不确定例:将 BL中的值逻辑左移 1位,设 ( BL) =AFH
SHL BL,1 1 0 1 0 1 1 1 10 指令执行前
0 1 0 1 1 1 1 01 指令执行后执行指令后,( BL) =5EH
例,将 BX指向的存储器单元的高字节与低字节互换位置 。
MOV CL,8
ROR [BX],CL
5 B 4 0 0 指令执行前设执行指令前:
(DS) =3000H,( BX) =0150H
(30150H) =5B40H
注意,如果 移位位数 大于 1,必须用 CL寄存器给出移位位数 。
执行指令后,( 30150H) =405BH,CF=0
指令执行后4 0 5 B 0
例,32位数移位;将 DX.AX中 32位数值左移一位
shl ax,1
rcl dx,1 rcr ax,1 rol ax,1
DX AXCF
0
例,32位数循环移位;将 DX.AX中 32位数值循环左移二位?
MOV BX,DX
SHL BX,1
RCL AX,1
RCL DX,1
RCL AX,1
RCL DX,1
1 将 DX.AX中 32位数值循环右移二位?请同学做,找同学实现
2 AH.AL分别存放着非压缩 BCD码的两位;将它们合并成为一个压缩
BCD码存 AL。
第一章 基础知识第四章 指令系统和寻址方式
1 MOV BX,DX
SHR BX,1
RCR AX,1
RCR DX,1
RCR AX,1
RCR DX,1
2 mov cl,4
shl ah,cl
add al,ah ;也可以用 or al,ah
第一章 基础知识第四章 指令系统和寻址方式近无条件转移指令
只要执行无条件转移指令 JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令
操作数 label是要转移到的 目标地址 ( 目的地址,转移地址 )
JMP指令分成 4种类型:
⑴ 段内转移、直接寻址
⑵ 段内转移、间接寻址
⑶ 段间转移、直接寻址
⑷ 段间转移、间接寻址
JMP label ;程序转向 label标号指定的地址
JMP
目标地址的寻址方式
直接寻址方式
– 转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式
间接寻址方式
– 转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式用标号表达用寄存器或存储器操作数表达
JMP
目标地址的范围:段内
段内转移 ——近转移( near)
– 在当前代码段 64KB范围内转移
( ± 32KB范围)
– 不需要更改 CS段地址,只要改变 IP偏移地址
段内转移 ——短转移( short)
– 转移范围可以用一个字节表达,在段内- 128~+ 127范围的转移代码段代码段
JMP
目标地址的范围:段间
段间转移 ——远转移( far)
– 从当前代码段跳转到另一个代码段,可以在 1MB范围
– 需要 更改 CS段地址和 IP偏移地址
– 目标地址必须用一个 32位数表达,
叫做 32位远指针,它就是逻辑地址代码段代码段实际编程时,汇编程序会根据目标地址的距离,
自动处理 成短转移,近转移或远转移程序员可用操作符 near ptr 或 far ptr 强制
JMP
JMP段内转移、直接寻址
JMP label ; IP←IP+ 位移量
位移量是紧接着 JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移
当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负
jmp again ;转移到 again处继续执行……
again,dec cx ;标号 again的指令……
jmp output ;转向 output……
output,mov result,al ;标号 output的指令实际为相对寻址段内转移、间接寻址
JMP r16/m16 ; IP←r16/m16
将一个 16位寄存器或主存字单元内容送入 IP寄存器,
作为新的指令指针,但不修改 CS寄存器的内容
jmp ax ; IP←AX
jmp word ptr [2000h] ; IP←[2000h]
JMP
段间转移、直接寻址
JMP far ptr label; IP←label 的偏移地址; CS←label 的段地址
将标号所在段的段地址作为新的 CS值,标号在该段内的偏移地址作为新的 IP值;这样,程序跳转到新的代码段执行
jmp far ptr otherseg;远转移到代码段 2的 otherseg
JMP
段间转移、间接寻址
JMP far ptr mem; IP←[mem],CS←[mem+2]
用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,
低位字送 IP寄存器,高位字送 CS寄存器
mov word ptr [bx],0
mov word ptr [bx+2],1500h
JMP far ptr [bx] ;转移到 1500h:0
JMP
第一章 基础知识第四章 指令系统和寻址方式段内直接短跳转:
条件转移指令
指定的条件 xx如果成立,程序转移到由 label
( 目标地址 ) 指定的目标地址处去执行指令;条件不成立,则程序将顺序执行下一条指令
操作数 label( 目标地址) 是采用短转移,称为相对寻址方式
Jxx
Jxx label;条件满足,发生转移,IP←IP + 8位位移量;条件不满足,顺序执行相对寻址方式
Jxx指令的操作数 label是一个标号
– 一个 8位位移量,表示 Jxx指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移
– 8位位移量是 相对于 当前 IP的,且距当前 IP地址-
128~+ 127个单元的范围之内,属于段内短距离转移
– Jxx目标地址就采用这种 相对寻址方式
Jxx指令为 2个字节,条件不满足时的顺序执行就是当前指令偏移指针 IP加 2
Jxx
Jxx指令的分类
Jxx指令不影响标志,但要利用标志( 下表 )。根据利用的标志位不同,17条指令分成 4种情况:
⑴ 判断单个标志位状态
⑵ 比较无符号数高低
⑶ 比较有符号数大小
⑷ 判断计数器 CX为 0
Jxx
判断单个标志位状态
这组指令单独判断 5个状态标志之一
⑴ JZ/JE和 JNZ/JNE:利用零标志 ZF,判断结果是否为零
(或相等)
⑵ JS和 JNS:利用符号标志 SF,判断结果是正是负
⑶ JO和 JNO:利用溢出标志 OF,判断结果是否产生溢出
⑷ JP/JPE和 JNP/JPO:利用奇偶标志 PF,判断结果中,1”
的个数是偶是奇
⑸ JC/JB/JNAE和 JNC/JNB/JAE:利用进位标志 CF,判断结果是否进位或借位
Jxx
例题例题例题例题例题比较无符号数高低
无符号数的大小用高( Above)低( Below)表示
利用 CF确定高低、利用 ZF标志确定相等
( Equal)
两数的高低分成 4种关系:
⑴ 低于(不高于等于),JB( JNAE)
⑵ 不低于(高于等于),JNB( JAE)
⑶ 低于等于(不高于),JBE( JNA)
⑷ 不低于等于(高于),JNBE( JA )
Jxx
无符号数条件转移指令(执行 A-B操作)
指令 条件 意义
JA/JNBE CF=0 AND ZF=0 A>B
JAE/JNB CF=0 OR ZF=1 A≥ B
JB/JNAE CF=1 AND ZF=0 A<B
JBE/JNA CF=1 OR ZF=1 A≤ B
例:比较无符号数
cmp ax,bx ;比较 ax和 bx
jnb next;若 ax≥ bx,转移
xchg ax,bx ;若 ax< bx,交换
next,...
结果,AX保存较大的 无符号数比较有符号数大小
有符号数的大( Greater)小( Less)需要组合
OF,SF标志,并利用 ZF标志确定相等( Equal)
两数的大小分成 4种关系:
⑴ 小于(不大于等于),JL( JNGE)
⑵ 不小于(大于等于),JNL( JGE)
⑶ 小于等于(不大于),JLE( JNG)
⑷ 不小于等于(大于),JNLE( JG )
Jxx
有符号数条件转移指令(执行 A-B操作)
指令 条件 意义
JG/JNLE SF=OF AND ZF=0 A>B
JGE/JNL SF=OF OR ZF=1 A≥ B
JL/JNGE SF≠ OF AND ZF=0 A<B
JLE/JNG SF≠ OF OR ZF=1 A≤ B
例:比较有符号数
cmp ax,bx ;比较 ax和 bx
jnl next;若 ax≥ bx,转移
xchg ax,bx ;若 ax< bx,交换
next,...
结果,AX保存较大的 有符号数计数器 CX为 0转移
这是一条较特殊的指令
CX寄存器通常在程序中用做计数器
JCXZ指令用来判断计数是否为 0
JCXZ label; CX= 0,发生转移,IP←IP + 8位位移量; CX≠0,顺序执行判断计数器为 0
mov cx,100
again,movsb ;传送一个字节
dec cx ;传送次数减 1
jnz again ;判断传送次数 cx是否为 0;不为 0( ZF=0),则转移;否则,结束
mov cx,100
again,jcxz next ;判断传送次数 cx是否为 0
movsb
dec cx
jmp again
next,...
cmp cx,0
jz next
第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式中断指令第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式第一章 基础知识第四章 指令系统和寻址方式存储器中的中断向量表第一章 基础知识第四章 指令系统和寻址方式处理机控制类指令
这些指令在特定的情况下,必须使用
对标志位进行设置的指令
– CLC STC CMC
– CLD STD
– CLI STI
对 CPU状态进行控制的指令
– NOP CS,SS,DS,ES:
– LOCK HLT ESC WAIT
进位标志操作指令
用于任意设置进位标志
CLC ;复位进位标志,CF←0
STC ;置位进位标志,CF←1
CMC ;求反进位标志,CF← ~ CF
方向标志操作指令串操作指令中,需要使用
CLD ;复位方向标志,DF←0
STD ;置位方向标志,DF←1
中断标志操作指令
在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止
CLI ;复位中断标志,DF←0
STI ;置位中断标志,DF←1
空操作指令
NOP
不执行任何操作,但占用一个字节存储单元,
空耗一个指令执行周期
NOP常用于程序调试
– 在需要预留指令空间时用 NOP填充
– 代码空间多余时也可以用 NOP填充
– 还可以用 NOP实现软件延时
事实上,NOP和 XCHG AX,AX的指令代码一样,
都是 90H
NOP
段超越前缀指令
在允许段超越的存储器操作数之前,使用段超越前缀指令,将采用指定的段寄存器寻址操作数
CS,;使用代码段的数据
SS,;使用堆栈段的数据
DS,;使用数据段的数据
ES,;使用附加段的数据封锁前缀指令
LOCK ;封锁总线
这是一个指令前缀,可放在任何指令前
这个前缀使得在这个指令执行时间内,
8086 处理器的封锁输出引脚有效,即把总线封锁,使别的控制器不能控制总线;
直到该指令执行完后,总线封锁解除暂停指令
HLT ;进入暂停状态
暂停指令使 CPU进入暂停状态,这时 CPU不进行任何操作。当 CPU发生复位或来自外部的中断时,CPU脱离暂停状态
HLT指令可用于程序中等待中断。当程序中必须等待中断时,可用 HLT,而不必用软件死循环。然后,中断使 CPU脱离暂停状态,返回执行 HLT的下一条指令交权指令
ESC mem
其中 mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去。当然 ESC
指令不允许使用立即数和寄存器寻址方式。
这条指令在使用协处理机 (Coprocessor)执行某些操作时,可从存储器取得指令或存储器取得指令或操作数。协处理机(如 8087)
则是为提高速度而可以选配的硬件。
等待指令
WAIT ;进入等待状态
该指令使处理机处于空转状态,它也可以用来等待外部中断发生,但中断结束后仍返回 WAIT指令继续等待。