body, table{font-family: 微软雅黑}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

FORTH 程序员利用堆栈来保存数据,对于要保存的临时数据可以用返回栈来暂存。但是如果要长时间的保存某些数就要用变量和常数。

变量
VARIABLE  使用形式  VARIABLE  名称   执行VARIABLE时,它生成<名称>的定义并在它的参数域分配两个字节。应用程序负责对生成变量的内容初始化。当以后执行<名称>时,参数域地址留在堆栈。
VARIABLE   DATE      定义一个名为DATE的变量
12   DATE  !   12压入堆栈,然后给出变量名 !表示存储赋值;就是把12 存入变量DATE
DATE   @   @表示取出数据,这个短语表示取出DATE的值压入堆栈
:   ?    @   .   ;      定义一个词,每次直接取出数据

//这里一旦把12存入DATE中就会一直在DATE里面,如果要改变就要重新赋值。13  DATE  !  

我们可以用这个方法存年月日,然后再定义一个词组合这个年月日。
FORTH 系统中有已经被定义的变量 BASE 
所以系统中的HEX  DECIMAL  OCTAL的定义都是
: DECIMAL   10 BASE  !  ;   
: HEX   16 BASE  !  ;   
: OCTAL   8  BASE  !  ;   

变量详解
定义变量时,已经把一个称为DATE的新词编译进了词典,该词典条目的简化结构
①12 进栈;
②文本解释程序在词典中查找DATE,若找到,则把它指向 EXECUTE ;
③EXECUTE 把该变量的“空”单元(将存放实际值的单元)地址复制到栈顶;
④词!从栈顶取出该地址,从下一项取出数值存入相应的内存单元。在该单元中无论什么值都将被新的数值锁代替;
词 @ 只要一个自变量的地址,它拿到自变量的地址,取出里面的值压入栈顶。
!     ( n  addr  ---    ) 将16位的n存入地址。称为“存储”。
@  ( addr  ---  n    ) 留下addr中的16位数据内容。称为“读取(fetch)”
!@ ( n  addr ---     )  将n加到地址为addr中的数值上。称为"加-存储"



利用变量作为计数器
eg: 鸡蛋计数
//这里设置EGGS变量,EGG每次对值+1;可以计数,看出EGG执行了多少次;

常数
常数用来表示无须再变更的值,定义的时候就必须给他赋值,之后就不会再次改变它的值。和变量的区别是使用定义得到的不是它的存放数据的地址,而是它的值。
eg: 220   CONSTANT   LIMIT    //定义一个名叫LIMIT的常数,并且赋值为220。使用LIMIT得到220。
用途之一:给硬件地址命名。

双字长变量和常数
2VARIABLE       定义一个双字长度的变量
2CONSTANT    定义一个双字长常数
eg:定义一个词把 400000 和栈顶的双字长数相加。
*/   ( n1  n2  n3  ---  n4 )         n1 与 n2相乘产生32带符号的中间结果,在被n3除,得到下整商n4。如果除数为零或者商大于16位就存在错误。
可以用一个2CONSTANT 定义的词存储两个单字长度的数对。这样既方便又能节省词典空间。

数组
定义一个变量可以用 ALLOT 分配多个空间(默认是一个)
VARIABLE   DATE   
//ERASE 用来给变量数组各个元素置0,前面要给一个参数,表示要置0的范围。

FILL  ( addr  字节数  b  ---  )   从addr地址开始把字节数个b填入存储区;  LIMITS 8 0 FILL     ( 这里我把b写成其他的就显示不正常了 )
DUMP  ( addr  len  ---   )  以十六进制和ASCII码显示存储地址addr到addr+len中的内容

字节数组
FORTH能够让元素只存储在一个字节而不是一个单元两个字节。用8位二进制数表示的数据好处是能以一半的存贮空间取得同样多的数据。
C!  相对于 ! 把n的最低有效8位数据存入地址addr中。
C@ 相对于 @  在堆栈中留下存储地址addr中的8位数据内容,堆栈中的高8位为0。
(这里我没有往第五个空间里存放数值)

数组初始化
定义变量数组的时候可以直接给它们赋值;
CREATE  VAR  1 , 2 , 3 , 4  ,      //定义一个变量,这个变量存放的数据为1,2,3,4;后面可以用上面的定义给它修改
 
CREATE (——)  定义词汇使用形式,CREATE  名称   生成<名称>的词典项目。在<名称>生成之后,下一个可利用的词典单元就是<名称>的参数域中的第一个字节,随后执行<名称>时,<名称>的参数域中的第一个字节的地址被留在堆栈中,CREATE并不给<名称>的参数域分配空间。
,      将16位的n存入词典指针的当前位置,然后指针前移两个字节。(把一个单子长数值存入词典中下一个可利用单元)   //词的功能是从栈中取出一个数并把它存入数组,所以每写一个数并跟随一个 , 时,就给该数组增加一个单元。
C,  与上面的,对应,是用来初始化一个字节的数组
LEAVE ( —— )   执行转移至下一个LOOP或+LOOP外的代码。循环被终止而循环参数被舍弃;
DO  ...  LEAVE  ...  LOOP  或者 DO  ...  LEAVE  ...  +LOOP 

PC/FORTH 变量|常数|数组的更多相关文章

  1. php变量与数组相互转换的方法(extract与compact

    #php变量与数组相互转换的方法(extract与compact) #compact 多个变量转数组 $name = 'sui'; $email = 'sui@qq.com'; $arr = comp ...

  2. 如何判断一个变量是数组Array类型

    在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象 ...

  3. java 数组变量与数组对象

    数组是否必须初始化 对于这个问题,关键在于要弄清楚数组变量和数组对象的差别.数组变量是存放在栈内存中的,数组对象是存放在堆内存中的.数组变量只是一个引用变量,他能够指向实际的数组对象. 所谓的数组初始 ...

  4. JavaScript用typeof判断变量是数组还是对象,都返回object

    在JavaScript中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数组还是对象使用typeof搞不定,因为它全都返回object. 使用typeof加leng ...

  5. C++ 用变量定义数组

    较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #includ ...

  6. js判断一个变量是数组还是对象

    判断变量是数组还是对象,使用Object.prototype.toString.call(),兼容性好,切勿使用typeof来判断对象或者数组,因为typeof得到的都是object: functio ...

  7. C++中变量做数组长度

    在Java中,这是完全可以的,比如我们运行如下程序: package cn.darrenchan.storm; import java.util.Arrays; public class Test { ...

  8. Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。

    Perl 引用引用就是指针,Perl 引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 1.创建引用1.使用斜线\定义变量的时候,在变量名前面加个\, ...

  9. Perl 变量:标量变量、数组变量、哈希变量和变量上下文

    一.Perl 变量变量是存储在内存中的数据,创建一个变量即会在内存上开辟一个空间.解释器会根据变量的类型来决定其在内存中的存储空间,因此你可以为变量分配不同的数据类型,如整型.浮点型.字符串等.上一章 ...

随机推荐

  1. arithmetic-02

    Java collection API 中实现的表ADT: collection<E>接口实现继承iterable<E>接口,实现iterable接口的类可以使用增强for循环 ...

  2. Beta阶段敏捷冲刺日志的集合贴

    Beta阶段冲刺前计划与安排:http://www.cnblogs.com/software-teamwork/p/9060118.html Day1(5.22):https://www.cnblog ...

  3. SpringMVC 图片上传,检查图片大小

    使用SpringMVC+Spring 前端提交图片文件到Controller,检查上传图片大小是否符合要求 直接上代码了 1.校验图片大小 这里提供出验证的方法,用于在需要校验的地方调用 /** * ...

  4. MSP430入门准备

    为什么选择MSP430? 低功耗是最主要原因,那有人说了,低功耗的片子多了去了,还有比这更低功耗的呢,只能说, 一个是精力有限, 二是430低功耗做的不差,能满足大部分项目的需求, 三是网上430的资 ...

  5. 20190402Linux高级命令进阶(week1_day2

    Linux高级命令进阶(week1_day2) 输出重定向 场景:一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到的输出重定向技 ...

  6. oracle ora-12514解决办法

    原来配置好的数据库监听用plsql登陆报错ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 网上说的改listener.ora 添加如下配置 SID_LIST_LISTENER = ...

  7. if __name__ == "__main__":

    工欲善其事,必先利其器 # 环境:Python3.6 + win10 # 目录结构: D:\test\ # 目录 ├─ t1.py # 文件 └─ t2.py # 文件 让模块如脚本一样运行 在Pyt ...

  8. Linux 系统日志

    查看日志服务 大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 /etc/syslogd 或/etc/rsyslog.d,默认配置文件为 /etc/syslo ...

  9. vue--vConsole

    平时在web应用开发过程中,我们可以console.log去输出一些信息,但是在移动端,也就是在手机上,console.log的信息我们是看不到的. 这种情况下,可以选择使用alert弹出一些信息,但 ...

  10. kafka在windows上的安装、运行

    https://blog.csdn.net/u010283894/article/details/77106159 kafka 创建消费者报错 consumer zookeeper is not a ...