正在看罗云彬编写的〈windows环境下32位 汇编语言程序设计〉这本书的人请进来看看

时间:2021-02-08 04:52:03
我是汇编语言的初学者,现在正在看罗云彬编写的《windows 环境下32位 汇编语言程序设计》。看到第九页的一段内容时,遇到一些问题。此段内容如下:
    当80386处理器推出后,可以寻址的内存范围达到了4GB,利用XMS驱动程序可以访问所有的4GB地址空间。但16位的段寻址方式限制了DOS程序,“可见”的内存范围还是停留在00000h到FFFF0h+64KB的范围内,所有高于1MB的扩展内存只能通过XMS驱动程序当做数据交换使用,程序的执行空间并没有什么增加。
    关于这一段内容有些不明白的地方:
    (1)何为DOS程序?根据我自己的理解,DOS程序就是运行在DOS操作系统下的程序,近而也就是运行在实模式下的程序(DOS操作系统就是运行在实模式下的)。
    (2)何为16位的段寻址方式?根据我自己的理解,80386虽然有32位的地址总线,并且它的8个通用寄存器和2个专用寄存器也都是32位的(注意,段寄存器还是16位的,这一点上和8086一样)。但是运行在实模式下的80386只使用了32位地址总线上的低端的20位,通用寄存器也仅仅使用低端的2个字节(2个字节是16位),所以还是16位的寻址方式(注意当80386被复位或加电时,其以实模式启动,然后在转入到保护模式)。所谓的段寻址方式,指的是通过段寄存器和通用寄存器,专用寄存器来进行寻址(“段寻址方式“中的“段”对应于”段寄存器“中的”段“),在这里和8086并没有什么不同的。
         在这里我为什么这样咬文嚼字呢?我同时还在看<<art of assemble>>这本书,这是一本纯英文的关于汇编的书籍。这本书也可以说是汇编方面的经典书籍,可以说非常的权威。在这本书(电子版)讲述寻址模式(也可以说是寻址方式)的第四章中,只有寄存器寻址模式(register addressing modes)和存储器寻址模式(memory addressing modes)这两种寻址模式。当然这是两个大类,其中还包含了许多小类别。在这章中没有出现和段寻址方式相对应的英文单词。
         其实,后来仔细想想,所谓的段寻址方式,指的不是哪个具体的寻址模式,而是这些所有的利用段寄存器,通用寄存器和专用寄存器进行寻址的方式的统称。
        其实,在学一些东西的过程中,最大的障碍是对一些术语理解的不清楚。其实看一些英文原版的资料的挺好的,比如说<<art of assemble>>这本书。翻译过来的东西总是一些问题的。但是这本罗云彬老前辈写的书,还是很不错的。值得大家看。这本书估计都是他的自身体验,否则写不了这样好的。
      (3)上面的两个问题自己已经在写这个帖子的时候搞清楚了,第三个问题,还没有搞清楚。第三个问题就出现在““可见”的内存范围还是停留在00000h到FFFF0h+64KB的范围内”这句话上。看不懂这句话。这个范围的大小应该是1MB,但是FFFF0h+64KB的值是10FFF0h而不是FFFFF。为什么呢?麻烦明白这句话的人解释以下。


    最后问大家一个问题:80586系列(当然也可以是其它系列,比如说,80486系列,8086系列等等)cpu的时钟频率是不是都是一样的?也许你从来就没想过会有这样一个问题吧。答案是:可以不一样的。时钟频率不是决定CPU属于哪个系列的因素。那什么决定了cpu是属于哪个系列的呢?答案当然是cpu的结构。cpu的结构决定了cpu属于哪个系列。那又有了一个问题:cpu的结构是什么意思呢?cpu的结构指的就是,cpu有多少位数据总线,cpu有多少位地址总线,cpu有多少寄存器,以及CPU的运作方式等等)。这问题是很小儿科的问题,见笑了。
   麻烦高手看看第三个问题是怎么回事。谢谢。
   

16 个解决方案

#1


还没看到这里,帮你up

#2


最后问大家一个问题:80586系列(当然也可以是其它系列,比如说,80486系列,8086系列等等)cpu的时钟频率是不是都是一样的?也许你从来就没想过会有这样一个问题吧。答案是:可以不一样的。时钟频率不是决定CPU属于哪个系列的因素。那什么决定了cpu是属于哪个系列的呢?答案当然是cpu的结构。cpu的结构决定了cpu属于哪个系列。那又有了一个问题:cpu的结构是什么意思呢?cpu的结构指的就是,cpu有多少位数据总线,cpu有多少位地址总线,cpu有多少寄存器,以及CPU的运作方式等等)。这问题是很小儿科的问题,见笑了。
   麻烦高手看看第三个问题是怎么回事。谢谢。
   

#3


最后问大家一个问题:80586系列(当然也可以是其它系列,比如说,80486系列,8086系列等等)cpu的时钟频率是不是都是一样的?也许你从来就没想过会有这样一个问题吧。答案是:可以不一样的。时钟频率不是决定CPU属于哪个系列的因素。那什么决定了cpu是属于哪个系列的呢?答案当然是cpu的结构。cpu的结构决定了cpu属于哪个系列。那又有了一个问题:cpu的结构是什么意思呢?cpu的结构指的就是,cpu有多少位数据总线,cpu有多少位地址总线,cpu有多少寄存器,以及CPU的运作方式等等)。这问题是很小儿科的问题,见笑了。
   麻烦高手看看第三个问题是怎么回事。谢谢。
 问这个问题的人真的很白痴,也不知道计算机是怎么学的,最基本的东西都不知道,就能问废话,白痴一个,脑子了根本就没建立到底什么是计算机的概念,只是一本字典,你这样的人不论怎么学都没用的了,你不适合或者没有成为高手的潜力了,你适合当中国的老师,你不善于自己归纳和总结,什么都的别人教,就好象我认识一个白痴的初中生,让我帮他补课,我随便问个问题,就知道他没把学的东西建立成一个体系。其实编程思想不完全就编程用,不过是生活中思想的延续而已。很难见到你这么猪的人,哎,想想计算机的那些传奇人物,很多都是非计算机专业的,我现在还记得一个中国传奇人物说的话,现在他说他的大学老师根本就不知道什么是计算机,他毕业前学校就没人比他强了,楼主现在也是一样,根本不知道什么是计算机,你提问中有地方还是错误的问题,根本就问错了,你自己去看看,还拿个英文原版书开玩笑,让我想起我一个白痴同学,UNIX系统工程师呢,还98启动的时候按F8进了存DOS还问我为什么PING 不通呢?妈的都不知道98下的或者2000下的命令行模式和存DOS的区别,头脑中根本就没那种想法,经常看他们回答现实中不懂电脑人的问题,全是错误的回答,我还不敢更正,让人以为他多厉害。都白痴。我们一批计算机专业的学生,可能成高手的不会超过2个,那么多人都白费,不全是中国教育的*问题,是他们根本就不爱好计算机,不是技术狂,至少不像我跟踪个程序半夜3点到4点睡觉,都天天干别的了,要是不真正喜欢计算机,那么学计算机和痛苦,要是喜欢了是乐趣,你好象不是第2种,虽然你很像。心理没真喜欢,当然我现在也不是高手。

#4


楼上的朋友说的很多事情都很对,没想到发一个贴子,搞得你发那么多牢骚.抱歉抱歉.其实吧,我是刚开始接触汇编语言的,原来对这个一点都不懂的.其实吧,做人应该谦虚一点,把成天把自己的长辈挂在嘴上.自己可能在某些方面比别人懂了许多,其实这很正常.我是非英语专业的学生,已经过了八级,你行吗?我是一重点大学的校足球队队长你行吗?说这些东西就没什么意思了,不过遇到你这种人,也就不得不说.这个论坛是用来交流自己的知识的,不是来贬低别人的,也不是来炫耀自己的.
    话又说回来,就是计算机专业的研究生很多也搞不清楚这些东西的,知道吧?10个计算机专业的研究生,懂点汇编的又有几个呢?对计算机的体系结构比较了解的又有几个呢?
   

#5


一个知识和一个知识加起来会大于两个知识.楼上的那个朋友还没有给我解释第三个问题呢,您要是真懂的话,就给我解释一下,谢谢.

#6


怎么?这么"土"的问题,也没什么人回答了?赫赫,说笑了.我的看法,仅供参考.

3.既然是段基址+偏移的寻址模式.
那么0000:0000H到FFFF:FFFF=10FFEFH,也就是0到10FFEF共有10FFF0H个单元了.
在只用20位地址线的情况下:
怎么可能表示10FFEFH呢?所以FFFFFH以上的地址单元100000-10FFEFH会反绕到00000-0FFEFH,就是20位以上的位全被截断(丢失)了.你可以在A20未打开的机器上看看100000-10FFEFH是否和00000-0FFEFH内容对应.(注意有些纯DOS加载了himem.sys已经将A20打开了,你可以去掉himem.sys)

还有关于1,2问题,DOS内核是运行在实模式下的.但其下的程序可就不那么老实了.否则,DPMI为什么要定?WINDOWS是怎么出来地?没有那么死的东西,软件是灵活的.

关于CPU系列,那是人家CPU厂商牛人说了算地,后来大伙就默认了这一标准.当然其中架构是主要的划分原因.

楼上那个几楼的,先鄙视你一下! 闻学有先后,术业有专攻.至少人家是经过思考,虚心求问.你这什么太度? navie! 不多说了,技术版啊.有意见,水园见!

#7


(1)何为DOS程序?
DOS 系统本身对程序的结构限定并不多,而且程序所得到的权限是完全的,你只要将你的程序文件的扩展名改为 .COM .EXE 就可以在 DOS 命令行下执行,具体得到的结果是什么要看你的程序文件,只要以开始,那么其它的你完全可以自己去做,当然也可以做成一个支持保护模式的操作系统。
(2)何为16位的段寻址方式?
依据 INTEL 的寻址定义,段寄存器(16bits) << 4 bits + 偏移地址(16bits),这也就限制了程序所能访问的空间。但是你要用 32bits 偏移地址来寻址那我可管不着。
(3) 如 (2),你所能访问的就是你所见的,其它的是你通过其它程序交换过来的,对你而言是不可见的。

#8


(1)中“只要以开始”应为 “只要以代码开始”

#9


谢谢"校课"和"李诚"的关注,这里还有一个问题,怎么进入纯DOS呢?我的机器安装了windows 2003 server和linux.进入windows 2003 server后怎样进入纯DOS?有的人可能认为通过运行COMMAND命令就可以了,或者点击"开始/所有程序/附件/命令提示符"就可以了.我个人认为那样进入的是虚拟86模式.对吗?请朋友解释一下

#10


还有一个相关的问题.我装的操作系统是windows 2003 server和redhat linux,那我的机器上是不是也安装了DOS操作系统.这个问题又小二科了.不好意思,我读的是建工专业

#11


关于"何为16位的段寻址方式?"这个问题,我自己又有了一些新的理解,(不一定是对的)如下:(1)先来说什么是段寻址?所谓段寻址就是指以"段基址+偏移"来寻址的方式.
    (2)再来说,什么是16位?所谓的16位是指偏移的范围是2的16次方.

#12


各位好,我也买了那本书,我还没有看到那么远,因为我买那本书的目的直接就是为了解决我手头的问题。
    我的课题是要通过对一个国外来的软件的分析,获取其中的几个关键算法。刚开始的时候我觉得自己是问题重重,不过后来发现其中还是有很多诀窍的。
    总结一下吧,我最大的体会是,不要停留在表面去探索什么理论或总去问别人。最好的解决方法是进行一下仿真。具体去跟踪一个软件的运行,去看这样的问题是什么结果。
    我总觉得学汇编本来就是很枯燥的,如果我们一入门就被一些很琐碎的东西障碍住了那只会让我们止步不前,解剖一个麻雀后,慢慢的很多东西就弄明白了。
    最后强烈推荐一下两个个软件:ollydbg,动态调试非常好用,解决了我很大的问题。Idag,也非常好用,静态调试帮我解决了不少问题:可以查函数之间的调用关系,甚至可以画出函数的流程图,尽管太碎了一点。

#13


WIN2K 以后不支持 DOS 实模式,给一个 FAT16 主分区,自己安装 DOS 6.22

#14


MS-DOS6.22不支持FAT32,你可以用MS-DOS7.1,就是用98带的那个.用98启动盘format c:/s即生成MS-DOS7.1的基本内核(IO.SYS,MSDOS.SYS). 2K,XP下的那个命令行是VMM控制的,已非DOS控制了.
我的C盘就是MS-DOS7.1+XP.

#15



总结一下吧,我最大的体会是,不要停留在表面去探索什么理论或总去问别人。最好的解决方法是进行一下仿真。具体去跟踪一个软件的运行,去看这样的问题是什么结果。
    我总觉得学汇编本来就是很枯燥的,如果我们一入门就被一些很琐碎的东西障碍住了那只会让我们止步不前,解剖一个麻雀后,慢慢的很多东西就弄明白了。
-----------------------------------------------------------
同意!

多实践,不唯书,不唯上.我们应该切记!

#16


真诚谢谢steveyoung ,pangbo1979,soroman,w32api,snowwa的帮助.

#1


还没看到这里,帮你up

#2


最后问大家一个问题:80586系列(当然也可以是其它系列,比如说,80486系列,8086系列等等)cpu的时钟频率是不是都是一样的?也许你从来就没想过会有这样一个问题吧。答案是:可以不一样的。时钟频率不是决定CPU属于哪个系列的因素。那什么决定了cpu是属于哪个系列的呢?答案当然是cpu的结构。cpu的结构决定了cpu属于哪个系列。那又有了一个问题:cpu的结构是什么意思呢?cpu的结构指的就是,cpu有多少位数据总线,cpu有多少位地址总线,cpu有多少寄存器,以及CPU的运作方式等等)。这问题是很小儿科的问题,见笑了。
   麻烦高手看看第三个问题是怎么回事。谢谢。
   

#3


最后问大家一个问题:80586系列(当然也可以是其它系列,比如说,80486系列,8086系列等等)cpu的时钟频率是不是都是一样的?也许你从来就没想过会有这样一个问题吧。答案是:可以不一样的。时钟频率不是决定CPU属于哪个系列的因素。那什么决定了cpu是属于哪个系列的呢?答案当然是cpu的结构。cpu的结构决定了cpu属于哪个系列。那又有了一个问题:cpu的结构是什么意思呢?cpu的结构指的就是,cpu有多少位数据总线,cpu有多少位地址总线,cpu有多少寄存器,以及CPU的运作方式等等)。这问题是很小儿科的问题,见笑了。
   麻烦高手看看第三个问题是怎么回事。谢谢。
 问这个问题的人真的很白痴,也不知道计算机是怎么学的,最基本的东西都不知道,就能问废话,白痴一个,脑子了根本就没建立到底什么是计算机的概念,只是一本字典,你这样的人不论怎么学都没用的了,你不适合或者没有成为高手的潜力了,你适合当中国的老师,你不善于自己归纳和总结,什么都的别人教,就好象我认识一个白痴的初中生,让我帮他补课,我随便问个问题,就知道他没把学的东西建立成一个体系。其实编程思想不完全就编程用,不过是生活中思想的延续而已。很难见到你这么猪的人,哎,想想计算机的那些传奇人物,很多都是非计算机专业的,我现在还记得一个中国传奇人物说的话,现在他说他的大学老师根本就不知道什么是计算机,他毕业前学校就没人比他强了,楼主现在也是一样,根本不知道什么是计算机,你提问中有地方还是错误的问题,根本就问错了,你自己去看看,还拿个英文原版书开玩笑,让我想起我一个白痴同学,UNIX系统工程师呢,还98启动的时候按F8进了存DOS还问我为什么PING 不通呢?妈的都不知道98下的或者2000下的命令行模式和存DOS的区别,头脑中根本就没那种想法,经常看他们回答现实中不懂电脑人的问题,全是错误的回答,我还不敢更正,让人以为他多厉害。都白痴。我们一批计算机专业的学生,可能成高手的不会超过2个,那么多人都白费,不全是中国教育的*问题,是他们根本就不爱好计算机,不是技术狂,至少不像我跟踪个程序半夜3点到4点睡觉,都天天干别的了,要是不真正喜欢计算机,那么学计算机和痛苦,要是喜欢了是乐趣,你好象不是第2种,虽然你很像。心理没真喜欢,当然我现在也不是高手。

#4


楼上的朋友说的很多事情都很对,没想到发一个贴子,搞得你发那么多牢骚.抱歉抱歉.其实吧,我是刚开始接触汇编语言的,原来对这个一点都不懂的.其实吧,做人应该谦虚一点,把成天把自己的长辈挂在嘴上.自己可能在某些方面比别人懂了许多,其实这很正常.我是非英语专业的学生,已经过了八级,你行吗?我是一重点大学的校足球队队长你行吗?说这些东西就没什么意思了,不过遇到你这种人,也就不得不说.这个论坛是用来交流自己的知识的,不是来贬低别人的,也不是来炫耀自己的.
    话又说回来,就是计算机专业的研究生很多也搞不清楚这些东西的,知道吧?10个计算机专业的研究生,懂点汇编的又有几个呢?对计算机的体系结构比较了解的又有几个呢?
   

#5


一个知识和一个知识加起来会大于两个知识.楼上的那个朋友还没有给我解释第三个问题呢,您要是真懂的话,就给我解释一下,谢谢.

#6


怎么?这么"土"的问题,也没什么人回答了?赫赫,说笑了.我的看法,仅供参考.

3.既然是段基址+偏移的寻址模式.
那么0000:0000H到FFFF:FFFF=10FFEFH,也就是0到10FFEF共有10FFF0H个单元了.
在只用20位地址线的情况下:
怎么可能表示10FFEFH呢?所以FFFFFH以上的地址单元100000-10FFEFH会反绕到00000-0FFEFH,就是20位以上的位全被截断(丢失)了.你可以在A20未打开的机器上看看100000-10FFEFH是否和00000-0FFEFH内容对应.(注意有些纯DOS加载了himem.sys已经将A20打开了,你可以去掉himem.sys)

