nullnull3.3 80x86的指令系统80x86的指令系统中共有136种基本指令,
可以分成6个功能组:
数据传送(Data transfer) 25
算术运算(Arithmetic) 21
逻辑运算和移位指令(Logic& Shift) 21
串处理(String manipulation) 7
控制转移(Control Transfer) 47
处理机控制(Processor Control) 15null先介绍以下内容:
1. 学习指令的要点
2. 指令中操作数的
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示
3. 书写指令注意事项
null先介绍以下内容:
1. 指令助记符表
2. 学习指令的要点
3. 利用DEBUG程序,学习指令系统
4. 指令中操作数的表示
5. 书写指令注意事项
null1. 指令助记符表nullnull1. 学习指令的要点
从以下几个方面来掌握一条指令:
指令的助记符
指令的
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
:操作数的个数、类型(B,W,DW)
执行的操作:指令执行后的结果
包括: 哪些寄存器、内存单元的值发生了变化
对标志位有无影响,哪些受影响
特点及注意事项
只介绍常用的指令,其他需要时可自学。null重点关注:
指令的汇编格式
指令的基本功能
指令支持的寻址方式
指令的执行对标志位的影响
指令的特殊要求null编程完成 B5h + 8Fh = ? 学习加法ADD指令及其对状态标志位的影响。3. 利用DEBUG学习指令系统(示例)null2. 指令中操作数的表示 )注释时表示寄存器、存储器、端口的内容oprd1oprd2两操作数nullnullnullnullnullnullnullnull 数据传送是最基本、最重要的一种操作
实际程序中,使用的比例最高 change PROC
LEA SI, num+2
MOV CL, num+1
MOV CH, 0
MOV AX, 0
MOV DI, 10
next: MUL DI
MOV BH, 0
MOV BL, [SI]
AND BL, 0FH
ADD AX, BX
INC SI
LOOP next
zero: MOV BX, AX
RET
change ENDP
汇编子程例:3.3.1 数据传送指令null 按传送内容,可分为四类: 通用数据传送指令
累加器专用传送指令
地址传送指令
标志寄存器传送指令 特点:
1. 除POPF/FD、SAHF外,其他传送指令对标志位均无影响
2. 唯一允许以段寄存器做操作数的指令
且只有MOV、PUSH、POP这三条允许null通用传送指令(8)
MOV
MOVSX
MOVZX
PUSH
POP
PUSHA/ PUSHAD
POPA /POPAD
XCHG
传送
带符号扩展传送
带零扩展传送
进栈
出栈
所有寄存器进栈
所有寄存器出栈
交换null(1)MOV传送指令
格式
MOV DST,SRC
执行 ( DST ) ← ( SRC )null例 :
①reg/mem/segreg ← reg 通用寄存器/存储器/段寄存器←通用寄存器
MOV AL , BL
MOV [ BX ] , AL
MOV DS , AX
②reg/segreg ← mem 通用寄存器/段寄存器 ← 存储器
MOV AL , [ BX ]
MOV DS , [ BX+SI ]
③reg/mem ← segreg 通用寄存器/存储器 ← 段寄存器
MOV BX , CS
MOV [ BX ] , DS
④reg/mem ← data 通用寄存器/存储器 ←立即数
MOV Al , 9
MOV BX , OFFSET buffer
MOV BYTE PTR [ value ] , 0
MOV WORD PTR [ BX ] , 1nullMOV指令特点及注意事项:
双操作数指令 (注意双操作指令的特点)
可进行字节或字传送
不允许存储器传送到存储器
MOV [ BX ] , value
MOV [DI], [SI]
MOV AX ,value
MOV [ BX ] ,AX
MOV AL ,[SI]
MOV [ DI ] ,ALnullnullnull例 编程将CL寄存器的内容传送到200:100H单元中。MOV [200:100H ], CLnull MOV指令应用(自学)
例:
实现将AREA1开始的100个数据传送到AREA2开始的单元。
……AREA1:AREA2:100个数据null
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
题意:
①可以用200条MOV指令来完成100个数据传送,
指令操作重复,每个数据传送后的地址是变化的。
② 可以利用循环,
但每循环一次要修改地址(源地址和目的地址),
必须把地址放在寄存器当中,用寄存器间接寻址来寻找操作数.null得到如下程序:
…
MOV SI,OFFSET AREA1
MOV DI,OFFSET AREA2
MOV CX,100
AGAIN : MOV AL,[SI]
MOV [DI],AL
INC SI ;修改地址指针
INC DI ;修改地址指针
DEC CX ;修改个数
JNZ AGAIN
…nullMOVSX 带符号扩展传送
MOVZX 带零扩展传送格 式: MOVSX/ MOVZX DST,SRC
执行的操作: (DST)符号扩展( SRC )
例:
MOVSX EAX,CL
MOVSX EDX,[EDI]
MOVZX DX,AL
MOVZX EAX,[EDI]null注意:
1.目的操作数必须是16位或32位寄存器
2.源操作数的长度一定要小于目的操作数
3.MOVSX的源操作数应是有符号数,而MOVZX的
源操作数应是无符号数null什么是堆栈,为什么需要堆栈
堆栈是按照先进后出原则组织的一段内存区域存在
于堆栈段中,SP在任何时候都指向栈顶。
通常用于存放一些重要数据,
如:程序的地址、或是需要恢复的数据。
为方便数据的存放和恢复,
设置专门的指针,指向堆栈中要操作的单元。
段值由 SS 给出,偏移地址由 SP 给出
SS → 堆栈段寄存器 (stack segment)
SP → 堆栈指针寄存器 (stack point)堆栈:“先进后出”的存储区,null堆栈使用的场合
用堆栈保存恢复信息
子程序的调用、返回以及中断调用、返回
用堆栈传送数据
(程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
中介绍)nullnull 进栈指令: PUSH SRC
执行操作: (SP) (SP) - 2
( (SP)+1, (SP) ) (SRC)
把一个字从源操作数(src)由SP指向堆栈顶部。特点:
单操作数指令
操作数为16位,可以是reg/segreg/mem, 不可以是data
reg : AX, BX, CX, DX, SI, DI, BP, BX
segreg : CS, DS, ES, SS
mem : 字类型null例: 假设 (AX) = 2107 H , 执行 PUSH AX
(SP)低地址高地址(SP) 07H
21H低地址高地址进栈方向* ** * * * * *PUSH AX 执行前PUSH AX 执行后nullD:\MASM>DEBUG
-A ;汇编两条指令
1693:0100 MOV AX, 1234
1693:0103 PUSH AX
1693:0104
-R ;显示指令执行前寄存器值
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1693 ES=1693 SS=1693 CS=1693 IP=0100 NV UP EI PL NZ NA PO NC
1693:0100 B83412 MOV AX, 1234
-T=100 2 ;执行CS:100开始处的两条指令
….
AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000
DS=1693 ES=1693 SS=1693 CS=1693 IP=0104 NV UP EI PL NZ NA PO NC
1693:0104 03C6 ADD AX,SI
-D SS:FFEC L10 ;查看栈顶内容
1693:FFE0 34 12 00 00 4...
1693:FFF0 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF .........…
-例 利用DEBUG学习PUSH指令注意相关寄存器和内存单元内容的变化null出栈指令: POP DST
执行操作: (DST) (SP)+1, (SP))
(SP) (SP) + 2
把现行SP所指向堆栈顶部的一个字 指定的目的操作数(dest),同时进行修改堆栈指针的操作。特点:
单操作数指令
操作数为16位,可以是reg/segreg/mem, 不可以是data
reg : AX, BX, CX, DX, SI, DI, BP, BX
segreg : DS, ES, SS, 不允许是CS
mem : 字类型null例: POP BX(SP)低地址高地址(SP) 07H
21H低地址高地址出栈方向07H
21H (BX) = 2107H POP BX 执行前 POP BX 执行后* ** ** * * *null-A
1693:0100 MOV BP, SP ;取当前栈顶地址
1693:0102 MOV WORD PTR [BP], 1234 ;用MOV指令使栈顶内容为1234H
1693:0107 POP BX ;出栈指令
1693:0108
-R ;查看指令执行前状态
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1693 ES=1693 SS=1693 CS=1693 IP=0100 NV UP EI PL NZ NA PO NC
1693:0100 89E5 MOV BP, SP
-T=100 ;执行CS:100处的第一条mov指令
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=FFEE SI=0000 DI=0000
DS=1693 ES=1693 SS=1693 CS=1693 IP=0102 NV UP EI PL NZ NA PO NC
1693:0102 C746003412 MOV WORD PTR [BP+00], 1234 SS:FFEE=0000
-T ;执行下一条mov指令
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=FFEE SI=0000 DI=0000
DS=1693 ES=1693 SS=1693 CS=1693 IP=0107 NV UP EI PL NZ NA PO NC
1693:0107 5B POP BX
-T ;执行pop指令,注意BX, SP的变化
AX=0000 BX=1234 CX=0000 DX=0000 SP=FFF0 BP=FFEE SI=0000 DI=0000
DS=1693 ES=1693 SS=1693 CS=1693 IP=0108 NV UP EI PL NZ NA PO NC
1693:0108 F5 CMC
-例 在DEBUG下学习POP指令nullPUSHA/ PUSHAD
POPA /POPAD所有16位/32位寄存器进栈
所有16位/32位寄存器出栈执行操作
进栈
顺序 AX,CX,DX,BX,SP,BP,SI,DI
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
(SP) ←(SP)-16(32)
出栈顺序 DI,SI,BP,SP,BX,DX,CX,AX
EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX
(SP) ←(SP)+16(32)null 交换指令: XCHG OPR1, OPR2
执行操作: (OPR1) (OPR2)
例:XCHG BX, [ BP+SI ]
XCHG AL, BH
注意:
* 可进行字或字节操作,不影响标志位
* 不允许对立即数、段寄存器做操作数
XCHG AX, 4
XCHG BX, DS null 输入指令(I/O CPU)
长格式: IN AL, PORT (字节)
IN AX, PORT (字)
IN EAX, PORT (双字) 累加器专用传送指令(只限使用AX或AL)执行操作:(AL) ( PORT ) (字节)
(AX) ( PORT+1, PORT )(字)
(AX) (PORT+3, PORT+2, PORT+1,
PORT ) (双字)null 短格式: IN AL, DX (字节)
IN AX, DX (字)
IN EAX, DX (双字)
执行操作:(AL) ( (DX) ) (字节)
(AX) ( (DX)+1, (DX) )(字)
(AX) ((DX)+3, (DX)+2, (DX)+1, (DX) )
(双字) null长格式: OUT PORT, AL (字节)
OUT PORT, AX (字)
OUT PORT, EAX (双字)
执行操作:( PORT ) (AL) (字节)
( PORT+1, PORT ) (AX)(字)
(PORT+3 , PORT+2 ,PORT+1, PORT ) (EAX)
(双字)
输出指令(CPU I/O)null 短格式: OUT DX, AL (字节)
OUT DX, AX (字)
OUT DX, EAX (双字)
执行操作:( (DX) ) (AL) (字节)
( (DX)+1, (DX) ) (AX) (字)
((DX)+3, (DX)+2, (DX)+1, (DX) ) (AX)
(双字)
null注意:
* 不影响标志位
* 前256个端口号00H~FFH可直接在指令中指定(长格式)
* 如果端口号 256,端口号 DX(短格式)
例: IN AX, 28H ; MOV DX, 28H
; IN AX, DX
MOV DATA_WORD, AX
例: MOV DX, 3FCH
IN AX, DX
例: OUT 5, AL
例:测试某状态寄存器(端口号27H)的第2位是否为1
IN AL, 27H
TEST AL, 00000100B
JNZ ERROR ;若第2位为1,转ERROR处理nullSound程序 mov dx, 100
in al, 61h
and al, 11111100b
sound:xor al, 2
out 61h, al
mov cx, 140h
wait1: loop wait1
dec dx
jne soundnull换码指令:XLAT 或 XLAT OPR
执行操作:(AL) ( (BX) + (AL) )
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用BX。
例:MOV BX, OFFSET TABLE ; (BX)=0040H
MOV AL, 3
XLAT TABLE
指令执行后 (AL)=33H
注意:
* 不影响标志位
* 字节表格(长度不超过256)
首地址 (BX)
* 需转换代码 (AL)nullXLAT指令使用方法:
先建立一个字节表格;
表格首偏移地址存入BX;
需要转换代码的序号(相对与表格首地址位移量)存入AL;
(表中第一个元素的序号为0)
执行XLAT指令后,表中指定序号的元素存于AL中。
(AL)为转换的代码。nullXLAT指令应用:
若把字符的扫描码转换成ASCII码;
或数字0~9转换成7段数码所需要的相应代码(字形码)等
就要用XLAT指令。
例:内存的数据段中有一张十六进制数字的ASCII码表。
首地址为:Hex_table ,欲查出表中第10个元素(‘A’)
null执行指令序列:
MOV BX,OFFSET Hex_table
MOV AL,0AH
XLAT Hex_table
假设:
(DS)=F000H,
Hex_table=0040H
(AL)=0AH
执行XLAT以后:
(AL)=41H=(F004AH),
即“A”的ASCII码。16进制数的ASCII码表null 地址传送指令
有效地址送寄存器指令: LEA REG, SRC
执行操作: (REG) SRC
指针送寄存器和DS指令: LDS REG, SRC
执行操作: (REG) (SRC)
(DS) (SRC+2)
4个相继字节 寄存器(通常是SI)、DS
指针送寄存器和ES指令: LES REG, SRC
执行操作: (REG) (SRC)
(ES) (SRC+2)
4个相继字节 寄存器(通常是DI)、ES null例:LEA BX, [BX+SI+0F62H]
LDS SI, [10H]
LES DI, [BX]40 H
00 H
00 H
30 H TABLE
(DS):1000HMOV BX, TABLE ; (BX)=0040H
MOV BX, OFFSET TABLE ; (BX)=1000H
LEA BX, TABLE ; (BX)=1000H
LDS BX, TABLE ; (BX)=0040H
; (DS)=3000H
LES BX, TABLE ; (BX)=0040H
; (ES)=3000H注意:
* 不影响标志位
* REG 不能是段寄存器
* SRC 必须为存储器寻址方式null 标志寄存器传送指令
标志送AH指令: LAHF
执行操作: (AH) (PSW的低字节)
AH送标志寄存器指令: SAHF
执行操作: (PSW的低字节) (AH)
标志进栈指令: PUSHF
执行操作: (SP) (SP) - 2
( (SP)+1, (SP) ) (PSW)
标志出栈指令: POPF
执行操作: (PSW) ( (SP)+1, (SP) )
(SP) (SP) + 2
* 影响标志位null 类型转换指令
CBW AL AX
执行操作: 若(AL)的最高有效位为0,则(AH)= 00H
若(AL)的最高有效位为1,则(AH)= 0FFH
CWD AX (DX,AX)
执行操作:若(AX)的最高有效位为0,则(DX)= 0000H
若(AX)的最高有效位为1,则(DX)= 0FFFFH
例:(AX) = 0BA45H
CBW ; (AX)=0045H
CWD ; (DX)=0FFFFH (AX)=0BA45H
注意: * 无操作数指令
* 隐含对AL 或AX 进行符号扩展
* 不影响条件标志位null 加法指令
ADD、ADC、INC
减法指令
SUB、SBB、DEC、NEG、CMP
乘法指令
MUL、IMUL
除法指令
DIV、IDIV
十进制调整指令
DAA、DAS、
AAA、AAS、AAM、AAD3.3.2算术指令null 加法指令
加法指令: ADD DST, SRC
执行操作: (DST) (SRC) + (DST)
带进位加法指令: ADC DST, SRC
执行操作: (DST) (SRC) + (DST) + CF
加1指令: INC OPR
执行操作: (OPR) (OPR) + 1注意:
* 除INC指令不影响CF标志外,均对条件标志位有影响。null加法指令对条件标志位(CF/OF/ZF/SF)的影响:CF 位表示 无符号数 相加的溢出。
OF 位表示 带符号数 相加的溢出。nulln=8bit 带符号数(-128~127) 无符号数(0~255)null例:双精度数的加法
(DX) = 0002H (AX) = 0F365H
(BX) = 0005H (CX) = 0E024H
指令序列 (1) ADD AX, CX
(2) ADC DX, BX
(1) 执行后,(AX) = 0D389H
CF=1 OF=0 SF=1 ZF=0
(2) 执行后,(DX) = 0008H
CF=0 OF=0 SF=0 ZF=0null 减法指令
减法指令: SUB DST, SRC
执行操作: (DST) (DST) - (SRC)
带借位减法指令: SBB DST, SRC
执行操作: (DST) (DST) - (SRC) - CF
减1指令: DEC OPR
执行操作: (OPR) (OPR) - 1
求补指令: NEG OPR
执行操作: (OPR) - (OPR)
比较指令: CMP OPR1, OPR2
执行操作: (OPR1) - (OPR2)注意:
* 除DEC指令不影响
CF标志外,均对条
件标志位有影响。null减法指令对条件标志位(CF/OF/ZF/SF)的影响:CF 位表示 无符号数 减法的溢出。
OF 位表示 带符号数 减法的溢出。nullNEG 指令对CF/OF的影响:null例:x、y、z 均为双精度数,分别存放在地址为X, X+2;
Y, Y+2;Z, Z+2的存储单元中,用指令序列实现
w x + y + 24 - z ,并用W, W+2单元存放wMOV AX, X
MOV DX, X+2
ADD AX, Y
ADC DX, Y+2 ; x+y
ADD AX, 24
ADC DX, 0 ; x+y+24
SUB AX, Z
SBB DX, Z+2 ; x+y+24-z
MOV W, AX
MOV W+2, DX ; 结果存入W, W+2单元null 乘法指令
无符号数乘法指令: MUL SRC
执行操作:
字节操作数 (AX) (AL) * (SRC)
字操作数 (DX, AX) (AX) * (SRC)
双字操作 (EDX, EAX) (EAX) * (SRC)
带符号数乘法指令: IMUL SRC注意:
* AL (AX、EAX) 为隐含的乘数寄存器。
* AX ((DX,AX)、 (EDX,EAX))为隐含的乘积寄存器。
* SRC不能为立即数。
* 除CF和OF外,对条件标志位无定义。null乘法指令对 CF/OF 的影响:例:(AX) = 16A5H,(BX) = 0611H
(1) IMUL BL ; (AX) (AL) * (BL)
; A5*11 5B*11=060B F9F5
; (AX) = 0F9F5H CF=OF=1
(2) MUL BX ; (DX, AX) (AX) * (BX)
; 16A5*0611=0089 5EF5
; (DX)=0089H (AX)=5EF5H CF=OF=1null对于80286+,还有(1)双操作数的IMUL
格式:IMUL REG,SRC
执行的操作:
字操作:(REG16)(REG16)*SRC
双字操作:(REG32)(REG32)*SRC注:
1、 SRC与REG长度要一致
2、 SRC可以是任一种寻址方式
3、SRC为立即数时,可以是8位、16位、32位立即数null对于80286+,还有(2)三操作数的IMUL
格式:IMUL REG,SRC,IMM
执行的操作:
字操作:(REG16)SRC*IMM
双字操作:(REG32)SRC *IMM注:
1、 SRC与REG长度要一致
2、 SRC可以是除立即数以外的任一种寻址方式
3、IMM(立即数),可以是8位、16位、32位立即数null三种IMUL的区别1、乘积字长不同
单操作数时乘积字长是源和目的操作数字长的二倍
双操作数和三操作数时乘积字长与源和目的操作数字长相同2、溢出位OF的意义不同
单操作数时OF为1,乘积结果也是正确的
双操作数和三操作数时乘积结果不正确null 除法指令
无符号数除法指令: DIV SRC
执行操作:
字节操作 (AL) (AX) / (SRC) 的商
(AH) (AX) / (SRC) 的余数
字操作 (AX) (DX, AX) / (SRC) 的商
(DX) (DX, AX) / (SRC) 的余数
双字操作 (EAX) (EDX, EAX) / (SRC) 的商
(EDX) (EDX, EAX) / (SRC) 的余数
带符号数除法指令: IDIV SRC
注意:
* AX、 (DX,AX)、 (EDX,EAX) 为隐含的被除数寄存器。
* AL、 (AX) 、(EAX)为隐含的商寄存器。
* AH 、(DX) 、 (EDX)为隐含的余数寄存器。
* SRC不能为立即数。
* 对所有条件标志位均无定义。null例:x , y , z , v 均为16位带符号数,计算
( v - ( x*y + z – 540 ) ) / xMOV AX, X
IMUL Y ; x*y
MOV CX, AX
MOV BX, DX
MOV AX, Z
CWD
ADD CX, AX
ADC BX, DX ; x*y+z
SUB CX, 540
SBB BX, 0 ; x*y+z-540
MOV AX, V
CWD
SUB AX, CX
SBB DX, BX ; v-(x*y+z-540)
IDIV X ; (v-(x*y+z-540))/xnull 十进制调整指令
BCD码:用二进制编码的十进制数,又称二--十进制数
压缩的BCD码:用 4 位二进制数表示 1 位十进制数
例:(59)10 =(0101 1001)BCD
非压缩的BCD码:用 8 位二进制数表示 1 位十进制数
例:(59)10 =(0000 0101 0000 1001)BCD
数字的 ASCII 码是一种 非压缩的 BCD 码
DIGIT ASCII BCD
0 30H 0011 0000
1 31H 0011 0001
2 32H 0011 0010
… … …
9 39H 0011 1001null 十进制调整指令
BCD码:用二进制编码的十进制数,又称二--十进制数
压缩的BCD码:用4位二进制数表示1位十进制数
例:(59)10 =(0101 1001)BCD
非压缩的BCD码:用8位二进制数表示1位十进制数
例:(59)10 =(0000 0101 0000 1001)BCD
数字的ASCII码是一种非压缩的BCD码
DIGIT ASCII BCD
0 30H 0011 0000
1 31H 0011 0001
2 32H 0011 0010
… … …
9 39H 0011 1001null例:写出(3590)10的压缩BCD码和非压缩BCD码,并
分别把它们存入数据区PAKED和UNPAK。
压缩BCD: (3590)10=(0011 0101 1001 0000)BCD
非压缩BCD:
(3590)10=(00000011 00000101 00001001 00000000)BCDnull压缩的BCD码调整指令加法的十进制调整指令:DAA
执行操作:(AL) (AL)压缩BCD
减法的十进制调整指令:DAS
执行操作:(AL) (AL)压缩BCD19 压缩BCD: 0001 1001 + 08 + 0000 1000 27 0010 0001 + 110 (0010 0111)BCD AF=1问题的提出: 注意:
* 隐含的操作寄存器为AL
* 紧接在加减指令之后使用
* 影响条件标志位
(对OF无定义)null调整方法:
AF=1或(AL)0~3=A~F,则(AL) (AL) 06H,AF=1
CF=1或(AL)4~7=A~F,则(AL) (AL) 60H,CF=1
( DAA做‘+’, DAS做‘-’ )
例: DATA SEGMENT
BCD1 DB 34H, 18H ; (1834)BCD
BCD2 DB 89H, 27H ; (2789)BCD
BCD3 DB 2 DUP (?)
DATA ENDS
(1) BCD3 BCD1 + BCD2 ; (4623)BCD
(2) BCD3 BCD1 - BCD2 ; (9045)BCD = -955null(1) MOV AL, BCD1 ; (AL)=34H
ADD AL, BCD2 ; (AL)=34+89=BDH
DAA ; (AL)=BD+60+06=23H AF=CF=1
MOV BCD3, AL ; (BCD3)=23H
MOV AL, BCD1+1 ; (AL)=18H
ADC AL, BCD2+1 ; (AL)=18+27+1=40H AF=1 CF=0
DAA ; (AL)=40+06=46H
MOV BCD3+1, AL ; (BCD3+1)=46H
(2) MOV AL, BCD1 ; (AL)=34H
SUB AL, BCD2 ; (AL)=34-89=ABH
DAS ; (AL)=AB-60-06=45H AF=CF=1
MOV BCD3, AL ; (BCD3)=45H
MOV AL, BCD1+1 ; (AL)=18H
SBB AL, BCD2+1 ; (AL)=18-27-1=F0H
DAS ; (AL)=F0-60=90H
MOV BCD3+1, AL ; (BCD3+1)=90Hnull非压缩的BCD调整指令
加法调整指令:AAA (AL) (AL)非压缩BCD
减法调整指令:AAS (AL) (AL)非压缩BCD
注意: * 隐含的操作寄存器为AL
* 紧接在加减指令之后使用
* 除AF、CF外,对其它条件标志位无定义
调整方法:
若(AL)0~3=0~9,且AF=0,则(AL)4~7 = 0,AF CF=0
若(AL)0~3=A~F,或AF=1,则(AL) (AL)±6,(AL)4~7=0
(AH) (AH)±1,AF CF=1( AAA做‘+’, AAS做‘-’ )null乘法调整指令:AAM (AL) (AX)非压缩BCD
注意: * 隐含的操作寄存器为AL
* 紧接在MUL指令之后使用
* 对OF、CF、AF无定义
调整方法:
(AL)除以0AH,商 (AH),余数 (AL)
除法调整指令:AAD
被除数(AX) = (0000 xxxx 0000 xxxx)非压缩BCD
除数 = (0000 xxxx)非压缩BCD
在DIV指令之前:
(AL)2 0AH ×(AH)+(AL)
(AH)2 0
null例:(AX)=0504H (BL)=03H
(1) (AL)*(BL)
MUL BL ; (AX)=000CH
AAM ; (AH)=01H (AL)=02H
(2) (AX)/(BL)
AAD ; (AH)=00H (AL)=36H
DIV BL ; (AH)=00H (AL)=12H
AAM ; (AH)=01H (AL)=08H
null
逻辑运算指令
位测试并修改指令
位扫描指令
移位指令
3.3.3 逻辑指令null逻辑非指令:NOT OPR * OPR不能为立即数
执行操作: (OPR) (OPR) * 不影响标志位
逻辑与指令:AND DST, SRC
执行操作: (DST) (DST) (SRC)
逻辑或指令:OR DST, SRC
执行操作: (DST) (DST) (SRC)
异或指令: XOR DST, SRC
执行操作: (DST) (DST) (SRC)
测试指令: TEST OPR1, OPR2 执行操作: (OPR1) (OPR2)CF OF SF ZF PF AF
0 0 * * * 无定义 根据运算结果设置逻辑运算指令null例:屏蔽AL的0、1两位
AND AL, 0FCH
例:置AL的第5位为1
OR AL, 20H
例:使AL的0、1位变反
XOR AL, 3
例:测试某些位是0是1
TEST AL, 1
JZ EVEN
* * * * * * * *