中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 清华的《IBM-PC汇编程序设计》误导我?
作者:
标题: 清华的《IBM-PC汇编程序设计》误导我? 上一主题 | 下一主题
Loff
中级用户




积分 286
发帖 59
注册 2003-4-8
状态 离线
『楼 主』:  清华的《IBM-PC汇编程序设计》误导我?

相信许多人学习dos汇编都是看这本书吧?
里面介绍寻址方式时,解释mov ax,[2000H]一句为:将ds:[2000h]处的内容赋给ax,即,若ds:[2000H]处的值为3020,则执行这一句后,ax =3020H。
      近日调试dos程序,发现形如mov xx,[XXXXh]、add xx,[XXXXh](里面都是数字)的指令都被汇编程序解释为mov xx,xxxxh,即直接将中括号里面的值给了寄存器!也就是说,mov ax,[2000H]执行后, ax=2000H。不信你可以自己编几句,然后装入调试器来查看内存里的代码,会发现执行改句后ax=2000h。
      除非是我的机器有问题,或者编程软件有问题(masm6.11、tasm5、Tdebug)。不然请大家告诉我应该如何理解这种寻址方式。

2004-6-4 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
拉菲尔
初级用户




积分 208
发帖 41
注册 2004-3-25
状态 离线
『第 2 楼』:  

尽信书,不如无书

2004-6-10 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
晓欣
初级用户




积分 154
发帖 14
注册 2003-12-30
状态 离线
『第 3 楼』:  

没有吧,是你自己没有写对吧

2004-6-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Loff
中级用户




积分 286
发帖 59
注册 2003-4-8
状态 离线
『第 4 楼』:  

.386c

cseg    segment byte public use16
   assume  cs:cseg, ds:dseg, ss:sseg
start:  
        mov ax,dseg
        mov ds,ax
lop:
        xor si,si                              ;清零si
        mov word ptr ds:[0C8h],0    ;内存ds:[0C8h]处的值清零
        cmp si,[0C8h]                     ;si的值等于ds:[0C8h]处的值么(0值)
        je _exit                              ;如果等则退出程序
        jmp lop                              ;否则循环判断。
_exit:  
        mov     ax, 4C00h
        int     21h
cseg ends
;---------------------------------------------------
dseg    segment byte public use16
    db    0    dup(1024)
dseg    ends
;----------------------------------------------
sseg    segment stack
        db      100h    dup(?)
sseg    ends
;----------------------------------------------
end   start

程序执行的结果是死循环,而按照[xxxx]是内存地址内容的理解,应该是正常退出程序。用tdb跟踪调试发现cmp一句被编译为 cmp si,00C8,也就是说,[0C8h]被编译器认为是立即数0C8h,而不是代表[0C8h]处存放的值。

再一个例子:
mov [XXXX],ax ; XXXX是一个数值地址,比如1234h。
编译报错:error A2001: immediate operand not allowed(不允许立即方式操作数)
也就是说,编译器将[XXXX]认为是立即数,而不是一个内存地址。
我改为mov ds:[XXXX],ax 就编译通过了。而且正确地存入了该地址。

编译器版本MASM6.11


[此贴子已经被作者于2004-6-12 上午 09:57:35编辑过]




2004-6-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
boblhh9999
中级用户




积分 316
发帖 74
注册 2004-3-4
状态 离线
『第 5 楼』:  

不会吧,那岂不是同立即数一样了

2004-7-1 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Arbiter
初级用户




积分 104
发帖 2
注册 2004-7-14
状态 离线
『第 6 楼』:  

小伙子,多找找自己程序的问题吧!

2004-7-14 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Loff
中级用户




积分 286
发帖 59
注册 2003-4-8
状态 离线
『第 7 楼』:  

搞清楚了,在源代码里面,形如[1234]的形式,都被masm编译器识别为立即数(和书上讲的不同)。只有[寄存器]、[符号地址]才是对应的内存值。但是,在调试器里面看到的[1234]却是内存值,与源代码又不同。

2004-7-14 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
buffon
新手上路





积分 2
发帖 1
注册 2006-5-30
状态 离线
『第 8 楼』:  

书没问题,加上段前缀就ok了。

2006-5-30 10:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pijiudu
新手上路





积分 4
发帖 2
注册 2006-6-29
状态 离线
『第 9 楼』:  

书上说的没错,可以看看王爽的书。通俗易懂。

2009-3-11 22:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cabinsummer
新手上路





积分 6
发帖 3
注册 2009-2-19
状态 离线
『第 10 楼』:  

我刚试了,书上的没错。楼主多找找自己的原因

2009-3-11 22:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Qtwdftxvt
初级用户




积分 190
发帖 101
注册 2008-11-23
状态 离线
『第 11 楼』:  

看书得取其意,不是仅仅观其形。

2009-3-12 11:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 12 楼』:  

1、你的数据段里面声明的是BYTE,用的却是WORD,所以需要加上WORD PTR加以限制。
2、mov 内存,立即数 是可以的,但它不是8086指令集,所以要在程序最前面加.386伪指令,并且要声明内存变量的类型,比如mov word ptr [0C8h],0。

2009-3-12 21:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
MarsKeeper
初级用户





积分 26
发帖 12
注册 2009-4-25
状态 离线
『第 13 楼』:  

mov ax,[2000H]在TASM上的结果与MASM相同。AX的内容为2000H。
12楼的两条理由都是错的,举的例子是对的。

2009-4-28 03:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: