从代码 *(char *)(_BX+_BX)='a';这里
到 *(char far *)(0x20001000+_BX)=*(char *)_AX;
从字面上理解(_BX+_BX)结果应该是他们的和,但_BX本身不应该变啊,这样看来,下面的应该为
(0x20001000+以前的_BX)了。前面定义了_AX=0x2000;_BX=0x1000;
可是debug中,好像总是用_BX保存别的寄存器值,导致,它本身也变了
如果编程者的意图是得到0x20002000的地址
那么在debug中的结果却是0x20003000,因为前面的一行代码是用add bx,bx来处理(_BX+_BX)的。
那么我们应该在编写程序时怎么才能让程序本身符合我们的意图呢。
我将_AX换成_DX,将_BX换成_AX,再次试验,有了一些改善,尽量不用_BX,可是却出现push ax的事情,真不懂机器到底怎么处理这些代码。
望哪位高手能详细解释一下这第1题的原理? |