第2章寄存器(CPU工作原理) 第二个问题:一个8位寄存器所能存储的数据的最大值为多少? 22字在寄存器中的存储 出于对兼容性的考虑,8086CPU可以一次性处理两种尺寸的数据: ·字节:记为byte,一个字节由8个比特(即二进制位)组成,可以存在8位寄存 器中 字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节 和低位字节,如图25所示。 字:0100111000100000 高位字节 低位字节 图2.5一个字由两个字节组成 一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄 存器的高8位寄存器和低8位寄存器中,如图24所示,一个字型数据2000存在AX寄 存器中,在AH中存储了它的高8位,在AL中存储了它的低8位。AH和AL中的数据, 既可以看成是一个字型数据的高8位和低8位,这个字型数据的大小是:2000又可以看 成是两个独立的字节型数据,它们的大小分别是78和32。 关于数制的讨论 任何数据,到了计算机中都是以二进制的形式存放的。我们为了描述不同的问题,又经常将它们用其 他的进制来表示,比如图24中寄存器AX中的数据是01001100010000这《就是AX中的信息本身,我 们可以用不同的逻辑意义来看待它,我们可以将它看作一个数值,大小是20000 当然,二进制数01001000本身也可表示一个数值的大小,但人类习惯的是十进制,用十进 制2000表示可以使我们直观地感受到这个数值的大小 我们知道十六进制数的一位相当于二进制数的四位,如01001100100000表示成:4(0100 E(110)、200).00000四位十六进制数。 由于一个内存单元可存放8位数据,CPU中的寄存器又可存放n个8位的数据,也就是说,计算机 中的数据大多是由1一N个8位数据构成的,很多时候,需要直观地看出组成数据的各个字节数据的值 用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的。比如20000写成4E20就可以 直观地看出,这个数据是由4E和20两个8位数据构成的,如果AX中存放4E20,则AH里是4E,AL 里是20这种表示方法便于许多问题的直观分析。在以后的课程中,我们多用十六进制来表示一个数据 在以后的课程中,为了区分不同的进制,我们在十六进制表示的数据的后面加H,在二进制表示的数 据后面加B,十进制表示的数据后面什么也不加。如:我们可用3种不同的进制表示图24中AX里的数 据,十进制:2000,十六进制:4E20H,二进制:0100110010
汇編语言 2.3几条汇编指令 我们可以通过汀编指令控制CPU进行工作,常用的指定如表21所示。 表2.1汇编指令举例 汇编指令 控制cPU完成的操作 用高级语言的语法描述 moy ax 18 将18送入寄存器AX 将78送入寄存器AH AH=78 add ax, 8 将寄存器AX中的数值加上8 moy ax. bx 将寄存器BX中的数据送入寄存器AX AXBX add ax bx 将AX和BX中的数值相加,结果存在AX中 AX=AX+BX 注意:为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高 级语言描述这两种方式来描述一条汇编指令的含义。在写一条汇编指令或一个寄 存器的名称时不区分大小写。如: mov ax,18和 MOVAX,18的含义相同;bx 和BX的含义相同。 我们看“下CPU执行表22中所列的程序段中的每条指令后,对寄存器中的数据进行 的改变。 表22程序段中指令执行情况之一(原AX中的值:000H,原BX中的值:000 程序段中的指令 指令执行后AX中的数据 指令执行后8中的数据 mov ax 4E20H 4E20H add ax, 1406H 6226H mov bx, 2000H 6226H add ax bx 2000H moy bx. ax 8226H 8226H ?(参见问题21) 226H 问题2.1 指令执行后AX中的数据为多少?思考后看分析。 分析: 程序段中的最后条指令 add ax,bx,在执行前ax和bx中的数据都为8226H,相加后 所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高 位的1不能在ax中保存,ax中的数据为:044CH 我们再看表23中所列一段程序的执行情况
第2章寄存器(CPU工作原理) 表2.3程序段中指令执行情况之二 序段中的指令 指令执行后AX中的数据 指令执行后BX中的数据 mov ax, cOIAH OOIAH moy bx, 0026H 001AH add al b1 0026H add ah. bI 0026H add bh, al 2640H 4026H 0040H 4026H add al. 85H 00C5H 4026H add aL.93H ?(参见问题22 4026H 问题2.2 指令执行后AX中的数据为多少?思考后看分析 分析: 程序段中的最后一条指令adda,93H,在执行前,al中的数据为CH,相加后所得的 值为:158H,但是a为8位寄存器,只能存放两位六进制的数据,所以最高位的1丢失, ax中的数据为:0058H。(这里的丢失,指的是进位值不能在8位寄存器中保存,但是CPU 不是并真的不丢弃这个进位值,关于这个问题,我们将在后面的课程中讨论。) 注意,此时a是作为一个独立的8位寄存器来使用的,和ah没有关系,CPU在执行 这条指令时认为ah和a是两个不相关的寄存器。不要错误地认为,诸如 add al,93H的指令 产生的进位会存储在ah中,adda,93H进行的是8位运算。 如果执行adax,93H,低8位的进位会存储在ah中,CPU在执行这条指令时认为只有 个16位寄存器ax,进行的16位运算。指令 add ax,93H执行后,a中的值为:0158H。 此时,使用的寄存器是16位寄存器ax, add ax,93H相当于将ax中的16位数据00c5H和 另一个16位数据009CH相加,结果是16位的0158H 在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如: mov ax, bx mov bx,Cx ov al, 1BH add ax, bx add ax, 20000 等都是正确的指令,而: moy ax b1 在8位寄存器和16位寄存器之间传送数据) (在16位寄存器和8位寄存器之间传送数据 mov al 20000 位寄存器最大可存放值为255的数掉 add aI 100H (将一个高于8位的数据加到个8位寄存器中)
江编语言 等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致。 检测点21 (1)写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX mov ah, 3lH mov nov Cx, ax add ax, bx mov al bh mov ah bl add al, 6 AX= add al al (2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方 2.4物理地址 CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是 个一维的线性空间,每一个内存单元在这个空间中都有惟一的地址,我们将这个惟一的地 址称为物理地址。 CPU通过地址总线送入存储器的必须是一个内存单元的物理地址在CPU向地址总线 上发出物理地址之前,必须在内部先形成这个物理地址。不同的CPU可以有不同的形成物 理地址的方式。下面讨论8086CPU是如何在内部形成内存单元的物理地址的 2.516位结构的CPU 我们说8086CPU的上一代CPU(8080、8085等是8位机,而8086是16位机,也可以 说8086是16位结构的CPU。那么什么是16位结构的CPU呢 概括地讲,16位结构(16位机、字长为16位等常见说法,与16位结构的含义相同)描 述了一个CPU具有下面几方面的结构特性: 运算器一次最多可以处理16位的数据: 奇存器的最大宽度为16位: 寄存器和运算器之间的通路为16位。 8086是16位结构的CPU,这也就是说,在8086内部,能够一次性处理、传输、暂时
第2章寄存器(CPU工作原理) 存储的信息的最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中 处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址。 2.68086CPU给出物理地址的方法 8086PU有20位地址总线,可以传送20位地址,达到1MB的寻址能力。8086CPU 又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部 结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能 力只有64KB 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。 8086CPU相关部件的逻辑结构图如图2.6所示。 16位 地址 加法器 其他部件 20位地址总线 物进地址一 输入输出 控制电路 内存 图2.68086cPU相关部件的逻辑结构 如图2.6所示,当8086CPU要读写内存时 (1)CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地 址 (2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件 (3)地址加法器将两个16位地址合成为一个20位的物理地址: (4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路: (5)输入输出控制电路将20位物理地址送上地址总线 (6)20位物理地址被地址总线传送到存储器。 地址加法器采用物理地址段地址16+偏移地址的方法用段地址和偏移地址合成物 理地址。例如:8086PU要访问地址为123C8H的内存单元,此时,地址加法器的工作过