版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PrincipleandApplicationofMicrocomputer
微机原理与应用YSU学习内容微型计算机系统概述微处理器指令系统汇编语言程序设计微处理器外部特性半导体存储器系统基本输入输出接口学习目的了解微型计算机的硬件知识
掌握汇编语言程序设计方法
掌握微机基本接口应用方法第一章微型计算机系统概述微型计算机的发展
微型计算机系统组成
计算机中的数据表示微型计算机的发展第1代:
4位微机。CPU:4004第2代:
8位微机。CPU:8080第3代:16位微机。CPU:8086、8088第4代:32位微机。CPU:80386、Pentium第5代:64位微机。CPU:Itanium微型计算机系统的组成硬件系统:
CPU、存储器、I/O接口、I/O设备、系统总线
软件系统:
系统软件-面向所有用户(如操作系统等)
应用软件-面向某个应用微机系统的硬件组成控制总线CB数据总线DB地址总线ABI/O设备I/O接口存储器系统总线微处理器计算机中的数据表示计算机中各种信息均表示为二进制数据。
数:用来直接表征量的多少,可进行运算。
码:指代码或编码,用来代表某个事物。基本术语位(Bit):二进制位,为0或1字节(Byte):8个二进制位字(Word):2字节(16位)双字(DWord):4字节(32位)千字节(KB):210个字节兆字节(MB):220个字节
计算机中的数二进制数(Binary)后缀为B或b
十进制数(Decimal)后缀为D或d
十六进制数(Hexadecimal)后缀为H或h二进制数到十进制数的转换方法:按权展开求和
10000101B=1×27+1×22+1×20=133D272625242322212010000101十进制数到二进制数的转换方法:除基取余
建议按照按权展开求和的逆过程进行二进制数与十六进制数之间的转换0000B0H1000B8H0001B1H1001B9H0010B2H1010BAH0011B3H1011BBH0100B4H1100BCH0101B5H1101BDH0110B6H1110BEH0111B7H1111BFH计算机中的码用于表示有符号数的补码。
用于表示十进制数的BCD码。
美国标准信息交换码ASCII码。补码计算机内部默认采用补码表示有符号数。
补码规定用最高位作为符号位。
最高位为0表示正数。
最高位为1表示负数。正数的补码最高位为0。
其余各位为该整数的二进制表示。
例如:(+2)=(00000010B)补负数的补码最高位为1。
其余各位可对该整数的二进制表示求补(即按位取反再加1)得到。
例如:(-2)=(11111110B)补8位二进制数表示的补码01111111B+1277FH01111110B+1267EH00000010B+202H00000001B+101H00000000B+000H11111111B-1FFH11111110B-2FEH10000001B-12781H10000000B-12880H8位二进制数表示的无符号数11111111B255FFH11111110B254FEH11111101B253FDH00000011B303H00000010B202H00000001B101H00000000B000H16位二进制数表示的补码0111111111111111B7FFFH+327670111111111111110B7FFEH+327660000000000000010B0002H+20000000000000001B0001H+10000000000000000B0000H+01111111111111111BFFFFH-11111111111111110BFFFEH-21000000000000001B8001H-327671000000000000000B8000H-3276816位二进制数表示的无符号数1111111111111111BFFFFH655351111111111111110BFFFEH655341111111111111101BFFFDH655330000000000000011B0003H30000000000000010B0002H20000000000000001B0001H10000000000000000B0000H0补码的性质(X)补+(Y)补=(X+
Y)补
(X)补
-(Y)补=(X-Y)补二进制数加减法运算规则加法:0+0=0,0+1=1,1+0=1,1+1=0(有进位)
减法:0-0=0,1-1=0,1-0=1,0-1=1(有借位)补码的运算示例00101011B(+43)(43)+10011100B+(-100)+(156)11000111B(-57)(199)BCD码BinaryCodedDecimal
二进制编码的十进制数
压缩的8421BCD码
非压缩的8421BCD码压缩的8421BCD码例如:12D的压缩BCD码为00010010B00000B50101B10001B60110B20010B70111B30011B81000B40100B91001B非压缩的8421BCD码000000000B500000101B100000001B600000110B200000010B700000111B300000011B800001000B400000100B900001001B例如:34D的非压缩BCD码为0000001100000100BASCII码美国标准信息交换码
AmericanStandardCodeforInformation
Interchange
码长7位,用来表示34个外设控制符号和94个可供打印的西文符号。
常用的ASCII码大写字母A~Z的ASCII码为41H~5AH。
小写字母a~z的ASCII码为61H~7AH。
数字符号0~9的ASCII码为30H~39H。
回车的ASCII码为0DH。
换行的ASCII码为0AH。第一章教学要求了解微型计算机系统的组成
熟练掌握二进制数与十进制数的转换
熟练掌握二进制数与十六进制数的转换
熟练掌握有符号数的补码表示、BCD码第二章微处理器指令系统微处理器的内部结构
8086/8088的寻址方式
8086/8088指令系统微处理器的基本结构算术逻辑单元ALU
ArithmeticLogicUnit
寄存器组
指令处理单元8086/8088的功能结构总线接口单元BIU
BusInterfaceUnit
负责CPU对存储器和外设进行访问
执行单元EU
ExecutionUnit
负责指令的译码、执行和数据的运算指令预取取指令1执行指令1取指令2执行指令2取指令3执行指令38086/8088的寄存器结构通用寄存器AX、BX、CX、DX、SI、DI、BP、SP指令指针IP标志寄存器FLAGS段寄存器CS、SS、DS、ES16位通用寄存器(1)AX:累加器。(Accumulator)
BX:基址寄存器。(Baseaddress)
CX:计数寄存器。(Counter)
DX:数据寄存器。(Dataregister)16位通用寄存器(2)SI:源变址寄存器。(SourceIndex)
DI:目的变址寄存器。(DestinationIndex)
SP:堆栈指针寄存器。(StackPointer)
BP:基址指针寄存器。(BasePointer)8位通用寄存器4个16位通用寄存器(AX、BX、CX、DX)可各分成高8位和低8位两个独立的8位寄存器,它们分别是:
AH、AL
BH、BL
CH、CL
DH、DL指令指针IP指令指针IP(InstructionPointer)
指示下一条指令的地址。
IP是一个专用寄存器,用户不能直接访问。标志寄存器FLAGS标志(Flag)
用于反映指令的执行结果(状态标志)
用于控制指令的执行形式(控制标志)
各种标志存放于一个16位的标志寄存器FLAGS中OFDFIFTFSFZFAFPFCF进位标志CF(CarryFlag)做加减运算时,若最高位有进位或借位,则CF置1,反之置0。01101000B10101011B+01000000B+11111111B10101000B10101010BCF=0CF=1奇偶标志PF(ParityFlag)当运算结果的低8位中l的个数为偶数时,则PF置1,反之置0。01101000B10101011B+01000000B+11111111B10101000B10101010BPF=0PF=1辅助进位标志AF(AuxitiaryCarryFlag)做加减运算时,若D3有向D4的进位或借位,则AF置1,反之置0。01101000B10101011B+01000000B+11111111B10101000B10101010BAF=0AF=1零标志ZF(ZeroFlag)运算结果为0时,ZF置1,否则ZF置0。01101000B00010000B+01000000B+11110000B10101000B00000000BZF=0ZF=1符号标志SF(SignFlag)运算结果的最高位为1时,SF置1,否则SF置0。00101000B10101011B+01000000B+11111111B01101000B10101010BSF=0SF=1溢出标志OF(OverflowFlag)有符号数的加减运算超过了所能表示的范围时,OF置1,否则置0。01101000B(+104)10101011B(-85)+01000000B+(+64)+11111111B+(-1)10101000B(-88)10101010B(-86)OF=1OF=0陷阱标志TF(TrapFlag)TF=1,CPU单步执行指令;TF=0,CPU正常工作。中断允许标志IF(InterruptenableFlag)控制外部可屏蔽中断是否可以被CPU响应。
IF=1允许中断,IF=0则禁止中断。方向标志DF(DirectionFlag)用于串操作指令中控制地址的变化方向。
DF=0则每次串操作后存储器地址自动增加;
DF=1则每次串操作后存储器地址自动减少。8086/8088的存储器结构存储器以字节为单位存储信息。
每个存储器单元都有一个地址。
8086/8088有20根地址线。
最大可寻址的存储器单元数为220=1MB。
其物理地址范围为00000H~FFFFFH。
例如:[00002H]=34H。小端方式字或双字信息在存储器中占据相邻的2个或4个存储单元。
多字节数据占据的地址空间用低地址来表示。
低字节对低地址、高字节对高地址。
例如:[00002H]=1234H
意指:[00002H]=34H,[00003H]=12H。存储器的分段管理8086/8088将1MB存储器空间分成若干个逻辑段来管理。每个段最大限制为64KB。
采用逻辑地址(段地址:偏移地址)的形式来表达段中每个存储器单元的20位物理地址。
段地址和偏移地址都是16位二进制数。段地址段地址说明该逻辑段在内存中的起始位置,即该段中的第一个内存单元的物理地址。
段地址必须是模16地址,即××××0H的形式,故可采用16位二进制数据表示,保存在段寄存器(CS,DS,ES,SS)中。偏移地址偏移地址说明该段中某个内存单元距离该段起始位置的偏移量。
由于每个段的长度不超过64KB,故偏移地址也可采用16位二进制数据表示。存储器单元的地址12340H67H1234H:0000H12341H67H1234H:0001H12342H67H1234H:0002H12343H67H1234H:0003H12344H67H1234H:0004H…67H…2233EH67H1234H:FFFEH2233FH67H1234H:FFFFH逻辑地址和物理地址物理地址=段地址×10H+偏移地址
例如,逻辑地址为B821H:4567H,
则其对应的物理地址为BC777H。代码段(CodeSegment)代码段主要用来存放指令代码,也可存放数据。
代码段寄存器CS存放代码段的段地址。
指令指针寄存器IP指示下条指令的偏移地址。数据段(DataSegment)数据段存放程序所使用的数据。
数据段寄存器DS存放数据段的段地址。
通过各种存储器寻址方式得到存储器中操作数的偏移地址。附加段(ExtraSegment)附加段是附加的数据段,也用于数据的保存。
附加段寄存器ES存放附加段的段地址。
通过各种存储器寻址方式得到存储器中操作数的偏移地址。堆栈段(StackSegment)堆栈段用于堆栈(Stack),用来暂时存放数据、保存程序断点、和向子程序传递参数等。
堆栈段寄存器SS存放堆栈段的段地址。
堆栈指针寄存器SP指示堆栈栈顶的偏移地址。逻辑段的使用程序的指令序列必须安排在代码段。
程序使用的堆栈一定在堆栈段。
程序中的数据默认是安排在数据段,也可以安排在附加段。数据的存放比较灵活,实际上可以存放在任何一种逻辑段中。汇编程序简单示例
.MODELSMALL
.STACK
.DATA
MESSAGEDB’HELLO,WORLD!$’
.CODE
.STARTUP
MOVAH,09H
MOVDX,OFFSETMESSAGE
INT21H
.EXIT
END指令的格式指令由操作码和操作数两部分组成。
例如:MOVAH,0B9H
操作码说明要执行何种操作。
操作数是各种操作的对象。8086/8088的寻址方式寻找操作数的方式(或操作数的存放方式)叫做操作数的寻址方式。操作数的分类立即数操作数(Immediate)
寄存器操作数(Register)
存储器操作数(Memory)立即数操作数立即数操作数(imm)是一个具体的数值,存放于指令中操作码之后。
它可以是8位数值(i8),或者是16位数值(i16)。
MOVAX,1234H;
操作数1234H就是立即数操作数。寄存器操作数寄存器操作数(reg)存放于CPU的内部寄存器中。它可以是8位寄存器(r8),或16位寄存器(r16)。
MOVAX,BX;
操作数AX、BX均为寄存器操作数。存储器操作数存储器操作数(mem)存放于存储器单元中。指令中给出的是操作数所在的存储器单元的逻辑地址。因段地址默认在DS中,故只给出偏移地址即可。
MOVAH,[2000H];设DS=1492H,[16920H]=12H
[2000H]为存储器操作数。指令执行后AH=12H。立即数寻址方式MOVAX,1234H;
操作数1234H为立即数操作数,
使用的是立即数寻址方式。
指令执行后AX=1234H,其中AH=12H,AL=34H。寄存器寻址方式MOVAX,BX;
操作数AX、BX均为寄存器操作数,
使用的是寄存器寻址方式。
指令执行后AX中的值与BX中的值相同,
而BX中的值不变。存储器寻址方式存储器操作数存放于存储器单元中。指令中给出的是操作数所在的存储器单元的逻辑地址。
有以下5种具体方式:直接寻址方式
寄存器间接寻址
寄存器相对寻址
基址变址寻址
相对基址变址寻址直接寻址方式指令中直接给出操作数的偏移地址。
段地址默认在DS中,可用段超越前缀来改变。
设DS=ES=1492H,[16920H]=12H,[16921H]=34HMOVAH,
[2000H];AH=12HMOVAX,ES:[2000H];AX=3412H用变量名来提供地址实际编程时,通常是通过定义变量,使用变量名来指代该变量所在内存单元的偏移地址。
WVARDW3412H;设WVAR的偏移地址为2000H
MOVAX,[2000H];AX=3412H
MOVAX,[WVAR];AX=3412H,中括号可省略
MOVAX,WVAR;变量变量实质上是指内存单元的数据。
变量需要事先定义才能使用。
变量定义的方法:
变量名伪指令初值表变量名变量名是用户自定义的标识符,用来表示该变量所占用的内存单元的首地址。
标识符一般最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头。
默认情况下,汇编程序不区别字母的大小写。
变量定义伪指令DB
DefineByte,定义字节型变量
分配一个或多个字节单元。DW
DefineWord,定义字型变量
分配一个或多个字单元。DD
DefineDoubleWord,定义双字型变量
分配一个或多个双字单元。初值表初值表是用逗号分隔的参数,是用户为所申请的内存单元赋的初值。
若初值为?,则表示初值不确定,即未赋初值。变量定义示例XDB12H,34H,56H,78H
YDW1122H,3344H
ZDD1A2B3C4DH,?
MOVAL,X+1;AL=34H
MOVBX,Y;BX=1122H
MOVCX,WORDPTRZ;CX=3C4DH变量在内存单元中的分配图示X12HZ4DHX+134H3CHX+256HZ+22BHX+378H1AHY22HZ+400H11H00HY+244HZ+600H33H00H变量的内容和逻辑地址XDB12H,34H,56H,78H
MOVAL,X
;AL存放X的内容12H
MOVBX,OFFSETX;BX存放X的偏移地址
MOVDX,SEGX;DX存放X的段地址寄存器间接寻址方式操作数的偏移地址存放于寄存器BX/BP/SI/DI中。使用寄存器BP寻址时,默认的段寄存器为SS;
使用其他寄存器寻址,默认的段寄存器为DS。
均可以使用段超越前缀改变。
设DS=1492H,ES=1492H,BX=2000H,[16920H]=12HMOVAL,
[BX];AL=12HMOVDH,ES:[BX];DH=12H寄存器间接寻址方式示例XDB12H,34H
MOVBX,OFFSETX;取偏移地址
MOVAL,[BX];AL=12H
INCBX;BX加1
MOVAH,[BX];AH=34H寄存器相对寻址方式操作数的偏移地址是寄存器(BX/BP/SI/DI)的内容与有符号的8位或16位位移量之和。
设DS=ES=1492H,SI=2000H,[16926H]=12HMOVAL,
[SI+06H];AL=12HMOVDH,ES:[SI+06H];DH=12H寄存器相对寻址方式示例XDB12H,34H
MOVBX,0;
MOVAL,X[BX];AL=12H
INCBX;BX加1
MOVAH,X[BX];AH=34H基址变址寻址方式操作数的偏移地址是一个基址类寄存器(BX或BP)的内容与另一个变址类寄存器(SI或DI)的内容之和。
设DS=1492H,BX=2000H,SI=06H,[16926H]=12HMOVAL,[BX+SI];AL=12H相对基址变址寻址方式操作数的偏移地址是一个基址类寄存器(BX或BP)的内容,一个变址类寄存器(SI或DI)的内容与有符号的8位或16位位移量之和。
设DS=1492H,BX=2000H,DI=04H,[16926H]=12HMOVAL,[BX+DI+02H];AL=12H8086/8088指令系统数据传送类指令
算术运算类指令
按位操作类指令
控制转移类指令
处理器控制指令操作数的表示符号的约定(1)i8
-8位立即数,i16-16位立即数
imm-代表i8或i16
r8
-8位寄存器,r16-16位寄存器
reg-代表r8或r16
seg-段寄存器CS、DS、ES、SS操作数的表示符号的约定(2)m8
-
8位存储器操作数
m16-16位存储器操作数
mem-代表m8或m16
dest-目的操作数
src-源操作数MOV传送指令MOVreg/mem,imm;立即数送寄存器或主存MOVreg/mem/seg,reg;寄存器送(段)寄存器
;寄存器送主存MOVreg/seg,mem
;主存送(段)寄存器MOVreg/mem,seg
;段寄存器送寄存器
;段寄存器送主存MOV指令注意事项(1)目的操作数与源操作数必须类型一致。
MOVAX,BH;错误指令
目的操作数不能是立即数。
MOV2000,AX;错误指令
两个操作数不能都是存储器操作数。
假设WV1、WV2是两个字变量
MOVWV1,WV2;错误指令MOV指令注意事项(2)不能手工修改CS寄存器。
MOVCS,AX;错误指令
指令指针IP不能作为操作数。
MOVAX,IP;错误指令MOV指令注意事项(3)两个操作数不能都是段寄存器。
MOVDS,ES;错误指令
立即数不能直接传送至段寄存器。
MOVDS,2000H;错误指令MOV指令练习将字变量WV2的内容传送至字变量WV1
将ES的内容传送至DS
将段寄存器DS赋初值2000HMOV指令练习答案MOVAX,WV2
MOVWV1,AX
MOVAX,ES
MOVDS,AX
MOVAX,2000H
MOVDS,AXXCHG交换指令(exchange)XCHGreg,reg/mem;XCHGreg/mem,reg;
源操作数与目的操作数内容互换MOVAX,1234H;AH=12H,AL=34H
XCHGAH,AL;AH=34H,AL=12H
不能在内存单元之间交换数据。段寄存器不能作为操作数。XCHG指令练习将字变量A、B的内容互换
ADW1234H
BDW5678HXCHG指令练习答案方法1:
MOVAX,B
XCHGAX,A
MOVB,AX方法2:
MOVAX,A
MOVBX,B
MOVA,BX
MOVB,AXXLAT指令XLAT
换码(查表转换)过程为:
先在主存中建立一字节表格;
将表格的首地址存放于BX寄存器中;
将欲查元素的序号存放于AL寄存器中;
执行XLAT,则AL中的内容即为欲查元素。十六进制数到ASCII码的转换TABLE1DB30H,31H,32H,33H,34H,35H,\
36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
MOVBX,OFFSETTABLE1
MOVAL,04H
XLAT;AL=34H堆栈堆栈(Stack)
内存中开辟的用于暂时存放数据的一个特殊区域。
按先进后出或后进先出的原则管理。
堆栈段的段地址存放于段寄存器SS中,
偏移地址存放于寄存器SP中。堆栈操作指令PUSHr16/m16/seg;SP=SP-2
;SS:SP=r16/m16/seg
POPr16/m16/seg;r16/m16/seg=SS:SP
;SP=SP+2堆栈操作指令示例MOVAX,1234H
MOVBX,5678H
PUSHAX
PUSHBX
POPCX
POPDX入栈操作示意SP1234SP12345678SP出栈操作示意SP1234SP12345678SPCX=5678HDX=1234H堆栈操作注意事项堆栈操作均为16位(字)操作;
不能将立即数压入堆栈;
进栈和出栈的操作伴随着堆栈指针SP的调整,SS:SP永远指向堆栈段的栈顶。
堆栈只有一个出口。堆栈的作用堆栈不可或缺,被很多指令使用。如:
堆栈操作指令PUSH和POP
子程序调用CALL和返回RET
中断调用INT等
堆栈可用来临时存放数据,以便随时恢复它们
利用堆栈实现主、子程序间传递参数堆栈指令练习请利用堆栈将两个字变量A、B内容互换。堆栈指令练习答案利用堆栈将两个字变量A、B内容互换。
PUSHA
PUSHB
POPA
POPB标志操作指令(1)CLC;CF=0
;ClearCarryFlagSTC;CF=1
;SetCarryFlagCMC;CF取反
;ComplementCarryFlag标志操作指令(2)CLD;DF=0
STD;DF=1
CLI;IF=0
STI;IF=1标志操作指令(3)PUSHF;SP=SP-2,SS:SP=FLAGS
POPF;FLAGS=SS:SP,SP=SP+2LEA指令(LoadEffectiveAddress)LEAr16,mem;r16=mem的偏移地址
LEABX,[SI+06H];若SI=1000H,则BX=1006HLEA指令示例WVARDW1234H;设其偏移地址为0001H
MOVBX,WVAR;BX=1234H
LEASI,WVAR;SI=0001H
MOVDX,[SI];DX=1234H加减法指令ADDdest,src;dest=dest+src
SUBdest,src;dest=dest-src
ADD加法指令(Addition)ADDreg,imm/reg/mem
ADDmem,imm/reg
目的操作数不能为立即数。
两操作数不能同时为存储器操作数。
两操作数类型要一致。
按定义影响6个状态标志位。SUB减法指令(Subtraction)SUBreg,imm/reg/mem
SUBmem,imm/reg
目的操作数不能为立即数。
两操作数不能同时为存储器操作数。
两操作数类型要一致。
按定义影响6个状态标志位。对状态标志位影响情况的说明不影响;如:MOV指令。
按定义影响;如:ADD指令。
强制(规定)影响;如:CLC指令。
无定义(随机影响);如:MUL指令。加减法指令示例MOVAH,96H
ADDAH,78H
ADDAH,78HAH=0EH
CF=1,PF=0,AF=0
ZF=0,SF=0,OF=0AH=86H
CF=0,PF=0,AF=1
ZF=0,SF=1,OF=1带进/借位加减法指令ADCdest,src;dest=dest+src+CF
SBBdest,src;dest=dest-src-CFADC指令(AddwithCarry)ADCreg,imm/reg/mem
ADCmem,imm/reg
目的操作数不能为立即数。
两操作数不能同时为存储器操作数。
两操作数类型要一致。
按定义影响6个状态标志位。SBB指令(SubtractwithBorrow)SBBreg,imm/reg/mem
SBBmem,imm/reg
目的操作数不能为立即数。
两操作数不能同时为存储器操作数。
两操作数类型要一致。
按定义影响6个状态标志位。ADC指令的应用ADC指令用于与ADD指令结合实现多精度数的加法。
先将两个操作数的低16位相加(用ADD指令)。
再加高位部分、并将进位加到高位(用ADC指令)。
SBB指令的应用SBB指令用于与SUB指令结合实现多精度数的减法。
先将两个操作数的低16位相减(用SUB指令)。
再减高位部分、并减去借位(用SBB指令)。带进/借位加减法指令示例XDD12345678H
YDD9ABCDEF0H
MOVAX,WORDPTRX
ADDAX,WORDPTRY
MOVDX,WORDPTRX+2
ADCDX,WORDPTRY+2CMP比较指令(Compare)CMPdest,src;dest-src
按定义影响6个状态标志位。
CMP指令通过减法运算影响状态标志位,
常用于比较两个操作数的大小关系。
CMP指令执行前后两操作数内容均不变。比较大小与标志位若ZF=1,则相等;若ZF=0,则不等。
对于无符号数:
若CF=1,为小于;若CF=0,为大于。
对于有符号数:
若OF≠SF,为小于;若OF=SF,为大于。INC增量指令(Increment)INCreg/mem;reg/mem=reg/mem+1
常用于计数器和地址指针的调整。
不影响CF标志,但影响其它状态标志位。DEC减量指令(Decrement)DECreg/mem;reg/mem=reg/mem-1
常用于计数器和地址指针的调整。
不影响CF标志,但影响其它状态标志位。NEG指令(Negate)NEGreg/mem;reg/mem=0-reg/mem
按定义影响6个状态标志位。
当操作数为-128或-32768时,操作数不变,但OF置1。
通常总是使CF=1,除非操作数为0。MUL无符号乘法指令(Multiplication)MULr8/m8;AX=AL×r8/m8
MULr16/m16;DX.AX=AX×r16/m16
IMUL有符号乘法指令(IntegerMultiply)IMULr8/m8;AX=AL×r8/m8
IMULr16/m16;DX.AX=AX×r16/m16乘法指令对标志位的影响乘法指令只影响OF和CF,对其它状态标志无定义。
对于无符号乘法,若乘积中AH=00H(8位乘法)或DX=0000H(16位乘法),OF=CF=0;否则均为1。
对于有符号乘法,若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。DIV无符号除法指令(Division)DIVr8/m8
;AL=AX÷src的商
;AH=AX÷src的余
DIVr16/m16;AX=DX.AX÷src的商
DX=DX.AX÷src的余IDIV有符号除法指令(IntegerDivision)IDIVr8/m8
;AL=AX÷src的商
;AH=AX÷src的余
IDIVr16/m16;AX=DX.AX÷src的商
;DX=DX.AX÷src的余除法指令对标志位的影响除法指令对6个状态标志位均无定义。
但当除数为0或商溢出时将产生编号为0的内部中断,指示除法错误。乘除法指令练习计算(X×Y+125)÷Z。设X、Y、Z均为16位有符号的字变量,计算后将商存入X,余数存入Y。乘除法指令练习答案MOVAX,X
IMULY
ADDAX,125
ADCDX,0
IDIVZ
MOVX,AX
MOVY,DX注意:乘除法指令均不能使用立即数操作数。CBW指令(ConvertBytetoWord)CBW;AL符号扩展成AX
若AL的最高有效位是0,则AH=00H;
若AL的最高有效位是1,则AH=FFH;CWD指令(ConvertWordtoDword)CWD;AX符号扩展成DX.AX
若AX的最高有效位是0,则DX=0000H;
若AX的最高有效位是1,则DX=FFFFH;逻辑运算指令ANDdest,src;dest=dest“与”srcORdest,src;dest=dest“或”srcXORdest,src;dest=dest“异或”srcTESTdest,src;dest“与”srcNOTreg/mem;reg/mem=reg/mem的“非”逻辑运算指令注意事项目的操作数不能为立即数。
两操作数不能同时为存储器操作数。
两操作数类型要一致。
双操作数逻辑运算指令均置OF=CF=0。
按定义影响SF、ZF和PF,对AF无定义。
NOT指令不影响状态标志位。逻辑“与”运算特点0011
0
1
0
10001和0相“与”,结果为0;和1相“与”,结果不变。逻辑“或”运算特点0011
0
1
0
10111和1相“或”,结果为1;和0相“或”,结果不变。逻辑“异或”运算特点0011
0
1
0
10110和1“异或”,结果取反;和0“异或”,结果不变。逻辑运算指令练习使AL最高位为“1”,其他位不变。使AX清0,同时清CF为0。使AL中的D7~D4位不变,D3~D0位取反。将AL存放的0~9中的一个数变成对应的ASCII码。将AL中的ASCII码小写字母变成对应的大写字母。将AL中的ASCII码大写字母变成对应的小写字母。逻辑运算指令练习答案ORAL,80H;使AL最高位为“1”,其他位不变。XORAX,AX;使AX清0,同时清CF为0。XORAL,0FH;D7~D4位不变,D3~D0位取反。ORAL,30H;0~9中的数变成对应的ASCII码。ANDAL,5FH;ASCII码小写变成大写。ORAL,20H;ASCII码大写变成小写。SHL逻辑左移位(ShiftLogicLeft)SHLreg/mem,1/CL;reg/mem左移1/CL位
MOVAL,10111110B;SHLAL,1;AL=01111100B,CF=1SHR逻辑右移位(ShiftLogicRight)SHRreg/mem,1/CL;reg/mem右移1/CL位
MOVAL,10111110B;SHRAL,1;AL=01011111B,CF=0SAL算术左移位(ShiftArithmeticLeft)SALreg/mem,1/CL;reg/mem左移1/CL位
MOVAL,10111110B;SALAL,1;AL=01111100B,CF=1SAR算术右移位(ShiftArithmeticRight)SARreg/mem,1/CL;reg/mem右移1/CL位
MOVAL,10111110B;SARAL,1;AL=11011111B,CF=0逻辑/算术移位指令对标志位的影响按照移入的位设置CF;
按定义影响SF、ZF、PF;对AF无定义。
移位次数为1,若移位前后操作数最高位不同,OF=1;否则OF=0。移位次数大于1,OF无定义。ROL循环左移位(RotateLeft)ROLreg/mem,1/CL;循环左移1/CL位
MOVAL,10111110B;ROLAL,1;AL=01111101B,CF=1ROR循环右移位(RotateRight)RORreg/mem,1/CL;循环右移1/CL位
MOVAL,10111110B;RORAL,1;AL=01011111B,CF=0RCL指令(RotatethroughCFLeft)RCLreg/mem,1/CL;带进位循环左移
MOVAL,10111110B;假设CF=0RCLAL,1;AL=01111100B,CF=1RCR指令(RotatethroughCFRight)RCRreg/mem,1/CL;带进位循环右移
MOVAL,10111110B;假设CF=1RCRAL,1;AL=11011111B,CF=0循环移位指令对标志位的影响按照移入的位设置CF;
不影响SF、ZF、PF、AF。
移位次数为1,若移位前后操作数最高位不同,OF=1;否则OF=0。移位次数大于1,OF无定义。移位指令练习用移位指令将AL中的无符号数乘10,结果存入AX中。
将ASCII码转换成BCD码。
ASCIIDB33H,38H
BCDDB?用移位指令实现乘法SHL逻辑左移一位相当于无符号数乘以2SHR逻辑右移一位相当于无符号数除以2
XORAH,AH;AH清0
SHLAX,1;AX=AL*2
MOVBX,AX;BX=AL*2
SHLAX,1;AX=AL*4
SHLAX,1;AX=AL*8
ADDAX,BX;AX=AL*10ASCII码转换成BCD码ASCIIDB33H,38HBCDDB?MOVAL,ASCII;AL=33HANDAL,0FH;AL=03HMOVAH,ASCII+1;AH=38H
MOVCL,4SHLAH,CL;AH=80HORAL,AH;AL=83H
MOVBCD,AL控制转移类指令程序代码在代码段中,由CS:IP确定地址。程序顺序执行,微处理器自动增量IP。
控制转移类指令:改变IP,有些也改变CS,
即改变程序执行顺序,实现程序控制转移的指令。转移范围段内转移
在当前代码段范围内的程序转移,
不需更改CS,只要改变IP。
段间转移
从当前代码段转移到另一代码段,
需要更改CS和IP。段内转移近转移(Near)
转移范围为±32KB
短转移(Short)
转移范围为+127~-128字节段间转移远转移(Far)
转移范围为1MB目标地址寻址方式相对寻址方式
直接寻址方式
间接寻址方式相对寻址方式相对寻址方式
提供目标地址相对于当前指令指针IP的位移量。
目标地址(转移后的IP)=当前IP+位移量。
相对寻址都是段内转移。直接寻址方式直接寻址方式
直接提供目标地址。
目标地址(转移后的CS和IP)=指令操作数。间接寻址方式间接寻址方式
目标地址来自寄存器或存储单元,间接获得。
寄存器间接寻址:用寄存器保存目标地址。
存储器间接寻址:用存储单元保存目标地址。JMP无条件转移指令(Jump)JMPLABEL
例如
NEXT:MOVAX,BX
•••••
JMPNEXT语句标号LABELLABEL是用户自定义的标识符,
其作用是用来指代某条指令的地址。
LABEL的语法特征是其后一定有冒号。段内JMPJMPLABEL;相对或直接
JMPr16/m16;间接段间JMPJMPFARPTRLABEL;直接
JMPFARPTRmem;间接条件转移指令Jcc根据指定的条件来确定程序是否发生转移
JccLABEL;条件满足,发生转移
;否则,顺序执行下一条指令
LABEL表示目标地址,采用段内相对短转移转移条件Conditioncc表示利用标志判断的条件,共16种,分两类
单个标志状态作为条件
两数大小关系作为条件转移条件cc:单个标志状态(1)JZ/JEZF=1Zero/EqualJNZ/JNEZF=0NotZero/NotEqualJSSF=1SignJNSSF=0NotSignJP/JPEPF=1Parity/ParityEvenJNP/JPOPF=0NotParity/ParityOdd转移条件cc:单个标志状态(2)JOOF=1OverflowJNOOF=0NotOverflowJCCF=1CarryJNCCF=0NotCarry转移条件cc:无符号数大小关系JB/JNAECF=1Below/NotAboveorEqualJNB/JAECF=0NotBelow/AboveorEqualJBE/JNACF=1或ZF=1BeloworEqual/NotAboveJNBE/JACF=0且ZF=0NotBeloworEqual/Above转移条件cc:有符号数大小关系JL/JNGESF≠OFLess/NotGreaterorEqualJNL/JGESF=OFNotLess/GreaterorEqualJLE/JNGSF≠OF或ZF=1LessorEqual/NotGreaterJNLE/JGSF=OF且ZF=0NotLessorEqual/Greater单分支结构Jcc条件满足?分支语句体YN将有符号数转换为绝对值
CMPAL,0
JGENEXT;为正数,转移到NEXT
NEG
AL;为负数,转换为绝对值NEXT:……双分支结构1Jcc条件满足?分支语句体1YN分支语句体2双分支结构2Jcc条件满足?分支语句体1YN分支语句体2JMP转移类指令练习通过判断符号实现CBW指令的功能。
通过判断正负实现CBW指令的功能。
取三个无符号字变量的最小值到AX。实现CBW指令功能的程序-1
MOV
AL,
BVAR;取出要判断的数据
TESTAL,
80H
;测试最高位
JZNEXT
;最高位为0,转移到NEXT
MOV
AH,
0FFH;最高位为1,设置AH=FFH
JMP
DONE
;无条件跳过另一个分支NEXT: MOV
AH,
0;最高位为0转移到此DONE:……实现CBW指令功能的程序-2
MOVAL,BVAR;取出要判断的数据
CMPAL,0
;与0比较
JNSNEXT
;最高位为0,转移到NEXT
MOVAH,0FFH;最高位为1,设置AH=FFH
JMPDONE
;无条件跳过另一个分支NEXT:MOVAH,0
;最高位为0转移到此DONE:……取三个无符号字变量的最小值到AX
MOVAX,V1
;假定V1最小
CMPAX,V2
;与V2比较
JBENEXT;V1<V2,转移到NEXT
MOVAX,V2
;V2<V1NEXT:CMPAX,V3
JBEDONE
;AX(V1或V2)最小
MOVAX,V3
;V3最小DONE:……循环指令LOOPLOOPLABEL;CX=CX-1,若CX≠0,转移
LOOP指令是针对CX计数器的计数循环指令
指令中的LABEL只能采用相对短转移寻址方式,
转移范围为段内(-128)~(+127)个字节。其他循环类指令LOOPELABEL;CX=CX-1,若CX≠0且ZF=1,转移
LOOPNELABEL;CX=CX-1,若CX≠0且ZF=0,转移
JCXZLABEL;若CX=0,转移;否则,顺序执行循环指令练习已知字节数组ARRAY,将其各元素之和存入变量SUM中(不考虑进位和溢出)。
ARRAYDB12H,34H,56H,78H
SUMDB?用循环指令实现字节数组求和 MOV
CX,4 JCXZDONE
;0个元素,不再求和 XOR
AX,AX
;求和初值为0 MOV
BX,AX
;数组指针为0AGAIN:ADD
AL,ARRAY[BX]
;求和INC
BXLOOPAGAINDONE: MOV
SUM,AL
;保存结果计数循环示意循环初始化循环修改部分循环体计数控制条件YN子程序与主程序子程序
与主程序分开的完成特定功能的一段程序
主程序(调用程序)
执行调用指令CALL调用子程序
子程序(被调用程序)
执行返回指令RET返回主程序子程序调用示意RETCALLLABEL主程序子程序子程序调用指令CALLCALLLABEL;相对寻址的段内调用
CALLFAR
PTR
LABEL;直接寻址的段间调用
指令中的LABEL为子程序名。其他形式的CALL指令CALLr16/m16;间接寻址的段内调用
CALLFARPTRmem;间接寻址的段间调用调用指令CALL的说明汇编程序会自动确定CALL指令
是段内调用还是段间调用。
CALL指令在改变CS和IP前,
会将返回的地址保存到堆栈中。子程序返回指令RETRET;返回
RETi16;返回,调整指针SP=SP+i16
RET指令用在子程序中,实现调用的返回。返回指令RET的说明汇编程序会自动根据CALL指令来产生相应的RET返回操作。
RET指令执行时伴随着CS,IP,SP的调整。子程序定义子程序名
PROC[NEAR/FAR]
……
;过程体子程序名
ENDP
子程序名为符合语法的标识符
子程序应安排在代码段内主程序之外中断(Interrupt)CPU因某个特殊事件将当前程序挂起(暂停),
转去执行处理这个特殊事件的程序,
处理结束后再返回被挂起的程序,
此过程称为“中断”。
处理特殊事件的程序称为“中断服务程序”。
中断是一种特殊的改变程序执行顺序的方法。中断向量8086/8088CPU支持256个中断。
每个中断用一个中断编号来区别。
中断服务程序的起始地址按中断向量号顺序存放在00000H~003FFH的内存单元中,形成“中断向量表”。中断向量表003FFH255号中断服务程序的CS003FEH003FDH255号中断服务程序的IP003FCH……00003H0号中断服务程序的CS00002H00001H0号中断服务程序的IP00000H中断指令INT
i8
;执行i8号中断
IRET
;中断返回指令
INTO;溢出中断指令DOS系统功能调用MS-DOS操作系统提供给程序员的“子程序”
系统功能调用步骤(类似高级语言调用函数)(1)在AH寄存器中设置系统子功能调用号(2)在指定寄存器中设置入口参数(3)中断调用指令“INT21H”执行功能(4)根据出口参数分析功能调用执行情况01号子功能子功能号:AH=01H;
出口参数:AL=输入字符的ASCII码;
功能说明:
等待从键盘输入一个字符,
将其ASCII码送入AL,同时回显到屏幕。
输入字符后,不需回车。01号子功能用法示例MOVAH,01H
INT21H02号子功能子功能号:AH=02H;
入口参数:DL=要显示字符的ASCII码;
功能说明:
在当前光标位置显示DL中给定的字符。
此功能可自动识别并相应处理退格(08H)、回车(0DH)、换行(0AH)等字符。02号子功能用法示例MOVAH,02H
MOVDL,41H
INT21H09号子功能子功能号:AH=09H;
入口参数:DS:DX=要显示字符串的首地址;
功能说明:
在当前光标位置显示由DS:DX所指的字符串。该字符串必须以“$”结束,“$”并不显示。09号子功能用法示例MSGDB‘HELLO!’,0DH,0AH,’$’
MOVAH,09H
MOVDX,OFFSETMSG
INT21H0AH号子功能子功能号:AH=0AH;
入口参数:DS:DX=输入缓冲区的首地址;
功能说明:
从键盘读入一个字符串,以回车结束。
存放在DS:DX所指的缓冲区。0AH号子功能用法示例BUFFERDB255,0,255DUP(0)
MOVAH,0AH
MOVDX,OFFSETBUFFER
INT21H4CH号子功能子功能号:AH=4CH;
入口参数:AL=DOS返回码;
功能说明:结束程序执行,返回DOS。4CH号子功能用法示例MOVAH,4CH
MOVAL,00H
INT21H子程序练习将BL中的2位16进制数显示出来。
利用子程序实现16进制数转换成ASCII码。子程序练习之主程序
.MODEL
TINY.STACK.CODE
.STARTUP
MOV
BL,34H
CALLDISPLAY.EXIT子程序练习之子程序-1DISPLAY
PROCMOV
DL,BL
MOVCL,
4
SHRDL,CL
CALLHTOASC
MOVDL,BLANDDL,0FH CALLHTOASC
RETDSPLAY
ENDP子程序练习之子程序-2HTOASC
PROCADD
DL,30H
CMP
DL,39H
JBE
NEXT
ADDDL,07HNEXT:
MOVAH,02HINT21H
RETHTOASC
ENDP
END处理器控制类指令NOP;空操作第二章教学要求了解8086/8088的功能结构
掌握8086/8088的寄存器结构
掌握存储器结构
掌握寻址方式
熟练掌握指令,从而编写程序段落第三章汇编语言程序设计汇编语言是一种以处理器指令系统为基础的低级程序设计语言。
汇编语言的主要优点是
可以直接、有效地控制计算机硬件,
容易创建代码序列短小、运行快速的程序。第三章学习内容汇编语言源程序格式
常量、变量
汇编语言程序设计方法顺序程序设计分支程序设计循环程序设计子程序设计汇编语言源程序格式源程序可包含若干个代码段/数据段/附加段/堆栈段
段与段之间的顺序可随意排列
独立运行的程序必须包含一个代码段
并在代码段中指示程序执行的起始点
一个程序只有一个起始点
执行性语句必须位于某一个代码段内
说明性语句可根据需要位于任一段内执行性语句格式用于表达处理器指令(也称为硬指令)
汇编后对应一条指令代码
标号:硬指令助记符操作数,操作数;注释
NEXT:MOVAX,1234H;初值为1234H说明性语句格式用于表达伪指令
指示源程序如何汇编、变量怎样定义、过程怎么设置等
名字伪指令助记符参数,参数,…;注释
X1DB12H,34H,56H;标识符标识符最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头。
默认情况下,不区别标识符中的字母大小写。
一个源程序中,每个标识符的定义是唯一的,且不能是汇编系统所采用的保留字。注释语句中由分号“;”开始的部分为注释内容,
用以增加源程序的可读性。
汇编程序在翻译源程序时将跳过该部分,
不对它们做任何处理。分隔符标号后用冒号,注释前用分号。
操作数之间和参数之间使用逗号分隔。
其他部分通常采用空格或制表符。
多个空格和制表符的作用与一个相同。
MASM支持续行符“\”。简化段定义格式.MODELSMALL;定义程序的存储模式.STACK;定义堆栈段.DATA ;定义数据段……;数据定义.CODE;定义代码段.STARTUP;程序执行起始……;主程序.EXIT;程序执行结束……;子程序END;汇编结束存储模式TINY微型模式SMALL小型模式COMPACT紧凑模式MEDIUM中型模式LARGE大型模式HUGE巨型模式FLAT平坦模式微型和小型模式TINY微型模式
只有一个小于64KB的逻辑段
SMALL小型模式
一个代码段、一个数据段,每个段不大于64KB定义堆栈段.STACK[大小]
段名:STACK
可用@STACK预定义操作符表示。
默认是1KB空间。定义数据段.DATA
段名:_DATA
可用@DATA预定义操作符表示定义代码段.CODE[段名]
默认段名:_TEXT
可用@CODE预定义操作符表示执行开始语句.STARTUP指明程序开始执行的位置,同时将数据段地址赋给DS。
可用如下两条语句代替.STARTUP语句。
START:MOVAX,@DATA
MOVDS,AX
语句标号START用于指明程序开始执行的位置。执行结束语句.EXIT终止应用程序执行。
语句.EXIT利用4CH号DOS系统功能调用实现。
MOVAH,4CH
INT21H汇编结束语句END表示汇编过程到此结束。
源程序的最后必须有一条END语句。
汇编程序不处理END语句之后的任何内容。
END伪指令后面可以有一个标号参数,
指定程序开始执行的起点。
ENDSTART常量、变量常量表示一个固定的数值。
可用作硬指令的立即数操作数或伪指令的参数。有常数/字符串/符号常量/数值表达式等多种形式。
变量实质上是指内存单元的数据。
主要用作存储器操作数。常数常数是指由各种进制形式表示的数值。
默认为十进制。
MOVAX,1234H
ADDAL,-77
CMPAH,10010001B字符串字符串是指:
用单引号或双引号括起来的单个或多个字符,
其数值是每个字符对应的ASCII码。
例如:'d'=64H、'AB'=4142H
MOVAL,'A'
MOVAL,41H符号常量符号常量是使用标识符表达一个固定的数值。
符号名EQU数值
符号名EQU<字符串>
符号名=数值
EQU不能重复定义符号名,“=”则允许。
符号常量可以提高程序的可读性。符号常量示例COUNTEQU100
DOSCALLEQU<INT21H>
MOVCX,COUNT;MOVCX,100
MOVAH,01H
DOSCALL;INT21H数值表达式数值表达式一般是指:
由运算符连接的由各种常数所构成的表达式。
数值表达式可增强程序的可读性。
运算符有:
算术操作符/逻辑操作符/移位操作符/关系操作符。运算符(1)算术运算符:+、-、*、/、MOD
逻辑运算符:AND、OR、XOR、NOT运算符(2)移位运算符:SHL、SHR
其格式为:数值表达式SHL/SHR移位次数
关系运算符:EQ、NE、GT、LT、GE、LE
用FFFFH表示条件为真,
用0000H表示条件为假。数值表达式示例ADDAX,100*4+2;ADDAX,402
ORAL,3AND47H;ORAL,3
MOVAX,1024SHR4;MOVAX,40H
MOVAX,1234HGT1024H;MOVAX,0FFFFH变量的定义变量实质上是指内存单元的数据,
因而可以改变。
变量需要事先定义才能使用。
变量定义方法:
变量名伪指令初值表变量名变量名是用户自定义的标识符,
用来表示该变量所占用的内存单元的首地址。
一个变量可以没有变量名。
这种情况汇编程序将直接为初值表分配空间。
设置变量名是为了方便存取它指示的存储单元。变量定义伪指令变量定义伪指令为变量分配或预留内存单元。
DB:定义字节伪指令
DW:定义字伪指令
DD:定义双字伪指令
DF:定义3字伪指令
DQ:定义4字伪指令
DT:定义10字节伪指令初值表初值表是用逗号分隔的参数,
是用户为所申请的内存单元赋的初值。
初值表主要由常量或?等组成。
其中?表示初值不确定,即未赋初值。
若多个存储单元初值相同,可用DUP进行定义。复制操作符DUP重复次数DUP(重复参数)
X1DB3DUP(12H)
X1DB12H,12H,12H变量的定位ORG
参数;偏移地址为该参数值
EVEN
;从偶地址开始
ALIGNn
;从n的整数倍地址开始
$
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年鹤壁职业技术学院单招职业倾向性考试题库带答案详解(能力提升)
- 2026年阿拉善职业技术学院单招职业适应性测试题库附答案详解(轻巧夺冠)
- 2025年深圳证券交易所及其下属单位备考题库技术人员招聘备考题库附答案详解
- 2025年柳州市鱼峰区花岭社区卫生服务中心招聘编外合同制工作人员备考题库及答案详解(考点梳理)
- 安钢总医院2026年度招聘25人备考题库及参考答案详解一套
- 2025年凭祥市友谊关口岸经济区管理委员会招聘编外人员备考题库及答案详解(易错题)
- 2025年巴林右旗蒙医医院招聘备考题库有完整答案详解
- 2026年青海省海西蒙古族藏族自治州单招职业倾向性考试题库附参考答案详解(黄金题型)
- 吉安市新中医医院2025年公开招聘高层次人才备考题库及答案详解(考点梳理)
- 2026年陕西机电职业技术学院单招综合素质考试题库(含答案详解)
- 电力电缆故障检测技术
- 商铺销售协议书模板
- 2026年辽宁医药职业学院单招职业技能测试题库及答案1套
- 雨课堂在线学堂《文物精ping与文化中国》课后作业单元考核答案
- 2026届高考二轮专题突破复习:新高考·素养提升-历史学科五大核心素养+课件-
- 基于儿童心理健康发展的智能产品设计
- FANUC焊接机器人培训课件
- 2025届四川省绵阳市高三下学期第一次诊断考-生物试题(含答案)
- 高一数学三角函数专题辅导资料
- 光伏组件清洗安全培训课件
- 悬挑防护网施工方案设计与实施指南
评论
0/150
提交评论