还有关于1,2问题,DOS内核是运行在实模式下的.但其下的程序可就不那么老实了.否则,DPMI为什么要定?WINDOWS是怎么出来地?没有那么死的东西,软件是灵活的.

关于CPU系列,那是人家CPU厂商牛人说了算地,后来大伙就默认了这一标准.当然其中架构是主要的划分原因.

楼上那个几楼的,先鄙视你一下! 闻学有先后,术业有专攻.至少人家是经过思考,虚心求问.你这什么太度? navie! 不多说了,技术版啊.有意见,水园见!

#7


(1)何为DOS程序?
DOS 系统本身对程序的结构限定并不多,而且程序所得到的权限是完全的,你只要将你的程序文件的扩展名改为 .COM .EXE 就可以在 DOS 命令行下执行,具体得到的结果是什么要看你的程序文件,只要以开始,那么其它的你完全可以自己去做,当然也可以做成一个支持保护模式的操作系统。
(2)何为16位的段寻址方式?
依据 INTEL 的寻址定义,段寄存器(16bits) << 4 bits + 偏移地址(16bits),这也就限制了程序所能访问的空间。但是你要用 32bits 偏移地址来寻址那我可管不着。
(3) 如 (2),你所能访问的就是你所见的,其它的是你通过其它程序交换过来的,对你而言是不可见的。

#8


(1)中“只要以开始”应为 “只要以代码开始”

#9


谢谢"校课"和"李诚"的关注,这里还有一个问题,怎么进入纯DOS呢?我的机器安装了windows 2003 server和linux.进入windows 2003 server后怎样进入纯DOS?有的人可能认为通过运行COMMAND命令就可以了,或者点击"开始/所有程序/附件/命令提示符"就可以了.我个人认为那样进入的是虚拟86模式.对吗?请朋友解释一下

#10


还有一个相关的问题.我装的操作系统是windows 2003 server和redhat linux,那我的机器上是不是也安装了DOS操作系统.这个问题又小二科了.不好意思,我读的是建工专业

#11


关于"何为16位的段寻址方式?"这个问题,我自己又有了一些新的理解,(不一定是对的)如下:(1)先来说什么是段寻址?所谓段寻址就是指以"段基址+偏移"来寻址的方式.
    (2)再来说,什么是16位?所谓的16位是指偏移的范围是2的16次方.

#12


各位好,我也买了那本书,我还没有看到那么远,因为我买那本书的目的直接就是为了解决我手头的问题。
    我的课题是要通过对一个国外来的软件的分析,获取其中的几个关键算法。刚开始的时候我觉得自己是问题重重,不过后来发现其中还是有很多诀窍的。
    总结一下吧,我最大的体会是,不要停留在表面去探索什么理论或总去问别人。最好的解决方法是进行一下仿真。具体去跟踪一个软件的运行,去看这样的问题是什么结果。
    我总觉得学汇编本来就是很枯燥的,如果我们一入门就被一些很琐碎的东西障碍住了那只会让我们止步不前,解剖一个麻雀后,慢慢的很多东西就弄明白了。
    最后强烈推荐一下两个个软件:ollydbg,动态调试非常好用,解决了我很大的问题。Idag,也非常好用,静态调试帮我解决了不少问题:可以查函数之间的调用关系,甚至可以画出函数的流程图,尽管太碎了一点。

#13


WIN2K 以后不支持 DOS 实模式,给一个 FAT16 主分区,自己安装 DOS 6.22

#14


MS-DOS6.22不支持FAT32,你可以用MS-DOS7.1,就是用98带的那个.用98启动盘format c:/s即生成MS-DOS7.1的基本内核(IO.SYS,MSDOS.SYS). 2K,XP下的那个命令行是VMM控制的,已非DOS控制了.
我的C盘就是MS-DOS7.1+XP.

#15



总结一下吧,我最大的体会是,不要停留在表面去探索什么理论或总去问别人。最好的解决方法是进行一下仿真。具体去跟踪一个软件的运行,去看这样的问题是什么结果。
    我总觉得学汇编本来就是很枯燥的,如果我们一入门就被一些很琐碎的东西障碍住了那只会让我们止步不前,解剖一个麻雀后,慢慢的很多东西就弄明白了。
-----------------------------------------------------------
同意!

多实践,不唯书,不唯上.我们应该切记!

#16


真诚谢谢steveyoung ,pangbo1979,soroman,w32api,snowwa的帮助.

#17