中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-25 13:33
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 清华的《IBM-PC汇编程序设计》误导我? 查看 2,332 回复 12
楼 主 清华的《IBM-PC汇编程序设计》误导我? 发表于 2004-06-04 00:00 ·  中国 湖北 武汉 鹏博士宽带
中级用户
★★
积分 286
发帖 59
注册 2003-04-08 00:00
23年会员
UID 1437
性别 男
状态 离线
相信许多人学习dos汇编都是看这本书吧?
里面介绍寻址方式时,解释mov ax,一句为:将ds:处的内容赋给ax,即,若ds:处的值为3020,则执行这一句后,ax =3020H。
近日调试dos程序,发现形如mov xx,、add xx,(里面都是数字)的指令都被汇编程序解释为mov xx,xxxxh,即直接将中括号里面的值给了寄存器!也就是说,mov ax,执行后, ax=2000H。不信你可以自己编几句,然后装入调试器来查看内存里的代码,会发现执行改句后ax=2000h。
除非是我的机器有问题,或者编程软件有问题(masm6.11、tasm5、Tdebug)。不然请大家告诉我应该如何理解这种寻址方式。
2 发表于 2004-06-10 00:00 ·  中国 河南 洛阳 联通
初级用户
积分 208
发帖 41
注册 2004-03-25 00:00
22年会员
UID 21059
性别 男
状态 离线
尽信书,不如无书
3 发表于 2004-06-11 00:00 ·  中国 四川 成都 联通
初级用户
积分 154
发帖 14
注册 2003-12-30 00:00
22年会员
UID 14671
性别 男
状态 离线
没有吧,是你自己没有写对吧
4 发表于 2004-06-12 00:00 ·  中国 湖北 武汉 鹏博士宽带
中级用户
★★
积分 286
发帖 59
注册 2003-04-08 00:00
23年会员
UID 1437
性别 男
状态 离线
.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:,0 ;内存ds:处的值清零
cmp si, ;si的值等于ds:处的值么(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

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

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

编译器版本MASM6.11


5 发表于 2004-07-01 00:00 ·  中国 辽宁 丹东 联通
中级用户
★★
积分 316
发帖 74
注册 2004-03-04 00:00
22年会员
UID 19167
性别 男
状态 离线
不会吧,那岂不是同立即数一样了
6 发表于 2004-07-14 00:00 ·  中国 陕西 西安 电信
初级用户
积分 104
发帖 2
注册 2004-07-14 00:00
21年会员
UID 28341
性别 男
状态 离线
小伙子,多找找自己程序的问题吧!
7 发表于 2004-07-14 00:00 ·  中国 湖北 武汉 鹏博士宽带
中级用户
★★
积分 286
发帖 59
注册 2003-04-08 00:00
23年会员
UID 1437
性别 男
状态 离线
搞清楚了,在源代码里面,形如的形式,都被masm编译器识别为立即数(和书上讲的不同)。只有、才是对应的内存值。但是,在调试器里面看到的却是内存值,与源代码又不同。
8 发表于 2006-05-30 10:58 ·  中国 广东 深圳 福田区 电信
新手上路
积分 2
发帖 1
注册 2006-05-30 10:30
20年会员
UID 56245
状态 离线
书没问题,加上段前缀就ok了。
9 发表于 2009-03-11 22:02 ·  中国 北京 鹏博士宽带
新手上路
积分 4
发帖 2
注册 2006-06-29 09:19
19年会员
UID 57725
状态 离线
书上说的没错,可以看看王爽的书。通俗易懂。
10 发表于 2009-03-11 22:09 ·  中国 湖北 武汉 电信
新手上路
积分 6
发帖 3
注册 2009-02-19 15:58
17年会员
UID 139283
性别 男
状态 离线
我刚试了,书上的没错。楼主多找找自己的原因
11 发表于 2009-03-12 11:48 ·  中国 黑龙江 大兴安岭地区 联通
初级用户
★★
积分 190
发帖 101
注册 2008-11-23 14:58
17年会员
UID 131841
性别 男
状态 离线
看书得取其意,不是仅仅观其形。
12 发表于 2009-03-12 21:01 ·  中国 福建 厦门 电信
高级用户
★★★
积分 741
发帖 366
注册 2007-07-25 19:11
18年会员
UID 94024
性别 男
状态 离线
1、你的数据段里面声明的是BYTE,用的却是WORD,所以需要加上WORD PTR加以限制。
2、mov 内存,立即数 是可以的,但它不是8086指令集,所以要在程序最前面加.386伪指令,并且要声明内存变量的类型,比如mov word ptr [0C8h],0。
13 发表于 2009-04-28 03:13 ·  IANA 局域网IP(Private-Use)
初级用户
积分 26
发帖 12
注册 2009-04-25 22:52
17年会员
UID 143791
性别 男
状态 离线
mov ax,[2000H]在TASM上的结果与MASM相同。AX的内容为2000H。
12楼的两条理由都是错的,举的例子是对的。
论坛跳转: