近日从以前的书籍里找到了一张以前记录的笔记,发现了一些早已被我淡忘的关于早期CPU的细节,或者永远也用不上了,但还是决定记录下来,或者......
- 以前的8086/8088 CPU上的一个小BUG
我们都知道,SP寄存器是堆栈的指针,当我们执行一条push(在8086/8088上)指令后,SP寄存器的值会自动减2,可是有没有想过,如果我们执行push sp这条指令的话,应该是先把SP - 2再压入堆栈,还是把SP压入堆栈,再把SP - 2呢?大家可以在你现在的机器上试试,当然应该是先把SP压入堆栈,再把SP - 2喽。
可以在以前的8086/8088上偏偏就出现了这么个BUG,执行push bp指令时,CPU居然把SP -2后才把SP的值压入堆栈,其实即便这样如果再pop sp是能够修正过来也无妨,可是偏偏没有修正,所以,在以前的8086/8088上如果执行push sp后再执行pop sp的话,SP的值和原来的就不同了,幸好很难得使用push sp这种指令。哈哈
- 在偏移为offffh的地方写入一个字,会怎样呢?
在实模式下,每个分段为64K,最大偏移地址是0ffffh,有没有人想过,如果有如下的指令序列会出现什么事情?
(假定此时ds=1234h)
mov si,0ffffh
mov ax,0b1c2h
mov [si],ax
我想问的是,在执行完这三条指令之后,肯定c2h会放到1234h:0ffffh这个这个地方,但是,b1h会放到那里呢?是放在1234h:0这个地方,还是放在2234h:0(1234h加10000h偏移)这个地方呢?
在Intel的CPU上,在一点上居然也是有区别的,在8086上,是第一种请况,上面说的b1h会放在1234h:0这个地方,但是从80186开始,就变成放在2234h:0这个地方了。
要说明的是,在写之前,我试图验证一下这个早已不怎么记得的事,但很是遗憾,没有找到8086的机器,只得作罢了,如果那位读者还能找到8086的机器,不妨试一下,最好能告诉我一下结果,谢谢!
评论