. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->综合研究
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  研究实验3(1)怎么就想不通呢  [待解决] 回复[ 3次 ]   点击[ 811次 ]  
huige
[帖 主]   [ 发表时间:2009-05-29 15:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-15 23:01
从代码 *(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题的原理?
starrynight
[第1楼]   [ 回复时间:2009-06-04 16:59 ]   [引用]   [回复]   [ top ] 
荣誉值:98
信誉值:2
注册日期:2007-10-09 18:23
AX是累加寄存器。
BX是基址寄存器。
tomato
[第2楼]   [ 回复时间:2009-06-15 17:31 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
程序执行的结果确实不是理论应该的结果,导致这个问题的原因是因为寄存器太少,尤其是像寄存器BX这样的,出现了混乱,导致结果不正确。解决的一个方法是将程序中的BX用寄存器DX来替换。通过这个例子,我们可以知道,为什么我们通常编程都不使用寄存器,因为不安全。
crazyman
[第3楼]   [ 回复时间:2009-06-16 12:05 ]   [引用]   [回复]   [ top ] 
荣誉值:152
信誉值:3
注册日期:2008-01-24 21:26
楼主一步步的对照debug看上两遍,看看跟自己的思维有多少不一样的地方,可能会理解的比较快点。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved