Loading... # 汇编语言学习(三)~寄存器 ## 通用寄存器 8086CPU的所有寄存器都是16位的,可存放两个字节 AX、BX、CX、DX这四个寄存器通常用来存放一般性数据,称为通用寄存器 AX可分为低8位AL和高8位AH寄存器 ## 汇编指令 ### 双操作指令 | 汇编指令 | 控制CPU完成的操作 | 高级语言描述 | | ----------- | ------------------------------------ | -------------- | | mov ax,18 | 将18送入寄存器AX | AX=18 | | mov ah,78 | 将78送入寄存器AH | AH=78 | | add ax,8 | 将寄存器AX中的数值+8 | AX=AX+8 | | mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX=BX | | add ax,bx | 将AX和BX中的数值相加,结果存在AX中 | AX=AX+BX | **指令的两个操作对象的位数应当是一致的** ### 单操作指令 | 汇编指令 | 控制CPU完成的操作 | 高级语言描述 | | ---------- | ----------------------------------------------- | -------------- | | inc ax | AX中数值加1 | AX+=1 | | push ax | 进栈,将AX中的数值分为2个字节压入(存入)堆栈 | …… | ### 无操作指令 | 汇编指令 | 控制CPU完成的操作 | | ---------- | -------------------------------------------------------- | | NOP | 空操作指令,什么操作也不做,CPU空转3个节拍(时钟周期) | | CLC | 进位标志CF清零,目的操作数隐含 | | HLT | 停机指令,CPU不再执行任何指令,中断除外 | ### 指令属性 指令长度:汇编指令对应机器指令的长度(以字节为单位) ![image-20220221155914448.png](http://xherlock.top/usr/uploads/2022/02/3508914791.png) 指令执行时间:执行一条汇编指令需要的节拍(时钟周期)数 ![image-20220221155926414.png](http://xherlock.top/usr/uploads/2022/02/2410712477.png) ## 16位结构CPU * 运算器一次最多可以处理16位的数据 * 寄存器的最大宽度是16位 * 寄存器和运算器之间的通路为16位 ## 寻址方式 获取操作数的方式 * 操作数放在寄存器中,或作为立即数直接写在指令中,CPU不需要访问存储器(内存)就可以得到操作数 * 如果操作数放在存储器(内存)中,CPU就需要访问存储器,指令中就要给出操作数的逻辑地址(段地址和偏移地址),通过对应的物理地址得到操作数 * 如果操作数在端口,则需要专门的指令访问 ### 直接寻址方式 eg:mov bx, [1000H] 指令把从程序内存映射起偏移1000H个字节的哪个字单元(2ge字节)中的内容传送到寄存器BX中,1000H使用数值表示的内存中的地址 eg:mov bx, var var时程序中定义的一个变量,变量对应于 内存中的字节单元或字单元,引用变量名称即是引用内存单元的地址(变量名称实质上是符号位移量,在汇编过程中会被替换为具体的数值位移量) eg:mov cl, da+3 目的操作数为寄存器寻址,DA是变量名,+3是指由DA字节单元起向高地址端偏移3个字节后的字节单元 ### 寄存器间接寻址方式 eg:mov CH, [SI] 将(SI)作为内存地址指向的内存单元中的数据传送到寄存器CH ### 基址寻址和变址寻址 都针对内存操作数,偏移量由地址指针寄存器中的内容和指令中给出的位移量两部分相加得到 ![image-20220221165650966.png](http://xherlock.top/usr/uploads/2022/02/1426281431.png) Disp:位移量 eg:MOV AX, [SI+10H] 把EA=(SI) + 10H的字单元中的数据传送到AX寄存器中 ### 基址变址寻址 ![image-20220221170200123.png](http://xherlock.top/usr/uploads/2022/02/4039703650.png) eg:MOV AX, [BX+SI+200H] (BX)为基址分量,(SI)为变址分量,200H为数值位移量 **这么多种寻址方式是为了对数据读写操作的方便、灵活** 8086CPU有20位地址总线,可以传送20位地址,达到1MB的寻址能力,而其又是16位结构,只能传送16位的地址,表现出的寻址能力只用64KB 故在内部用2个16位地址合成的方法来形成1个20位的物理地址 <img src="http://xherlock.top/usr/uploads/2022/01/3972869543.png" alt="B6C23C5E06B101E5C1AEDFF621F57D70" style="zoom: 50%;" style=""> 步骤 1. CPU中相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址 2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件 3. 地址加法器将两个16位地址合成为一个20位的物理地址 4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路 5. 输入输出控制电路将20位物理地址送上地址总线 6. 20位物理地址被地址总线传送到存储器 地址加法器:物理地址=段地址×16+偏移地址 eg:访问123C8H的内存单元,123C8=1230×16+00C8 **一个段的起始地址一定是16的倍数,一个段的最大长度为64KB** CPU可以用不同的段地址和偏移地址形成同一个物理地址 ## 段寄存器 CS、DS、SS、ES CS:代码段寄存器 IP:指令指针寄存器 在8086PC机中,CPU读取CS×16+IP来执行指令 修改CS、IP指令:jmp jmp 2AE3:3 执行后:CS=2AE3H,IP=0003H,CPU从2AE33H处读取指令 仅修改IP:jmp ax ≈ mov IP,ax ![image-20220221153911891.png](http://xherlock.top/usr/uploads/2022/02/2713571448.png) ## 地址寄存器 ![image-20220221153938485.png](http://xherlock.top/usr/uploads/2022/02/3065348729.png) ## 控制寄存器 ![image-20220221154054007.png](http://xherlock.top/usr/uploads/2022/02/1011390446.png) ![image-20220221154140330.png](http://xherlock.top/usr/uploads/2022/02/3357673483.png) ![image-20220221154150380.png](http://xherlock.top/usr/uploads/2022/02/1673811277.png) ## 实验:查看CPU和内存,用机器指令和汇编指令编程 DOSBox下载[DOSBox download | SourceForge.net](https://sourceforge.net/projects/dosbox/) MASM https://files-cdn.cnblogs.com/files/dgwblog/DOSBox.rar 安装DOSBox最好别在C盘,下好后,点击目录下的DOSBox 0.74-3 Options.bat ![image-20220117161316074.png](http://xherlock.top/usr/uploads/2022/01/3609966158.png) 找到如下改DOSBox的窗口大小,原来的太小 ![image-20220117161427505.png](http://xherlock.top/usr/uploads/2022/01/2641830567.png) 现在你的dosbox目录下建一个asm文件夹,将asam解压后的文件放入该文件夹中。在上面这个设置文件里最后添加映射目录,目录填写你自己的目录,比如d盘,就填 mount d d:\目录 d: ![image-20220117161512160.png](http://xherlock.top/usr/uploads/2022/01/2220419492.png) 各种操作 ![image-20220117180157735.png](http://xherlock.top/usr/uploads/2022/01/3356317719.png) 最后修改:2022 年 03 月 28 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