最好的免费软件网站建设微信公众号管理平台app

当前位置: 首页 > news >正文

最好的免费软件网站建设,微信公众号管理平台app,长沙建站标协助找有为太极,优化网站页面《汇编语言》- 读书笔记 - 第2章-寄存器 2.0 8086CPU 寄存器段地址:偏移地址 2.1 通用寄存器2.2 字在寄存器中的存储2.3 几条汇编指令表2.1汇编指令举例表2.2 程序段中指令的执行情况之一问题 2.1表2.3 程序段中指令的执行情况之二问题 2.2 检测点 2.12.4 物理地址2.5 16位结构… 《汇编语言》- 读书笔记 - 第2章-寄存器 2.0 8086CPU 寄存器段地址:偏移地址 2.1 通用寄存器2.2 字在寄存器中的存储2.3 几条汇编指令表2.1汇编指令举例表2.2 程序段中指令的执行情况之一问题 2.1表2.3 程序段中指令的执行情况之二问题 2.2 检测点 2.12.4 物理地址2.5 16位结构的CPU2.6 8086CPU给出物理地址的方法2.7 “段地址X16偏移地址物理地址”的本质含义2.8 段的概念内存单元地址小结检测点 2.22.9 段寄存器2.10 CS和IP2.11 修改 CS、IP 的指令问题 2.3 2.12 代码段2.9~2.12 小结检测点 2.3 CPU由运算器、控制器、寄存器等构成内部总线连接这些器件外部总线连接主板上其他器件。 对于汇编程序员来说寄存器是最主要的部件我们能做的就是通过改变寄存器中的内容来控制CPU。 不同CPU的寄存器个数和结构不同。8086CPU有14个寄存器包括 通用寄存器AX、BX、CX、DX 段寄存器CS、SS、DS、ES 偏移指针寄存器SI、DI、SP、BP、IP 标志寄存器PSW 2.0 8086CPU 寄存器 寄存器EN全称功能通用寄存器AXAccumulator Register累加器用于算术运算和数据传输。可拆成高8位ah和低8位al分开使用。BXBase Register基地址寄存器用于存放内存地址。可拆成高8位bh和低8位bl分开使用。CXCount Register计数器用于循环计数或者数据传输。可拆成高8位ch和低8位cl分开使用。DXData Register数据寄存器也可以用于 I/O 操作。可拆成高8位dh和低8位dl分开使用。段寄存器DSData Segment Register数据段寄存器存放程序的数据的基地址。ESExtra Segment Register附加段寄存器存放一些额外数据的基地址。SSStack Segment Register堆栈段寄存器存放堆栈的基地址。CSCode Segment Register代码段寄存器存放当前执行指令的代码段的基地址。偏移指针寄存器IPInstruction Pointer指令指针寄存器。SPStack Pointer栈指针指向当前堆栈顶部。BPBase Pointer基址指针用于访问堆栈中的参数和局部变量SISource Pointer源变址指针用于源操作数的偏移地址DIDestination Pointer目的变址指针用于目的操作数的偏移地址标志寄存器PSWProgram Status Word程序状态寄存器主要用于反映处理器的状态和ALU运算结果的某些特征及控制指令的执行。 段地址:偏移地址 段地址:偏移地址说明CS:IP指向下一条指令的物理地址SS:SP指向当前堆栈顶部的物理地址DS:BX指向数据的物理地址DS:SI指向数据的物理地址。例复制中的源DS:DI指向数据的物理地址。例复制中的目标 2.1 通用寄存器 8086CPU 的所有寄存器都是 16 位的可以存放两个字节。 AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据被称为通用寄存器。 数据在寄存器中的存储情况 四个通用寄存器都可以拆分为高低位分开使用。 2.2 字在寄存器中的存储 8bit(位)组成一个Byte(字节)。2字节组成一个字 。 所以一个字包含高和低两个字节。共16位。 我们再看个例子9527H这个字的数据可以当作整体来用表示 9527H 10010101 00100111 38183 也可以把高低位拆开分别使用表示 高位95H 10010101B 149 低位27H 00100111B 39 进制寄存器值高位低位169527H952721001010100100111B1001010100100111103818314939 补充10进制数直接与高低位对应很难理解。需要转为2或16进制分出高低位再转成10进制。 2.3 几条汇编指令 写汇编指令或寄存器名时不区分大小写。下面的两个问题主要是介绍了寄存器执行加法后溢出的问题。 表2.1汇编指令举例 汇编指令控制CPU完成的操作用高级语言的语法描述mov ax,18将18 送入寄存器AXAX18mov ah,78将78送入寄存器AHAH-78add ax,8将寄存器AX中的数值加上8AXAX8mov ax,bx将寄存器BX中的数据送入寄存器AXAX-BXadd ax,bx将AX和BX中的数值相加结果存在AX中AXAXBX 表2.2 程序段中指令的执行情况之一 (原 AX 中的值:0000H原 BX 中的值:0000H) 程序段中的指令指令执行后AX中的数据指令执行后BX中的数据mov ax,4E20H4E20H0000Hadd ax,1406H6226H0000Hmov bx,2000H6226H2000Hadd ax,bx8226H2000Hmov bx,ax8226H8226Hadd ax,bx(参见问题2.1)8226H 问题 2.1 指令执行后AX中的数据为多少? 8226H 8226H 1044CH 但 AX 只有16位对应4个16进制数 所以溢出了最高位的1丢失。 最后AX中剩下的就只有044CH 表2.3 程序段中指令的执行情况之二 程序段中的指令指令执行后AX中的数据指令执行后BX中的数据mov ax,001AH001AH0000Hmov bx,0026H001AH0026Hadd al,bl0040H0026Hadd ah,bl2640H0026Hadd bh,al2640H4026Hmov ah,00040H4026Hadd al,85H00C5H4026Hadd al,93H?(参见问题2.2)4026H 问题 2.2 指令执行后AX中的数据为多少? C5H 93H 158H 但 AL 只有8位对应2个16进制数 所以溢出了最高位的1丢失。 最后AL中剩下的就只有58H 注意add al,93H进行的是 8 位运算。单独使用AL时它作为一个独立的8位寄存器和AH无关。并不会把溢出的1放到 AH中去。 在进行数据传送或运算时要注意指令的两个操作对象的位数应当是一致的例如: 正确的写法 mov ax,bx mov bx,cx mov ax,18H mov al,18H add ax,bx add ax,20000错误的写法 mov ax,bl ; 在8位存器和16位存器之间传送数据 mov bh,ax ; 在16位寄存器和8位存器之间传送数据 mov al,20000 ; 8位存器最大可存放值为255的数据 add al,100H ; 将一个高于8位的数据加到一个8位存器中检测点 2.1 《汇编语言》- 读书笔记 - 检测点 2.1 2.4 物理地址 CPU 访问内存单元时需要使用物理地址。 所有的内存单元构成一个线性空间每个内存单元在其中有唯一的地址这就是所谓的物理地址。 不同的 CPU 可以采用不同的方式来形成物理地址。对于 8086CPU在发送物理地址到地址总线之前它需要先在内部生成物理地址。 2.5 16位结构的CPU 运算器一次最多可以处理 16 位的数据;寄存器的最大宽度为 16位;寄存器和运算器之间的通路为 16 位。 8086CPU是16位结构一次性能够处理、传输、暂存信息长度最大为16位。(内存单元的地址也是信息) 2.6 8086CPU给出物理地址的方法 8086CPU有20位地址总线达到1MB寻址能力。 也就是说地址总线一次能收发20辆车。 但CPU一单只能打包16车货。 如果CPU来一单就发车。那地址总线上就要跑4辆空车。 为了不浪费。 CPU决定一次发两单每单都少装点货拼到一起刚好20车至于谁多谁少程序员可以根据自己调配。 一单是段地址一单是偏移地址。 在CPU中有一个地址加法器它用来计算最终的物理地址 物理地址 段地址x 16 偏移地址。
如图 2.6所示当8086CPU 要读写内存时 CPU中的相关部件提供两个16 位的地址一个称为段地址另一个称为偏移地址段地址和偏移地址通过内部总线送入一个称为地址加法器的部件地址加法器将两个 16 位地址合成为一个 20 位的物理地址地址加法器通过内部总线将 20 位物理地址送入输入输出控制电路;输入输出控制电路将 20 位物理地址送上地址总线;20 位物理地址被地址总线传送到存储器。 2.7 “段地址X16偏移地址物理地址”的本质含义 段地址x16偏移地址物理地址的本质含义是CPU 在访问内存时用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加得出内存单元的物理地址。 是 基础地址偏移地址物理地址这种寻址模式的一种实现方案。 例1 这里如果应用 基础地址偏移地址物理地址的寻址模式。2000可视作基址826可视作偏移地址。 例2
2.8 段的概念 内存中没有段的概念。是8086CPU使用 基础地址偏移地址物理地址方式寻址来分段管理内存。
段地址是x16得来的。段起始地址一定是16的倍数。偏移地址有16位范围0000h~FFFFh。所以一个段最大为64KB。可以根据需要将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。 内存单元地址小结 CPU可以用不同的段地址和偏移地址组成同一个物理地址也就是说同一个物理地址可以有很多种组合方式获得。数据在21F60H内存单元中。对于8086PC机一般表达为 2.1. 数据存在内存2000:1F60单元中; 2.2. 数据存在内存的2000H段中的1F60H单元中。 检测点 2.2 《汇编语言》- 读书笔记 - 检测点 2.2 2.9 段寄存器 8086CPU 有4 个段存器:CS、DS、SS、ES。用来存放内存单元的段地址。 见8086CPU 寄存器 2.10 CS和IP CS代码段寄存器。存放当前执行指令的代码段的基地址。 IP指令指针寄存器。保存着将要执行的指令在段中的偏移量。 CS:IP指向接下来要执行的指令的物理地址。 在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CSFFFFHP0000H 即在 8086PC 机刚启动时CPU 从内存 FFFFOH 单元中读取指令执行 FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。 8086机中任意时刻CPU将 CS:IP 指向的内容当作指令执行。. 执行过的一段信息对应的内存单元必然被 CS:IP 指向过。 图 2.10 展示了 8086CPU 读取、执行指的工作原理(图中只包括了和所要说明的问题密切相关的部件图中数字都为十六进制)。 图2.10说明如下。 8086CPU当前状态:CS 中的内容为 2000HIP 中的内容为 0000H;内存20000H~20009H单元存放着可执行的机器码;内存20000H~20009H单元中存放的机器码对应的汇编指令如下。 地址内容长度对应汇编指令20000H~20002HB8 23 013Bytemov ax,0123H20003H~20005HBB 03 003Bytemov bx, 0003H20006H~20007H89 D82Bytemov ax,bx20008H~20009H01 D82Byteadd ax,bx 下面的一组图(图2.11~图 2.19)以图 2.10 描述的情况为初始状态展示了8086CPU读取、执行一条指令的过程。注意每幅图中发生的变化(下面对 8086CPU 的描述是在逻辑结构、宏观过程的层面上进行的目的是使读者对 CPU 工作原理有一个清晰、直观的认识为汇编语言的学习打下基础。其中隐蔽了 CPU 的物理结构以及具体的工作细节)。 总结 8086CPU的工作过程可以简要描述如下 首先 CS 和 IP 送入地址加法器得到CS:IP。 例CS 2000h IP 0000h CS:IP CS * 16 IP CS:IP 2000h * 16 0000h ;16进制数 *16 等于左移1位。进位了嘛 CS:IP 20000h 0000h CS:IP 20000h然后 1、 从 CS:IP 指向的内存单元读取指令读取的指令进入指令缓冲器; 2、 IPIP本条指令的长度从而指向下一条指令; 3、 执行指令。转到步骤(1)重复这个过程 到 20003H~20005H 获取 mov bx, 0003H 执行 IPIP3到 20006H~20007H 获取 mov ax,bx 执行 IPIP2到 20008H~20009H 获取 add ax,bx 执行 IPIP2 2.11 修改 CS、IP 的指令 在 CPU 中程序员能够用指令读写的部件只有寄存器通过改变寄存器中的内容实现对 CPU 的控制。程序员改变CS、IP 就实现了控制 CPU执行目标指令。 mov 不能修改 CS、IP 它有专用的指令如jmp 指令说明jmp 2AE3:3用给定的地址修改CSIP执行后:CS2AE3HIP0003H。jmp ax用寄存器ax中的值修改IP执行前ax1000HCS2000HIP0003H执行后ax1000HCS2000HIP1000H CPU将从修改后的地址读取指令。 问题 2.3 内存中存放的机器码和对应的汇编指令情况如图 2.27 所示设 CPU 初始状态:CS2000HIP0000H请写出指令执行序列。思考后看分析。 分析 执行步骤内存地址CS:IP机器码汇编指令IP指向下一条指令执行后寄存器变化12000:0000B8 22 66mov ax, 6622hIPIP3AX 6622h22000:0003EA 03 00 00 10jmp 1000:3IPIP5CS 1000hIP 0003h31000:0003B8 00 00mov ax, 0000IPIP3AX 0000h41000:00068B D8mov bx, axIPIP2BX 0000h51000:0008FF E3jmp bxIPIP2IP 0000h61000:0000B8 23 01mov ax, 0123hIPIP3AX 0123h71000:0003转到第3步循环了 2.12 代码段 在2.8 段的概念中我们知道了什么是段。 那么这段内存中如果存放的是指令我们认为代是个代码段。 但它本质还只是内存中的一堆01当CS:IP指向它CPU就会把它当指令来执行。 例 mov ax, 0000 (B8 00 00) add ax, 0123H (05 23 01) mov bx, ax (8B D8) jmp bx (FF E3)这段长度为 10个字节的指令存放在 123B0H~123B9H 的一组内存单元中。 假如使用 jmp将CS:IP设置为123B:0000 指向了代码段中的第一条指令的首地址。CPU就会执行它了。 2.9~2.12 小结 段地址在8086CPU的段寄存器中存放。当8086PU要访问内存时由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器其中CS用来存放指令的段地址CS存放指令的段地址IP存放指的偏移地址。8086机中任意时刻CPU将CS:IP指向的内容当作指令执行8086CPU的工作过程: 从CS:IP指向的内存单元读取指令读取的指令进入指令缓冲器IP指向下一条指令;执行指令。(转到步骤1重复这个过程。) 8086CPU提供转移指令修改CS、IP的内容。 检测点 2.3 《汇编语言》- 读书笔记 - 检测点 2.3