回 帖 发 新 帖 刷新版面

主题:编程相关知识简介(2005-3-24内容更新)

希望对电脑爱好的网友能认真看完
“功夫在诗外”,学编程或者是学计算机的学生,不可避免的要接触或者是要求了解编程以外的这些知识!
如果不了解系统基本相关原理,也很难写出高质量的程序!
除了系统的基本原理,程序调试技巧也非常重要,写一个程序要10分钟,也许调试它要50分钟或者更多。
在这里我只能找到系统相关的一小部分,更多的只有靠自己去找,我想开阔一下大家的思路!

3、系统篇  2、键盘篇 1、文件篇
  当一种编程语言运用熟练以后,就不可避免的接触一些计算机原理和一些相关知识,这样就需要找找相关的计算机书籍来看了,通过学习以后能对自己的编程又有提高,反过来又通过编程促进了对系统的了解,我自己就买过一些计算机原理和汇编语言方面的书籍,虽然我并不学习这些语言.

1  文件系统
   文件的操作是电脑最频繁 最常用 的内容 对于一个学习编程的网友来说,对文件的使用是很必要而且很基本的操作,所以我们应该很详细的了解这方面的知识。

   我们大家的电脑上99%的用的都是WIN的操作系统,所以我们首先来看看WINDOWS对本地硬盘上的文件管理。
       WINDOWS的文件系统有两种格式FAT格式和NTFS格式 ,这两个系统上对文件编程并没有什么很特别的地方,都可以用OPEN 。。。来打开一个文件。
    WINDOWS文件系统的最小读写单位是簇,一个簇包含多个扇区(一个扇区有512个字节),也就是一个文件就算你只有1一个字节,他也要在你的硬盘上占用几个扇区。(而对于硬盘,它的最小的读写单位是扇区,一个扇区的大小一般是512个字节,就算你只有一个字节的内容要写扇区,他也要占用512个字节。很少有人去绕过操作系统自己来读写硬盘)

   注意:所有磁盘上的文件都是可以用QB的文件语句打开操作的.这与文件的类型格式没有关系!
     
路径:    
    对于一个编程学习的网友来说,文件中比较重要的就是路径的概念了,WINDOWS以目录树的形式管理磁盘,这里的目录就是文件夹。他是一层一层的,构成一个树的形式。在一个盘符中最底层的目录为根目录,根目录下的目录都称为它的子目录,根目录用"\"表示,一个目录的上一层目录用".."表示。我们可以通过路径来查找某一个文件或目录,路径就如同地址一样,可以使用户方便、准确地进行查找。比如"C:\Windows\Command\deltree.exe"就是一个文件的路径。

相对路径与绝对路径:

如果从根目录开始定位一个文件,则其路径称为该文件的绝对路径,如上述的例子。
  如果我们使用计算机的话,一定使用磁盘或光盘之类的外部存储器,我们必然处于其中的某个位置,
比如C:\Dos,我们称之为当前目录,在某个盘中,我们只能也必然处于某一(不是二、三)个位置,所以,我们的某个盘的当前目录只有一个,但是我们可以改变当前目录。
  从当前目录算起来定位一个文件,所经过的路径称相对路径。比如,..\ABC\Readme.txt,其中,
..\ABC\ 就称为当前目录为 C:\Dos 时文件Readme.txt所在的相对路径,同样,Tools\Hdcopy.exe 也是相对路径表示方法,只是Tools是当前目录 C:\Dos 下的子目录。这里的..表示上级目录。
文件:
  在同一个目录下,不允许存在相同名称的文件或目录 
电脑中的数据主要都是以文件形式存储的,文件是相关数据的集合,若干数据聚集在一起组成一个文件。每个文件都有文件名,文件名由主文件名和扩展名两部分组成,中间有小圆点隔开。扩展名的类型一般是约定俗成的,比如test.bas,他的扩展名是.BAS,这个是BASIC的文件,如:TEST.TXT,他的扩展名是TXT,这个就是文本文件,当然,你也可以把扩展名随便改,这个都是无所谓的,DOS6.22及其以前版本最多仅支持8个字符的主文件名和3个字符的后缀名,而从Windows 95的DOS7.0开始就可支持128个字符的主文件名和后缀名。字母、汉字、数字和一些特殊符号如"!、@、#"都可以作为文件名,但不能有"/、\、|、:、?"等符号。
   
  由于QB是DOS时代的产物,所以不支持长文件名,在QBASIC中 打开一个文件,文件名不能大于8+3个字符,如果要用长文件名,也不市没有办法的,对于一个编程的人来说,不要轻易的说这个那个语言有局限,做不到,而是要说我一定能做到,事实上也能做到。虽然qb语言本身不提供长文件名,但是可以调用扩展中断来实现长文件名读写、显示.
     在QBASIC中你在用OPEN语句打开文件往里面写东西的时候,到底是怎么写进去的呢,(操作系统完成写文件过程也一样),其实都是调用的操作系统提供的文件服务功能,QBASIC的写文件语句调用了INT21中断中的文件服务功能,在操作系统接受写文件功能以后,文件服务功能模块就在FAT(文件分配表)中找这个文件所在的簇,找到以后就转换成绝对的扇区号,然后调用BIOS中的INT13中断(这个中断是专门用于磁盘服务的,一般由主板上的BIOS芯片中的程序提供),BIOS会把中断请求翻译转换到相应IO比如1F0...1F7这样的端口,硬盘上也有BIOS芯片,它接受到请求后会根据这些数据转换成具体的内容,最后才驱动磁头完成一次写操作,这个过程说起来很长,电脑实现起来是非常快的!
    知道这个过程有什么好处呢,举个简单例子,现在的网吧很多都用还原精灵保护,按照上面的原理来分析,他可以从这样的环节来控制写硬盘,一替换INT21中断的文件 二替换INT13的写硬盘,三监视端口,最后就是对硬盘上BIOS的控制了!通过分析还原精灵是替换了INT13中断(市场上的还原卡也类似),所以我们可以饶过它,直接用端口来写!
      用QB可以打开硬盘上所有格式的文件(不含NT系统)也就是你可以对一个电脑里的硬盘上任何的文件进行操作,如果你改写了WINDOWS关键的文件,例如在WIN98中你 用
OPEN "C:\WINDOWS\WIN.COM" FOR BINARY AS #1
FOR I=1 TO LOF(1)
    PUT 1,I,0
NEXT 
END
系统就无法正常启动运行了,所以学习好文件的使用是非常非常的重要,希望大家重视,而且这个东西也不复杂,很容易就能学明白!

在QB中,操作文件是极其方便的 ,比C语言要方便很多,而且在vb中的文件语句也是一样的用法。

有关文件语句的操作请大家多加练习!






回复列表 (共4个回复)

沙发

二 键盘篇
由于qbasic不提供一些需要的键盘功能,所以要做一些东西就得看看这篇帖子,然后可以实现KeyDOWN、KeyUP、KeyP.....
当在键盘上“按下”或“放开”一个键时,如果键盘中断是允许的(21H端口的第1位=0,如果你能操作21H,就可以封锁键盘硬盘等等设备),就会产生一个类型9的中断,并转入到BIOS的键盘中断处理程序:这里它会把接收的按键转换成ASC码! 
从8255可编程外围接口芯片的输入端60H读取一个字节(其低7位是键的扫描码) 
当按下时,最高位为0,称为通码; 
当放开时,最高位为1,称为断码
如按下Esc键时产生一个通码为01H(000000
01B),放开Esc键时产生一个断码为81H(10000001B)。键盘上每一个键都对应一
个扫描码,从01(Esc)到83(Del),或从01H到53H,所以根据扫描码就可以判断用户对键盘的操作。然后BIOS16H中断会根据一个表来返回键的ASC码,这样就可以通过调用INT16H直接获得字符了无需与扫描码打交道了!
   需要说明的是不是每个键都返回ASC码,比如AIT,CTRL,F1,F2。。。都没有ASC码
在QB中的INKEY$语句实际上是调用了DOS中断INT21中的有关键盘功能。在键盘中SHIFT AIT CTRL 大小写转换等等这些功能建也可以通过中断调用来判断,用户在键盘上输入都保存在一个32个字节大小的键盘缓冲区里,地址在41:1E,我们可以来直接读也可以自己来模拟键盘的输入,比如一个获得密码的功能

通过上面的知识,我们自己写段程序来观察键盘扫描码
这个程序是直接读端口来判断键的扫描码!
CLS
DO
  Keys = INP(&H60)  '从60H端口获得键盘状态
  LOCATE 4, 12: PRINT HEX$(KeyS);"  "   '用16进制方式显示扫描码
LOOP UNTIL INKEY$=CHR$(27)    '当按下ESDC键的时候就退出

这样就算同是按了几个键也是可以判断的,因为,只有按键放开才有这个键的断码

如果不通过端口,也可以用INKEY函数来读
如果不是功能键那么INKEY 不返回扫描码,它的长度是1
如果是,它就带扫描码返回,它的长度是2
如:
DO
  K$ = inkey$  '获得键盘状态
  if len(k$) =1 then    '判断长度 
     locate 10,10:      print k$ 
  else
      locate 10,10:      print val(left$(k$,1)) ,val(right$(k$,2)) 
  end if    
LOOP UNTIL K$=CHR$(27)    '当按下ESDC键的时候就退出

下面是我找到的键盘标志位的资料
键盘上的大小写建SHIFT  ALT CTRL....等等这样的功能建在内存41:17中
bit0=1:按下右移键Right Shift
bit1=1:按下左移键Left Shift
bit2=1:按下控制键Ctrl
bit3=1:按下交替键Alt
bit4=1:Scroll Lock状态已变换
bit5=1:Num Lock状态已变换
bit6=1:Caps Lock状态已变换
bit7=1:Insert状态已变
根据以上的资料,我们可以来读取键盘的状态(简介,详细的自己写)
DEF SEG = &H40  '定义段址到40H
DO
   keyshift = PEEK(&H17)'在偏移地址中取键盘状态
   keyshift = keyshift AND &H3
   SELECT CASE keyshift
      CASE 1
         DispTxt$ = "你按下了右SHIFT键"
      CASE 2
         DispTxt$ = "你按下了左SHIFT键"
   END SELECT
   LOCATE 10, 10: PRINT DispTxt$, keyshift
LOOP UNTIL INKEY$ = CHR$(27)
DEF SEG '恢复段址

当然我们也可以自己编程来打开大小写转换键,小键盘上的数字转换键等等...
程序如下
DEF SEG = &H40  '定义段址到40H
'打开大写键:注意看键盘上的Caps LockK灯会亮
POKE &H17, &H40 '&h40 是16进制,换成2进制就是0100 0000,也就是第6位为1
LOCATE 10,5:PRINT "按任意键继续,关闭大写键,打开数字键"
WHILE INKEY$ = "": WEND 
'打开Num Lock键,.....灯亮
POKE &H17, &H20 '&h20 换成2进制就是0010 0000,也就是第5位为1
DEF SEG
大家看看资料,再体会实际中编程,这样非常有意思!




板凳

显示
下面介绍显卡显存的主要结构,关于高分辨的图形模式显示这里不介绍。
显卡的显示模式大的方面分为两种,一种是文本方式,一种是图形方式。我们现在在Windows中的640×480、800×600和1024×768等都是在图形模式下,而过去的DOS是在文本模式下在QBASIC中如果不用SCREEN语句设置的话,默认是文本模式。
图形模式下的显存地址是从A000:0000开始的,文本模式下的显存地址是从B800:0000开始的。我在这里主要讲讲文本模式。
比如
COLOR 10,3
PRINT "TEST"
这个语句就会调用一些过程比如调用INT21号相关的中断调用,这个相关的调用又调用了BIOS INT10中断......最终的表现形式是反映到显存里,当显存里的数据发生变化的时候,显示器显示的内容也跟着发生变化,所以我们可以绕过这个语句,直接写这个显存,也可以同样达到这个效果,但要注意显存的组织方式,
  显示属性定义
B800:0000——长度2000H字 彩色显示器文本模式的显示缓冲区。每个字中的低字节是字符的ASCII码,高字节是其属性( 背景属性 前景属性 )
  其组织方式
如下(80×25的16色文本模式):
B800:0000 ;第一行第一列的字符的ASCII码
B800:0001 ;第一行第一列的字符的属性字节
B800:0002 ;第一行第二列的字符的ASCII码
B800:0003 ;第一行第二列的字符的属性字节
... ...
B800:07CE ;第25行第80列的字符的ASCII码
B800:07CF ;第25行第80列的字符的属性字节

属性字节的定义如下:
低四位是表示前景色,也就是字符颜色
位3 位2 位1 位0
0 0 0 0 黑色
0 0 0 1 蓝色
0 0 1 0 绿色
0 0 1 1 青色
0 1 0 0 红色
0 1 0 1 洋红
0 1 1 0 棕色
0 1 1 1 白色
1 0 0 0 灰色
1 0 0 1 亮蓝色
1 0 1 0 亮绿色
1 0 1 1 亮青色
1 1 0 0 亮红色
1 1 0 1 亮洋红
1 1 1 0 黄色
1 1 1 1 亮白色

高四位中位7(最高位)为1表示闪烁,为0表示不闪烁,其它三位表示背景色。
位6 位5 位4
0 0 0 黑色
0 0 1 蓝色
0 1 0 绿色
0 1 1 青色
1 0 0 红色
1 0 1 洋红
1 1 0 棕色
1 1 1 白色

实践:
   有了这些资料,我们就来用QBASCI来写显存,来加深对计算机显示原理的理解
目的:往显示缓冲区写东西,看看屏幕上的结果
思路:先定义段到B800,然后写内存
如果我们要显示背景为兰色,前景为灰色的*,如下:
用QB提供的语句:
COLOR 7,1
PRINT “*”

下面我们自己调用写内存的语句来直接写显存:
DEF SEG=&HB800 ''定义段址
 POKE 0,42 ''(42是字符*的ASC码) 
 POKE 1,&H17 ''写字符的属性
