大数据算法,分布式技术,spark技术爱好者
分类: 嵌入式
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语句,sub,add都不行。
调试时-d 0:0,(或者空格)查看的终止下标1f终止到第二行,0f终止到第一行。
3.栈的进出操作完全是为了方便函数。push,pop。ss:sp时刻指向栈顶。栈顶是大头。push ax.
入栈只能如16位数。因为电路板复杂度有限,不可能为了入个al的功能更加复杂化电路。而且push也不能直接操作变量。但是可以直接操作内存中的数。push [0]。 add ax,[0]。都是合法的操作。我们知道其实push操作的是一个栈,栈首先是一个数组,这里cpu可以索引到他。其实为了方便,cpu把他的电路和段寄存器的电路设计的很相似。如下,箭头表示数据流向:
这时候ss:sp指向的栈顶元素就是一个段寄存器类似的单元。而mov命令特殊化为pop和push。
回头看看add指令和sub指令。他们的操作符必须有一个是寄存器。而且不能操作段寄存器,也不能操作栈,因为只有pop,push能操作栈。另外段寄存器没有高低位之分,永远是按字存取,和栈一样。所以段寄存器和栈是一个东西。这样设计电路就方便多了。其实,不光是他俩,内存也是一样的东西。所以你可以看到,内存,栈,段寄存器,彼此之间可以交换数据,但是同类内部不能传输数据,没有自环。这是为什么?其实很简单,他们自己和自己靠的太紧了,容纳不下控制电路。。。ss:sp永远指向即将入栈的位置的上一个“字节”。栈内操作都是按照字。最后一条,8086没有栈顶,栈底寄存器,全靠程序猿自己注意。sp不是段寄存器!sp是寄存器!所以可以mov sp,0010H。sp存着偏移量,就是栈剩余空间的大小(此处要特别注意,当栈大小事64K,且栈空时,sp=0,因为进位了,而栈满也为0,所以是特殊的循环栈,即最大栈是循环栈),按照字节统计,另一种含义上面也介绍了,就是栈顶元素的上一个字节是ss:sp。
有这样一道题很有意思:
不使用 "mov 内存单元,寄存器",完成在10000H处写数据2266H。如果你明白pop,push是特殊的mov,也明白段寄存器,栈和内存单元都是同等地位。就有两种写法。对吧?
4. 在修改段地址寄存器ss的指令执行时,会把下一条指令也直接执行了。和中断有关?目测是因为debug是利用中断实现。但是ss寄存器不支持中断吧,等学到后面就知道了。
5. 执行实验时突然发现可以写如下命令 pop[2],push[4],jmp[2]。大家明白了吧。不用加空格的。