![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 07:46 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 清华的《IBM-PC汇编程序设计》误导我? |
| 可打印版本 2,640 / 12 |
| 第1楼 Loff | 发表于 2004-06-04 00:00 |
| 中级用户 发帖 59 积分 286 | |
|
清华的《IBM-PC汇编程序设计》误导我? 相信许多人学习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 |
| 初级用户 发帖 41 积分 208 | |
|
尽信书,不如无书
|
|
| 第3楼 晓欣 | 发表于 2004-06-11 00:00 |
| 初级用户 发帖 14 积分 154 | |
|
没有吧,是你自己没有写对吧
|
|
| 第4楼 Loff | 发表于 2004-06-12 00:00 |
| 中级用户 发帖 59 积分 286 | |
|
.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楼 boblhh9999 | 发表于 2004-07-01 00:00 |
| 中级用户 发帖 74 积分 316 | |
|
不会吧,那岂不是同立即数一样了
|
|
| 第6楼 Arbiter | 发表于 2004-07-14 00:00 |
| 初级用户 发帖 2 积分 104 | |
|
小伙子,多找找自己程序的问题吧!
|
|
| 第7楼 Loff | 发表于 2004-07-14 00:00 |
| 中级用户 发帖 59 积分 286 | |
|
搞清楚了,在源代码里面,形如的形式,都被masm编译器识别为立即数(和书上讲的不同)。只有、才是对应的内存值。但是,在调试器里面看到的却是内存值,与源代码又不同。
|
|
| 第8楼 buffon | 发表于 2006-05-30 10:58 |
| 新手上路 发帖 1 积分 2 | |
|
书没问题,加上段前缀就ok了。
|
|
| 第9楼 pijiudu | 发表于 2009-03-11 22:02 |
| 新手上路 发帖 2 积分 4 | |
|
书上说的没错,可以看看王爽的书。通俗易懂。
|
|
| 第10楼 cabinsummer | 发表于 2009-03-11 22:09 |
| 新手上路 发帖 3 积分 6 | |
|
我刚试了,书上的没错。楼主多找找自己的原因
|
|
| 第11楼 Qtwdftxvt | 发表于 2009-03-12 11:48 |
| 初级用户 发帖 101 积分 190 | |
|
看书得取其意,不是仅仅观其形。
|
|
| 第12楼 netwinxp | 发表于 2009-03-12 21:01 |
| 高级用户 发帖 366 积分 741 | |
|
1、你的数据段里面声明的是BYTE,用的却是WORD,所以需要加上WORD PTR加以限制。
2、mov 内存,立即数 是可以的,但它不是8086指令集,所以要在程序最前面加.386伪指令,并且要声明内存变量的类型,比如mov word ptr [0C8h],0。 |
|
| 第13楼 MarsKeeper | 发表于 2009-04-28 03:13 |
| 初级用户 发帖 12 积分 26 | |
|
mov ax,[2000H]在TASM上的结果与MASM相同。AX的内容为2000H。
12楼的两条理由都是错的,举的例子是对的。 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |