汇编语言程序设计简明教程_第1页
汇编语言程序设计简明教程_第2页
汇编语言程序设计简明教程_第3页
汇编语言程序设计简明教程_第4页
汇编语言程序设计简明教程_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1汇编语言程序设计

简明教程2第一章汇编语言基础1.1计算机内数据的表示1.2计算机组织1.3指令、程序和程序设计语言1.480x86寄存器1.580x86CPU的工作模式 习题一3汇编语言的特点:1.面向计算机“硬件”进行程序设计2.使用与机器指令同级的符号指令编写程序3.程序短小、运行速度快、发挥计算机的全部性能学习汇编语言的目的:1.深刻理解计算机硬件、软件的工作原理2.深刻理解基本控制结构程序的编制、计算机实现3.编写要求实时、高效的应用程序4 1.1.1进位计数制

1.1.2数据组织

1.1.3无符号数的表示

1.1.4有符号数的表示

1.1.5字符编码

1.1.6BCD码1.1计算机内数据的表示5进位计数制三个基本特征:有限个数字符号:0,1,2,……,R-1,“R”称为“基数”;“逢R进1”;“权展开式”:小数点向左各数字的“权”分别是R0,R1,R2,R3,……。小数点向右各数字的“权”分别是R-1,R-2,R-3,……。D=dn-1dn-2dn-3……d2d1d0.d-1d-2……d-m=dn-1×Rn-1+……+d1×R1+d0×R0+d-1×R-1+……+d-m×R-m1.1.1进位计数制610个数字符号:0,1,2,……,9;“逢十进一”;小数点向左各数字的“权”是100,101,102,103,……小数点向右各数字的“权”是10-1,10-2,10-3,……。[例]:323.31=3×102+2×101+3×100+3×10-1+1×10-2。十进制数用它原来的形式表示,如123,-36等,也可以在数值后面加上字母“D”或“d”,如123D,-36d等。1.十进制计数法7计算机内部采用“二进制”表示数据。

2个数字符号:0,1;

“逢二进一”:用“进位”的方法表示大于1的数;

“权展开式”:

小数点向左各数字的“权”是20,21,22,23,……。

小数点向右各数字的“权”是2-1,2-2,2-3,……。

二进制数需要在数字的后面加上字母B。例:10110111B2.二进制计数法

8十进制数转换为二进制数9二进制数转换为十进制数(11011.101)2=1×24+1×23+0×22+1×21+ 1×20+1×2-1+0×2-2+1×2-3=(27.625)10

103.八进制和十六进制计数法八进制:八进制使用的数字符号:0,1,2,3,4,5,6,7。一位8进制数可以方便地转换成3位二进制数

(1101100.0101)2 =(1

101

100.010

1)2

=(001

101

100.010

100)2 =(154.24)811十六进制十六进制使用的数字符号:0~9,A~F。书写十六进制数时,在它各位数字的后面加上“H”。如果十六进制数以字母A~F开始,还要在前面添加0。 例:3AFH,0FF3DH一位十六进制数可以方便地转换成4位二进制数(1101100.0101)2 =(110

1100.0101)2 =(0110

1100.0101)2 =(6C.5)16121.1.2 数据组织1.位(bit比特)--最小信息表示单位2.字节(Byte)--最小信息存储单位3.字(Word)和双字(DoubleWord)131.1.3 无符号数的表示用字节、字、双字或者更多的字节来存储和表示。用N位二进制表示一个无符号数时,最小的数是0,最大的数是2N-1(N位二进制111……111)。无符号数需要增加它的位数时,在它的左侧添加若干个“0”,称为“零扩展”。“进位标志(CarryoutFlag,CF)”表示二个无符号数运算结果的特征。如果CF=1,表示它们的加法有“进位”,或者它们的减法有“借位”。CF=0,则没有产生进位或借位。-----正数和零的集合141.1.4 有符号数的表示1.原码最左边一位二进制表示这个数的符号:“0”代表正,“1”代表负后面是它的“有效数字”一个字节存储有符号数原码,有127个正数(1~127),127个负数(-1~-127)和2个“0”,“正”0:00000000,“负”0:10000000。原码的表示规则简单,但是运算规则比较复杂,不利于计算机高速运算的实现。---原码、反码、补码152.反码用最高位“0”表示符号为正,“1”表示符号为负。符号位之后的二进制位用来存储这个数的有效数字:

正数的有效数字不变,负数的有效数字取反。对于正数X=dn-2dn-3……d2d1d0,

[X]反

=X=0dn-2dn-3……d2d1d0。对于负数Y=-dn-2dn-3……d2d1d0,

[Y]反

=1111…111-|Y|=2n-1-|Y|=2n-1+Y。

1字节存储有符号数反码,有127个正数(1~127),127个负数(-1~-127)和2个“0”,“正”0:00000000,

“负”0:11111111。反码的运算规则仍然比较复杂,可以用作原码和常用的补码之间的一个过渡。163.补码

用最高有效位(MSB)表示一个有符号数的符号:

“1”表示负,“0”表示正。其他二进制位用来存储这个数的有效数字:

正数的有效数字不变,负数的有效数字取反后最低位加1。用字节存储一个有符号数时,对于正数X=dn-2dn-3……d2d1d0,

[X]补

=X=0dn-2dn-3……d2d1d0。对于负数Y=-dn-2…d1d0,

[Y]补

=1(dn-2…d1d0)#+1=1111…111-|Y|+1

=2n-|Y|=2n+Y。17一字节存储有符号数补码时,有127个正数(1~127),

128个负数(-1~-128),1个“0”(00000000)。

其中,[-1]补=11111111,[-128]补=10000000。把一个数补码的所有位(包括符号位)“取反加1”,得到这

个数相反数的补码。称为“求补”,[[X]补]求补=[-X]补。已知一个负数的补码,求这个数自身(真值)时,可以先求出这个数相反数的补码。[例]:已知[X]补=10101110,求X的值:

[-X]补=[[X]补]求补=[10101110]求补=01010001+1=01010010

于是,-X=[+1010010]2=+82

于是,X=-82

18真值(十进制)二进制表示原码反码补码+127+1111111011111110111111101111111+1+0000001000000010000000100000001+0+0000000000000000000000000000000-0-0000000100000001111111100000000-1-0000001100000011111111011111111-2-0000010100000101111110111111110-127-1111111111111111000000010000001-128-10000000无无10000000部分数的8位二进制原码、反码和补码19一个补码需要增加它的位数时,对于正数,需要在它的左侧添加若干个“0”,对于负数,需要在它的左侧添加若干个“1”,

用它的符号位来填充增加的“高位”,称为“符号扩展”。在处理不同长度有符号数的时候,必需使用符号扩展。(在处理无符号二进制数的时候,可以使用零扩展)4.

补码的扩展[例]:

[-5]补

=11111011(8位)=1111111111111011(16位)

[+5]补

=00000101(8位)=0000000000000101(16位)20

大多数高级程序设计语言允许程序员包含不同大小的整数的表达式。那么当一个表达式的两个操作数大小不同的时候,有些语言会报错,有些语言会自动将操作数转换成一个统一的格式,这种转换是有代价的。因此,如果你不希望编译器在你不知情的情况下自动加入各种转换到你原本非常完美的代码中,就需要掌握编译器是如何处理这些表达式的。要求提供显式转换的语言的优点在于编译器永远不会在程序员不知情的情况下在任何事情。21

关于符号扩展和零扩展,有一点需要明确的是,它们是需要付出代价的。将一个小整数赋值给一个大整数可能会比在同样大小的整数变量间传输数据需要更多的机器指令(执行时间更长),因此,在一个数学表达式或者一条赋值语句中混合使用不同大小的变量要小心。22补码的运算遵循以下规则:

[X+Y]补=[X]补+[Y]补

[X-Y]补=[X]补-[Y]补 ([X-Y]补=[X]补+[-Y]补=[X]补+[[Y]补]求补)“溢出标志(OverflowFlag,OF)”表示有符号数运算特征。

OF=1,表示运算结果超过了表示范围,称为“溢出”,

OF=0,没有产生溢出。计算机自身用“双进位法”判断是否产生“溢出”:

补码最左边2个位上的进位相等,没有溢出,反之有溢出。5.

补码的运算23同号数和异号数相加使用相同的规则;有符号数和无符号数加法使用相同的规则减法可以用加法实现(对于电子计算机内的开关电路,

求补是十分容易实现的)补码运算规则的优点:上述特性可以用来简化运算器电路,简化指令系统计算机内的有符号数一般都用补码表示,除非特别说明。24“ASCII(AmericanStandardCodeforInformationInterchange,美国信息交换标准编码)”。7位二进制表示一个字母、数字或符号,包含128个不同的编码。一个字符的ASCII码占用一个字节,低7位是它的ASCII码,最高位置“0”,或者用作“校验位”。1.1.5 字符编码25ASCII编码的前32个(编码00H~1FH)用来表示“控制字符”,例如CR(“回车”,编码0DH),LF(“换行”,编码0AH)。ASCII编码30H~39H用来表示数字字符“0”~“9”。它们的高3位为011,低4位就是这个数字字符对应的二进制表示。ASCII编码41H~5AH用来表示大写字母“A”~“Z”,它们的高2位为01。ASCII编码61H~7AH用来表示小写字母“a”~“z”,它们的高2位为10。小写字母的编码比对应的大写字母编码大20H。26用一组四位二进制来表述一位十进制数,组间仍然按照“逢十进一”的规则进行,称为“BCD码(BinaryCodedDecimal)”。压缩的BCD码用一个字节存储2位十进制数,高4位二进制表示高位十进制数,低4位二进制表示低位十进制数。可以用相同数字的十六进制数表述。非压缩的BCD码用一个字节存储1位十进制数,低4位二进制表示该位十进制数,对高4位的内容不作规定。1.1.6 BCD码十进制数25的压缩BCD码用25H表示。数字字符‘7’的ASCII码37H就是数7的非压缩BCD码2741H: 有符号数+65的补码 无符号数65

大写字母‘A’的ASCII码 十进制数41D的压缩BCD码计算机内的一组二进制编码和它们的“原型”之间存在着

“一对多”的关系:知情者:定义、使用该数据的程序员281.2计算机组织

1.2.1计算机组成1.2.2中央处理器1.2.3存储器1.2.4总线1.2.5外部设备和接口

29“存储程序原理”:把程序事先存储在计算机内部,计算机通过

执行程序实现高速数据处理“五大功能模块”:电子数字计算机由运算器、控制器、存储器

、输入设备、输出设备“冯·诺依曼体系结构”:30中央处理器(CentralProcessUnit,CPU)”或“微处理器(MicroProcessUnit,MPU)”:把控制器、运算器、寄存器和高速缓冲存储器集成在一块集成电路上。Intel8086与它兼容的若干微处理器,统称为80X86微处理器。寄存器:由电子线路构成的一个电子器件,可以用来储存若干位二进制。寄存器可以存储运算过程的中间结果,节省反复访问内存储器的时间开销高速缓冲存储器(Cache):容量较小,速度较快的存储器。把将要执行的程序指令和将要使用的数据“提前”取到CPU的内部,加速程序的执行。1.2.2 中央处理器31存储器用于存储程序和数据,是计算机的重要部件。存储器属于计算机“主机”的一部份,为了和磁盘存储器等“外部存储器”加以区分,也称为“内存储器”或者“主存储器”。1.2.3 存储器内存层次结构3280X86微机内存储器以“字节”为基本单位,

称为“存储单元”。每个字节用一组二进制数进行编号,称为“地址”地址的位数决定了可以编号的字节的个数,也就是

内存储器的大小,称作容量。1.

存储器物理组织假设“地址”20300H的单元存放了数据34H,

写作(20300H)=34H331KB(千字节)=210B=1024B≈103B1MB(兆字节)=210KB=220B≈106B1GB(吉字节)=210MB=230B≈109B1TB(太字节)=210GB=240B≈1012B用16位二进制表示存储器地址:

最小地址为0000H,最大地址为0FFFFH,

共有65536(64K=216)个不同的地址,

最多可以连接64KB的存储器。8086CPU有20位地址线,可以连接最多1MB=220B的内存储器34读操作:从某个存储单元取出事先存储的程序指令或数据

读操作不改变原存储单元的内容。写操作:把一个数据存入指定的存储单元。写操作之后,

该存储单元原来的内容被新的内容所“覆盖”,不复存在一次存储器的读操作或写操作统称为对存储器的一次

“访问(Access)”。2.

存储器操作

从20300H单元读出它的内容“34H”之后,该单元的内容仍然是“34H”。向20300H单元写入“11H”之后,该单元内容变成“11H”,原来的数据“34H”被覆盖。35

一项数据可能占用连续的多个存储单元:

高位的数据存入地址较大的存储单元用多个存储单元中的最小地址来表示该数据的地址。3.

存储器内的数据组织例如,数据12345678H存储在地址为23000H~23003H的4个连续的内存单元,每个存储单元存储这个数据的一部分(8b),顺序为:78H,56H,34H,12H。用23000H作为这个“双字”数据的存储地址。36对连续的多个存储单元进行读写时,发送给存储器的是这个数据的最小地址。向存储器发出一个地址信号之后,可以进行1B/2B/4B数据的读写,对应的地址称为“字节地址”、“字地址”和“双字地址”。地址的这个“属性”在指令中指明。向存储器发出地址23000H和“读命令”后,如果这个地址是“字节地址”,那么读出的内容是78H,如果这个地址是“字地址”,那么读出的内容是5678H,如果这个地址是“双字地址”,那么读出的内容是12345678H。371.2.4 总线总线的概念所谓总线,就是多个信息源分时传送数据流到多个目的地的传送通路。即一组公用的传递信号的连线。假如一组导线只连接一个信息源和一个负载,就不能称为总线。

38微型计算机的系统构成体现出以“总线”为信息“枢纽”的特点。39“总线(Bus)”:多个部件/设备公用的一组信号传输线。按照传输方向,有“输出”、“输入”以及“双向”总线。按照传输的内容,总线可以分为三组:

地址总线(AddressBus,AB),传输地址信号,输出; 数据总线(DataBus,DB),传输数据信号,双向;

控制总线(ControlBus,CB),传输控制信号,大多数控

制信号为单向,输入或输出。地址总线的位数决定了可以连接存储器的数量。数据总线的位数决定了一次可以存取数据的位数。40CPU处理器位数数据总线位数地址总线位数最大寻址空间8088/80188168201MB8086/801861616201MB8028616162416MB80386/804863232324GBPentium3264324GBPentiumII/P3/P432643664GB411.3.1指令和程序1.3.2 机器语言和汇编语言1.3.3 高级语言1.3指令、程序和程序设计语言42机器指令由若干位二进制组成

操作码:操作种类

操作数:操作对象。机器指令可以由CPU直接执行。指令:对计算机硬件发出的操作命令。指令系统:某台计算机所有指令的集合。符号指令:用“助记符”、“寄存器名”、“变量名”等记录/书写

的指令,不能由CPU直接执行。助记符:用字母、文字表示的符号(操作码,操作数)4310001000→MOVR2,R0[R2←(R0)]10010111→ADDR1,R3[R1←(R1)+(R3)]10100001→SUBR0,R1[R0←(R0)-(R1)]指令系统示例44指令序号机器指令符号指令指令执行后寄存器的值R0R1R2R3?XY?110000001MOVR0,R1XXY?210010001ADDR0,R12XXY?310100010SUBR0,R22X-YXY?实现计算R0←2X-Y的程序

45模型机

ALUA

256BYTERAMPCARH

程序控制器ID(指令译码器)IR(指令寄存器)DR数据总线地址总线程序计数器地址寄存器存储器数据寄存器累加器算术逻辑单元控制信号输入输入输出虚线以上是CPU46算术逻辑单元ALU

是执行算术和逻辑运算的装置,它以累加器A的内容作为一个操作数,另一个操作数由内部数据总线提供,可以是寄存器H中的内容,也可以是由数据寄存器DR供给的由内存读出的内容等。操作的结果通常放在累加器A中。程序计数器PC

要执行的指令的地址由PC提供,并传给AR地址寄存器,由它把要寻址的单元的地址通过地址总线,送至存储器。47

从存储器中取出的指令,由数据寄存器送至指令寄存器IR,经指令译码器ID译码,通过控制电路,发送执行一条指令所需的各种控制信息。若程序已存放在内存中,则机器的执行过程就是取指(取出指令)和执行指令这两个阶段的循环。机器从停机状态进入运行状态,要把第一条指令所在的地址赋给PC,然后就进入取指阶段。在取指阶段从内存中读出的内容必为指令,所以DR把它送至IR,然后由指令译码器译码,就知道此指令要执行什么操作,在取指阶段结束后就进入执行阶段。当一条指令执行完以后,就进入了下一条指令的取指阶段。这样的循环一直进行到程序结束(遇到停机指令)48微机工作过程举例

下面以一个极简单的例子来说明程序的执行过程。若要求机器把两个数7和10相加。要使机器执行这样的操作当然要给它编程序。在编程序时首先要检查一下机器的指令系统,这里用到三条指令。

助记符

机器码二进制十六进制立即数送累加器(2字节指令)MOVA,N001111103EnnA中内容加立即数(2字节指令)ADDA,N11000110C6nn暂停(1字节指令)HALT011101107649编写程序MOVA,7HADDA,0AHHALT人工查指令表完成翻译工作源程序机器码(二进制表示)机器码(十六进制)MOVA,7H00111110000001113E07HADDA,0AH1100011000001010C60AHHALT0111011076H50

假定本例程序在内存中的存放如图示地址

00MOVA017

02ADDA

031004HALT001111100000011111000110000010100111011051

对于第一条指令MOVA,7由于它是一个两字节指令,存放时用了两个存储单元,这条指令的读出需要两次读操作,第一次读出的是操作码,第二次读出操作数。执行过程:微机接通电源,复位电路使程序计数器PC的内容自动置0(不同微机PC的初值不同,即程序的起始地址不同),它是第一条指令的地址,在时钟脉冲作用下,CPU开始一个节拍一个节拍地工作。首先进入第一条指令的取指阶段,具体地说:52PC的内容(00H)送至地址寄存器(AR)当PC的内容可靠地送入地址寄存器后,PC的内容自动加1变为01H地址寄存器把地址00H通过地址总线送至存储器,经地址译码器译码,选中00号单元CPU给出读命令所选中的00号单元的内容3EH读至数据总线上读出的内容经过数据总线送至数据寄存器DR因是取指阶段的第一个字节,取出的为操作码,故DR把它送至指令寄存器IR,然后经过译码发出执行这条指令的各种控制命令。53

然后就转入执行第一条指令的阶段。经过对操作码译码后知道,这是一条把操作数送累加器A的指令,而操作数在指令的第二个字节,所以执行第一条指令就必须把第二字节中的操作数取出来。取第二个字节的过程为:把PC的内容01H送至地址寄存器PC的内容可靠送AR后,PC自动加1变为02HAR通过地址总线AB把地址信号送存储器,经译码选中相应单元CPU发出读命令选中的存储单元的内容07H读至数据总线DB通过DB把读出的内容送至DR因已知读出的是操作数,且指令要求把它送累加器A,故由DR通过数据总线送至A54到此,第一条指令执行完毕进入第二条指令的取指阶段。取第二条指令的过程为:把PC的内容02H送至ARPC自动加1变为03AR通过AB把02送至存储器,经译码后选中相应单元CPU发出读命令选中存储单元的内容C6H,读出到数据总线上读出的内容通过数据总线送至DR因是取指阶段,所以读出的是操作码,DR把它送至IR,经过译码发出各种控制信息

经过对指令译码后知道,此为加法指令,以A中的内容为一操作数,另一操作数在指令的第二个字节中,必须取出第二个字节。55

取第二个字节及执行指令的过程为:把PC的内容03送ARPC自动加1变为04AR通过AB将03送存储器,经译码选中相应单元CPU发出读命令选中的存储单元的内容0AH读到DB上通过DB将数据送至DR因由指令译码已知读出的为操作数,且要与A中的内容相加,故数据由DR通过内部数据总线送至ALU的另一个输入端A中的内容送ALU,且执行加法操作相加的结果由ALU输出至累加器A中56

到此,第二条指令的执行阶段结束了,就转入第三条指令的取指阶段。按上述类似的过程取出第三条指令,经译码后就停机。578086微处理器的结构8086微处理器8086的编程结构5859总线接口部件总线接口部件的功能是负责与存储器、I/O端口传送数据。CPU执行指令时,总线接口部件要配合执行部件从指定的内存单元或外设端口中取数据,将数据传送给执行部件,或者把执行的操作结果传送到指定的内存单元或外设端口中。执行部件执行部件的功能是负责指令的执行。60通用寄存器

AXAHALBXBHBLCXCHCLDXDHDLSPBPSIDI61数据寄存器 累加器AX(Accumulator)基址寄存器BX(Base)计数寄存器CX(Count)数据寄存器DX(Data)这四个16位寄存器可分为高8位(AH、BH、CH和DH)与低8位(AL、BL、CL和DL)可分别寻址、独立操作。

62

指针寄存器和变址寄存器 堆栈指针寄存器SP(StackPointer)基址指针寄存器BP(BasePointer)源变址寄存器SI(SourceIndex)目的变址寄存器DI(DestinationIndex)

SP用来确定欲读写堆栈的地址,BP用来存放在现行堆栈段的一个数据区的“基地址”。SI、DI用于变址操作,存放变址地址。63

指令指针IP和标志寄存器F

指令指针IP(InstructionPointer) 指向当前需要取出的指令字节

IP指向的是指令地址的段内地址偏移量,又称偏移地址(OffsetAddress)或有效地址(EA,EffectiveAddress)。 程序员不能对IP进行存取操作,程序中的转移指令、返回指令以及中断处理能对IP进行操作。IPFR64标志寄存器FR(FlagRegister)

定义了9位6位状态位(条件码) C、A、Z、S、O、P3位控制位I、D、TOFDFIFTFSFZFAFPFCFInterruptenableDirectionTrapCarryAuxiliaryCarryZeroSignOverflowParity65进位标志CF,加减运算后有进位(借位)CF=1, 辅助进位标志AF零标志ZF,结果为0,ZF=1

结果非0,ZF=0符号标志SF,结果为正,SF=0

结果为负,SF=1奇偶校验标志PF,低8位中,“1”的个数为偶数,PF=1, “1”的个数为奇数,PF=0溢出标志OF66中断允许标志IF:用于控制可屏蔽中断。

IF=1,开中,IF=0关中。方向标志DF:用于串操作

DF=0,增量操作,DF=1,减量操作。陷阱标志TF:

TF=1,单步操作,TF=0,连续操作。67指令预取队列由于跳转与条件跳转指令会使得预取队列失效,因此在跳转指令确实将控制转交到目的位置的时候,它们执行得比其他指令慢,CPU是无法重叠执行下一条指令的取指与解码和会转移控制的跳转指令的。因此,在执行某条跳转指令之后可能需要几个时钟周期才能恢复预取队列的内容。因此如果想要编写快速的代码,要尽量避免在程序中跳来跳去。如果在编写程序的时候能够判断出哪一个跳转条件出现的最频繁,应该小心安排程序,让最常见的情况下程序会继续执行下一条指令而不是跳转到别的地址去。68三、段寄存器(SegmentRegister)内存中通常存放着三类信息:(1)代码(指令)—指示微处理器执行何种操作;(2)数据(字符、数值)—程序处理的对象;(3)堆栈信息—被保存的返回地址和中间结果等。CSDSSSES69

段的起始地址由称为“段寄存器”的4个16位寄存器决定,这4个段寄存器为:(1)代码段寄存器CS(CodeSegment)指向当前的代码段,指令由此段中取出;(2)堆栈段寄存器SS(StackSegment)指向当前的堆栈段,堆栈操作的对象就是该段中存储单元的内容;70(3)数据段寄存器DS(DataSegment)指向当前的数据段,通常用来存放程序变量(存储器操作数);(4)附加段寄存器ES(ExtraSegment)指向当前的附加段,通常也用来存放数据,以及一些专用指令的操作数。711.480x86寄存器1.4.1 数据寄存器1.4.2 地址寄存器1.4.3 段寄存器1.4.4 专用寄存器1.4.5 其它寄存器7216位80X86处理器有4个16位的通用数据寄存器。AX(累加器):最常用的数据寄存器BX(基址寄存器):存放一片内存的首地址—“基址”CX(计数寄存器):存放重复操作的次数—“计数器”DX(数据寄存器):存放32位数据的高16位/存放端口地址通用数据寄存器可以拆分为2个8位寄存器使用,命名为:

AH,AL,BH,BL,CH,CL,DH,DL。32位80X86处理器的4个数据寄存器扩展为32位,更名为EAX、EBX、ECX和EDX。1.4.1数据寄存器731.4.2 地址寄存器SP(堆栈指针):存放堆栈“栈顶”的偏移地址。BP(基址指针):存放堆栈中数据的偏移地址;SI(源变址寄存器):存放“源”数据区的偏移地址;DI(目的变址寄存器):存放“目的”数据区的偏移地址。变址寄存器:存放的地址可以按照要求自动地增加/减少,地址寄存器不能再拆分使用(地址信息至少16位)。32位80X86处理器的地址寄存器扩展为32位,命名为:ESP,EBP,ESI,EDI。741.4.4 专用寄存器IP寄存器称为指令指针,存放即将执行指令的偏移地址。4A00H:1020H……4A00H:1022HMOVAX,1020H4A00H:1025HADDAX,Y执行“MOVAX,1020H”时,IP=1025HFLAGS称为“标志寄存器”,存放CPU的两类标志:

状态标志:反映处理器当前状态,如有无“溢出”、“进位”

控制标志:控制处理器的工作方式

75OF(OverflowFlag):溢出标志

OF=1:两个有符号数的运算结果超出范围,结果错误。

OF=0:没有溢出,结果正确。进行无符号数运算时也会产生新的OF标志,此时无意义。状态标志1(OF和CF)CF(CarryOutFlag):进位/借位标志

CF=1:两个无符号数的加法运算有“进位”,或者是减法运算

有“借位”,需要对它们的“高位”进行补充处理。

CF=0:没有产生进位或借位。进行有符号数运算时也会产生新的CF标志,此时无意义。状态标志在每次运算后产生76

SF(SignFlag):符号标志,

SF=1,表示运算结果的最高位为“1”。状态标志2(SF)

对于有符号数运算

OF=0时,结果正确:

SF=1表示运算结果为负

SF=0表示运算结果非负(正或零)

OF=1时,结果是错误的,符号位和正确值相反例如,两个负数相加产生溢出,此时SF=0。对于无符号数运算,SF无意义(但是可以看出结果的大小规模)状态标志在每次运算后产生77PF(ParityFlag):奇偶标志,可以用来进行“奇偶校验”

PF=1运算结果的低8位中有偶数个“1”(Even)

PF=0运算结果的低8位中有奇数个“1”(Odd)ZF(ZeroFlag):零标志ZF=1运算结果为零,减法运算后结果为零意味着两个参加

运算的数大小相等。ZF=0运算结果非零。

状态标志3(ZF,AF,PF)AF:辅助进位标志,两个BCD数运算时b3位上的进位,供运算

后“调整”结果用,对其他数的运算没有意义。状态标志在每次运算后产生78控制标志(IF,TF,DF)控制标志的值由指令设置

DF(DirectionFlag):方向标志

DF=0执行字符串指令后,用加法修改源或目的地址指针

DF=1用减法来修改地址指针IF(InterruptEnableFlag):中断允许标志,

IF=1允许处理器响应“可屏蔽中断请求”信号,称为“开中断”

IF=0不允许处理器响应“可屏蔽中断请求”信号,称为“关中断”。TF(TraceFlag):单步(跟踪)标志

TF=1时,每执行完一条指令都会产生一次“1号”中断,该程序被暂停执行。它用于程序的调试791.4.5 其它寄存器5个32位的控制寄存器,命名为CR0~CR4。

CR0寄存器的PE=1表示目前系统运行在“保护模式”

PG=1表示允许进行分页操作。

CR3寄存器存放“页目录表”的基地址。32位80X86微处理器新增加的寄存器:8个用于调试的寄存器DR0~DR72个用于测试的寄存器TR6~TR780“段(Segment)”:内存中的一片区域,用来存放某一种类型的信息。例如,用一片存储区存放某程序所使用的数据,该存储区称为“数据段”。类似的,还有存放程序代码的“代码段”,存放程序运行时临时信息的“堆栈段”等。采用分段结构之后,内存单元的地址由两部分组成:所在段的起始地址,该单元在这个段内的相对地址。段内相对地址也称为“偏移地址”,一般从0开始编码。段的起始地址是这个段的所有单元公用的,相对固定。81

8086系统中内存分段 解决20位内存地址和16位地址计算能力的矛盾。

8086程序把1M字节的存储空间看成为一组存储段,各段的功能由具体用途而定,分别为代码段、堆栈段、数据段和附加段。82

一个存储段是存储器的一个逻辑单位,其长度可达64K字节,每段第一个字节的位置称为“段起始地址”。对段起始地址的要求是:最好能被16整除(起始地址为××××0H)。段寄存器中存放了与段起始地址有关的16位“段基值”(SegmentBasevalue),几个段可以相互重叠,也可指向同一个64K字节空间。83

在具有地址变换机构的计算机中,有两种存储器地址:一种是逻辑地址(LogicalAddress)

—允许在程序中编排的地址一种是物理地址(PhysicalAddress)

—信息在存储器中实际存放的地址848086系统中,对给定的任一存储单元而言有两部分逻辑地址;“段基值”—决定所在段第一个字节的位置;“段内偏移量”(Offset)—该存储单元相对于该段起始单元的距离。 “段基值”存放在段寄存器(CS、SS、DS、ES)中,“段内偏移量”由SP、BP、SI、DI、IP、BX和直接地址以及上述寄存器和直接地址的组合而形成。85段基址:每个段20位起始地址的高16位,存放在专门的

“段寄存器”内。每个段的偏移地址用16位二进制表示。这样,每个段最

多可以有216B=64KB。8086CPU的分段方法:例如,把“数据段”的段基址存放在“数据段寄存器”DS中,访问数据时,自动从DS中取出段基址。86“逻辑地址”:用“段基址:偏移地址”表示的地址,是程序员在

汇编语言程序中使用的地址。“物理地址”:访问存储器的20位地址。计算机硬件把逻辑地址转换为物理地址:

把“段基址”尾部添加4个0(相当于乘上16),得到“段起始地址”,再加上偏移地址,就得到了它对应的物理地址。物理地址=段基址×16+偏移地址87

每个逻辑地址对应一个唯一的物理地址,但是一个物理地址可以对应多个“逻辑地址”。使用一个段之前应该把这个段的“段基址”装入对应的“段寄存器”。

8086CPU有4个段寄存器,因此允许同时使用4个“段”:数据段、代码段、堆栈段、附加段(另一个数据段)逻辑地址2340H:1234H对应于物理地址

23400H+1234H=24634H。物理地址24634H可以同时和

2463H:0004H、2460H:0034H、2400H:0634H……

等“逻辑地址”相对应。88错误认识:内存被划分成了一个一个的段,每一个段有一个段地址。其实:内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。89

我们可以认为:地址10000H~100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H。90

我们也可以认为地址10000H~1007FH、10080H~100FFH的内存单元组成两个段,它们的起始地址(基础地址)为10000H和10080H,段地址为:1000H和1008H,大小都为80H。91

以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元92内存单元地址小结:CPU访问内存单元时,必须向内存提供内存单元的物理地址。8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。思考下面的两个问题。(1)观察下面的地址,你有什么发现?物理地址段地址偏移地址

21F60H2000H1F60H2100H0F60H21F0H0060H21F6H0000H1F0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论