第二章:寄存器
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。
在CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在他们之间进行数据的传送。
程序员通过改变各种寄存器中的内容来实现对CPU的控制。
通用寄存器:AX、BX、CX、DX。
段寄存器:CS、SS、DS、ES。
16位通用寄存器(ax、bx、cx、dx)可以分为两个8位寄存器来用。如:ax可以分为ah和al。
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。
操作数
0~9开头的不用加0,A~F开头的要加0.主要是汇编编译器的设计者需要用户按这个规则编程,否则他设计的编译器不知道你写的是什么。因为标号不能以0~9的数字开头,但可以以字母开头,如果不这样规定一下,那你写的东西其语义是标号呢,还是16进制数呢?
例:错误指令:mov ax,bh
当此指令的意图为寄存器与寄存器之间传送数据时:
错误原因为,寄存器ax为16位寄存器,寄存器bh位数为8位。位数不一致!
当此指令的意图为向寄存器ax传送数据b(16进制)时:
错误原因为,无法识别,操作数开头需要加0.
物理地址(定义):所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址。
16位结构CPU具有以下几方面的机构特征:
运算器一次最多可以处理16位的数据;
寄存器的最大宽度为16位;
寄存器和运算器之间的通路为16位。
也就是说,在8086CPU内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。
物理地址计算方法:在8086CPU中有一种‘地址加法器’的器件,其采用“物理地址=段地址*16+偏移地址(基础地址+偏移地址=物理地址)”的方法用段地址和偏移地址合成物理地址。
段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。
“数据在21F60H内存单元中”的说法:
①数据存在内存2000:1F60单元中;
②数据在内存的2000段中的1F60单元中。
可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。
一个数据的十六进制形式左移1位,相当于乘以16;一个数据的十进制形式左移1位,相当于乘以10;一个X进制的数据左移1位,相当于乘以X。
CS为代码段寄存器,IP为指令指针寄存器。任意时刻,CPU将CS:IP指向的内容当做指令执行。
8086CPU的工作过程:
① 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
② IP指向下一条指令;
③ 执行指令。(转到步骤①,重复这个过程。)
程序员可以通过改变寄存器中的内容实现对CPU的控制。
几条汇编指令:
传送指令:MOV
加法指令:ADD
减法指令:SUB
转移指令:JMP
几种形式:MOV 寄存器,寄存器
寄存器,数据
寄存器,内存单元
内存单元,寄存器
寄存器,段寄存器
段寄存器,寄存器
段寄存器,内存单元
内存单元,段寄存器
ADD 寄存器,数据
寄存器,寄存器
寄存器,内存单元
内存单元,寄存器
SUB 寄存器,数据
寄存器,寄存器
寄存器,内存单元
内存单元,寄存器
JMP 段地址:偏移地址
某一合法寄存器
运行JMP指令,将会两次修改IP。(执行中,放入指令缓冲器修改一次;执行后,转移指令JPM修改IP的值,第二次修改。)
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。
几条命令:
查看、修改CPU中寄存器的内容:R命令
查看内存中的内容:D命令
修改内存中的内容:E命令(可以写入数据、指令,在内存中他们实际上没有区别)
将内存中的内容解释为机器指令和对应的汇编指令:U命令
执行CS:IP指向的内存单元处的指令:T命令
以汇编指令形式向内存写入指令:A命令
- [kanwangxue] 如果是文字的,不是特别好啊,体力活,如果文字还加点动画,那就必须顶了。 01/15 01:10
- [kanwangxue] 必须顶啊。 01/15 00:54
- [ltoiii] 既然是实现loop功能,是否要考虑s和se标号? mov bx,offset s - offset 12/09 12:09
- [xiaoyao2012] 正确 11/01 15:33
- [xuer2016] 又找到2条被我忽视的地方: 1.PUSH 和 POP 针对字单元 2.POP 不能是CS 10/26 10:57
- [xuer2016] 学习了 我书写不规范,16进制字母前不加0,后面不加H,以后要注意了。。。 10/26 10:51
- [xuer2016] 来老师这学习下 10/26 10:31
- [youthangel] 不妙,CPU的利用率一下子就上去了。还好我的处理器不是太弱,35%左右的利用率。建议博主在修改一下 10/20 08:23
- [fpamc] 在我心里她就是我的女神。 10/02 08:58
- [newpeople] 你女朋友用得了简直就是一个女神…… 10/01 08:10
- [99998888] 请您指点一下如何找到会ASSEMBLER 语言的翻译,翻译成中文或英文。我的QQ ; 9097815 07/25 09:56
- [jeremy] 我觉得你学习的挺好,可以加你扣扣吗?我的469614823 08/07 14:46
- [zhangbo0805] 哈哈, 你好呀!很希望认识你呀!我发现你学习的积极性很高!正想向您学习呢! 07/31 23:31
- [tomato] 知道了,排得还挺满。 05/29 16:35
- [tomato] 现在学习情况怎么样?在做课设二还是什么? 05/29 10:41
- [tomato] 你的留言收到了。 05/05 23:51
- [fpamc] 开始学习c咯! 05/03 21:40
- [fpamc] 居然不能发博客了……! 04/22 21:03
- [tomato] 你相册中的游戏界面我看过了,非常好,界面很漂亮,很有创造力。博主,很有潜力。加油,一定能把这个游戏做 04/20 23:46
- [fpamc] 忙了半个月,不在家,没时间学习汇编。 但是在途中想到了一个有史以来最难的程序。对于刚学完9章的我。 04/13 20:56