tl0760 发表于 2007-1-7 15:34

[求助]低级问题,请指点!

<P>以前学了点汇编的皮毛,现在要用到它。可自己调一个简单的程序都实现不了。特来请教!<BR><BR>下面的程序是在数据段中给a赋值0。在代码段中将a的偏移地址放入ax中,段地址放入bx中。<BR>可是在TD中查找到其存放地址,发现那个地址上的内容并不是a的值0。<BR><BR>data1 segment<BR>        a dw 0<BR>data1 ends<BR>code1 segment<BR>        assume cs:code1,ds:data1<BR>start:<BR>        mov ax,data1<BR>        mov ds,ax<BR><BR>        mov ax,offset a<BR>        mov bx,seg a<BR>code1 ends<BR>        end start<BR><BR></P>

曾小 发表于 2007-1-7 20:20

<STRONG>-d 0b4f :0000 得到的是 0 啊!<br>你没搞错吧>???????</STRONG><br><br><br>
[align=right][color=#000066][此贴子已经被作者于2007-1-7 20:22:54编辑过][/color][/align]

曾小 发表于 2007-1-7 20:23

<DIV class=quote><B>以下是引用<U>曾小</U>在2007-1-7 20:20:27的发言:</B><BR><STRONG>-d 0b4f :0000 得到的是 0 啊!<BR>你没搞错吧>???????</STRONG><BR><BR><BR><BR></DIV>
<p>

tl0760 发表于 2007-1-8 22:00

<P>谢谢楼上的同志!<BR><BR>我是真的搞不懂了,我可能连怎么查看内存内容都忘记了。<BR><BR>请给我说一下怎么查看!</P>

菜鸟上路 发表于 2007-1-8 22:12

<P>用基址寄存器或变址寄存器试下吧</P>
[align=right][color=#000066][此贴子已经被作者于2007-1-9 13:04:50编辑过][/color][/align]

tl0760 发表于 2007-1-9 12:10

能不能说明白点呢?<BR><BR>我也去网上查查吧。

菜鸟上路 发表于 2007-1-9 13:04

<DIV class=quote><B>以下是引用<U>tl0760</U>在2007-1-7 15:34:04的发言:</B><BR><BR>下面的程序是在数据段中给a赋值0。在代码段中将a的偏移地址放入ax中,段地址放入bx中。<BR><FONT color=#ff0000>可是在TD中查找到其存放地址,发现那个地址上的内容并不是a的值0。</FONT><BR><BR><BR><BR></DIV>
<P>不知道这句是什么意思。那个地址是哪个地址?<BR>基址寄存器就是BX,BP,变址寄存器就是SI,DI,SP</P>

tl0760 发表于 2007-1-10 12:35

<P>我认为段地址(16位)左移4位(20位)+偏移地址(16位)就是其物理地址,<BR>所以通过  mov bx,seg a   将段地址存入bx通用寄存器,<BR>    通过  mov ax,offset a   将偏移地址存入ax通用寄存器。<BR>然后,查看数据段中a存放位置的值。<BR><BR>我就是这样搞的。</P>

菜鸟上路 发表于 2007-1-10 12:52

都没看过mov ax,offset a这种写法[em04],不如用mov di,offset a试试

tl0760 发表于 2007-1-10 20:48

<P>好象还是不行,可能我哪里弄错了。。。<BR><BR>算了,找其他方法解决吧。<BR><BR>谢谢楼上的同志了!</P>

lefttime 发表于 2007-1-10 21:07

<P>[em03]一个值而已,搞得那么多支节<BR>楼主就是想得到a的物理地址吧,再从物理地址查看a的值吧;<BR>先把你的程序写好,你漏了程序结束,这样编译能通过,但是执行可就会出错<BR>......<BR>mov bx,seg a<BR><STRONG><FONT color=#ff0000>mov ah,4ch<BR>int 21h</FONT></STRONG><BR>code1 ends<BR>        end start<BR>行啦,生成可执行程序后,让我们跟踪下<BR>在命令提示符下用DEBUG调试看看(假设生成文件为test.exe)<BR>debug test.exe<BR>-t<BR>....        ;这是显示跟踪单步后出的数据<BR>-t<BR>....        ;同上<BR>-t<BR>....<BR>-t<BR>....        ;照你的程序跟踪执行4步已经能得看到ax,bx中的值,也就是你想得到的段基址和偏移地址啦<BR>-d <FONT color=#ff0000><STRONG>XXXX</STRONG></FONT>:<STRONG>XXXX</STRONG>    ;红色部分改成bx中的值,后面改为ax中的值,这样你就能看到啦[em03]<BR><BR><BR></P>

tl0760 发表于 2007-1-12 16:15

<DIV class=quote><B>以下是引用<U>lefttime</U>在2007-1-10 21:07:27的发言:</B><BR>debug test.exe<BR>-t<BR>....        ;这是显示跟踪单步后出的数据<BR>-t<BR>....        ;同上<BR>-t<BR>....<BR>-t<BR>....        ;照你的程序跟踪执行4步已经能得看到ax,bx中的值,也就是你想得到的段基址和偏移地址啦<BR>-d <FONT color=#ff0000><STRONG>XXXX</STRONG></FONT>:<STRONG>XXXX</STRONG>    ;红色部分改成bx中的值,后面改为ax中的值,这样你就能看到啦[em03]<BR></DIV>
<P>楼上的同学比起我来真是太厉害了。。。<BR>十分感谢你的帮忙!<BR><BR>随便问一下上面我引用部分的命令原来我都不知道也(不知道是我们学校什么都不教,还是我什么都不爱学。。),如果要学习的话应该学习什么好呢?<BR></P>

YYFYQZY 发表于 2007-5-9 22:24

我也想知道

爱以走远 发表于 2007-5-9 22:33

你最后加mov ah,4ch<BR>    int 21h  

爱以走远 发表于 2007-5-9 22:35

<DIV class=quote><B>以下是引用<U>菜鸟上路</U>在2007-1-10 12:52:58的发言:</B><BR>都没看过mov ax,offset a这种写法[em04],不如用mov di,offset a试试</DIV>
<P>   可以哈  不过我个人认为还是用lea  ax,a   这样用不着加什么   呵呵  <BR>     不好意思   我没看问题已经解决拉   多留拉一哈 [em04][em04]<BR>   </P>

chaogang 发表于 2007-5-10 00:12

<DIV class=quote><B>以下是引用<U>爱以走远</U>在2007-5-9 22:35:42的发言:</B><BR><BR>
<P>   可以哈  不过我个人认为还是用lea  ax,a   这样用不着加什么   呵呵  <BR>     不好意思   我没看问题已经解决拉   多留拉一哈 [em04][em04]<BR>   </P></DIV>
<p>[em02][em03]好象问题的本质是 ax不能直接拿来存偏移地址

爱以走远 发表于 2007-5-10 15:08

<DIV class=quote><B>以下是引用<U>chaogang</U>在2007-5-10 0:12:11的发言:</B><BR><BR>
<P>[em02][em03]好象问题的本质是 ax不能直接拿来存偏移地址</P></DIV>
<P>  不错哈  呵呵   做偏移地址的只有bx   sp   si   di  bp   ip   <BR>      </P>

页: [1]

编程论坛