Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183941
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 601
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-03 18:51
个人简介

大数据算法,分布式技术,spark技术爱好者

文章分类

全部博文(29)

文章存档

2015年(4)

2014年(3)

2013年(22)

分类: 嵌入式

2013-07-06 23:54:43

1.段寄存器的特殊性,取决于芯片构造,时刻牢记着一点。学汇编要想着cpu构造。

数据--一般的寄存器--段寄存器

mov ax,1000H

mov ds,ax

mov ax,[0]

mov bx,[2]

mov cx,[1]

add bx,[1]

图可以看出寄存器是一个中转站,自己可以传给自己,其他的都不行!!!。(箭头是数据流)

2.第一章说到80256的数据线是16根,就有了字的概念。传输的时候传输一个字。寄存器大小也是一个字。ok。那么也同样支持按照字节传。字单元就是两个字节大小的单元。

对段寄存器的操作只有mov语句,subadd都不行。

调试时-d 0:0(或者空格)查看的终止下标1f终止到第二行,0f终止到第一行。

 

3.栈的进出操作完全是为了方便函数。push,popss:sp时刻指向栈顶。栈顶是大头。push ax.

入栈只能如16位数。因为电路板复杂度有限,不可能为了入个al的功能更加复杂化电路。而且push也不能直接操作变量。但是可以直接操作内存中的数。push [0] add ax,[0]。都是合法的操作。我们知道其实push操作的是一个栈,栈首先是一个数组,这里cpu可以索引到他。其实为了方便,cpu把他的电路和段寄存器的电路设计的很相似。如下,箭头表示数据流向:

这时候ss:sp指向的栈顶元素就是一个段寄存器类似的单元。而mov命令特殊化为poppush

回头看看add指令和sub指令。他们的操作符必须有一个是寄存器。而且不能操作段寄存器,也不能操作栈,因为只有poppush能操作栈。另外段寄存器没有高低位之分,永远是按字存取,和栈一样。所以段寄存器和栈是一个东西。这样设计电路就方便多了。其实,不光是他俩,内存也是一样的东西。所以你可以看到,内存,栈,段寄存器,彼此之间可以交换数据,但是同类内部不能传输数据,没有自环。这是为什么?其实很简单,他们自己和自己靠的太紧了,容纳不下控制电路。。。ss:sp永远指向即将入栈的位置的上一个“字节”。栈内操作都是按照字。最后一条,8086没有栈顶,栈底寄存器,全靠程序猿自己注意。sp不是段寄存器!sp是寄存器!所以可以mov sp,0010Hsp存着偏移量,就是栈剩余空间的大小(此处要特别注意,当栈大小事64K,且栈空时,sp=0,因为进位了,而栈满也为0,所以是特殊的循环栈,即最大栈是循环栈),按照字节统计,另一种含义上面也介绍了,就是栈顶元素的上一个字节是ss:sp

有这样一道题很有意思:

不使用 "mov 内存单元,寄存器",完成在10000H处写数据2266H。如果你明白poppush是特殊的mov,也明白段寄存器,栈和内存单元都是同等地位。就有两种写法。对吧?

4. 在修改段地址寄存器ss的指令执行时,会把下一条指令也直接执行了。和中断有关?目测是因为debug是利用中断实现。但是ss寄存器不支持中断吧,等学到后面就知道了。

5. 执行实验时突然发现可以写如下命令 pop[2],push[4],jmp[2]。大家明白了吧。不用加空格的。



阅读(2094) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~