DEF SEG ''恢复段


3 楼

系统原理篇
  按功能划分, 计算机的硬件包括输入、控制与处理(数值运算和逻辑运算)、存储和输出设备。其中, 控制和处理部分一般做在一起, 称中央处理单元(Central Process Unit, CPU);存储设备又分为内部存储器(简称内存, 又称主存)和外部存储器(如磁盘、磁带和光盘),
计算机内的“数”
  计算机只认识 0 和 1 ,所以计算机使用的是二进制数。所谓二进制就是逢二进一。十进制中的2在二进制数中表示为10,即(2)10=(10)2 、(3)10=(11)2 、(4)10=(100)2 等等,其中的下标表示数的进制。由于大的二进制数太长,所以,人们又用16进制来表述计算机里的数,但计算机存储的依然是二进制数。十进制数有0~9十个数字符号,二进制数只有0和1两个数字符号,十六进制数有0~9、A~F十六个数字符号。对不同进制的书写,除了用上面所示的下标表示外,还有用尾部符号表示的,其中B为二进制数的符号,H为16进制数的符号,如110B即(110)2、9A3FH即(9A3F)16 ,尾部无这类符号的为十进制数。
   其实,只要数的大小定了,不管用什么进制来表示,总是那个数,对一般用户而言管不了那么多,这些知识是我们这些伤脑筋学编程的人学的
  位(Bit):二个进制中的一位数即一个位,只能是 0 或 1,如 (10100)2有5位。
  字节(Byte):8个二进制位。你只需记住,英文状态下一个字母或数字占用一个字节。
  字(Word):为两个字节。一个汉字用两个字节表示。
  1K=1024Bytes
  1M=1024K
  1G=1024M
  1T=1024G
  计算机里用字节来作为最基本的存储单位。
CPU的指令系统是用位来表示的,我们经常听说64位32位16位就这个意思
电脑的启动过程:
向大家介绍一下从打开电源到出现Windows,计算机到底干了些什么工作。 
系统启动过程简介

    系统启动过程主要由一下几步组成(以硬盘启动为例):

    1. 开机 :-)
    2. BIOS 加电自检 ( Power On Self Test -- POST )
       内存地址为 0ffff:0000
    3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)
       读入内存地址 0000:7c00 处.
    4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于
       则转去尝试其他启动介质, 如果没有其他启动介质则显示
       "No ROM BASIC" 然后死机.
    5. 跳转到 0000:7c00 处执行 MBR 中的程序.
    6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行.
    7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动
       分区或有不止一个活动分区, 则转停止.
    8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处.
    9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则

       显示 "Missing Operating System" 然后停止, 或尝试
       软盘启动.
    10. 跳转到 0000:7c00 处继续执行特定系统的启动程序.
    11. 启动系统 ...
王江民的逻辑锁,就是改写了主引导区,中了逻辑锁,不光是无法用硬盘启动,而且,软盘、光盘都无法启动!实际上这是利用了微软win98以前的一个BUG,(nt系统没有这个BUG)最先用这个方法的是DOS时代的一个叫“猴子”的病毒,让这个BUG大出名的是王江民逻辑锁!
主引导区是如此重要,在里面任意改动都有可能造成系统无法启动!
MBR是关键的东西,它就是一段代码,通过检查DPT分区信息引导系统跳转至DBR;它就象是一根火柴点亮整个系统,MBR里的内容是在操作系统前载入的,你在这里可以做很多想做的事情,如果你编程水平足够厉害的话!
    所以MBR是很重要的扇区,有些病毒就喜欢攻击他,如果被破坏,你的电脑就无法启动
因此很多硬盘工具可以保存MBR,如果你想用QB保存,请看我在本论坛写帖子,当然你也可以用QB来改写MBR,这个在本论坛不讨论!

所有这些知识,均来自于网络,为了大家能更好的学习,我把他们编排了一下,在此我感谢提供资料的这些网站!
    如果大家看了这个帖子有什么问题和感想要回贴的,对不起了,这个帖子我锁了,无法回帖的,因为怕有人乱回无意义的垃圾帖子,从而影响大家的学习!

4 楼

有关的错误认识:
1 很多人以为QB语言是用C做的,C又是用汇编做的,汇编是用机器语言做的,这个看法是错误的!
比如QB的那一套编程的软件即可以用C写,也可以用汇编,也可以用QB写,
C语言也一样,汇编也一样!

2 QB语言是解释性语言
这个也是一个认识上的错误,QB系列中有可以解释运行的语言,也有编译性的语言,无论QB是伪编译还是真编译,总之,你编的程序是可以被做成一个EXE文件,然后就到处运行了

我来回复

您尚未登录,请登录后再回复。点此登录或注册