首页
社区
课程
招聘
[求助]一段汇编代码的疑惑!
发表于: 2008-6-19 14:18 6307

[求助]一段汇编代码的疑惑!

2008-6-19 14:18
6307
最近在看"没有风"的汇编专题,在用DEBUG学习汇编的过程中有下面一段代码不太理解,
请前辈指点,谢谢 :-)
问题描述:比如我输入字符串"123456$",那么下面代码输出的字符串头部会
多一个0x20字符;如果把红色字体部分的代码改为:MOV DX,0118,那么输出就是预期的结果
"123456"! 我用DEBUG命令:D0116看到的数据确实是多了一个0x20字符.
那么0116 DB 20处定义的缓冲区的首址到底是0118还是0116呢?是不是我对DB伪指令理解错了?

输入A100
0100 BA1601      MOV    DX,0116             ; 装入缓冲区首址
0103 B40A          MOV    AH,0A                 ; INT 21的0A功能
0105 CD21          INT      21                      ; 用户输入一个以$结束的字符串
0107 B20A          MOV    DL,0A                  ; 输出一个换行码
0109 B402          MOV    AH,02                 ; INT 21的02功能
010B CD21          INT      21                     
010D BA1601      MOV    DX,0116             ; 装入字符串的起始位置
0110 B409          MOV    AH,09                 ; INT 21的09功能
0112 CD21          INT      21                      ; 输出字符串
0114 CD20          INT      20                      ; 退出程序
0116                   DB       20                      ; 定义缓冲区存放我们输入的字符串

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
两点建议,个人愚见,仅供参考。
1. 不要再学win16 了, 要学就学win32. (win64 也行啊,我的机器不是)
哎!主要是bios 启动,系统加载会用到win16, 否则win16早就该退役了。
如果你不写bios 不写loader, 就不要学win16, 其它全是win32 天下。
2. 不要用debug 调试了,调试ring3 就用ollydbg, ring0 就用windbg

3. 你的问题? 啊! 对不起,我没看清楚。仔细看一眼。
明摆着吗,0116处有一个0x20, 从这个地址开始显示,当然会多显示一个空格了
2008-6-19 20:59
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
没记错的话
AH=0A  INT21 其 DX 所指的第1个Byte表示此buffer的长度
所以, 你DX=0116, 你输入的字是由0117开始存.

db 20h        表示你这buffer长度为20h bytes

你试试你可输入几个字
2008-6-19 21:15
0
雪    币: 217
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的解答,经验证确实是这样!
2008-6-20 09:11
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
5
可是不学16位的汇编,32位有很多东西会看不明白的
2008-6-20 09:40
0
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
不会吧? 32位比16位容易呀, ring3 下 32位都是平坦模式,平坦模式说白了就是简单模式,不用考虑cs, ds,.... 大家都在一个段里,有4G
的空间,总比16模式下,空间小(多少来着,好像是1M还要掐头去尾,还要考虑块,你一块cs,我一块ds。。
指令集是一样的...  ,目标码差别由汇编器完成。 32位,简单而强大
2008-6-20 15:18
0
雪    币: 808
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
支持楼上的说法。
但是对刚接触汇编的人来说,还是先学习16位的汇编来理解下指令的含义,对学习32位的汇编有很好的帮助。
2008-6-20 21:29
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看来你学的不是汇编,而是windows32api的汇编模式。
如果你多看看保护模式汇编就会明白32位汇编比16位的寻址复杂多了。
任何操作系统的系统调用都会最终使用中断
dos下使用 int 21h
linux/unix下使用int 80h
windows也有他自己的系统调用中断(比如win2k的int 2eh)。
windowsapi都封装封装的很深了。

平坦模式,那只是windows模拟出来的和一个一个的小“虚拟机”。
2008-6-21 12:46
0
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
看来老兄误会我的意思了。
我知道32位汇编使用的是段,页式存储。从而引出逻辑地址,线性地址,物理地址三种地址的差别,寻址比16位复杂的多。但这些复杂的地址变化,对ring3 是看不见的。....
你要是想完全掌握win32 编程。做ring0 程序,写操作系统,那确实要学更多的东西,不过入门还是从ring3, 写应用开始吧。win32 ring3 的坎是比win16 的坎还要低的。
好了,别的我也不多说了。
win16 的存在价值前边我也说了,若不是出于兼容的目的,win16 确实早就应该不存在了,是旧的东西拖了后腿。 看看新出的没有包袱的32位cpu ,sparc, mips, st 都已崭新的32位汇编语言出现, arm
的主流是32位模式,但也支持16 位模式, 但那是为了紧缩代码的目的,它仍然发挥着32位的威力。与intel 为了兼容的目的不一样。
会有人同意我的观点的,当然也不能要求所有人员都同意。
我的观点及理由基本上都说了, 后边就这个话题就不在参加讨论了。
2008-6-21 14:12
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
10
呵,没什么的,大家就一个问题,发表自己的看法而已

不过Windows的确是帮忙解决了不少的问题
2008-6-21 21:22
0
雪    币: 212
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我觉得16位的汇编基本了解下就可以了,不需要太深入,从而转向Win32汇编。不过可惜现在还有很多高校仍然使用那16位汇编做教材呢。
2008-6-22 23:05
0
游客
登录 | 注册 方可回帖
返回
//