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;}

 输出操作符

TYPE  (  addr  字符数  ---  )   从addr将计数字符串发送到选定的输出设备。OUT中加上字符数。如果“字符数”为零,没有发送。
S0  (  ---  addr  )   含有“堆栈指针”初始值的用户变量。输入信息缓冲区中的起始地址是由用户变量S0保存的。
名域 链域 代码域 参数域
 ' 找到TEST在词典中的地址,偏移5来到S的首地址,6 TYPE 打印出 SAMPLE 。         

从磁盘输出字符串

BLOCK  可以把一给定块复制到可利用缓冲区并把该缓冲区的地址压入堆栈。例如:要打印第16块的第0行,可以键入:CR 16 BLOCK 64 TYPE        
BLOCK   ( u --- addr )   addr是含有块u指定的缓冲区地址,假如该缓冲区具有的块不是块u,并且已经被UPDATE更新。则在指定该缓冲区之前就将其内容写入大容量存储器。一个给定的块不可以被指配给一个以上的缓冲区。如果u不是可利用的块号,就存在错误条件。如果u是一个没有被访问过的块,则DISK-ERROR就置为“真”。仅在由BLOCK或BUFFER最后引用的缓冲区中的数据才是有效的。块缓冲区的内容不应改变,除非该变动可以被转移到大容量存储器中。
-TRAILING  (  adr  u1 --- adr  u2  )   通过把u1(原始字节计数)减少为u2(被缩短的字节计数),删除起始地址为 adr 的字符串的尾随空格。
//这里 -TRAILING 把原始的53字节数减到20个字节数,刚好是出去了尾部的所有空格         

内部串操作符

移动字符串或数组需要三个自变量:源地址目的地址计数
MOVE  ( addr1  addr2  u  --- )   从addr1开始,逐单元的把u个字的内存区域复制到addr2开始的内存区域。从addr1开始移动,向内存高区(就是从要复制内容的第一个开始向后移动)移动。
CMOVE  ( addr1  addr2  u  --- )   功能和上面一样,只不过是逐字节移动。
CMOVE>  ( addr1  addr2  u  --- )   功能和上面一样,只不过是从串尾开始移动,向内存低区(就是从要复制内容的最后一个开始向前移动)移动。这对于向较高地址传送是有溢的。
addr1  addr  u  顺序必须是 源地址  目的地址  计数  

如果要把某个缓冲区的全部内容移进 PAD ,尽管按单元寻址的机器上若用逐单元移动的方法进行要快(第一种),但是最好还是用逐字节的(第二种)
比如要把一个串向右移动一个字节 <CMOVE 要改成

单个字符输入

KEY  (  ---  c  )   留下一个终端键入字符的ASCII码。(等待从终端键入一个字符,并把相应的 ASCII 码存入堆栈的低位字节)
直接指向 KEY ,这时光标先前进一格,但终端不显示"ok",它正在等待输入。这时候如果接着按下一个字母,屏幕将显示"ok"。这时栈中存放了输入字母的ASCII码。(回车符的ASCII码是13)
KEY 可以用在定义内部。执行定义期间当遇到 KEY 时将停止执行,知道接受到输入字符时为止。
eg:定义个词,从当前块开始显示给定数量的块的内容,在显示下一块之前等待我们按下任意键。
SCR  (  ---  addr  )   具有最近由 LIST 引用的屏面号的变量。变量里面存放的是最近引用的屏面号。
//显示从当前引用屏面号到知道屏面数的所有屏面。DROP 丢掉键入的字母ASCII码。先1  LIST  然后执行 10  BLOCKS  将显示1-10的屏面。
改进:当键入回车(ASCII == 13)时就终止显示屏面.

串输入命令

EXPECT  (  addr  u  --  )   从终端将字符移到地址addr,直到"回车"或者全部字符计数已被接受。回车不存入存储器。一个"空字符"被附加在文本串的末端。实际收到的和被存入存储器中的字符将被显示。(等待从键盘输入u个字符(或一个回车)。并把他们存贮在addr开始的区域)
WORD  (  c  ---  addr  )   从输入流中读一个利用某字符c(通常用空格)作为界限符的词。把该串传送到HERE中的地址开始的区域,该区域中的第一个字节存贮该串的字符个数,并把HERE中的地址压栈。先行定界符会被忽略。
词 EXPECT 使得任务终止执行,等待从磁盘输入给定个数的字符或一个回车符,无论谁先满足都行。然后把输入文本存入给定地址开始的区域。
eg:等待输入指定个数的字符,并把他们存入输入信息缓冲区。(这个短语也被用在 QUIT 的定义中为 INTERPRET 取得输入)
//第一个回车等待输入5个字符,输入5个自动结束显示ok;第二个等待输入50个,但是可以回车提前终止。  
文本解释程序扫描输入信息缓冲区是通过短语  32 WORD   来查找的。32是"空格"的十进制ASCII码值。WORD 扫描输入信息缓冲区以寻找给定的界限符(输入信息缓冲区敲入回车的时候自动过滤多余的空格);然后把此界限符分隔的子串传送到另一个缓冲区中,该缓冲区的第一个字节存放子串的字符个数;最后把缓冲区的首地压栈,这个时候 INTERPRET 就可以拿到这个地址去找到对应的词。WORD 的缓冲区通常是从词典指针 DP 开始,因此给定的地址是 HERE 。
注:你可以用 EXPECT 从诸如测量设备这样的装备中接受数据。由于提供了地址和计数,这样的数据能直接读入数组。在单用户系统中你可以把数据读入缓冲区而存入磁盘。但在多用户系统中,你必须先用 S0 然后再送到缓冲区,因为其他用户可能要使用"你的"缓冲区。
>IN  (   ---  addr  )   具有输入流中当前字符偏移量的变量的地址。
    当你从终端直接执行 WORD 时,它将扫描从S0开始的输入信息缓冲区,随着扫描,它向前推进缓冲区的指针 >IN ,以使每执行一次 WORD 都能扫描到输入流中的下一个词。
    >IN 是一"相对指针",即它包含的不是实际地址而是将要加在实际地址上的位移量。在上面的例子中,实际地址是S0,WORD 已扫描过输入信息缓冲区的"STAR"之后,>IN 的值是5。
    扫描的时候 WORD 忽略初始的界限符(直到遇到任何其他字符时为止)。WORD 传送子串时包含串结尾的一个空格,但在字符计数中不包括这个空格。

