易码技术论坛

 找回密码
 加入易码
搜索
查看: 591388|回复: 11

[转帖]转些原来的精华贴!!

[复制链接]
发表于 2004-9-11 18:20:00 | 显示全部楼层
太精典了,我学PPC就是用这个
记得是徐洪海写的吧
 楼主| 发表于 2004-9-7 14:56:00 | 显示全部楼层
POKE的使用
§POKE的使用
首先要明白POKE与CALL不是标准的GVBASIC的一部分。只有GVBASIC助手和GVBASIC+(即为增强版),可以使用这两个特殊的命令。有了PEEK作为基础,POKE就可以讲快一点了。既然PEEK可以从洞中窥视系统内部的RAM和闪存的值,那么应该有某个指令可以改变这些值。对,这就是POKE。还是先来看一个例子:
GRAPH
POKE 704,48
CALL 57638
哇!大哥,你在写什么哟。呵呵,有难度才有挑战嘛。第一行最简单,使用GRAPH模式去掉讨厌的光标。然后就是两行天书。POKE是写内存,那么就要告诉文曲星写什么,写在哪里?答案就在POKE后面的参数里面。第一个是将要修改其值的内存地址,而48则是写入的数字。稍微聪明一点的人从程序运行结果就可以推测出我玩了什么明堂。很简单,我写了屏幕的字符缓存704,写入的值是48,对应的字符就是0(关于ASC][的对应规则可以看看gvbasic的帮助)。
○POKE用来写内存,地址和写入的值为参数。
有一点要特别说明,虽然闪存与RAM都是内存,但是POKE不可以写闪存。但是,我们平时使用BASIC很少操作闪存,所以也不会收到什么影响。基本上就这样了,挺简单的。当然,一个POKE也是一个字节。
 楼主| 发表于 2004-9-7 15:05:00 | 显示全部楼层
§CALL的使用
如果你把上面程序的CALL去掉就不会在屏幕上出现字符0了。这是因为我们写入的是缓存。所谓缓存,就是只有我们要求系统更新屏幕时,还缓存的内容才会在屏幕上反映出来。如果你仅仅是要使用,只需要把这些数字记住就可以了。有哪些?去问那些高手。真正方便Basic使用的没有几个(大部分是给写汇编和机器码的人用的)。
○CALL就是对系统下达指令
§向高手进阶
把像57638这样的数字当作常数来记,说什么都不是很开心。不用急,不久你就会知道他们的含义。
·文曲星地址分配
还记得什么是地址吗?如果不记得了,翻回去看看。闪存与RAM都是使用地址来标识不同区块(一个字节)的。那么哪些地址对应的是RAM,哪些地址对应的是闪存呢?这就是本节的重点
0-16383是RAM的地盘
16384-49151是闪存
好,我们来简单计算一下。16383+1是RAM的总供的字节数,换算成千字节就是16384/1024=16K。嗯,不错,16K的RAM。然后是闪存:(49151-16384)+1=32768个字节,除以1024就是32K。嗯?不对!GGV说文曲星有512K的闪存呀?怎么只有这么一点了?的确奇怪。以后就明白了(留点悬念给汇编教程嘛)。
好,我来看看CALL 57638是不是把57638当作地址用了?不是,在0-49151的范围里面没有57638。嗯,所以果然是一个常数。呵呵,那是因为我话还没有说完。文曲星的五脏六腑中除了闪存,RAM之外还有第三种存储器-ROM。这个家伙和光盘有点像,只可以读不可以写。关于ROM的作用和地址使用比较复杂,这里仅挑简单的讲:
49152—65535对应的是ROM
关于ROM的作用记住是系统自己用或者提供给我们用的就是了。
再来看那个CALL。57638对应了一个ROM中的地址,与前面几处提到的地址不同的是,57638处存放的不是数据(比如密码)而是程序的代码。这种代码又与Basic的代码不同,那是CPU阅读的机器码。CALL 57638的意思就是叫CPU到57638处读代码并根据代码进行操作(这里的操作就是更新屏幕),做完了又把控制权交换给Basic。
○0 -16383 RAM
○16384-49151 闪存
○49152-65535 ROM
 楼主| 发表于 2004-9-7 15:06:00 | 显示全部楼层
实例一
POKE 128,0
POKE 129,0
CALL 57668
CALL 57638
这是一个比较典型的POKE与CALL结合的例子。除了POKE与CALL就没有其他的语句了。其中128,129,57668,57638是地址而0则是写入的值。这段程序是干什么的呢?这还不简单,运行一下试试看。咦?怎么什么都没有?真的没有?左上角是什么?这段程序就是更新左上角的四个数字的。好,现在开始分析:
一二两行是写RAM。这个应该比较明白了。就是令128与129两个地址处的值为0。这是在干什么呢?莫非又在写图形缓存?非也非也。再看下一行。CALL 57668,这又是在执行ROM的一段代码。从系统函数表上,查到的是显示BCD数字用的,其实就是左上角的那个数字(哪里有这个表?现在还只有汇编使用的版本,BASIC的需要等我来编辑)。最后一行应该见过,是更新屏幕。我们已经用过的。那么,现在应已知道POKE与CALL之间的关系。左上角的数字是0,POKE进内存的值也是0。哦!我知道了。POKE进的就是CALL的参数。对,就是这么回事。那么两个参数?一个不就可以了?嗯,因为一个只能在0-255之间,两个才可以表示4位的数字。但是两个参数表的不是一个对应一二位,另一个对应三四位。而是等于128处的 值+129处的值×256。为什么是256?自己想想。



实例二
POKE 8200,0
POKE 8202,255
POKE 8203,96
PRINT "点第几首?"
INPUT N
POKE 8201,N
CALL 8200
CLS
GOTO 40
所有的语句都看得懂吧。运行了说有的POKE之后。地址8200处为0,8202处为255,地址8203处为96而8201处受到用户输入的影响。这里代表要播放的音乐的编号。运行一下。是不是很神奇?我们来具体分析为什么是8200这个地址?因为8200是内存中系统没有使用的区域,且一般为空。为什么使用CALL 8200?因为我们把东西POKE到了这个地方。CALL不一定是系统的内容吗?不一定,我也从来没有这么说过。CALL 的涵义就是执行机器码,一种CPU阅读的程序代码。只不过从前CALL 的是系统已经写好的现成代码,而现在的代码是我们自己POKE进去的。这就是GVBASIC和汇编结合的一个例子。把内存8200处开始展开,就是00XXFF60(十六进制表示,怎么使用十六进制请参见其他的书籍),这里使用的是机器码了。是不是很恐怖?数字不像数字,单词不像单词。想知道它是什么东西吗?这就不是BASIC的文章可以讨论的了,看汇编的入门文章吧。
发表于 2004-9-8 12:06:00 | 显示全部楼层
DAE,你可真强啊!这都能弄出来啊!
发表于 2004-9-13 17:02:00 | 显示全部楼层
很适用于初学者,建议本版斑竹加成精华啊
发表于 2004-10-5 22:59:00 | 显示全部楼层
可是各个机型的poke植不一样
那怎么办
那call功能就更不敢用
了,我是不敢试一些很刺激的,只是小打小闹而已
 楼主| 发表于 2004-10-19 17:54:00 | 显示全部楼层
你可以去找找你WQX型号的PEEK和CALL值再试啊!!

(最坏的结果只是重起WQX而已。。。。。。。。。。。。。)
发表于 2004-11-28 11:49:00 | 显示全部楼层
谁能搞到NC3000的啊?!?!?!现在有了GVBASIC+,没有不行啊!
发表于 2005-1-10 02:43:00 | 显示全部楼层
以下是引用jyleihan在2004-11-28 11:49:02的发言:

谁能搞到NC3000的啊?!?!?!现在有了GVBASIC+,没有不行啊!


是啊!

4322_9470_1801.rar

54 KB, 下载次数: 512

发表于 2005-1-10 09:01:00 | 显示全部楼层
以下是引用郝婧在2005-1-10 2:43:16的发言:
>

是啊!


[em05][attachment:459]

194_9474_459.rar

30 KB, 下载次数: 567

 楼主| 发表于 2004-9-7 14:55:26 | 显示全部楼层 |阅读模式
大多以前是TIMBERHARE和NET还有wqxxp上的精华贴。。。。。。。。 虽然说是FOR PC1000,但基础知识,对那些还不是真正了解POKE ,CALL ,PEEK的星迷还是有点用处的!!!

PEEK详解


在论坛上时常有人问怎么用PEEK,POKE。我也曾经为此迷惘过。对那些PEEK值感到 不可思议。现在学了汇编,当然不觉得了。但当时的情景仍然记忆犹新。于是, 我决定写下这个详解。
§PEEK的使用
先来看一段程序:
FOR I=8136 TO 8141
PRINT CHR$(PEEK(I));
NEXT I
大家应该见过了吧。这就是查看系统密码的程序。他是怎么起作用的呢?我们来 看: 第一行很简单,是一个循环。大家应该看得懂。第三行是对应的循环结尾。主体就在第二行。
PRINT大家都很熟悉了,使用来显示值的。如果给他的参数是数字,就显示数字。 如果是字符就显示字符。当然我们这里需要的是字符了。可是PEEK取出来的是数 字呀。所以我们使用了CHR$()这个函数来吧把数字变成字符。如果你有些知识就 知道这种对应是按照ASC][表来的,如果是中文就比较复杂(有两种对应法则)。
○PEEK取出来的是数字
如果你是细心的人还会发现后面有一个:号。这是干什么用的?是用来把取出的 密码连续的显示出来,而不是写一个就换一行。PEEK不可以一次取出多个值吗? 不可以!一次只可以取一个英文字母或者一个字节的数字。
○PEEK一次取出一个英文字母或者一个字节的数字
好了。那么再来看PEEK的参数。这里没有用直接的数字如8136,而使用了循环变量I。这是因为使用了FOR循环的缘故。PEEK对参数并没有什么特别的要求。
○PEEK的参数可以是数字也可以是变量甚至表达式。
如果你把循环展开,一下语句是等价的:
PRINT CHR$(PEEK(8136));
PRINT CHR$(PEEK(8137));
...
PRINT CHR$(PEEK(8141));
这样写虽然有些笨,不过却可以很清楚的发现对应关系。假设你的系统密码是genius,那么第一至六行对应的分别是g,e,n,i,u,s。清楚?
OK!进入正提。8136到底是什么?8136对应文曲星的内存地址。
○PEEK的参数是内存地址
在这个地址处,系统会把密码放入供检验密码使用。你把它的值取出来了,就相当于偷看到了系统的底牌。于是乎,PEEK就是偷看的意思。什么是内存地址?好,下面就讲。





§文曲星存储器结构基础
题目是不是有些吓人?没关系,其实很简单的。
文曲星其实是学生用的掌上电脑,与桌面上的电脑一样也有CPU。这不是本文的重点(以后写汇编教程的时候就是重点了)。和人的大脑一样,电脑也要记忆东西。人有两种记忆,长期记忆与短时记忆。比如你的mm的生日,就是长期记忆。你在算87乘以76时候的进位就是短时记忆。电脑也一样,在桌面机上就对应为硬盘与RAM。而文曲星是没有硬盘的,文曲星是靠闪存来达到长期记忆的目的的。RAM之所以称为短期记忆是因为断电后内容就没有 了。不过,你按开关键关闭文曲星的时候并不会清空RAM,是我讲错了吗?当然不是,那是因为开关键并没有真正的断电。此时系统时钟仍在运行。只有你按RESET或拔电池时,RAM的内容才会被清空。闪存,RAM。嗯,有些概念了。他们长得什么样?这并不重要。工作原理是什么?也不管我们得事。
○闪存用于长期保存资料
○RAM用于暂时保存资料
我更习惯把两者合称为内存,这和大家一般的概念不太一样。不过我认为,既然都是内部的存储器当然就叫内存喽。不论闪存还是RAM都是用来保存数字的。到了电脑中一切都是用数字表示的,这点观念一定要有。
○闪存和RAM是用来保存数值的。
可是,问题就来了。闪存和RAM肯定不止一个数的内容吧?如果我存入了十个,当我取出来的时候,文曲星怎么知道我要取出来的是哪一个?其实很简单,用数字给他们编一个号就是了。还记得夏天用来冻冰块的方格吗?内存就是那样的,分成了许多块。每一个块对应一个编号,用来标识这个方格的身份。一个方块可以储存一个字节的信息。这个编号就称为地址。现在明白前面的例子了吧。
○地址是用来标识内存不通区块的编号



[此贴子已经被作者于2004-9-7 15:13:45编辑过]

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-11-11 03:45 , Processed in 0.015338 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表