null第4章 指令系统第4章 指令系统本章要求掌握的内容本章要求掌握的内容 寻址方式:立即寻址、寄存器寻址、内存寻址
常用指令:
1)数据传送指令MOV、LEA、 XCHG
2)算术运算指令ADD(加)、SUB(减)、MUL(乘)、DIV(除)
3)逻辑运算指令AND(与) 、OR(或)、NOT(非), XOR(异或)
4)移位指令SHL、SAL、SHR、SAR、ROL、ROR
5)常用转移指令JNZ、JNA等, 循环控制指令LOOP
6)外设的输入和输出指令IN、OUT主要内容主要内容指令与指令系统
指令格式
操作数寻址方式
六大类指令
下面分别介绍§4.1 指令与指令系统概述§4.1 指令与指令系统概述指令及指令系统
指令格式下面分别介绍一、指令与指令系统一、指令与指令系统1.指令(Instruction): 计算机完成某种操作的命令
如:数据传送指令MOVE(把数据由一处复制到另一处)
如:加法指令ADD(进行加法运算)
2.指令系统(Instruction System): 机器提供的所有指令
3.指令兼容性:同一系列机器的指令兼容
4.程序(Program): 为完成某个任务编制的一系列指集合 二、指令的表示二、指令的表示1. 二进制代码表示 —— 机器指令
例 10001010 11000011 (8AC3H)
功能:把寄存器BL内容复制到寄存器AL中
2. 符号化机器指令 —— 助记符表示(汇编语言指令)
例 MOV AL, BL汇编汇编语言指令二进制机器指令三、指令格式三、指令格式 做什么 需要的数据或存放数据的地址
指令包含的信息:
执行的操作、运算数据来源、运算结果去向
例 MOV AX, 1234H
功能:把数据1234H送到 AX寄存器中 格式: 操作码 目标操作数, 源操作数 ;注释 四、指令操作数个数四、指令操作数个数操作数:指令需要的数据
1) 无操作数指令格式: 操作码
例 HLT
2) 单操作数指令格式: 操作码 操作数
例 INC AX
3) 双操作数指令格式: 操作码 操作数, 操作数
例 MOV AL, 34H
4) 多操作数指令: SHLD AX, BX, 1五、指令字长及执行时间五、指令字长及执行时间例 MOV AX, 1234H
机器代码是B83412, 指令字长3B
存储该指令需3个字节
指令字长:由操作码长度、操作数地址长度、操作数个数和类型决定。
操作数越多,指令字长越大
执行时间:指令字长影响指令执行时间代
码
段 B8 34 12内存低端内存高端3字节指令字长举例指令字长举例MOV AL, BL 机器代码8AC3,指令字长2B
MOV BL, AL 机器代码8AD8,指令字长2B
MOV AX, 1234H 机器代码B83412,指令字长3B
MOV BX, 1234H 机器代码BB3412,指令字长3B§4.2 操作数的寻址方式§4.2 操作数的寻址方式确定操作数地址的
。即寻找操作数的方法。
包括 立即寻址(数据直接在指令中) 例 MOV AX, 1234H
内存寻址(数据放在内存中) 例 MOV AX, [1234H]
寄存器寻址(数据放在寄存器中) 例 MOV AX, BX 下面分别介绍一、立即寻址(Immediate Addressing) 一、立即寻址(Immediate Addressing) 立即数: 源操作数是常数(固定值)
立即寻址:源操作数是常数
例 MOV AX, 1234H ;机器代码是B83412AH AL源操作数存放在操作码之后低放低高放高1234B8代码段┇内存低端内存高端二、寄存器寻址(Register Addressing) 二、寄存器寻址(Register Addressing) 操作数在CPU的通用寄存器中
例 源操作数、目的操作数都是寄存器寻址
MOV AX, BX ;把BX内容送到AX中
即 BH→AH BL→AL
例 目的操作数是寄存器寻址, 源操作数是立即寻址
MOV AX, 1234H
ADD AL, 78H ;AL+78H→AL三、内存寻址(Memory Addressing) 三、内存寻址(Memory Addressing) 指令给出操作数的偏移地址,操作数默认在数据段
分为 1.直接寻址(Direct Addressing)
2.寄存器间接寻址(Register Indirect Addressing)
3.基址加变址寻址
4.寄存器相对寻址
5.基址、变址、相对寻址下页举例1.直接寻址(Direct Addressing) 1.直接寻址(Direct Addressing) 直接给出操作数的偏移地址
操作数段地址默认为数据段DS
例 MOV AX, [1200H]
实际地址:DS×16+1200
AH=11H AL=22H1122数据段┇内存低端内存高端1200H┇段重设(重新设置)的直接寻址段重设(重新设置)的直接寻址允许:指令指出操作数所在段
操作数默认的段:数据段DS
例 MOV AX, ES:[1200H]
指明ES为操作数的段地址, 操作数在ES段中
数据实际地址:ES×16+12002.寄存器间接寻址2.寄存器间接寻址 操作数偏移地址由寄存器给出
该寄存器称为间址寄存器,可以是BX、BP、SI、DI
例 MOV BX, 1200H
MOV AX, [BX] ;BX(Base)
实际地址:DS×16+1200AH AL 11 2222111200H┇ 数据段┇ 接下页间址寄存器(不要求)间址寄存器(不要求)只能是:基址寄存器(BX、BP),变址寄存器(SI、DI)
操作数的段地址取决于间址寄存器
BX, SI, DI 默认在数据段
BP 默认在堆栈段
例 MOV AX, [BX] 数据在数据段DS
MOV AX, [BP] 数据在堆栈段SS
寄存器为BX(Base)、BP(Base Point):又称为基址寻址
寄存器为SI、DI:又称为变址寻址3.基址加变址寻址3.基址加变址寻址操作数的偏移地址为: [基址寄存器]+[变址寄存器]
操作数的段地址: 由基址寄存器决定
例 MOV AX, [BX+SI] 或写成
MOV AX, [BX] [SI]
BX的段地址默认在数据段DS
实际地址: DS×16+BX+SI2个自由度4.寄存器相对寻址4.寄存器相对寻址操作数偏移地址:间址寄存器+位移量(相对量)
例 MOV AX, [SI+DATA] ; 数据在数据段DS
地址=DS×16+SI+DATA
例 MOV AX, DATA [BP] ;数据在堆栈段SS
地址= SS×16+ BP+DATA
例 MOV AX, [BX+DATA]接下页5.基址、变址、相对寻址5.基址、变址、相对寻址操作数的偏移地址为:
[基址寄存器]+[变址寄存器]+[位移量]
操作数的段地址:由基址寄存器决定
例 MOV AX, [BP+SI+DATA]
BP的段地址默认在堆栈段SS
实际地址:SS×16+BP+SI+DATA3个自由度四、32位地址的寻址方式 四、32位地址的寻址方式 MOV AX, [ESP]
MOV EAX, [123456H]
MOV EAX, [EBX]
MOV EBX, [ECX*2]
MOV EBX, [EAX+100H]
MOV EDX, [EAX*4+200H]
MOV EBX, [EAX+EDX*2]
MOV EBX, [EAX+EDX*2+300H]寻址方式习题寻址方式习题指出下列每条指令源操作数的寻址方式。
1) MOV CH, 3AH ;立即数寻址
2) MOV AX, BX ;寄存器寻址
3) MOV BX, [2000H] ;内存寻址(直接寻址), 数在数据段
4) MOV DX, [BX] ;内存寻址(间接寻址), 数在数据段
5) MOV AL, ES:[SI] ;数据在附加段
6) MOV BX, DS:[BP] ;数据在数据段, BP默认在堆栈段
7)MOV AX, 3[BX][DI] ;内存寻址(基址变址相对寻址), 在数据段 §4.3 微机指令系统§4.3 微机指令系统按功能分为六大类指令数据传送(重点)
算术运算(重点)
逻辑运算和移位(重点)
串操作(不要求)
程序控制(重点)
处理器控制(不要求)下面分别介绍4.3.1 数据传送指令4.3.1 数据传送指令通用数据传送(重点)
输入输出(重点)
地址传送(重点)
标志位操作(不要求)下面分别介绍不影响标志位1.一般数据传送指令MOV (MOVE)1.一般数据传送指令MOV (MOVE)一般数据传送指令 :MOV
格式:MOV DEST, SRC
操作:SRC(源操作数) DEST(目标操作数)
例 MOV AX, 1000H
MOV AL, BL
MOV AX, [1200H]
MOV AX, [BX]MOV错误指令举例MOV错误指令举例MOV 100H, AX 立即数不能作目的操作数
MOV AL, BX 两操作数字长必须相同
MOV [1200], [SI] 两操作数不允许同时为存储器地址
MOV DS, ES 不能在两个段寄存器之间传送数据
MOV DS, 1000H 立即数不能直接传给段寄存器
MOV IP, AX 不能修改IP值
MOV DS, 1000H 不能修改DS 值练习题练习题指出下列指令错误原因
MOV AL, BX
MOV [1200], [SI]
MOV DS, 1000H2.传送、填充指令(Move and Fill)2.传送、填充指令(Move and Fill) 80386及以后CPU增加的指令
可以传送数据类型相同、位数不同的数据下面分别介绍1)零填充传送指令1)零填充传送指令格式:MOVZX DEST, SRC
MOVZX:Move with Zero Extend
用0填充多出的位
例 MOV AL, 87H
MOVZX CX, AL ;CX=0087H2)符号填充传送指令2)符号填充传送指令格式:MOVSX DEST, SRC
MOVSX:Move with Sign Extend
用符号位填充多出的位
例 MOV AL, 87H ;10000111
MOVSX CX, AL ;CX=FF87H3.交换两数指令XCHG (Exchange)3.交换两数指令XCHG (Exchange) 格式:XCHG DEST, SRC
功能:交换操作数
要求:两操作数必须有一个是寄存器操作数
禁止:不允许使用段寄存器
例 XCHG AX, BX ;交换AX和BX的值
XCHG CL, [2000H] ;交换CL和2000H单元中的值
XCHG [2000H], CL ;同上 4.地址传送指令LEA(Load Effective Address)4.地址传送指令LEA(Load Effective Address)格式:LEA 寄存器, 内存有效地址
可以是 SI、DI、DX
功能:内存效地址的偏移量送寄存器
例 LEA SI, DATA
将符号DATA表示的地址偏移量送SI中例子见下页LEA指令与MOV指令的区别LEA指令与MOV指令的区别比较下列指令:
LEA SI, DATA1
MOV SI, OFFSET DATA1
MOV SI, DATA1
前2条指令:SI=DATA1 地址
后1条指令:SI=1234H 数据
MOV BX, [BX]
LEA BX, [BX]
前者:BX=7788H
后者:BX=1100HLEA应用见下页┇ ┇ ┇ DATA112H34HBX=1100H88H77H1100H符号地址应用LEA举例应用LEA举例题目:传送数据
将数据段中首地址为MEM1 的10字节数据传送到该段首地址为MEM2的区域存放
要求:编写相应程序段SI=MEM1
MEM1+1DI=MEM2
bMEM2+110个字节10个字节程序见下页流程图流程图Y开 始计数值=0?取源地址送数据块长度到CL修改地址指针修改计数值结 束程序见下页取目标地址传送一个字节程序程序 LEA SI, MEM1
LEA DI, MEM2
MOV CL, 10
NEXT: MOV AL, [SI] ; 取数据
MOV [DI], AL ; 移数据
INC SI ; SI加1
INC DI ; DI加1
DEC CL ; CL减1
JNZ NEXT ; CL≠0, 跳到NEXT
HLT SI=MEM1DI=MEM210个字节10个字节6.堆栈操作指令(Stack Operation)6.堆栈操作指令(Stack Operation)堆栈基本概念:
堆栈段:内存的一块区域
指针:栈顶、栈底
堆栈操作:入栈、出栈
操作原则:先进后出低
高SP栈顶 栈底┇ ┇ 下页数据入栈指令PUSH数据入栈指令PUSHPush word or double word onto stack
8086CPU:PUSH Register/Memory
可以是寄存器、内存地址
80286及以后CPU,操作数还可以是立即数
PUSH Register/Memory/Immediate 下页举例入栈指令举例入栈指令举例SP=1200H××堆栈段入栈前SP=11FEH3412××堆栈段入栈后 12 34 AX例 PUSH AX
设 AX=1234H,SP=1200H,执行指令后堆栈区状态见右图
SP-1 放操作数高字节 SP-2 放操作数低字节高地址低地址数据出栈指令POP数据出栈指令POPPop word or double word off stack
格式:POP Register/Memory
操作数可以是寄存器、内存地址下页举例出栈指令举例出栈指令举例SP=1200H3412××堆栈段出栈后SP=11FEH3412××堆栈段出栈前例 POP AX
SP 操作数低字节 SP+1 操作数高字节 SP+2→SP
AX=1234H (AH=12H AL=34H) 12 34 AX高地址低地址8. 输入输出指令(Input and Output)8. 输入输出指令(Input and Output)专门面向I/O端口(设备)操作的指令
内容:
指令格式及操作
指令两种寻址方式
指令对操作数的要求下面分别介绍指令格式指令格式指令格式:
输入指令: IN 累加器, 端口地址
输出指令: OUT 端口地址, 累加器
例 输入指令
IN AX, 80H ;将端口80H中的数据送到AX
例 输出指令
OUT 43H, AL ;AL数据送到43H端口 指令寻址方式(直接寻址)指令寻址方式(直接寻址) 直接寻址:
直接给出8位端口地址, 可寻址256个端口
例 IN AX, 80H ;直接给出8位端口地址80H
例 OUT 43H, AL ; AL数据送到地址43H端口
间接寻址:见下页指令寻址方式(间接寻址)指令寻址方式(间接寻址) 间接寻址:16位端口地址由DX指定, 可寻址64K个端口
例 MOV DX, 03FFH ;将16位端口地址送DX
IN AL, DX ;DX端口数据入AL寄存器
例 MOV DX, 43H ;端口地址送至DX中
OUT DX, AX ;注意只能用DX存放端口地址4.3.2 算术运算类指令(重点)4.3.2 算术运算类指令(重点)加法运算指令
减法运算指令
乘法运算指令
除法运算指令算术运算指令的大多对状态标志位有影响下面分别介绍1. 加法指令1. 加法指令包括:
普通加法指令:ADD
带进位的加法指令:ADC
加1指令:INC
加法指令对操作数的要求与MOV指令相同下面分别介绍1)不带进位加法指令ADD1)不带进位加法指令ADD格式: ADD OPRD1, OPRD2
功能: OPRD1+OPRD2 OPRD1
例 执行下列程序段后, AX结果是什么?
MOV AX, 12
ADD AX, 15 ADD运算影响标志寄存器Flags举例1ADD运算影响标志寄存器Flags举例1例 执行下列程序段后,AL结果是什么?
Flags中的CF、ZF、OF、SF的值各是什么?
MOV AL, 7FH
ADD AL, 01H
答 AL=10000000B=80H
状态标志位结果 CF=0 ZF=0 OF=1 SF=1 01111111
+ 00000001
10000000用调试程序看结果用调试程序查看标志位用调试程序查看标志位ADD运算影响标志寄存器举例2ADD运算影响标志寄存器举例2例 执行下列程序段后,AX结果是什么?
Flags中的CF、ZF、OF、SF的值各是什么?
MOV AX, 7FFFH
ADD AX, 0001H
答 AX=1000000000000000B=8000H
状态标志位结果 CF=0 ZF=0 OF=1 SF=1 注意注意 若立即数最高位为数码A~F,则必须在前面加一个0
MOV AH, 0B6H ;B前加0
MOV BX, 1234H2)带进位加法指令ADC (Add with Carry)2)带进位加法指令ADC (Add with Carry)指令格式: ADC OPRD1, OPRD2
指令操作:
OPRD1+OPRD2+CF OPRD1
对操作数要求、标志位影响与ADD指令完全一样
ADC指令多用于多字节数相加运算
例子见下页ADC 指令举例ADC 指令举例ADC指令用于多字节数相加运算
MOV AX, 0FH ;AX=000FH
ADD AL, 0F1H ;AL+F1HAL=00H, 有进位CF=1
ADC AH, 0 ;AH+0+CFAH=01H
最后结果:AH=01H AL=00H3)加1指令INC (Increment by 1) 3)加1指令INC (Increment by 1) 用于在程序中修改地址或修改计数值(控制循环次数)
格式:INC OPRD
操作:OPRD+1 OPRD
例 LEA SI, MEM1
. . .
INC SI ;地址SI加1
. . .SI=MEM1
MEM1+1
内存OPRD不能是段寄存器或立即数
2. 减法指令2. 减法指令包括:
普通减法指令:SUB
考虑借位的减法指令:SBB
减1指令:DEC
两数比较指令:CMP
求数据补码指令:NEG
减法指令对操作数的要求与对应的加法指令相同下面分别介绍1)减法指令SUB (Subtract) 1)减法指令SUB (Subtract) 格式: SUB OPRD1, OPRD2
操作: OPRD1 - OPRD2 OPRD1
对标志位影响与ADD指令相同
例 计算 3078H - 240AH = ? 结果放在AX中
MOV AX, 3078H
SUB AX, 240AH 2)带借位减法指令SBB(Subtract with Borrow)2)带借位减法指令SBB(Subtract with Borrow)指令格式:SBB OPRD1, OPRD2
指令操作:OPRD1- OPRD2- CF OPRD1
对操作数的要求与SUB指令完全一样
对标志位的影响与SUB指令完全一样
SBB指令多用于多字节数相减运算3)减1指令DEC (Decrement by 1) 3)减1指令DEC (Decrement by 1) 格式: DEC OPRD
操作: OPRD – 1 OPRD
例 MOV CX, 25
DEC CX ;CX减1
常用于在程序中修改计数值, 控制循环次数
对操作数的要求与INC指令相同例子见下页DEC应用程序举例DEC应用程序举例问执行下面循环程序后,AX的值是多少?
MOV AX, 0
MOV CX, 3
LOP: ADD AX, 1
DEC CX
JNZ LOP ; 若CX≠0, 则跳到LOP处
HLT4)求补指令NEG (Negate) 4)求补指令NEG (Negate) 格式: NEG OPRD
操作: 0 – OPRD OPRD
用0减去操作数, 相当于对操作数求补码
例 求两数之差的绝对值, 结果放到AL中。
MOV AL, 24 ; 求|24 - 32|=?
SUB AL, 32
NEG AL 5)两数比较指令CMP (Compare)5)两数比较指令CMP (Compare) 格式:CMP OPRD1, OPRD2
操作:OPRD1- OPRD2
特点:指令执行后, 两个操作数不变, 只影响标志位
用途:
比较两个数的大小, 可作为条件转移指令的转移条件
指令对操作数的要求及对标志位的影响与SUB指令相同比较原理见下页两数相减影响标志位
CMP指令比较原理 CMP指令比较原理对于两个无符号数(CMP AX, BX):
若 CF=0 没借位,则 AX > BX
若 CF=1 有借位,则AX < BX
若 ZF=1 则 AX-BX=0 即 AX = BX
对于两个带符号数(CMP AX, BX):
两个数的大小由OF和SF共同决定
若 OF和SF状态相同,则 AX > BX
若 OF和SF状态不同,则 AX < BX 例子见下页CMP指令应用举例CMP指令应用举例 LEA BX, MAX
LEA SI, BUF
MOV CL, 3 ;比较次数
MOV AL, [SI]
NEXT:INC SI
CMP AL, [SI]
JNC EDIT ;CF=0跳转
XCHG [SI], AL
EDIT: DEC CL
JNZ NEXT
MOV [BX], AL
HLTMAXBUF题目:
找出4个无符号数的最大数
结果放到MAX单元124385最大数4个数563. 乘法指令(Multiply) 3. 乘法指令(Multiply) 无符号的乘法指令: MUL OPRD
带符号的乘法指令: IMUL OPRD乘法指令有一个操作数(乘数)
规定被乘数要事先放在累加器AL或AX中
乘积被放在AX、DX中
若运算结果的高位全为0, 表示为无效数据, 有OF=CF=0下面分别介绍无符号数乘法指令(单字节)无符号数乘法指令(单字节)格式:MUL OPRD
操作:AL×OPRD AX
乘积最大值:65535
例 MOV BL, 4
MOV AL, 2
MUL BL 即AL×BL=2×4=8→AX不能是立即数
无符号数乘法指令(双字节)无符号数乘法指令(双字节) 格式:MUL OPRD
乘积超过65535, 用双字节OPRD, 乘积为32位
DX=乘积高16位 AX=乘积低16位
例 MOV BX, 40000
MOV AX, 2
MUL BX ; 高16位放 DX, 低16位放AX带符号数乘法指令带符号数乘法指令 格式: IMUL OPRD
例 设 AL=FEH, CL=11H, 求 AL×CL=?
看作无符号数时, 使用 MUL CL
则 AL=254, CL=17, AX=AL×CL= 4318= 10DEH
看作有符号数时, 使用 IMUL CL
则 AL=FEH(补码)=-2, 原码为82H CL=+17
结果 AX=-2×17=-34=FFDEH 带符号数(补码表示)4. 除法指令 (Divide)4. 除法指令 (Divide)无符号除法指令 DIV OPRD
有符号除法指令 IDIV OPRD字节除法:OPRD是8位数据
字除法: OPRD是16位数据
除法指令要求被除数是除数的双倍字长
例如 除数是8位数据, 被除数应是16位数据字节除法(无符号数)字节除法(无符号数)要求:除数是8位数据, 被除数AX是16位数据
字节除法指令:DIV OPRD
执行:AX/ OPRD (结果:商放AL, 余数放AH)例子见下页字节除法举例字节除法举例
例 计算无符号数 26 ÷ 4 = ?
MOV AX, 26
MOV BL, 4
DIV BL ; AX÷BL, 商放AL=6, 余数放AH=2
注意:要求被除数是除数的双倍字长字除法(无符号数)字除法(无符号数)要求:除数是16位数据, 被除数是32位数据
字除法指令:DIV OPRD
执行: DXAX/OPRD →(AX=商 DX=余数)例子下页字除法举例字除法举例 DXAX/OPRD →(AX=商 DX=余数)
例 计算 9321÷4660 = ? (2469H÷1234H)
MOV DX, 0
MOV AX, 9321
MOV CX, 4660
DIV CX
即 (DX : AX)÷CX, 商AX=2, 余数DX=14.3.3 逻辑运算指令(Logical Instruction) 4.3.3 逻辑运算指令(Logical Instruction) 包括
逻辑运算指令对操作数要求大多与MOV指令相同
除NOT(非)指令外,其余指令都使标志位OF=CF=0与 AND
或 OR
非 NOT(要求操作数不能是立即数)
异或 XOR下面分别介绍与指令(AND)与指令(AND)格式:AND OPRD1, OPRD2
操作:两操作数按位相“与”,结果送目标地址OPRD1
规则:1AND1=1 1AND0=0 0AND1=0 0AND0=0
例 执行下面指令后, AL=?
MOV AL, 10001011B
AND AL, 00001111B ; AL前4位清0,后4位不变
结果 AL=00001011B=0BH
通过与运算,可使数据某些位不变、某些位为零与指令练习题与指令练习题 执行下面指令后, 寄存器的值是什么?
MOV BH, 01100111B
AND BH, 11011100B ; BH=?
AND BX, BX ; BX =?
MOV BL, 12H
AND BL, 0FH ; BL =?
若操作数自身相与,则操作数不变,把CF和OF清零与指令应用举例1与指令应用举例1 设(BH)=67H=01100111B,如何把第0、1和5位变为0,其它位保持不变,即使(BH)=54H。
用指令:MOV BH, 01100111B
AND BH, 11011100B
第5位、1位、0位为0,其它位为1与指令应用举例2与指令应用举例2例 将数字9的ASCII码39H转成BCD码09H,结果放AL中
方法:将39H的高4位变成0,低4位不变,结果为09H
代码:MOV AL, 39H
AND AL, 0FH
数字0~9的ASCII码:30H~39H
同理:任何数字的ASCII码变BCD码,将ASCII 高4位变0或运算指令(OR)或运算指令(OR)格式:OR OPRD1, OPRD2
操作:两操作数按位相“或”,结果送目标地址OPRD1
规则:1OR1=1 1OR0=1 0OR1=1 0OR0=0
例 执行下面指令后, AL=?
MOV AL, 10110001B
OR AL, 10111111B ;AL前4位不变,后4位为1
结果AL=10111111B=BFH或指令的应用或指令的应用通过或运算,可使数据的某些位不变、某些位变1
例 OR CL, 0FH ;CL前4位不变,后4位为1
若操作数自身相或,则操作数不变,使OF=CF=0
例 OR AX, AX非运算指令(NOT)非运算指令(NOT) 格式:NOT OPRD
操作:操作数按位取反再送回原地址
执行指令对标志位无影响
例 已知(AL)=46H=01000110B,执行指令“NOT AL”后,AL的值是什么?OPRD不能是立即数
NOT 0 1 0 0 0 1 1 0 B=46H
结果 1 0 1 1 1 0 0 1 B=B9H异或运算指令XOR (Exclusive OR)异或运算指令XOR (Exclusive OR)格式:XOR OPRD1, OPRD2
操作:两操作数相“异或”,结果送目标地址OPRD1
例 操作数自身相异或,结果为0
XOR AX, AX 等价指令为 MOV AX,0
例 XOR指令可用于对某些位求反,不影响其他位。
XOR BL, 00001001B
将BL中D3和D0位求反,其他位保持原值不变。 测试指令(TEST) 测试指令(TEST) 格式:TEST OPRD1, OPRD2
操作:执行“与”运算,运算结果不送回目标地址OPRD1
应用:常用于测试某些位的状态
例 设AL=10111011B,测试D1位是否为1
MOV AL, 10111011B
TEST AL, 00000010B
若AL AND 00000010B=0,则D1位是0,不是1 4.3.4 移位运算指令(SHIFT)4.3.4 移位运算指令(SHIFT)非循环移位
循环移位逻辑移位
算术移位不带进位的移位
带进位的移位下面分别介绍× × × × × × × × × × × × × × × × × × × × 非循环移位指令非循环移位指令逻辑左移
算术左移
逻辑右移
算术右移下面分别介绍逻辑左移(Shift Logic Left)逻辑左移(Shift Logic Left)用于无符号数:SHL OPRD, Imm/CL 0CF例 MOV AL, 00000001B
SHL AL, 1 左移可实现简单乘法运算,左移1位是扩大2倍立即数或CL寄存器0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0补0CF移位前左移1位后,数据扩大2倍逻辑左移指令应用举例1逻辑左移指令应用举例1例 AX×8 AX
MOV CL, 3 ;CL=移位次数
SHL AX, CL ;AX左移3位,即AX×8 AX
HLT
16位微机:移动一位时,指令可直接给出移动位数
移动多位,移位次数放CL中
32位微机:移动多位时,也可直接给出移动位数逻辑左移指令应用举例2逻辑左移指令应用举例2例 AX×10 AX
SHL AX, 1 ;AX×2 AX
MOV BX, AX ;AX×2 BX
MOV CL, 2 ;CL=移位次数
SHL AX, CL ;AX左移2位,即AX=(AX×2)×4
ADD AX, BX ;AX=AX×8+AX×2=AX×10
HLT逻辑右移(Shift Logic Right)逻辑右移(Shift Logic Right)用于无符号数右移: SHR OPRD, Imm/CL 0CF0 0 0 0 1 0 0 00 0 0 0 0 1 0 0CF原数据右移1位后,缩小2倍例 MOV AL, 00001000B
SHR AL, 1 右移可实现简单除法,右移1位是缩小2倍立即数或CL寄存器算术左移(Shift Algebraic Left)算术左移(Shift Algebraic Left)用于有符号数:SAL OPRD, Imm/CL
例 MOV AL, 00000001B
MOV CL, 2
SAL AL, CL ;AL=00000100B 溢出问题见下页 左移可实现简单乘法运算,左移1位是扩大2倍算术右移(Shift Algebraic Right)算术右移(Shift Algebraic Right)用于有符号数右移
SAR OPRD, Imm/CL
可实现简单除法运算,移动1位缩小2倍CF符号位不变CF0例 MOV AL, 0FCH ; FCH 是补码,表示-4
SAR AL, 1 变为-2,绝对值缩小2倍1 1 1 1 1 1 0 0符号位不变1 1 1 1 1 1 1 0 -4 (原码为10000100)移位操作影响溢出标志位OF移位操作影响溢出标志位OF左移一位后:若CF与最高位不相等,则OF=1,否则OF=0
对有符号数:CF与最高位不相等(OF=1),说明移位前后符号位不同,即数据溢出(超出范围)
对无符号数:移位后 OF=1,不能说明数据溢出
右移一位后:次高位和最高位两值不等→OF=1,否则OF=0
移动多位后: OF值不确定例子见下页移位影响OF举例移位影响OF举例 MOV AL, 81H
SAL AL, 1 或 SHL AL, 1
因为CF=1、最高位=0,两者不等,可知OF=1。1 0 0 0 0 0 0 10 0 0 0 0 0 1 0CF最高位原数据AL=81H左移1位后,AL=02H移位指令应用见下页补0移位指令应用举例移位指令应用举例 题目:
将10H单元存放的十进制数的BCD码转为ASCII码,并将低位数字的ASCII码存在50H单元,高位数字的ASCII码存在51H单元。
为什么要转换:
在屏幕上显示BCD码的十进制数时,需将BCD码的各位转成ASCII码。
转换方法见下页:
10H50H51H┇12H32H31HASCII码用于显示BCD码┇┇BCD码转成ASCII码的方法BCD码转成ASCII码的方法方法:将十进制数的每位BCD码转为ASCII码
已知:数字0~9的BCD码为0H~9H
数字0~9的ASCII码为30H~39H
数字的ASCII码为:数字的BCD码+30H
例如:数字1的ASCII码=1H+30H=31H
转换步骤(以BCD12H转成ASCII为例):
首先把12H变成02H,然后02H+30H得低位2的ASCII码
用移位把12H变成01H,然后01H+30H得高位1的ASCII码程序见下页nullMOV SI, 10H
MOV DI, 50H
MOV AL, [SI] ;将BCD码12H放入AL
MOV BL, AL ;原数据12H放入BL,下面首先获低位数据ASCII码
AND AL, 0FH ;保留AL( 12H)的低位, AL变为02H
ADD AL, 30H ;AL=02H+30H=32H,得个位数字2的ASCII码32H
MOV [DI], AL ;数字2的ASCII码32H放入50H单元中
MOV AL, BL ;原BCD码数据12H放入AL,下面获高位的ASCII码
MOV CL, 4
SHR AL, CL ;BCD码12H右移4位,AL变为01H
ADD AL, 30H ;AL=01H+30H=31H,得数字1的ASCII码
INC DI ;标地址加1, DI变为51H
MOV [DI], AL ;将数字1的ASCII码放入51H单元中
HLT低位转换高位转换循环移位指令 (Rotate Shift) 循环移位指令 (Rotate Shift)
不带进位位的循环移位
带进位位的循环移位
指令格式:对操作数的要求与非循环移位指令相同左移 ROL
右移 ROR左移 RCL
右移 RCR下面分别介绍不带进位的循环移位不带进位的循环移位左移 ROL右移 ROR例 MOV BX, 0001 0010 0011 0100B
MOV CL, 4
ROL BX, CL
结果是BX变为0010 0011 0100 0001B=2341H CF带进位循环移位(Rotate Shift Through Carry) 带进位循环移位(Rotate Shift Through Carry) 左移RCL
右移RCRCFCF 循环移位指令的用途
用于测试某些位的状态
交换高位部分和低位部分
与非循环移位指令一起组成32位或更长字长数的移位。4.3.6 程序控制指令4.3.6 程序控制指令转移指令
循环控制
过程调用
中断控制下面分别介绍1. 转移指令1. 转移指令无条件转移指令:
无条件转移到目标地址执行指令。(要求掌握段内转移)
有条件转移指令:
当具备一定条件时转移到目标地址,如ZF=0时转。
转移指令的转移原理
通过修改代码段寄存器CS及指令指针IP的内容,使程序改变顺序执行的模式,转到新的目标地址执行。下面分别介绍无条件转移指令(Transfer Unconditionally)无条件转移指令(Transfer Unconditionally) 段内转移: JMP Label
段间转移: JMP Far Label
例 段内转移
…
JMP AA ;跳到AA处
…
AA: … ;在同一代码段
段内转移要点:
新位置的段基地址不变
偏移地址=当前IP+位移量Label代码段1代码段2JMP 目标┇┇┇××××××××位移量Far Label无条件段间直接转移无条件段间直接转移 JMP Far LabelFar Label代码段1代码段2JMP ┇┇┇××××××××IPCS远地址标号 改变段基地址CS
执行另一段指令
需保存原有地址,返回后继续 条件转移指令 (Transfer Conditionally) 条件转移指令 (Transfer Conditionally) 当满足某个条件时,程序转移到目标地址继续执行;
在条件转移指令之前,应有一条形成转移条件的指令
(如影响标志位的指令);
条件转移均为段内短转移;
转向的目的地址必须在转移指令的-128~+127字节之内。 下面分别介绍无符号数条件转移常用指令无符号数条件转移常用指令举例见下页 指令名称 汇编格式 转移条件
高于转移 (jump above) JA target CF=0且ZF=0
不低于等于转移 JNBE target CF=0且ZF=0
(jump not below and not equal)
低于转移 (jump below) JB target CF=1
不高于等于转移 JNAE target CF=1
高于或等于转移 JAE target CF=0
不低于转移 JNB target CF=0
低于或等于转移 JBE target CF=1或ZF=1
不高于转移 JNA target CF=1或ZF=1高于转移指令举例高于转移指令举例 指令格式:JA target
含义:jump target while above
转移条件:高于(大于)转移 (CF=0且ZF=0)
例 比较字符’B’和’A’ ,若’B’大于’A’,则跳到AA处。
MOV AL, ’B’
CMP AL, ’A’
JA AA ; ’B’>’A’时跳到AA处
…
AA: …用于无符号数带符号数条件转移常用指令带符号数条件转移常用指令 指令名称 汇编格式 转移条件
大于转移(jump greater) JG target SF=OF且ZF=0
不小于或等于转移 JNLE target SF=OF且ZF=0
大于或等于转移 JGE target SF=OF
不小于转移 JNL target SF=OF
小于转移(jump less) JL target SF≠OF且ZF=0
不大于或等于转移 JNGE target SF≠OF且ZF=0
小于或等于 JLE target SF≠OF或ZF=1
不大于转移 JNG target SF≠OF或ZF=1其他常用条件转移指令其他常用条件转移指令 指令名称 汇编格式 转移条件
等于转移(jump equal) JE target ZF=1
为零转移(jump zero) JZ target ZF=1
不等于转移 (jump not equal ) JNE target ZF=0
非零转移 (jump not zero) JNZ target ZF=0
举例见下页求负数个数求负数个数从内存5单元开始存有10个符号数,统计负数个数,送RT单元
XOR DI, DI ;DI清零,存放负数个数
MOV BX, 5 ;起始地址5→BX
MOV CX, 10 ;数据个数→CX(置计数器初值)
AGAIN: MOV AL, [BX] ;BX内容送AL
CMP AL, 0 ;比较
JGE NOT ;AL≥0(非负数)时,转NOT
INC DI ;为负数DI加1
NOT: INC BX ;BX加1,指向下一个数