数字输入转换

    在终端键入一数字是,FORTH自动地把这一字符串转换成二进制数值并把它压入堆栈。FORTH 还提供两个命令,这两个命令允许你把从任何内存单元开始的一个字符串转换成二进制数值。
CONVERT  (  +d1  addr1  ---  +d2  addr2  )  把从addr1+1开始的文本转换成相应数基的二进制数值。新的数值将被累加进+d1形成+d2,转换直到遇到第一个不能转换的字符为止。第一个不能转换字符的地址存放在addr2.
NUMBER  (  addr  ---  d  )   使用当前的基数,将在地址addr中具有先行字符计数和结尾ASCII空白符(20H)或0的字符串转换为带符号的双字长数(从addr+1开始文本转换)。如果文本中遇到小数点,则它的位置将在BPL中给出,但不发生其它影响。如果数字转换不可能,将给出错误信息。

Forth相关IO操作的更多相关文章

  1. Linux学习记录--文件IO操作相关系统编程

    文件IO操作相关系统编程 这里主要说两套IO操作接口,各自是: POSIX标准 read|write接口.函数定义在#include<unistd.h> ISO C标准 fread|fwr ...

  2. python之协程与IO操作

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...

  3. java中的IO操作总结

    一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...

  4. Java之IO操作总结

    所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 ...

  5. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  6. node.js零基础详细教程(4):node.js事件机制、node异步IO操作

    第四章 建议学习时间3小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  7. C++ IO操作API及注意事项(包含一个日志类的实现)

    C++是一个抽象程度比C高很多的语言,在使用C++时,编译器做了很多工作,如果我们不对C++的某些特性的实现机制进行了解,那么编程时也许会有很多疑惑,我们也许知道怎样做才是正确的,但不知道为什么要这样 ...

  8. (笔记)Linux内核中内存相关的操作函数

    linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...

  9. Java 基本IO操作

    1.基本IO操作     有时候我们编写的程序除了自身会定义一些数据信息外,还需要引用外界的数据,或是将自身的数据发送到外界,这时我们需要使用输入与输出. 1)输入与输出       输入:是一个从外 ...

随机推荐

  1. nginx rewrite 指令

    ginx通过ngx_http_rewrite_module模块支持url重写.支持if条件判断,但不支持else. 该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录, nginx安装方 ...

  2. WinSDK(菜单笔记)

  3. RNA-seq基本流程

    https://www.2cto.com/net/201801/714420.html

  4. 使用quartz数据库锁实现定时任务的分布式部署

    ,1.根据项目引用的quartz依赖版本,确定下载的quartz-distribution安装包,我项目引用的信息如下图所示: 2.解压,在\quartz-2.2.3-distribution\qua ...

  5. Linux进程相关命令使用场景

    Linux进程相关命令使用场景 在Linux系统上工作时,我们常常会碰到很多和进程相关的查询场景,今天在这里进行详细的讲解,进程相关的对象包括以下几个: 端口:Port 进程号:PId 执行文件所在路 ...

  6. MySQL驱动和数据库字符集设置不搭配

    刚才控制台又报这个错,这是代表MySQL驱动和数据库字符集设置不搭配: 错误: "...Initial client character set can be forced via the ...

  7. LOJ #10130 点的距离

    在LOJ做的第一道题. 最开始想复杂了qwq 想的是在求LCA的过程中统计向上的步数 其实此题很裸--就是求出u,v的LCA, 再分别用两点深度减去LCA的深度,再加起来就好了qwq---化简--- ...

  8. [c/c++] programming之路(12)、循环结构

    一.求2n #include<stdio.h> void main(){ ; ; while(n--){ s*=; printf("%d,%d\n",s,n); } g ...

  9. react 表格扩展与编辑

    项目里有个需求是点击表格某行的工料机,显示对应定额下的工料机的表格数据,并能对两个表格进行增删改查,效果如下: 代码如下: // 引入 Component 组件 import React, { Com ...

  10. iOS开发 -------- 图片浏览器初步

    一 示例代码 // // RootViewController.m // 图片浏览器初步 // // Created by lovestarfish on 15/11/1. // Copyright ...