SAL 语言参考手册


SAL SAL SAL SAL 语言语言语言语言 参考手册参考手册参考手册参考手册 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第2页 请 注意 以下 有关 SAL SAL SAL SAL 语 言( 以下 称 SALSALSALSAL) 的发 布要 点: ·SAL 是 可跨 越平 台的 ,不 受硬 件与 操作 系统 制约 的功 能性 汇编 语言 和虚 拟机 器的 总称 ,其 中包 括 SAL 语 言与 Liu 虚 拟机 器以 及运 行库 部分 ; ·本 手册 描述 的 SAL 版 本是 1.04,包括SAL 1.04 与Liu 1.04,如 果你 所使 用的 SAL 版 本低 于此 ,可 能不 保证 所述 的功 能能 在你 的版 本中 正确 使用 ; ·SAL 最新 的发 布版 本软 件均 达到 技术 手册 所述 的技 术指 标; ·我们 愿与 那些 注重 知识 产权 用户 分享 SAL 带来 的任 何益 处; ·我们 愿与 那些 注重 产品 完整 性的 客户 合作 ; ·SAL 是闭 源的 非免 费软 件; ·SAL 提供 免费 版本 ,供 教学 和免 费项 目使 用, 但免 费版 本中 不提 供分 布式 计算 机支 持; ·SAL 不是 通用 型开 发工 具, 其指 令集 具有 对特 定场 合的 针对 性; ·我们认为SAL 语言是一种坚定的风格,古老却十分有效,因此拒绝第三方厂商或个人开发适用于SAL 的高级语言编译 外壳 程序 。 SAL SAL SAL SAL 具有非常强的针对性开发支持能力,它灵敏小巧且运行迅速,相信您也可以找到使用 SAL SAL SAL SAL 的 理由 : ·跨越 硬件 与软 件平 台, 至本 手册 发布 期时 , SAL 可以 在 Windows,Linux,BSD 上完 好工 作; ·针对 性极 强的 指令 系统 ,快 速部 署有 严格 要求 的程 序; ·用户 可扩 充的 指令 系统 与运 行库 ; ·7x24 监控 反馈 系统 的支 持; ·自主 锁死 目标 运行 平台 的能 力( 暂限 WINDOWS); ·从官 方获 取普 遍稳 健的 运行 库; ·获得 精确 任何 关于 SAL 的技 术和 非技 术手 册。 本技术手册中所述的软件或硬件应用信息及其他类似内容仅为您提供便利 ,它们可能由更新之信息所替代 。 确保应用符合技术规范,是您自身应负的责任。我们对这些信息不作任何明示或暗示、书面或口头、法定 或其他形式的声明或担保,包括但不限于针对其使用情况、质量、性能、适销性或特定用途的适用性的声 明或担保。 我们对因这些信息及使用这些信息而引起的后果不承担任何责任。 该技术手册可以在不修改的情况下自由传播。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第3页 第1111章概述 1.1 汇 编不 是倒 退 ------------------------------------------------------------------------------------ 5 1.2 SAL 和Liu ----------------------------------------------------------------------------------------- 6 1.2.1 名 字与 读音 -------------------------------------------------------------------------------- 6 1.2.2 指 令, 就是 想要 的 ----------------------------------------------------------------------- 6 1.2.3 关于GUI------------------------------------------------------------------------------------ 6 1.2.4 开 动虚 拟机 器 ----------------------------------------------------------------------------- 7 1.2.4.1 寄 存器 ------------------------------------------------------------------------------ 7 1.2.4.2 寻 址方 式 --------------------------------------------------------------------------- 8 1.2.4.3 指 令集 ------------------------------------------------------------------------------ 8 1.2.4.4 选 用适 合你 平台 的运 行库 ------------------------------------------------------- 9 第2222章指 令集 2.1 数 据移 动 ----------------------------------------------------------------------------------------- 10 2.1.1 move -------------------------------------------------------------------------------------- 10 2.1.2 moveb ------------------------------------------------------------------------------------- 10 2.1.3 movew ------------------------------------------------------------------------------------ 10 2.2 算 术运 算 ----------------------------------------------------------------------------------------- 11 2.2.1 add ---------------------------------------------------------------------------------------- 11 2.2.2 sub ----------------------------------------------------------------------------------------- 11 2.2.3 mul ---------------------------------------------------------------------------------------- 11 2.2.4 div ----------------------------------------------------------------------------------------- 12 2.3 堆栈----------------------------------------------------------------------------------------------- 12 2.3.1 push --------------------------------------------------------------------------------------- 12 2.3.2 pop ---------------------------------------------------------------------------------------- 12 2.4 过程----------------------------------------------------------------------------------------------- 13 2.4.1 call ---------------------------------------------------------------------------------------- 13 2.4.2 ret ----------------------------------------------------------------------------------------- 13 2.5 位 及循 环 ----------------------------------------------------------------------------------------- 13 2.5.1 bit ----------------------------------------------------------------------------------------- 13 2.5.2 shift --------------------------------------------------------------------------------------- 14 2.5.3 loop --------------------------------------------------------------------------------------- 14 2.6 跳 转判 断 ----------------------------------------------------------------------------------------- 14 2.6.1 jump --------------------------------------------------------------------------------------- 14 2.6.2 ifj ------------------------------------------------------------------------------------------ 15 2.6.3 ifc ------------------------------------------------------------------------------------------ 15 2.7 线程----------------------------------------------------------------------------------------------- 16 2.7.1 crth ---------------------------------------------------------------------------------------- 16 2.7.2 deth ---------------------------------------------------------------------------------------- 16 2.7.3 joth ---------------------------------------------------------------------------------------- 17 2.8 网络----------------------------------------------------------------------------------------------- 17 2.8.1 lsrv ---------------------------------------------------------------------------------------- 17 2.9 输 入输 出 ----------------------------------------------------------------------------------------- 18 2.9.1 recv ---------------------------------------------------------------------------------------- 18 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第4页 2.9.2 send --------------------------------------------------------------------------------------- 18 2.9.3 trap ---------------------------------------------------------------------------------------- 19 2.10 其 他指 令 ---------------------------------------------------------------------------------------- 19 2.10.1 wait -------------------------------------------------------------------------------------- 19 2.11 用 户指 令 ---------------------------------------------------------------------------------------- 19 第3333章创 建程 序 3.1 第 一个 程序 -------------------------------------------------------------------------------------- 20 3.2 编译SAL程序----------------------------------------------------------------------------------- 21 3.3 只 要源 码 ----------------------------------------------------------------------------------------- 22 3.3.1 宏 定义 ------------------------------------------------------------------------------------ 22 3.3.2 堆 栈和 缓冲 区 --------------------------------------------------------------------------- 23 3.3.3 无 名结 构体 ------------------------------------------------------------------------------ 24 3.3.4 理解API----------------------------------------------------------------------------------- 26 3.4 使 用集 成开 发环 境 ----------------------------------------------------------------------------- 26 第4444章应 用编 程示 例 4.1 使 用随 机数 -------------------------------------------------------------------------------------- 31 4.2 复 制文 件 ----------------------------------------------------------------------------------------- 34 4.3 堆 栈有 多深 ? ----------------------------------------------------------------------------------- 35 4.4 小 人升 旗 ----------------------------------------------------------------------------------------- 37 4.5 线 程演 示 ----------------------------------------------------------------------------------------- 41 4.6 通 信典 型程 序 ----------------------------------------------------------------------------------- 43 4.7 测试CPU------------------------------------------------------------------------------------------ 49 4.8 编 写程 序库 --------------------------------------------------------------------------------------- 51 第5555章API API API API 简述 5.1 console --------------------------------------------------------------------------------------------- 52 5.2 MATH--------------------------------------------------------------------------------------------- 56 附录----------------------------------------------------------------------------------------------------------- 57 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第5页 第1111章概述 1.11.11.11.1 汇编不是倒退 即 便在 高级 语言 繁荣 、横 行的 今日 ,也 仍然 存在 着很 多蹩 脚的 地方 和使 用习 惯 ,这 也许 就是人类语言与计算机语言之间永远存在的几角旮旯似的障碍,你可以用习惯一词来屏蔽 它 ,但 无法 掩盖 真实 存在 。 几 乎每 种计 算机 语言 都有 其附 庸者 和使 用者 ,为 了血 统 、为 了习 惯 、为 了简 洁 ,为 了流 行,而 或是 为了 荣誉 。随 着其 自身 的发 展和 进步 ,有 些语 言变 得渐 渐偏 离了 原始 设计 ,臃肿 和 难以 使用 成为 程序 员间 经常 抱怨 修饰 词汇 ,甚 至臃 肿和 难以 使用 也间 接成 为了 这些 语言 的 第 二个 名字 ,当 然, 不含 有版 本号 (总 不能 叫 ‘难 以使 用 V2.0’一类)。 这 其中 大多 数是 命令 式语 言。 多年 以来 , C语 言的 表现 最为 优异 。 有 人跟 我抱 怨过 JAVA, 甚至 到了 开骂 的地 步, 我没 有接 触过 这东 西, 不好 评论 。但 事 实 上来 讲, 全面 的东 西意 味着 臃肿 和低 效, 其支 持环 境就 很可 怕。 那 么, 汇编 如何 ? 大 致会 有这 样几 种答 案: A. 晦 涩难 懂 B. 开 发效 率低 C. 易 出错 D. 是 一种 底层 语言 也 许以 上答 案都 是正 确的 。我想,作 为汇 编程 序员 一定 不都 是这 样认 为 ;但 非汇 编程 序 员 大概 都是 这样 肯定 的答 案 。大 致来 讲 ,所 谓汇 编 ,是 泛指 处理 器这 一级 别的 语言 ,是 机器 能 够直 接读 懂的 符号 化表 现形 式, 不同 类型 的处 理器 有不 同的 汇编 语言 方式 。如 果 JVM 开 放 它的 汇编 ,你 会看 到用 JAVA 汇 编写 程序 也未 必不 是一 种快 乐 ,我 相信 对于 某些 人来 说是 这 样。 拿商业计算机系统来讲,现在与十几年前的情况大不相同,2000 年之前我可以用微软 的MASN(宏 汇编 )创 建想 要的 程序 ,而 现在 若是 在 NT5.0 以 上内 核的 WINDOWS 系 统下 用 汇编 创建 想要 的程 序, 那就 是件 极其 不好 解释 的事 情。 我 归结 为几 点原 因: A. 系 统不 再以 命令 方式 作为 主要 工作 模式 B. 多 数复 杂的 应用 程序 导致 汇编 的工 作量 和复 杂度 陡然 提升 ,达 到无 法控 制的 地 步 C. 软 件厂 商已 不升 级或 极少 更新 汇编 独立 工具 D. 九 十年 代前 后以 汇编 为主 要手 段的 程序 员群 体性 消失 ,2000 年 前后 已经 少有 汇 编 程序 人员 (汇 编程 序员 失业 率高 ) E. 计 算机 语言 系统 更好 的提 供各 类开 发支 持和 人过 于依 赖高 级语 言的 惰性 事 实上 ,简 化汇 编的 开发 前工 作是 项重 要的 研究 内容 ,面 面具 到不 是个 好点 子 ,如 果以 小 项目 为例 ,能 够获 得更 加精 确的 功能 性指 令 ,势 必可 以让 汇编 的优 势大 大发 挥出 来 。微操 作是汇编的强项,这才是要点。如果通用X86 处理器的汇编不那么繁琐,或者有更功能性 的 指令 ,我 想汇 编亦 是 ‘程 序控 ’的 拿手 好戏 。 汇编语言——Assembler,是与机器沟通最为真实的一种语言,这种小众的开发方式, 被 视为 真正 高手 的顶 级手 段一 直被 延续 着, 直到 今天 ,直 到当 代机 器体 系的 消亡 。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第6页 我 认为 ,汇 编可 以从 晦涩 的定 义中 脱离 一些 ,哪 怕就 一点 点 ,也 绝是 好的 方式 。但 愿这 种 尝试 能带 来不 一样 的惊 奇感 受。 1.21.21.21.2 SAL SAL SAL SAL 和LiuLiuLiuLiu SAL( 编译 器) 和 Liu( 虚拟 机器 )不 是一 定要 同时 存在 ,譬 如: 运行 编译 后的 程序 , 只需Liu 即 可; 另一 种情 况是 开发 任务 :同 时需 要 SAL 与Liu。 值得注意,在一般情况下,SAL 与Liu 以相同版本号出现,如:1.04。如不同,Liu 的 版 本号 高于 SAL 为 妥。 本 手册 均针 对 1.04 版 本进 行说 明, 含 SAL 1.04 与Liu 1.04。 1.2.11.2.11.2.11.2.1 名字与读音 SAL 是SSSSimpileimpileimpileimpile AAAAssemblerssemblerssemblerssembler LLLLanguaganguaganguaganguageeee的 首字 母缩 写 ,意为“简 单汇 编语 言 ”,读音作sa-ao; Liu 是为了纪念我的老师刘锦宪(台湾人,程序能力极高,英年早逝),用了他的姓, 读 音作 liu。 1.2.21.2.21.2.21.2.2 指令,就是想要的 也 许在 某些 方面 来看 ,你 并不 赞同 我的 观点 ,而 重点 关注 所谓 的 “惊 奇感 受 ”, 便在 于 指 令一 层 ,CPU 工 作方 式的 最终 表现 也在 指令 一层 ,传 统的 指令 包括 任何 的计 算式 ,跳转, 和 精细 操作 如位 运算 ,标 志位 运算 等 ;举 个例 子 ,如 果说 将文 件复 制提 升到 指令 一层 ,很明 显,这 需要 文件 系统 的支 持 ,而 且看 上去 更像 是命 令而 非指 令 ,因 此这 样的 逻辑 是有 问题 的 。 请 将视 线集 于操 作系 统之 下到 CPU 间 的这 个层 次, 复杂 常用 的工 作除 了数 据移 动、 计 算 以外 (而 且他 们也 被抽 象为 函数 ), 更主 要和 实际 的内 容被 抓住 了, 事实 上即 便它 们也 被 抽 象成 函数 ,也 丝毫 掩盖 不了 这些 指令 设计 初衷 的热 情 。没错,是 网络 与线 程 ,甚 至是 分布 在 多个 计算 机的 线程 。 Liu 的 指令 系统 简洁 而干 净 ,保 留了 常用 的移 动和 运算 ,去 掉了 标志 位 ,抽 象了 新的 判 定 转移 指令 如 ifj;对 位指 令完 整的 支持 如 bit;而 看上 去消 减工 作的 最佳 指令 则是 lsrv(socket 指 令) 与 *th( 线程 指令 )。 下 面的 章节 将看 到 lsrv 与*th 如 何在 程序 中扮 演重 要角 色, 在一 个充 满实 际应 用的 程序 例 程中 ,它 们是 无法 或缺 的存 在, 正是 如此 ,或 许 Liu 真 正带 来了 全新 的尝 试。 对 象亦 不是 Liu 追 寻的 目标 ,因 此, 这里 不涉 及任 何对 象指 令, 即便 在更 高的 版本 中 , 我 们也 承诺 于此 。 1.2.31.2.31.2.31.2.3 关于 GUIGUIGUIGUI GUI,在 创建 友好 用户 端时 需要 的常 用手 段 ,相 比黑 底白 字的 命令 方式 愚蠢 得多 ,连退 出 也要 再次 确认 ,当 然用 户效 率在 很多 时候 看来 好像 并不 重要 ,用 户效 率与 用户 专业 度也 一 向 成正 比。 至 少现 在来 看 ,Liu 1.04 的 运行 库中 不存 在对 GUI 的 支持 ,大 多数 基于 Liu 1.04 的 程序 还 只能 以黑 底白 字的 传统 方式 被开 发和 运转 ,这 从实 用角 度来 说是 足够 的了 。如果在Liu 1.10 中 加入 特殊 计算 支持 ,那 么从 某种 角度 来讲 ,GUI 的 重要 性会 变得 淡薄 很多 ,运 行安 全稳 定 是 一个 重点 ,用 户效 率是 另一 个重 点, 虽然 这需 要很 专业 的操 作人 员和 程序 员来 完成 工作 。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第7页 GUI 可以加深用户体验,这没有错。一旦给予Liu 支持GUI 方式的运行与开发能力, 这 将是 件极 其有 趣的 事情 ,同 样的 ,这 需要 付出 巨大 的努 力。 Liu 所 关注 更多 的, 还是 基础 平台 的运 算方 式和 能力 。 1.2.41.2.41.2.41.2.4 开动虚拟机器 在 接下 来的 几个 小节 ,将对Liu 虚 拟机 器进 行细 致简 洁的 说明 ,包 括寄 存器 、寻 址方 式 、 指 令集 、运 行库 等关 键内 容。 Liu 是计算命令式的原生虚拟机器(可理解为顺序执行指令的方式并以计算为主),是 狂 热超 级计 算机 ⑴的 一部 分 ——计 算命 令式 模组 ,但 至今 为止 ,Liu 仍 可作 为一 个独 立的 组 件 在多 个计 算机 平台 上工 作。 【注 ⑴】:狂热是绿 衫实 验室 的重 要课 题之 一, 是具 有执 行态 和态 流机 制的 大规 模逻 辑运 算集 群。 1.2.4.11.2.4.11.2.4.11.2.4.1 寄存器 Liu 中有20个 寄存 器, 其中 包括 16个 通用 寄存 器、 指令 指针 寄存 器、 堆栈 寄存 器 、程 序 段寄 存器 、数 据段 寄存 器。 通用寄存器:r开头,编 号从 0~15。R0~R15 的 通用 寄存 器是 32位的,可 以通 过指 令 访 问低 8位 ,低 16位 和整 个 32位 ,但 无法 直接 访问 高 8位 ,高 16位 ;某 些寄 存器 有特 殊 用途,这也是相当灵活的,请参看具体指令对寄存器的需求,但一般情况下,R0~R15 可 以 任意 访问 ,不 需要 特殊 记忆 。 指令指针寄存器:pc,32位。这个寄存器不允许任意访问,只能够通过如call,jump 一 类的 调用 /转 移指 令才 能间 接修 改 pc的 值, 这是 顺序 执行 支持 的传 统规 则, 无须 言明 。 堆栈寄存器:ps,32位 特殊 结构 。这 个寄 存器 不允 许任 意访 问 ,只 能够 通过 push,pop 一 类的 堆栈 指令 ,或 者 call,ret 一 类的 调用 /返 回指 令才 能间 接修 改 ps的 值, 值得 说的 是 , Liu 的 堆栈 是动 态增 长的 。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第8页 程 序段 寄存 器 :cs,32位 ,不 可见 寄存 器, 与 pc一 起构 成指 令访 问地 址。 数 据段 寄存 器 :ds,32位 ,不 可见 寄存 器, 与通 用寄 存器 一起 构成 数据 访问 地址 。 如你所见,Liu 并未开放常见的如状态寄存器,调试寄存器以及页面等寄存器。ifj/ifc 指 令的 直接 判定 省略 了状 态寄 存器 ;调 试寄 存器 是不 开放 的, 在下 一个 版本 中对 JL语言⑵ 的 支持 会开 放这 一特 性 ,方 便编 译一 级别 的调 试工 作 ;Liu 的 程序 模型 是平 面的 ,32位 的寻 址 范围 在 0x00000000~0xFFFFFFFF,这 大大 简化 了页 面切 换的 复杂 度 ,虽 然降 低了 程序 执 行 的可 靠性 ,但 在虚 拟机 器一 级别 的安 全机 制上 ,其 程序 可靠 性反 而被 增强 。 【注 ⑵】:JLJLJLJL语言是专 用于 狂热 超级 计算 机编 程的 语言 。 1.2.4.21.2.4.21.2.4.21.2.4.2 寻址方式 在Liu 指令的操作数中,允许出现的有名字(包括变量名、常量名、过程名),十进制 常 数或 者寄 存器 ,而 名字 ,常 数或 者寄 存器 都是 与寻 址方 式有 关系 的。 下 表是 Liu 中的7种 寻址 方式 : 寻 址方 式 格式说明 直 接式 名字存 取名 字中 数据 ,除 了常 量 地 址式 &名字取 名字 地址 ,除 了常 量 指 针式 *名字以 名字 中数 据为 地址 ,存 取数 据, 除了 常量 寄 存器 式 寄 存器 存 取通 用寄 存器 中数 据 寄 存器 指针 式 *寄 存器 以 通用 寄存 器中 数据 为地 址, 存取 数据 常 量式 常量/常数以 常量 或者 常数 为数 据 字 符串 式 $名字名 字地 址即 是串 首址 ,只供move 指 令使 用 ,除 了常 量 7种寻址方式可以出现在目的操作数、源操作数甚至第三操作数(如ifj 指令就有第三 操 作数 ), 某个 操作 数被 限制 使用 何种 寻址 方式 ,由 具体 指令 限定 ,这 里不 作赘 述。 1.2.4.31.2.4.31.2.4.31.2.4.3 指令集 Liu 有25条 指令 ,涵 盖了 几乎 所有 当代 CPU 常 用的 指令 (数 据移 动 、算 术运 算 、堆栈、 过程、位 及循 环 、跳 转等 ),有 部分 抽象 (跳 转判 断 、输 入输 出 )和 专用 指令 (线程、网络)。 在 这些 指令 中, 操作 数的 个数 都是 不相 同的 ,最 少为 无操 作数 指令 ,至 多为 三操 作数 指令 , 格 式如 下: 无 操作 数指 令格 式: insinsinsins 单 操作 数指 令格 式: insinsinsins srcsrcsrcsrc 双 操作 数指 令格 式: insinsinsins srcsrcsrcsrc totototo objobjobjobj 三 操作 数指 令格 式: insinsinsins srcsrcsrcsrc objobjobjobj o3o3o3o3 insinsinsins: 指令 srcsrcsrcsrc: 源操 作数 objobjobjobj: 目的 操作 数 o3o3o3o3: 第三 操作 数 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第9页 : 指令 的扩 展码 在第2章 指令 集中 ,将 详述 所有 25条 指令 的格 式和 操作 数规 则, 以及 使用 方法 。 1.2.4.41.2.4.41.2.4.41.2.4.4 选用适合你平台的运行库 在相应的计算机平台中均提供相应平台的运行库,现有Windows,Linux 和OpenBSD 的 运行 库, 请在 选择 时注 意, 虽然 很像 ,但 Linux 和OpenBSD 并 不同 。 对于Linux,我们提供Ubuntu 与Federa 两种稳定内核的运行库,如果你所用的其他版 本Linux 需 要一 份 SAL 与Liu, 请联 系我 : cailei@vm2.org, 并注 明目 标运 行操 作系 统。 纯 粹的 AIX 与Solaris 是 理想 的分 布式 平台 ,它 们高 效健 壮, 对于 我们 来讲 ,用 可望 不 可 及形 容一 点也 不夸 张, 昂贵 的价 格使 绿衫 实验 室迄 今为 止还 未有 这种 机型 。旦 有机 会 ,我 们 会把 运行 库移 植到 AIX 与Solaris 上。 获 取相 应的 平台 库和 SAL 软 件请 到 http://www.vm2.org/sal/ SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第10页 第2222章指令集 本 章将 详述 Liu 1.04 中的25条 指令 ,包 括格 式, 操作 数规 则, 以及 使用 方法 。 2.12.12.12.1 数据移动 数据移动方面的指令有3条,都属于双操作数指令,分别是move(32位数据移动), moveb(8位 数据 移动 ),movew(16位 数据 移动 )。 2.1.12.1.12.1.12.1.1 movemovemovemove 格式movemovemovemove srcsrcsrcsrc totototo objobjobjobj 说明将src src src src 的 数据 复制 到 obj obj obj obj 中 操 作位 数 32323232位 操 作数 规则 src src src src 允 许使 用任 意寻 址方 式 obj obj obj obj 不 允许 使用 ‘地 址式 ’和‘常 量式 ’的 寻址 方式 当srcsrcsrcsrc ==== objobjobjobj ==== 字符串式的时候,move move move move 指令启用串复制,把src src src src 地址处 的 字符 串复 制到 obj obj obj obj 地 址的 缓冲 区内 使 用示 例 movemovemovemove 0000 totototo r13r13r13r13 movemovemovemove &&&&var2var2var2var2 totototo r15r15r15r15 movemovemovemove r12r12r12r12 totototo var1var1var1var1 movemovemovemove $var$var$var$var totototo $vag$vag$vag$vag 2.1.22.1.22.1.22.1.2 movebmovebmovebmoveb 格式movebmovebmovebmoveb srcsrcsrcsrc totototo objobjobjobj 说明将src src src src 的 数据 复制 到 obj obj obj obj 中 操 作位 数 8888位 操 作数 规则 同movemovemovemove 使 用示 例 movemovemovemovebbbb 0000 totototo r13r13r13r13 movemovemovemovebbbb &&&&var2var2var2var2 totototo r15r15r15r15( 取地 址的 值一 定是 32323232位 ,此 处 8888位 无效 ) movemovemovemovebbbb r12r12r12r12 totototo var1var1var1var1 2.1.32.1.32.1.32.1.3 movewmovewmovewmovew 格式movewmovewmovewmovew srcsrcsrcsrc totototo objobjobjobj 说明将src src src src 的 数据 复制 到 obj obj obj obj 中 操 作位 数 16161616位 操 作数 规则 同movemovemovemove 使 用示 例 movemovemovemovewwww 0000 totototo r13r13r13r13 movemovemovemovewwww &&&&var2var2var2var2 totototo r15r15r15r15( 取地 址的 值一 定是 32323232位 ,此 处 16161616位 无效 ) movemovemovemovewwww r12r12r12r12 totototo var1var1var1var1 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第11页 2.22.22.22.2 算术运算 算 术运 算方 面的 指令 有 4条,都 属于 双操 作数 指令 ,分 别是 add,sub,mul,div。浮点 计 算在 1.04 版 本中 未提 供支 持, 如使 用, 可通 过平 台库 实现 。 2.2.12.2.12.2.12.2.1 addaddaddadd 格式addaddaddadd srcsrcsrcsrc totototo objobjobjobj 说明将src src src src 的 数据 与 obj obj obj obj 的 数据 相加 ,再 存入 objobjobjobj,objobjobjobj ==== objobjobjobj ++++ srcsrcsrcsrc 操 作位 数 32323232位 操 作数 规则 src src src src 不 允许 使用 ‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 obj obj obj obj 不 允许 使用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 addaddaddadd 1111 totototo r0r0r0r0 addaddaddadd r0r0r0r0 totototo r1r1r1r10000 addaddaddadd r12r12r12r12 totototo var1var1var1var1 addaddaddadd ****r12r12r12r12 totototo var1var1var1var1 addaddaddadd rrrr0000 totototo *r1*r1*r1*r1 2.2.22.2.22.2.22.2.2 subsubsubsub 格式subsubsubsub srcsrcsrcsrc totototo objobjobjobj 说明obj obj obj obj 减去src src src src 获 取的 数据 并存 入 objobjobjobj,objobjobjobj ==== objobjobjobj ---- srcsrcsrcsrc 操 作位 数 32323232位 操 作数 规则 src src src src 不 允许 使用 ‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 obj obj obj obj 不 允许 使用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 subsubsubsub 1111 totototo r0r0r0r0 subsubsubsub r0r0r0r0 totototo r1r1r1r10000 subsubsubsub r12r12r12r12 totototo var1var1var1var1 subsubsubsub ****r12r12r12r12 totototo var1var1var1var1 subsubsubsub rrrr0000 totototo *r1*r1*r1*r1 2.2.32.2.32.2.32.2.3 mulmulmulmul 格式mulmulmulmul srcsrcsrcsrc totototo objobjobjobj 说明obj obj obj obj 乘以src src src src 获 取的 数据 并存 入 objobjobjobj,objobjobjobj ==== objobjobjobj **** srcsrcsrcsrc 操 作位 数 32323232位 操 作数 规则 src src src src 不 允许 使用 ‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 obj obj obj obj 不 允许 使用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 mulmulmulmul 1111 totototo r0r0r0r0 mulmulmulmul r0r0r0r0 totototo r1r1r1r10000 mulmulmulmul r12r12r12r12 totototo var1var1var1var1 mulmulmulmul ****r12r12r12r12 totototo var1var1var1var1 mulmulmulmul rrrr0000 totototo *r1*r1*r1*r1 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第12页 2.2.42.2.42.2.42.2.4 divdivdivdiv 格式divdivdivdiv srcsrcsrcsrc totototo objobjobjobj 说明obj obj obj obj 除以srcsrcsrcsrc,商放入r1r1r1r1寄存器,余数放入r2r2r2r2寄存器;注意,src src src src 除数 不 能为 0000 操 作位 数 32323232位 操 作数 规则 src src src src 不 允许 使用 ‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 obj obj obj obj 不 允许 使用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 divdivdivdiv 1111 totototo r0r0r0r0 divdivdivdiv r0r0r0r0 totototo r1r1r1r10000 divdivdivdiv r12r12r12r12 totototo var1var1var1var1 divdivdivdiv ****r12r12r12r12 totototo var1var1var1var1 divdivdivdiv rrrr0000 totototo *r1*r1*r1*r1 2.32.32.32.3 堆栈 堆栈支持方面的指令有2条,都属于单操作数指令,分别是push 和pop。在1.04 中尚 未 加入 pusha 与popa 的 支持 ,这 个需 要注 意。 2.3.12.3.12.3.12.3.1 pushpushpushpush 格式pushpushpushpush srcsrcsrcsrc 说明将src src src src 指 示的 数据 压入 堆栈 顶端 ,并 调整 堆栈 指针 寄存 器 pspspsps 操 作位 数 32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 使 用示 例 pushpushpushpush 56565656 pushpushpushpush r0r0r0r0 pushpushpushpush ****rrrr0000 pushpushpushpush &var&var&var&var pushpushpushpush varvarvarvar pushpushpushpush *var*var*var*var 2.3.22.3.22.3.22.3.2 poppoppoppop 格式poppoppoppop srcsrcsrcsrc 说明将 堆栈 顶端 数据 弹入 src src src src 中 并调 整堆 栈指 针寄 存器 pspspsps 操 作位 数 32323232位 操 作数 规则 src src src src 不 能使 用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 poppoppoppop r0r0r0r0 poppoppoppop ****rrrr0000 poppoppoppop varvarvarvar poppoppoppop *var*var*var*var SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第13页 2.42.42.42.4 过程 过 程方 面涉 及 2条 指令 , call 是 单操 作数 指令 , ret 没 有操 作数 。 2.4.12.4.12.4.12.4.1 callcallcallcall 格式callcallcallcall srcsrcsrcsrc 说明除了常量名,其他任何名字所代表的地址,call call call call 指令都能正确调用:它 将当前程序的下一条指令地址(32323232位)压入堆栈,然后转到srcsrcsrcsrc。但要 小 心, 不要 让 call call call call 调 用一 个变 量或 者数 据区 操 作位 数 32323232位 操 作数 规则 src src src src 只 使用 ‘直 接式 ’和‘寄 存器 式 ’的 寻址 方式 ,src src src src 也 可是 一个 标号 使 用示 例 callcallcallcall r0r0r0r0 callcallcallcall strcpystrcpystrcpystrcpy 2.4.22.4.22.4.22.4.2 retretretret 格式retretretret 说明从 堆栈 弹出 32323232位 数据 ,装 载到 指令 指针 寄存 器 pcpcpcpc 操 作位 数 32323232位 操 作数 规则 无 使 用示 例 retretretret 2.52.52.52.5 位及循环 位 及循 环涉 及 3条 指令 ,分 别是 bit,shift,loop, 它们 均为 双操 作数 带扩 展码 的指 令 。 2.5.12.5.12.5.12.5.1 bitbitbitbit 格式bitbitbitbit srcsrcsrcsrc objobjobjobj 说明位运算指令bit bit bit bit 将src src src src 与obj obj obj obj 的数据,按照方式进行位运算后,存 入objobjobjobj; 如果 是not not not not 运 算, 那么 src src src src 无效 扩 展码 是 位运 算符 号, 它的 取值 是: |||| 表示orororor &&&& 表示andandandand ~~~~ 表示notnotnotnot ^^^^ 表示xorxorxorxor 操 作位 数 8888~32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 ; obj obj obj obj 不 能使 用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 bitbitbitbit r1r1r1r1 |||| r0r0r0r0 bitbitbitbit 7777 &&&&****rrrr0000 bitbitbitbit 127127127127 ^^^^ r1r1r1r1 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第14页 bitbitbitbit whatwhatwhatwhat ~~~~ r1r1r1r1(not not not not 运 算, what what what what 无 效) 2.5.22.5.22.5.22.5.2 shiftshiftshiftshift 格式shiftshiftshiftshift srcsrcsrcsrc objobjobjobj 说明移 位指 令 shift shift shift shift 将obj obj obj obj 指 示的 数据 按照 方 式移 位 src src src src 次后,存入objobjobjobj 扩 展码 是 移位 指示 符, 它的 取值 是: <<<< 表 示左 移 >>>> 表 示右 移 操 作位 数 8888~32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 ; obj obj obj obj 不 能使 用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 shiftshiftshiftshift 5555 >>>> r0r0r0r0 shiftshiftshiftshift r1r1r1r1 <<<< ****rrrr0000 shiftshiftshiftshift *r0*r0*r0*r0 <<<< r1r1r1r1 shiftshiftshiftshift var1var1var1var1 >>>> var2var2var2var2 2.5.32.5.32.5.32.5.3 looplooplooploop 格式looplooplooploop srcsrcsrcsrc objobjobjobj 说明循环移位指令looloolooloopppp 将obobobobjjjj 指示的数据按照方式循环移位srsrsrsrcccc 次后, 存入objobjobjobj 扩 展码 是 移位 指示 符, 它的 取值 是: <<<< 表 示左 移 >>>> 表 示右 移 操 作位 数 8888~32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 ; obj obj obj obj 不 能使 用 ‘常 量式 ’、‘字 符串 式 ’和‘地 址式 ’的 寻址 方式 使 用示 例 looplooplooploop 5555 >>>> r0r0r0r0 looplooplooploop r1r1r1r1 <<<< ****rrrr0000 looplooplooploop *r0*r0*r0*r0 <<<< r1r1r1r1 looplooplooploop var1var1var1var1 >>>> var2var2var2var2 2.62.62.62.6 跳转判断 跳转判断涉及3条指令,其中jump 是单操作数指令,ifj 与ifc 为三操作数带扩展码的 指 令。 2.6.12.6.12.6.12.6.1 jumpjumpjumpjump 格式jumpjumpjumpjump srcsrcsrcsrc 说明除了常量名,其他任何名字所代表的地址,jump jump jump jump 指令都能正确执行。 但 要小 心, 不要 让 jump jump jump jump 调 用一 个变 量或 者数 据区 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第15页 操 作位 数 32323232位 操 作数 规则 src src src src 只 使用 ‘直 接式 ’和‘寄 存器 式 ’的 寻址 方式 ,src src src src 也 可是 一个 标号 使 用示 例 jumpjumpjumpjump r0r0r0r0 jumpjumpjumpjump tabtabtabtab 2.6.22.6.22.6.22.6.2 ifjifjifjifj 格式ifjifjifjifj srcsrcsrcsrc objobjobjobj o3o3o3o3 说明若srcsrcsrcsrc obj obj obj obj 的式子成立,跳转到o3o3o3o3地址处执行指令;否则继续执 行 下一 条指 令 扩 展码 是 比较 指示 符, 它的 取值 是: <<<< 小于 <=<=<=<= 小 于等 于 >>>> 大于 >=>=>=>= 大 于等 于 <><><><> 不 等于 ======== 等于 操 作位 数 8888~32323232位 操 作数 规则 src src src src 和obj obj obj obj 不 能使 用 ‘字 符串 式 ’的 寻址 方式 ; o3o3o3o3只 能使 用 ‘直 接式 ’的 寻址 方式 ,它 也可 是一 个标 号 使 用示 例 ifjifjifjifj r0r0r0r0 >=>=>=>= 127127127127 overoveroverover ifjifjifjifj r1r1r1r1 <<<< 6666 nextnextnextnext ifjifjifjifj *r0*r0*r0*r0 ======== *r1*r1*r1*r1 _equ_equ_equ_equ ifjifjifjifj *r0*r0*r0*r0 <><><><> r1r1r1r1 who_am_iwho_am_iwho_am_iwho_am_i 2.6.32.6.32.6.32.6.3 ifcifcifcifc 格式ifcifcifcifc srcsrcsrcsrc objobjobjobj o3o3o3o3 说明若srcsrcsrcsrc obj obj obj obj 的式子成立,执行callcallcallcall o3o3o3o3指令,待o3o3o3o3过程执行完毕, 接 着执 行下 一条 指令 ; 无论srcsrcsrcsrc obj obj obj obj 的 式子 成立 与否 ,都 将继 续执 行下 一条 指令 扩 展码 是 比较 指示 符, 它的 取值 是: <<<< 小于 <=<=<=<= 小 于等 于 >>>> 大于 >=>=>=>= 大 于等 于 <><><><> 不 等于 ======== 等于 操 作位 数 8888~32323232位 操 作数 规则 src src src src 和obj obj obj obj 不 能使 用 ‘字 符串 式 ’的 寻址 方式 ; o3o3o3o3只 能使 用 ‘直 接式 ’的 寻址 方式 ,它 也可 是一 个标 号 使 用示 例 ifcifcifcifc r0r0r0r0 >=>=>=>= 127127127127 save_numsave_numsave_numsave_num ifcifcifcifc r1r1r1r1 <<<< 6666 next_numnext_numnext_numnext_num SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第16页 ifcifcifcifc *r0*r0*r0*r0 ======== *r1*r1*r1*r1 equequequequ ifcifcifcifc *r0*r0*r0*r0 <><><><> r1r1r1r1 who_am_iwho_am_iwho_am_iwho_am_i 2.72.72.72.7 线程 线 程涉 及 3条 指令 , crth,deth,joth, 均为 无操 作数 的指 令。 2.7.12.7.12.7.12.7.1 crthcrthcrthcrth 格式crthcrthcrthcrth 说明crth crth crth crth 是 创建 线程 指令 ,入 口如 下: r15r15r15r15 ==== 待 创建 线程 的地 址 r0r0r0r0~r14 r14 r14 r14 的寄存器数据都会被复制到新线程中,因此要向新线程传递参 数,r0r0r0r0~r14 r14 r14 r14 寄 存器 这 15151515个 寄存 器可 以存 放参 数之 用 当 该指 令执 行完 毕: r14r14r14r14 ==== 1111, 成功 ; r15 r15 r15 r15 返 回线 程 IDIDIDID r14r14r14r14 ==== 0000, 失败 操 作位 数 32323232位 操 作数 规则 无 使 用示 例 movemovemovemove &&&&threadthreadthreadthread totototo r1r1r1r15555 crthcrthcrthcrth 2.7.22.7.22.7.22.7.2 dethdethdethdeth 格式dethdethdethdeth 说明deth deth deth deth 是 销毁 线程 指令 ,入 口如 下: r14r14r14r14 ==== 1111, 销毁 其他 线程 ; r15r15r15r15 ==== 线程IDIDIDID r14r14r14r14 ==== 0000, 销毁 自己 当 该指 令执 行完 毕: r14r14r14r14 ==== 1111, 成功 r14r14r14r14 ==== 0000, 失败 注意,当销毁自己成功时,是无论如何都无法进行deth deth deth deth 执行状态测试 的 ,因 为线 程已 经消 失, 无法 继续 执行 操 作位 数 32323232位 操 作数 规则 无 使 用示 例 movemovemovemove 0000 totototo rrrr14141414 dethdethdethdeth SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第17页 2.7.32.7.32.7.32.7.3 jothjothjothjoth 格式jothjothjothjoth 说明joth joth joth joth 是 等待 线程 结束 的指 令, 入口 如下 : r15r15r15r15 ==== 线程IDIDIDID joth joth joth joth 每次指令只等待一个线程,这个线程的IDIDIDID放入r15 r15 r15 r15 中。如果该线 程未结束,那么等待线程会一直等待,不会继续执行,直到等待的线程 结 束; 如果 该线 程非 法, 那么 joth joth joth joth 会 直接 返回 操 作位 数 32323232位 操 作数 规则 无 使 用示 例 movemovemovemove &&&&threadthreadthreadthread totototo r1r1r1r15555 crthcrthcrthcrth jothjothjothjoth 2.82.82.82.8 网络 网 络只 涉及 1条 指令 , lsrv, 此为 单操 作数 指令 。 2.8.12.8.12.8.12.8.1 lsrvlsrvlsrvlsrv 格式lsrvlsrvlsrvlsrv srcsrcsrcsrc 说明当src src src src 不为CLOSE CLOSE CLOSE CLOSE 时 ,建 立一 个 Socket Socket Socket Socket 服 务或 连接 ,入 口如 下: r13r13r13r13 ==== ip ip ip ip 地 址字 符串 地址 (当 创建 服务 时, 此寄 存器 无意 义) r14r14r14r14 ==== 端 口号 r15r15r15r15 ==== Socket Socket Socket Socket 服 务程 序地 址( 当创 建连 接时 ,此 寄存 器无 意义 ) 当 该指 令执 行完 毕: r10r10r10r10 ==== 1111, 成功 ; r11r11r11r11 ==== Socket Socket Socket Socket 服 务程 序线 程 IDIDIDID( 当创 建连 接时 ,此 寄存 器无 意义 ) r12r12r12r12 ==== SocketSocketSocketSocket IDIDIDID r10r10r10r10 ==== 0000, 失败 当lsrv lsrv lsrv lsrv 建立服务时,其会自动创建一个Socket Socket Socket Socket 服务线程,由r15 r15 r15 r15 寄存 器 制定 线程 地址 当src src src src 为CLOSECLOSECLOSECLOSE, 关闭 Socket Socket Socket Socket 连 接, 入口 如下 : r15r15r15r15 ==== SocketSocketSocketSocket IDIDIDID 操 作位 数 32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 使 用示 例 movemovemovemove 0000 totototo r13r13r13r13 movemovemovemove PORTPORTPORTPORT totototo r14r14r14r14 movemovemovemove &th_srv&th_srv&th_srv&th_srv totototo r15r15r15r15 lsrvlsrvlsrvlsrv TCP_SRVTCP_SRVTCP_SRVTCP_SRV movemovemovemove r12r12r12r12 totototo r15r15r15r15 lsrvlsrvlsrvlsrv CLOSECLOSECLOSECLOSE SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第18页 2.92.92.92.9 输入输出 输 入输 出涉 及 3条 指令 , recv,send 与trap, 均为 单操 作数 指令 。 2.9.12.9.12.9.12.9.1 recvrecvrecvrecv 格式recvrecvrecvrecv srcsrcsrcsrc 说明注 意, 在本 手册 发布 时, src src src src 项 只支 持 IO_SOCKET IO_SOCKET IO_SOCKET IO_SOCKET 值 recv recv recv recv 指令是通用IO IO IO IO 数据接收指令,IO IO IO IO 类型由src src src src 指定,当src src src src 为 IO_SOCKET IO_SOCKET IO_SOCKET IO_SOCKET 时 ,入 口如 下: r13r13r13r13 ==== 缓 冲区 地址 r14r14r14r14 ==== 字 节数 r15r15r15r15 ==== SocketSocketSocketSocket IDIDIDID 当 该指 令执 行完 毕: r10r10r10r10 ==== 1111, 成功 r11r11r11r11 ==== 实 际收 到的 字节 数 r10r10r10r10 ==== 0000, 失败 操 作位 数 32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 使 用示 例 movemovemovemove &buffer&buffer&buffer&buffer totototo r13r13r13r13 movemovemovemove 28282828 totototo r14r14r14r14 movemovemovemove socket_idsocket_idsocket_idsocket_id totototo r15r15r15r15 recvrecvrecvrecv IO_SOCKETIO_SOCKETIO_SOCKETIO_SOCKET 2.9.22.9.22.9.22.9.2 sendsendsendsend 格式sendsendsendsend srcsrcsrcsrc 说明注 意, 在本 手册 发布 时, src src src src 项 只支 持 IO_SOCKET IO_SOCKET IO_SOCKET IO_SOCKET 值 send send send send 指令是通用IO IO IO IO 数据发送指令,IO IO IO IO 类型由src src src src 指定,当src src src src 为 IO_SOCKET IO_SOCKET IO_SOCKET IO_SOCKET 时 ,入 口如 下: r13r13r13r13 ==== 缓 冲区 地址 r14r14r14r14 ==== 字 节数 r15r15r15r15 ==== SocketSocketSocketSocket IDIDIDID 当 该指 令执 行完 毕: r10r10r10r10 ==== 1111, 成功 r11r11r11r11 ==== 实 际发 送的 字节 数 r10r10r10r10 ==== 0000, 失败 操 作位 数 32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 使 用示 例 movemovemovemove &buffer&buffer&buffer&buffer totototo r13r13r13r13 movemovemovemove 28282828 totototo r14r14r14r14 movemovemovemove socket_idsocket_idsocket_idsocket_id totototo r15r15r15r15 sendsendsendsend IO_SOCKETIO_SOCKETIO_SOCKETIO_SOCKET SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第19页 2.9.32.9.32.9.32.9.3 traptraptraptrap 格式traptraptraptrap srcsrcsrcsrc 说明以src src src src 的值作为API API API API 功能的调用码,trap trap trap trap 指令进行API API API API 功能的陷入功 能 ,关 于 trap trap trap trap 的 陷入 ,请 参考 第 5555章 内容 操 作位 数 32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 使 用示 例 traptraptraptrap 10101010 traptraptraptrap r1r1r1r1 traptraptraptrap varvarvarvar 2.102.102.102.10 其他指令 2.10.12.10.12.10.12.10.1 waitwaitwaitwait 格式waitwaitwaitwait srcsrcsrcsrc 说明程 序等 待 src src src src 个 毫秒 操 作位 数 8888~32323232位 操 作数 规则 src src src src 不 能使 用 ‘字 符串 式 ’的 寻址 方式 使 用示 例 waitwaitwaitwait 1000100010001000 waitwaitwaitwait r1r1r1r1 waitwaitwaitwait varvarvarvar 2.112.112.112.11 用户指令 Liu 支 持用 户自 定义 指令 ,这 极大 的丰 富了 指令 集中 专用 指令 的内 容 。但 在本 手册 所描 述的1.04 版 本中 ,此 模组 被关 闭, 现阶 段仍 在测 试期 间。 用 户自 定义 指令 的开 放版 本和 时间 请进 入 SAL 官 网查 询: http://www.vm2.org/sal/ SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第20页 第3333章创建程序 编 写程 序是 一件 有趣 的事 情 ,用SAL 也 同样 如此 。本 章将 描述 SAL 怎 样从 无到 有创 建 程序,以 及介 绍编 写程 序中 的相 关事 宜和 语法 规定 ,好了,话 不多 说 ,从 久违 亲切 的 “Hello! World!”开启SAL 新 篇章 。 3.13.13.13.1 第一个程序 首先要找一件文本编辑工具,Windows 记事本也好,VC++编辑器也罢,再不UEdit、 Q10 都好,如 果你 习惯 UNIX 的VI,也 不错 ,总之SAL 不 挑平 台 ,你 用哪 种编 辑器 都可 以 , SAL 不 会让 你满 头雾 水的 在平 台之 间切 换。 现 在有 了文 本工 具 ,把 下面 的代 码敲 下去 保存 起来 ,名 字由 你来 定 ,我 用的 是 hello.ax。 //////// //////// hello.axhello.axhello.axhello.ax :::: ThisThisThisThis isisisis firstfirstfirstfirst programprogramprogramprogram bybybyby SALSALSALSAL ☺☺☺☺ //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" datadatadatadata hello_bufhello_bufhello_bufhello_buf isisisis {{{{ bytebytebytebyte bufferbufferbufferbuffer isisisis "hello,"hello,"hello,"hello, world!",world!",world!",world!", 13,13,13,13, 10,10,10,10, 0000 }}}} codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &buffer&buffer&buffer&buffer totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS traptraptraptrap EXITEXITEXITEXIT }}}} 这 段程 序可 能与 你想 象中 的汇 编有 些不 同, 它看 上去 还算 友好 ,不 那么 生硬 。 “hello.axhello.axhello.axhello.ax”,SAL 中 的源 代码 默认 扩展 名为 .ax; “////////”是 注释 , SAL 中 只采 用这 一种 注释 方法 ,单 行注 释; “includeincludeincludeinclude”完成一个文件包含工作,这种包含是唯一性的,如果之前的相关源文件包 含 某个 文件 ,那 么再 遇到 相同 文件 的时 候 ,SAL 会 避让 此文 件 。扩 展名 为 .i的 文件 是头 文件 , 当 然, include 有 另外 一个 重要 工作 ——包含.ax 文 件, 使整 个项 目一 同编 译。 如 果你 愿意 ,可 以将 include 这 一行 挪到 源程 序的 最后 一行 ,SAL 依 然完 好工 作 。只要 不 在数 据段 定义 ( data…is) 和程 序段 定义 ( code…is)有include 动 作, include 可 以写 在任 意 一行 。 接 下来 是数 据段 的定 义, 如下 : datadatadatadata hello_bufhello_bufhello_bufhello_buf isisisis {{{{ bytebytebytebyte bufferbufferbufferbuffer isisisis "hello,"hello,"hello,"hello, world!",world!",world!",world!", 13,13,13,13, 10,10,10,10, 0000 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第21页 }}}} hello_buf hello_buf hello_buf hello_buf 是 数据 段的 名字 ; buffer buffer buffer buffer 是 数据 段内 “hello, ……”这 个字 符串 的首 地址 ,名 字; 在 数据 段中 定义 数据 要指 定数 据宽 度, 此程 序中 用 byte(8位 )声 明一 段数 据, 注意 , SAL 不 处理 特殊 字符 ,因 此在 字符 串结 尾处 要显 示的 加上 13(回车),10(换行),0(字符 串 结束 符 ); 声明 数据 还可 使用 word(16位),dword(32位), 但本 例中 无需 。 来 看代 码段 : codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &buffer&buffer&buffer&buffer totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS traptraptraptrap EXITEXITEXITEXIT }}}} main main main main 是程序段名字,SAL 要求项目程序中只可以有一个main 程序段,这是程序执行 入 口, 此例 中只 有一 个程 序段 ,因 而也 只能 用 main 作 为程 序段 的名 字。 对于trap 陷 入要 说一 下: trap trap trap trap 陷 入号 说明入口 CON_PUTSCON_PUTSCON_PUTSCON_PUTS 在 屏幕 打印 字符 串 r0 = 字 符串 地址 EXITEXITEXITEXIT 结 束程 序 无 一 般的 陷入 功能 号在 head/console.i 中 有定 义 ,陷 入的 详细 功能 说明 将在 第 5章 内描 述 。 到 此, hello.ax 程 序显 而易 见: 在屏 幕打 印 “hello, world!”, 然后 结束 程序 。 SAL SAL SAL SAL 要求所有实体数据的声明都要写在数据段中,数据段允许有若干个,而且不要求 上下顺序,但不能重名;所有代码都要写在代码段中且必须有main main main main 代码段,代码段允许有 若 干个 ,而 且不 要求 上下 顺序 ,但 不能 重名 。 3.23.23.23.2 编译 SAL SAL SAL SAL 程序 即 便是 再简 单的 程序 在运 行之 前都 要经 过编 译 ,SAL 也 毫不 例外 。如 果经 常使 用 SAL, 那么在编译之前,建议你将SAL 复制到系统自动搜索目录,或者自建搜索,我们给出第一 种 方法 : E:\sal>copyE:\sal>copyE:\sal>copyE:\sal>copy sal.exesal.exesal.exesal.exe c:\windowsc:\windowsc:\windowsc:\windows E:\sal>copyE:\sal>copyE:\sal>copyE:\sal>copy liu.exeliu.exeliu.exeliu.exe c:\windowsc:\windowsc:\windowsc:\windows 以 上是 Windows 操 作系 统, 来看 Linux: ccccaileiaileiaileiailei@cailei-nw9440:~/src/sal$@cailei-nw9440:~/src/sal$@cailei-nw9440:~/src/sal$@cailei-nw9440:~/src/sal$ sudosudosudosudo cpcpcpcp ./sal./sal./sal./sal /usr/sbin/usr/sbin/usr/sbin/usr/sbin SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第22页 ccccaileiaileiaileiailei@cailei-nw9440:~/src/sal$@cailei-nw9440:~/src/sal$@cailei-nw9440:~/src/sal$@cailei-nw9440:~/src/sal$ sudosudosudosudo cpcpcpcp ./liu./liu./liu./liu /usr/sbin/usr/sbin/usr/sbin/usr/sbin OK,现 在来 尝试 编译 上一 章的 hello.ax,顺 便说 一下 ,要 将包 内的 head 目 录与 hello.ax 放 置在 同一 路径 下, 如果 将 head 目 录移 走, 要相 应的 修改 hello.ax 中的include: 成功了,生成一个hello.jx 文件,这个就是执行文件,可以直接拷贝到各个平台用Liu 执 行的 程序 文件 ,或 者叫 字节 码一 类。 那 么, 可以 运行 看看 效果 了: 见 到了 久违 的 “hello, world!”,在Linux 下 也是 一样 的。 3.33.33.33.3 只要源码 上一节展示了一个极简单的SAL 程序,接下来的几个小节将对写程序的必要元素进行 说 明, 相信 经过 以下 几个 小节 的通 读, 可以 找到 构建 复杂 程序 的方 法。 3.3.13.3.13.3.13.3.1 宏定义 宏 这个 概念 不新 鲜了 ,实用,常用,不 可少 的元 素 ,或 者称 作常 量符 号 。以 下代 码说 明 了SAL 是 如何 使用 宏的 : //////// //////// console.iconsole.iconsole.iconsole.i ////////SALSALSALSALAPIAPIAPIAPI //////// create:create:create:create: 2003.6.132003.6.132003.6.132003.6.13 //////// definedefinedefinedefine FALSEFALSEFALSEFALSE isisisis 0000 definedefinedefinedefine TRUETRUETRUETRUE isisisis 1111 definedefinedefinedefine EOFEOFEOFEOF isisisis -1-1-1-1 definedefinedefinedefine NULLNULLNULLNULL isisisis 0000 definedefinedefinedefine GETM_DECGETM_DECGETM_DECGETM_DEC isisisis 1111 definedefinedefinedefine GETM_OCTGETM_OCTGETM_OCTGETM_OCT isisisis 2222 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第23页 definedefinedefinedefine GETM_HEXGETM_HEXGETM_HEXGETM_HEX isisisis 3333 //////// 文 件指 针移 动方 式 //////// definedefinedefinedefine SEEK_SETSEEK_SETSEEK_SETSEEK_SET isisisis 0000 definedefinedefinedefine SEEK_CURSEEK_CURSEEK_CURSEEK_CUR isisisis 1111 definedefinedefinedefine SEEK_ENDSEEK_ENDSEEK_ENDSEEK_END isisisis 2222 ////////……省略 如你所见,这是console.i 的部分内容,透过它可以轻易的发现宏定义/常量符号的使用 方 法: definedefinedefinedefine NAMENAMENAMENAME isisisis VALUEVALUEVALUEVALUE 需 要注 意 ,常 量名 字 NAME 不 可以 与其 他常 量名 ,数 据名 ,段 名一 样 ,如 果不 幸一 样 , 编 译器 会提 醒我 们错 在哪 里, 不过 仍然 要注 意名 字重 复的 事情 发生 。 3.3.23.3.23.3.23.3.2 堆栈和缓冲区 对于汇编来讲,堆栈的操作是重点之一,也是错误率高的部分之一,甚至C语言都用 到堆栈来做参数传递。对于SAL 来讲,就没这么复杂了,如果你想在程序执行前定义堆栈 空 间, 那么 就这 样做 ,我 们用 hello.ax 小 改一 下: //////// //////// hello.axhello.axhello.axhello.ax :::: ThisThisThisThis isisisis firstfirstfirstfirst programprogramprogramprogram bybybyby SALSALSALSAL ☺☺☺☺ //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" stackstackstackstack lengthlengthlengthlength isisisis 100100100100 //////// 显 示的 定义 100 100 100 100 个32323232位 数据 的堆 栈 datadatadatadata hello_bufhello_bufhello_bufhello_buf isisisis {{{{ bytebytebytebyte bufferbufferbufferbuffer isisisis "hello,"hello,"hello,"hello, world!",world!",world!",world!", 13,13,13,13, 10,10,10,10, 0000 }}}} codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &buffer&buffer&buffer&buffer totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS traptraptraptrap EXITEXITEXITEXIT }}}} 这 样程 序在 执行 前就 有了 400 字 节的 堆栈 。 事 实上 ,我 们之 前没 有堆 栈的 hello 程 序也 是可 以执 行的 ,而 且没 有任 何问 题, 不是 因 为 代码 内不 存在 堆栈 操作 指令 ,真 正的 原因 是 Liu 的 堆栈 机制 是动 态的 ,从 第一 次堆 栈操 作 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第24页 开 始, 建立 动态 堆栈 区域 ,可 随之 增大 ,随 之减 小。 如 果你 显示 定义 的堆 栈用 完了 ,比 如这 个程 序中 的 400 字 节堆 栈区 ,都 用完 了 ,当再次 push 或者call 时,Liu 的 动态 堆栈 机制 立刻 启动 ,为 程序 划分 堆栈 空间 。这 一过 程是 自动 的 , 不 需要 用户 程序 的干 预。 接 下来 看缓 冲区 的定 义和 声明 : datadatadatadata bufferbufferbufferbuffer isisisis {{{{ bytebytebytebyte bbbb lengthlengthlengthlength isisisis 100100100100 //////// bbbb缓 冲区 长度 100 100 100 100 字节 wordwordwordword wwww lengthlengthlengthlength isisisis 100100100100 //////// wwww缓 冲区 长度 200 200 200 200 字节 dworddworddworddword dddd lengthlengthlengthlength isisisis 100100100100 //////// dddd缓 冲区 长度 400 400 400 400 字节 }}}} b,w,d均 是实 体数 据 ,必 须在 数据 段中 声明 ,至 于要 写到 哪个 数据 段中 ,以 及是 否要 将 源代 码安 排更 明了 ,由 程序 员自 己决 定。 现 在我 们来 初始 化 w缓 冲区 中的 数据 ,将 w缓 冲区 所有 数据 置 1: codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &&&&wwww totototo r0r0r0r0 movemovemovemove 100100100100 totototo rrrr1111 re_set:re_set:re_set:re_set: movemovemovemovewwww 1111 totototo *r0*r0*r0*r0 addaddaddadd 2222 totototo r0r0r0r0 subsubsubsub 1111 totototo rrrr1111 ifjifjifjifj r1<>r1<>r1<>r1<> 0000 rrrre_sete_sete_sete_set traptraptraptrap EXITEXITEXITEXIT }}}} 3.3.33.3.33.3.33.3.3 无名结构体 SAL 并 不能 像高 级语 言如 C那 样方 便的 使用 结构 体变 量, 如果 不得 不用 ,那 么在 SAL 中 有一 种方 法可 以使 用结 构, 就是 无名 结构 体。 先 来看 无名 结构 体的 定义 方法 : structstructstructstruct isisisis {{{{ bytebytebytebyte var1var1var1var1 isisisis 100100100100 wordwordwordword var2var2var2var2 isisisis 100100100100 dworddworddworddword var3var3var3var3 isisisis 100100100100 }}}} SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第25页 关 于无 名结 构体 的描 述如 下: A.一 个程 序中 可以 定义 任意 多个 无名 结构 体; B.无 名结 构体 内的 数据 不生 成实 体数 据, 其名 字只 表示 相对 于每 个结 构体 的偏 移地 址 ; C.无 名结 构体 内的 数据 可以 用 ‘取 地址 ’运 算。 如上代码,var1 的地址是0,var2 的地址是1,var3 的地址是3。无名结构体的这个特 性 可以 与缓 冲区 联用 ,达 到结 构变 量的 同样 的使 用效 果。 来 看一 段无 名结 构体 的应 用示 例, 还是 在 hello.ax 基 础上 小改 一下 : //////// //////// hello.axhello.axhello.axhello.ax :::: ThisThisThisThis isisisis firstfirstfirstfirst programprogramprogramprogram bybybyby SALSALSALSAL ☺☺☺☺ //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" datadatadatadata hello_bufhello_bufhello_bufhello_buf isisisis {{{{ bytebytebytebyte bufferbufferbufferbuffer isisisis "hello,"hello,"hello,"hello, world!",world!",world!",world!", 13,13,13,13, 10,10,10,10, 0000 }}}} structstructstructstruct isisisis {{{{ bytebytebytebyte offset1offset1offset1offset1 isisisis 0000 bytebytebytebyte offset2offset2offset2offset2 isisisis 1111 }}}} codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &&&&offset1offset1offset1offset1 totototo rrrr1111 movemovemovemove &&&&offset2offset2offset2offset2 totototo rrrr2222 movemovemovemove &buffer&buffer&buffer&buffer totototo rrrr0000 addaddaddadd r0r0r0r0 totototo rrrr1111 addaddaddadd r0r0r0r0 totototo rrrr2222 movemovemovemovebbbb 48484848 totototo ****rrrr1111 movemovemovemovebbbb 48484848 totototo ****rrrr2222 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS traptraptraptrap EXITEXITEXITEXIT }}}} 编 译它 ,看 看运 行结 果, 一目 了然 ! SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第26页 3.3.43.3.43.3.43.3.4 理解 APIAPIAPIAPI SAL 的API 实 际上 是由 trap 指 令引 发的 核心 陷入 过程 ,在 1.04 版 本中 ,提 供三 种标 准 的 核心 陷入 保证 工作 ,分 别是 控制 台输 入输 出 ,标 准文 件处 理 ,标 准数 学处 理 。这 些将 在 第 5章 讲述 。 3.43.43.43.4 使用集成开发环境 SAL 没 有自 己的 IDE,如 果你 想 ,可 以借 用 UltraEdit 做 到这 一点 。我 使用 的是 UltraEdit 14.20, 语法 着色 文件 WORDFILE.UEW 请到SAL 官 网下 载。 首 先, 打开 UltraEdit, 工程 (P)-> 新 建工 程: SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第27页 我 建立 了 hello 工 程, 保存 。然 后添 加文 件: 接 下来 ,高 级 (A)-> 工 程工 具配 置, 准备 配置 编译 器和 运行 系统 : SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第28页 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第29页 配 置完 毕后 ,会 在高 级 (A)中 出现 编译 ,运 行两 个功 能。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第30页 编 译和 运行 系统 配置 完成 ,看 一下 集成 开发 环境 的效 果吧 : SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第31页 第4444章编程示例 在上一章中,你大概已知晓SAL 编程的基本方法,本章着重演示较实用的程序例子。 可 能会 有懵 懂的 地方 ,但 在上 一章 和下 一章 也许 能找 到答 案, 比如 trap 的 某些 陷入 。 4.14.14.14.1 使用随机数 让 我们 来做 一百 万次 随机 数运 算 ,这 是一 个完 整的 程序 ,由2个 源程 序文 件组 成 ,首先 是random.ax 文 件: //////// //////// random.axrandom.axrandom.axrandom.ax //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" datadatadatadata rdatrdatrdatrdat isisisis {{{{ dworddworddworddword randseedrandseedrandseedrandseed isisisis 1111 dworddworddworddword xxxx isisisis 0000 dworddworddworddword hihihihi isisisis 0000 dworddworddworddword lolololo isisisis 0000 }}}} //////// //////// Pseudo-randomPseudo-randomPseudo-randomPseudo-random numbernumbernumbernumber generatorgeneratorgeneratorgenerator forforforfor randomizingrandomizingrandomizingrandomizing thethethethe profilingprofilingprofilingprofiling clock,clock,clock,clock, //////// andandandand whateverwhateverwhateverwhatever elseelseelseelse wewewewe mightmightmightmight useuseuseuse itititit for.for.for.for. TheTheTheThe resultresultresultresult isisisis uniformuniformuniformuniform onononon ////////[0,[0,[0,[0, 2^312^312^312^31 ---- 1].1].1].1]. //////// //////// in:in:in:in: //////// codecodecodecode randomrandomrandomrandom isisisis {{{{ //////// ComputeComputeComputeCompute x[nx[nx[nx[n ++++ 1]1]1]1] ==== (7^5(7^5(7^5(7^5 **** x[n])x[n])x[n])x[n]) modmodmodmod (2^31(2^31(2^31(2^31 ---- 1).1).1).1). //////// FromFromFromFrom "Random"Random"Random"Random numbernumbernumbernumber generators:generators:generators:generators: goodgoodgoodgood onesonesonesones areareareare hardhardhardhard totototo find",find",find",find", //////// ParkParkParkPark andandandand Miller,Miller,Miller,Miller, CommunicationsCommunicationsCommunicationsCommunications ofofofof thethethethe ACM,ACM,ACM,ACM, vol.vol.vol.vol. 31,31,31,31, no.no.no.no. 10,10,10,10, //////// OctoberOctoberOctoberOctober 1988,1988,1988,1988, p.p.p.p. 1195.1195.1195.1195. //////// rewriterewriterewriterewrite bybybyby CaileiCaileiCaileiCailei atatatat 2011.04.182011.04.182011.04.182011.04.18 //////// pushpushpushpush r1r1r1r1 pushpushpushpush r2r2r2r2 movemovemovemove randseedrandseedrandseedrandseed totototo r0r0r0r0 divdivdivdiv 127773127773127773127773 totototo r0r0r0r0 movemovemovemove r1r1r1r1 totototo hihihihi SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第32页 movemovemovemove r2r2r2r2 totototo lolololo mulmulmulmul 16807168071680716807 totototo r2r2r2r2 mulmulmulmul 2836283628362836 totototo r1r1r1r1 subsubsubsub r1r1r1r1 totototo r2r2r2r2 ififififjjjj r2r2r2r2 <<<< 2147483647214748364721474836472147483647 random_overrandom_overrandom_overrandom_over addaddaddadd 2147483647214748364721474836472147483647 totototo r2r2r2r2 random_over:random_over:random_over:random_over: movemovemovemove r2r2r2r2 totototo randseedrandseedrandseedrandseed movemovemovemove r2r2r2r2 totototo r0r0r0r0 poppoppoppop r2r2r2r2 poppoppoppop r1r1r1r1 retretretret }}}} random 是生成随机数的过程,生成的随机数存入r0。这段程序的原型选自BSD4.4 版 本 中的 随机 数处 理函 数, 算法 没有 更改 ,我 只是 用 SAL 写 了一 遍。 下 面是 主程 序 main.ax: //////// //////// main.axmain.axmain.axmain.ax //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" includeincludeincludeinclude "random.a"random.a"random.a"random.axxxx"""" datadatadatadata datdatdatdat isisisis {{{{ bytebytebytebyte randbufrandbufrandbufrandbuf isisisis """"",",",", 0000 }}}} //////// 一 百万 次随 机数 运算 //////// codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &randbuf&randbuf&randbuf&randbuf totototo r0r0r0r0 movemovemovemove 1000000100000010000001000000 totototo r1r1r1r1 re:re:re:re: callcallcallcall sed_mainsed_mainsed_mainsed_main traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS subsubsubsub 1111 totototo r1r1r1r1 ififififjjjj r1r1r1r1 ======== 0000 main_overmain_overmain_overmain_over SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第33页 jumpjumpjumpjump rererere main_over:main_over:main_over:main_over: retretretret }}}} //////// 取 得一 个随 机数 ,将 它处 理后 打印 到屏 幕上 //////// sed_main sed_main sed_main sed_main 无 需声 明, 任何 位置 的程 序可 直接 调用 //////// codecodecodecode sed_mainsed_mainsed_mainsed_main isisisis {{{{ pushpushpushpush r0r0r0r0 pushpushpushpush r1r1r1r1 pushpushpushpush r2r2r2r2 callcallcallcall randomrandomrandomrandom divdivdivdiv 100100100100 totototo r0r0r0r0 //////// 得 到的 随机 数除 以 100100100100, 把余 数作 为打 印内 容 movemovemovemove r2r2r2r2 totototo r0r0r0r0 traptraptraptrap CON_PUTMCON_PUTMCON_PUTMCON_PUTM poppoppoppop r2r2r2r2 poppoppoppop r1r1r1r1 poppoppoppop r0r0r0r0 retretretret }}}} 以 下是 程序 运行 结果 : SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第34页 Windows 就 是很 奇怪 ,C语 言编 写的 百万 次随 机运 算都 会比 Linux 慢,还 会比 Linux 的 SAL 百 万次 随机 运算 慢。 4.24.24.24.2 复制文件 trap 有 标准 文件 的支 持陷 入, 因此 这一 小节 演示 显示 文件 的复 制。 只 有一 个源 文件 , copy.ax, 源代 码如 下: //////// //////// copy.axcopy.axcopy.axcopy.ax //////// includeincludeincludeinclude """"head/head/head/head/console.i"console.i"console.i"console.i" datadatadatadata data_areadata_areadata_areadata_area isisisis {{{{ bytebytebytebyte str1str1str1str1 isisisis "input"input"input"input filefilefilefile [*.*]:[*.*]:[*.*]:[*.*]:",",",", 0000 bytebytebytebyte str2str2str2str2 isisisis "output"output"output"output filefilefilefile [*.*]:[*.*]:[*.*]:[*.*]:",",",", 0000 bytebytebytebyte str3str3str3str3 isisisis "success!","success!","success!","success!", 0000 bytebytebytebyte str4str4str4str4 isisisis "unable"unable"unable"unable openopenopenopen file:file:file:file: ",",",", 0000 bytebytebytebyte srcfilesrcfilesrcfilesrcfile lengthlengthlengthlength isisisis 256256256256 dworddworddworddword srcsrcsrcsrc isisisis 0000 bytebytebytebyte objfileobjfileobjfileobjfile lengthlengthlengthlength isisisis 256256256256 dworddworddworddword objobjobjobj isisisis 0000 }}}} codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &str1&str1&str1&str1 totototo r0r0r0r0 traptraptraptrap CONCONCONCON_PUTS_PUTS_PUTS_PUTS movemovemovemove &srcfile&srcfile&srcfile&srcfile totototo r0r0r0r0 traptraptraptrap CONCONCONCON_GETS_GETS_GETS_GETS movemovemovemove &str2&str2&str2&str2 totototo r0r0r0r0 traptraptraptrap CONCONCONCON_PUTS_PUTS_PUTS_PUTS movemovemovemove &objfile&objfile&objfile&objfile totototo r0r0r0r0 traptraptraptrap CONCONCONCON_GETS_GETS_GETS_GETS movemovemovemove &srcfile&srcfile&srcfile&srcfile totototo r0r0r0r0 movemovemovemove &OPEN_RB&OPEN_RB&OPEN_RB&OPEN_RB totototo r1r1r1r1 traptraptraptrap FILE_OPENFILE_OPENFILE_OPENFILE_OPEN ififififjjjj r15r15r15r15 <><><><> 0000 continue1continue1continue1continue1 movemovemovemove &str4&str4&str4&str4 totototo r0r0r0r0 traptraptraptrap CONCONCONCON_PUTS_PUTS_PUTS_PUTS movemovemovemove &srcfile&srcfile&srcfile&srcfile totototo r0r0r0r0 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第35页 traptraptraptrap CONCONCONCON_PUTS_PUTS_PUTS_PUTS traptraptraptrap EXITEXITEXITEXIT continue1:continue1:continue1:continue1: movemovemovemove r15r15r15r15 totototo srcsrcsrcsrc movemovemovemove &objfile&objfile&objfile&objfile totototo r0r0r0r0 movemovemovemove &OPEN_WB&OPEN_WB&OPEN_WB&OPEN_WB totototo r1r1r1r1 traptraptraptrap FILE_OPENFILE_OPENFILE_OPENFILE_OPEN ififififjjjj r15r15r15r15 <><><><> 0000 continue2continue2continue2continue2 movemovemovemove &str4&str4&str4&str4 totototo r0r0r0r0 traptraptraptrap CONCONCONCON_PUTS_PUTS_PUTS_PUTS movemovemovemove &objfile&objfile&objfile&objfile totototo r0r0r0r0 traptraptraptrap CONCONCONCON_PUTS_PUTS_PUTS_PUTS traptraptraptrap EXITEXITEXITEXIT continue2:continue2:continue2:continue2: movemovemovemove r15r15r15r15 totototo objobjobjobj recopy:recopy:recopy:recopy: movemovemovemove srcsrcsrcsrc totototo r0r0r0r0 traptraptraptrap FILE_FGETCFILE_FGETCFILE_FGETCFILE_FGETC ififififjjjj r15r15r15r15 ======== 256256256256 overoveroverover movemovemovemove objobjobjobj totototo r0r0r0r0 movemovemovemove r15r15r15r15 totototo r1r1r1r1 traptraptraptrap FILE_FPUTCFILE_FPUTCFILE_FPUTCFILE_FPUTC jumpjumpjumpjump recopyrecopyrecopyrecopy over:over:over:over: traptraptraptrap FILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALL traptraptraptrap EXITEXITEXITEXIT }}}} 以 下是 程序 的运 行结 果: 4.34.34.34.3 堆栈有多深? 这个问题很有意思,Liu 的动态堆栈支持将得到验证的机会,我们通过stack.ax 展示这 一 问题 的答 案: //////// //////// stack.axstack.axstack.axstack.ax SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第36页 //////// includeincludeincludeinclude """"head/head/head/head/console.i"console.i"console.i"console.i" datadatadatadata enter_dataenter_dataenter_dataenter_data isisisis {{{{ bytebytebytebyte enterenterenterenter isisisis 13,13,13,13, 10,10,10,10, 0000 }}}} codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove 1111 totototo r0r0r0r0 movemovemovemove 0000 totototo r1r1r1r1 re_push:re_push:re_push:re_push: ifjifjifjifj r1r1r1r1 ======== 10000000100000001000000010000000 contcontcontcont pushpushpushpush r0r0r0r0 addaddaddadd 1111 totototo r0r0r0r0 addaddaddadd 1111 totototo r1r1r1r1 jumpjumpjumpjump re_pushre_pushre_pushre_push cont:cont:cont:cont: movemovemovemove 0000 totototo r1r1r1r1 re_pop:re_pop:re_pop:re_pop: ifjifjifjifj r1r1r1r1 ======== 10000000100000001000000010000000 overoveroverover poppoppoppop r0r0r0r0 addaddaddadd 1111 totototo r1r1r1r1 traptraptraptrap CON_PUTMCON_PUTMCON_PUTMCON_PUTM movemovemovemove &enter&enter&enter&enter totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS jumpjumpjumpjump re_popre_popre_popre_pop over:over:over:over: traptraptraptrap CON_GETCHCON_GETCHCON_GETCHCON_GETCH traptraptraptrap EXITEXITEXITEXIT }}}} 这 是一 个一 千万 次堆 栈纵 深测 试 ,执 行起 来确 实需 要时 间 ,答 案是 稳定 。如 果你 来测 试 动 态堆 栈, 可以 把阀 值改 成十 万次 左右 ,这 样不 会耽 误太 久的 时间 。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第37页 程 序的 执行 结果 : 4.44.44.44.4 小人升旗 这同样是由C语言程序改编而来,有效键位是箭头左右键,小写x键。此程序包含4 个 文件 ,源 代码 文件 press.ax, 还有 三个 文本 文件 , init.txt,left.txt,right.txt。 //////// //////// press.axpress.axpress.axpress.ax //////// 运 行时 要把 press.jxpress.jxpress.jxpress.jx 和init.txtinit.txtinit.txtinit.txt,left.txtleft.txtleft.txtleft.txt,right.txtright.txtright.txtright.txt 放 在一 个目 录 //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" datadatadatadata main_datamain_datamain_datamain_data isisisis {{{{ bytebytebytebyte keykeykeykey isisisis 0000 //////// 文 件指 针 dworddworddworddword initinitinitinit isisisis 0000 dworddworddworddword leftleftleftleft isisisis 0000 dworddworddworddword rightrightrightright isisisis 0000 dworddworddworddword tfiletfiletfiletfile isisisis 0000 bytebytebytebyte init_txtinit_txtinit_txtinit_txt isisisis "init.txt","init.txt","init.txt","init.txt", 0000 bytebytebytebyte left_txtleft_txtleft_txtleft_txt isisisis "left.txt","left.txt","left.txt","left.txt", 0000 bytebytebytebyte right_txtright_txtright_txtright_txt isisisis "right.txt","right.txt","right.txt","right.txt", 0000 bytebytebytebyte error1error1error1error1 isisisis "donnot"donnot"donnot"donnot openopenopenopen inputinputinputinput file!",file!",file!",file!", 13,13,13,13, 10,10,10,10, 0000 }}}} SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第38页 codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &init_txt&init_txt&init_txt&init_txt totototo r0r0r0r0 movemovemovemove &OPEN_R&OPEN_R&OPEN_R&OPEN_R totototo r1r1r1r1 traptraptraptrap FILE_OPENFILE_OPENFILE_OPENFILE_OPEN movemovemovemove r15r15r15r15 totototo initinitinitinit movemovemovemove &left_txt&left_txt&left_txt&left_txt totototo r0r0r0r0 movemovemovemove &OPEN_R&OPEN_R&OPEN_R&OPEN_R totototo r1r1r1r1 traptraptraptrap FILE_OPENFILE_OPENFILE_OPENFILE_OPEN movemovemovemove r15r15r15r15 totototo leftleftleftleft movemovemovemove &right_txt&right_txt&right_txt&right_txt totototo r0r0r0r0 movemovemovemove &OPEN_R&OPEN_R&OPEN_R&OPEN_R totototo r1r1r1r1 traptraptraptrap FILE_OPENFILE_OPENFILE_OPENFILE_OPEN movemovemovemove r15r15r15r15 totototo rightrightrightright ifjifjifjifj initinitinitinit ======== 0000 open_erroropen_erroropen_erroropen_error ifjifjifjifj leftleftleftleft ======== 0000 open_erroropen_erroropen_erroropen_error ifjifjifjifj rightrightrightright ======== 0000 open_erroropen_erroropen_erroropen_error movemovemovemove initinitinitinit totototo tfiletfiletfiletfile callcallcallcall showshowshowshow main_re:main_re:main_re:main_re: traptraptraptrap CON_GETCHCON_GETCHCON_GETCHCON_GETCH ifjifjifjifj r1r1r1r1 ======== 75757575 show_leftshow_leftshow_leftshow_left ifjifjifjifj r1r1r1r1 ======== 77777777 show_rightshow_rightshow_rightshow_right ifjifjifjifj r1r1r1r1 ======== 120120120120 main_overmain_overmain_overmain_over jumpjumpjumpjump main_remain_remain_remain_re show_left:show_left:show_left:show_left: movemovemovemove leftleftleftleft totototo tfiletfiletfiletfile callcallcallcall showshowshowshow jumpjumpjumpjump main_remain_remain_remain_re show_right:show_right:show_right:show_right: movemovemovemove rightrightrightright totototo tfiletfiletfiletfile callcallcallcall showshowshowshow jumpjumpjumpjump main_remain_remain_remain_re open_error:open_error:open_error:open_error: movemovemovemove &error1&error1&error1&error1 totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第39页 main_over:main_over:main_over:main_over: traptraptraptrap FILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALL traptraptraptrap EXITEXITEXITEXIT }}}} datadatadatadata show_datashow_datashow_datashow_data isisisis {{{{ bytebytebytebyte bufbufbufbuf lengthlengthlengthlength isisisis 2000200020002000 bytebytebytebyte enterenterenterenter isisisis 13,13,13,13, 10,10,10,10, 0000 wordwordwordword cntcntcntcnt isisisis 2000200020002000 }}}} //////// 显 示指 定文 件内 容 //////// codecodecodecode showshowshowshow isisisis{{{{ movemovemovemove 25252525 totototo cntcntcntcnt re_enter:re_enter:re_enter:re_enter: ifjifjifjifj cntcntcntcnt ======== 0000 show_beginshow_beginshow_beginshow_begin subsubsubsub 1111 totototo cntcntcntcnt movemovemovemove &enter&enter&enter&enter totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS jumpjumpjumpjump re_enterre_enterre_enterre_enter //////// 这 里显 示文 件内 容 //////// show_begin:show_begin:show_begin:show_begin: movemovemovemove tfiletfiletfiletfile totototo r0r0r0r0 movemovemovemove 0000 totototo r1r1r1r1 movemovemovemove SEEK_SETSEEK_SETSEEK_SETSEEK_SET totototo r2r2r2r2 traptraptraptrap FILE_SEEKFILE_SEEKFILE_SEEKFILE_SEEK movemovemovemove &buf&buf&buf&buf totototo r0r0r0r0 movemovemovemove 0000 totototo cntcntcntcnt cls_buf:cls_buf:cls_buf:cls_buf: movemovemovemove 0000 totototo *r0*r0*r0*r0 addaddaddadd 1111 totototo r0r0r0r0 aaaadddddddd 1111 totototo cntcntcntcnt ifjifjifjifj cntcntcntcnt ======== 2000200020002000 show_read_fileshow_read_fileshow_read_fileshow_read_file jumpjumpjumpjump cls_bufcls_bufcls_bufcls_buf show_read_file:show_read_file:show_read_file:show_read_file: movemovemovemove &buf&buf&buf&buf totototo r1r1r1r1 movemovemovemove tfiletfiletfiletfile totototo r0r0r0r0 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第40页 re_read:re_read:re_read:re_read: traptraptraptrap FILE_FGETCFILE_FGETCFILE_FGETCFILE_FGETC ifjifjifjifj r15r15r15r15 ======== 256256256256 show_fileshow_fileshow_fileshow_file movemovemovemove r15r15r15r15 totototo *r1*r1*r1*r1 addaddaddadd 1111 totototo r1r1r1r1 jumpjumpjumpjump re_readre_readre_readre_read show_file:show_file:show_file:show_file: movemovemovemove &buf&buf&buf&buf totototo r1r1r1r1 re_putc:re_putc:re_putc:re_putc: movemovemovemove *r1*r1*r1*r1 totototo r0r0r0r0 traptraptraptrap CON_PUTCCON_PUTCCON_PUTCCON_PUTC ifjifjifjifj *r1*r1*r1*r1 ======== 0000 show_overshow_overshow_overshow_over addaddaddadd 1111 totototo r1r1r1r1 jumpjumpjumpjump re_putcre_putcre_putcre_putc show_over:show_over:show_over:show_over: retretretret }}}} 程 序运 行结 果: SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第41页 再 补一 张 Windows 与Linux 平 台本 程序 运行 结果 : 4.54.54.54.5 线程演示 现 在轮 到线 程指 令大 发神 威了 ,在 下面 的程 序中 ,你 会看 到简 单的 线程 程序 例子 ,虽然 这很简单,但是却体现出Liu 对线程支撑的高效和简洁。同步是个有趣的话题,但在SAL 语 言这 一层 无需 关心 ,它 由 Liu 封 装, 无需 程序 干扰 。 //////// //////// thread.axthread.axthread.axthread.ax //////// 线 程演 示的 例子 ,两 个线 程同 时向 屏幕 打印 字符 串 //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" datadatadatadata datandatandatandatan isisisis {{{{ bytebytebytebyte buffer_1buffer_1buffer_1buffer_1 isisisis """"****",",",", 0000 bytebytebytebyte buffer_2buffer_2buffer_2buffer_2 isisisis """"----",",",", 0000 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第42页 }}}} codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &thread_1&thread_1&thread_1&thread_1 totototo r15r15r15r15 crthcrthcrthcrth pushpushpushpush r15r15r15r15 movemovemovemove &thread_2&thread_2&thread_2&thread_2 totototo r15r15r15r15 crthcrthcrthcrth jothjothjothjoth //////// 等 待线 程 1111结束 poppoppoppop r15r15r15r15 jothjothjothjoth //////// 等 待线 程 2222结束 traptraptraptrap EXITEXITEXITEXIT }}}} //////// 线程1111: 向屏 幕打 印 10000 10000 10000 10000 个‘****’ //////// codecodecodecode thread_1thread_1thread_1thread_1 isisisis {{{{ movemovemovemove 10000100001000010000 totototo r10r10r10r10 re1:re1:re1:re1: ifjifjifjifj r10r10r10r10 ======== 0000 over_1over_1over_1over_1 movemovemovemove &buffer_1&buffer_1&buffer_1&buffer_1 totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS subsubsubsub 1111 totototo r10r10r10r10 jumpjumpjumpjump re1re1re1re1 over_1:over_1:over_1:over_1: retretretret }}}} //////// 线程2222: 向屏 幕打 印 10000 10000 10000 10000 个‘----’ //////// codecodecodecode thread_2thread_2thread_2thread_2 isisisis {{{{ movemovemovemove 10000100001000010000 totototo r10r10r10r10 re2:re2:re2:re2: ifjifjifjifj r10r10r10r10 ======== 0000 over_2over_2over_2over_2 movemovemovemove &buffer_2&buffer_2&buffer_2&buffer_2 totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS subsubsubsub 1111 totototo r10r10r10r10 jumpjumpjumpjump re2re2re2re2 over_2:over_2:over_2:over_2: retretretret }}}} SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第43页 可 以看 到 ,两 个线 程中 都没 有保 存要 使用 的寄 存器 ,这 不奇 怪 ,也 无需 担心 ,线 程所 使 用 的寄 存器 是独 立存 在的 ,不 影响 其他 线程 和主 程序 ,堆 栈也 是这 样 ,每 个线 程都 有独 立的 动 态堆 栈支 持。 以下 是程 序执 行后 的结 果, 注意 ,你 的结 果可 能于 图中 不同 : 理论上Liu 在单台机器上支持的线程数是255 个,除掉主线程main,你至多可以创建 254 个 线程 。 4.64.64.64.6 通信典型程序 Liu 的lsrv 指 令支 持两 种模 式的 通信 , UDP 与TCP, 本节 都将 给出 程序 实例 。 先 来看 UDP 的 例子 , udpserver.ax: //////// //////// udpserver.axudpserver.axudpserver.axudpserver.ax //////// udp udp udp udp 服 务器 示例 ,在 屏幕 打印 接收 到的 字符 串内 容 //////// 端 口: 8700870087008700 //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" definedefinedefinedefine BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE isisisis 30303030 definedefinedefinedefine PORTPORTPORTPORT isisisis 8700870087008700 datadatadatadata d1td1td1td1t isisisis {{{{ bytebytebytebyte srv_oksrv_oksrv_oksrv_ok isisisis "UDP"UDP"UDP"UDP serverserverserverserver waiting...",waiting...",waiting...",waiting...", 13,13,13,13, 10,10,10,10, 0000 dworddworddworddword fdfdfdfd isisisis 0000 bytebytebytebyte bufferbufferbufferbuffer lengthlengthlengthlength isisisis BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE }}}} SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第44页 codecodecodecode mainmainmainmain isisisis {{{{ //////// 建立udp udp udp udp 服 务器 线程 //////// movemovemovemove 0000 totototo r13r13r13r13 movemovemovemove PORTPORTPORTPORT totototo r14r14r14r14 movemovemovemove &server_main&server_main&server_main&server_main totototo r15r15r15r15 lsrvlsrvlsrvlsrv UDP_SRVUDP_SRVUDP_SRVUDP_SRV movemovemovemove r12r12r12r12 totototo fdfdfdfd movemovemovemove &srv_ok&srv_ok&srv_ok&srv_ok totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS re_main:re_main:re_main:re_main: jumpjumpjumpjump re_mainre_mainre_mainre_main retretretret }}}} //////// udp udp udp udp 服 务器 线程 //////// codecodecodecode server_mainserver_mainserver_mainserver_main isisisis {{{{ movemovemovemove &buffer&buffer&buffer&buffer totototo r13r13r13r13 movemovemovemove r13r13r13r13 totototo r0r0r0r0 movemovemovemove r13r13r13r13 totototo r1r1r1r1 addaddaddadd 10101010 totototo r1r1r1r1 movemovemovemove BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE totototo r14r14r14r14 movemovemovemove r12r12r12r12 totototo r15r15r15r15 re_get:re_get:re_get:re_get: recvrecvrecvrecv IO_SOCKETIO_SOCKETIO_SOCKETIO_SOCKET traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS jumpjumpjumpjump re_getre_getre_getre_get }}}} 编 译后 运行 此程 序, 如图 所示 ,等 待连 接, 不要 关闭 : SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第45页 再 来看 UDP 客 户端 的程 序, udpclient.ax: //////// //////// udpudpudpudpclientclientclientclient.ax.ax.ax.ax //////// udp udp udp udp 客 户端 示例 //////// 端 口: 8700870087008700 //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" definedefinedefinedefine BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE isisisis 30303030 definedefinedefinedefine PORTPORTPORTPORT isisisis 8700870087008700 datadatadatadata d1td1td1td1t isisisis {{{{ bytebytebytebyte ipipipip isisisis "127.0.0.1","127.0.0.1","127.0.0.1","127.0.0.1", 0000 dworddworddworddword fdfdfdfd isisisis 0000 bytebytebytebyte bufferbufferbufferbuffer isisisis "TagID:082,x:"TagID:082,x:"TagID:082,x:"TagID:082,x: 18.07,y:18.07,y:18.07,y:18.07,y: 02.49",02.49",02.49",02.49", 13,13,13,13, 10,10,10,10, 0000 }}}} codecodecodecode mainmainmainmain isisisis {{{{ //////// 建立udp udp udp udp 客 户端 连接 //////// movemovemovemove &ip&ip&ip&ip totototo r13r13r13r13 movemovemovemove PORTPORTPORTPORT totototo r14r14r14r14 movemovemovemove 0000 totototo r15r15r15r15 lsrvlsrvlsrvlsrv UDP_CLIUDP_CLIUDP_CLIUDP_CLI movemovemovemove r12r12r12r12 totototo fdfdfdfd movemovemovemove r12r12r12r12 totototo r15r15r15r15 //////// 持 续向 服务 端发 送数 据 //////// movemovemovemove BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE totototo r14r14r14r14 movemovemovemove &buffer&buffer&buffer&buffer totototo r13r13r13r13 movemovemovemove r13r13r13r13 totototo r0r0r0r0 waitwaitwaitwait 2000200020002000 re:re:re:re: sendsendsendsend IO_SOCKETIO_SOCKETIO_SOCKETIO_SOCKET traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS jumpjumpjumpjump rererere }}}} SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第46页 需要在打开一个cmd,来编译udpclient.ax,然后运行之,如果没有问题,这两个程序 的 工作 结果 如下 : udpclient.ax 中的ip 地址指定127.0.0.1,因此这两个程序要放在同一机器上运行,你也 可 以更 改 ip 地 址, 或者 分不 同操 作系 统完 成连 接测 试。 接 下来 我们 看看 TCP 的 例子 ,首 先是 服务 器端 的 tcpserver.ax: //////// //////// tcptcptcptcpserver.axserver.axserver.axserver.ax //////// tcp tcp tcp tcp 服 务器 示例 ,在 屏幕 打印 接收 到的 字符 串内 容 //////// 端 口: 8701870187018701 //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" definedefinedefinedefine BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE isisisis 30303030 definedefinedefinedefine PORTPORTPORTPORT isisisis 8708708708701111 datadatadatadata d1td1td1td1t isisisis {{{{ bytebytebytebyte srv_oksrv_oksrv_oksrv_ok isisisis """"TCTCTCTCPPPP serverserverserverserver waiting...",waiting...",waiting...",waiting...", 13,13,13,13, 10,10,10,10, 0000 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第47页 dworddworddworddword fdfdfdfd isisisis 0000 bytebytebytebyte bufferbufferbufferbuffer lengthlengthlengthlength isisisis BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE }}}} codecodecodecode mainmainmainmain isisisis {{{{ //////// 建立tcp tcp tcp tcp 服 务器 线程 //////// movemovemovemove 0000 totototo r13r13r13r13 movemovemovemove PORTPORTPORTPORT totototo r14r14r14r14 movemovemovemove &server_main&server_main&server_main&server_main totototo r15r15r15r15 lsrvlsrvlsrvlsrv TCTCTCTCP_SRVP_SRVP_SRVP_SRV movemovemovemove r12r12r12r12 totototo fdfdfdfd movemovemovemove &srv_ok&srv_ok&srv_ok&srv_ok totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS re_main:re_main:re_main:re_main: jumpjumpjumpjump re_mainre_mainre_mainre_main retretretret }}}} //////// tcp tcp tcp tcp 服 务器 线程 //////// codecodecodecode server_mainserver_mainserver_mainserver_main isisisis {{{{ movemovemovemove &buffer&buffer&buffer&buffer totototo r13r13r13r13 movemovemovemove r13r13r13r13 totototo r0r0r0r0 movemovemovemove r13r13r13r13 totototo r1r1r1r1 addaddaddadd 10101010 totototo r1r1r1r1 movemovemovemove BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE totototo r14r14r14r14 movemovemovemove r12r12r12r12 totototo r15r15r15r15 re_get:re_get:re_get:re_get: recvrecvrecvrecv IO_SOCKETIO_SOCKETIO_SOCKETIO_SOCKET traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS jumpjumpjumpjump re_getre_getre_getre_get }}}} 然 后是 tcpclient.ax,TCP 客 户端 的源 代码 : //////// //////// tctctctcppppclientclientclientclient.ax.ax.ax.ax //////// tcp tcp tcp tcp 客 户端 示例 //////// 端 口: 8701870187018701 //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第48页 includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" definedefinedefinedefine BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE isisisis 30303030 definedefinedefinedefine PORTPORTPORTPORT isisisis 8708708708701111 datadatadatadata d1td1td1td1t isisisis {{{{ bytebytebytebyte ipipipip isisisis "127.0.0.1","127.0.0.1","127.0.0.1","127.0.0.1", 0000 dworddworddworddword fdfdfdfd isisisis 0000 bytebytebytebyte bufferbufferbufferbuffer isisisis "TagID:082,x:"TagID:082,x:"TagID:082,x:"TagID:082,x: 18.07,y:18.07,y:18.07,y:18.07,y: 02.49",02.49",02.49",02.49", 13,13,13,13, 10,10,10,10, 0000 }}}} codecodecodecode mainmainmainmain isisisis {{{{ //////// 建立tcp tcp tcp tcp 客 户端 连接 //////// movemovemovemove &ip&ip&ip&ip totototo r13r13r13r13 movemovemovemove PORTPORTPORTPORT totototo r14r14r14r14 movemovemovemove 0000 totototo r15r15r15r15 lsrvlsrvlsrvlsrv TCPTCPTCPTCP_CLI_CLI_CLI_CLI movemovemovemove r12r12r12r12 totototo fdfdfdfd movemovemovemove r12r12r12r12 totototo r15r15r15r15 //////// 持 续向 服务 端发 送数 据 //////// movemovemovemove BUF_SIZEBUF_SIZEBUF_SIZEBUF_SIZE totototo r14r14r14r14 movemovemovemove &buffer&buffer&buffer&buffer totototo r13r13r13r13 movemovemovemove r13r13r13r13 totototo r0r0r0r0 waitwaitwaitwait 2000200020002000 re:re:re:re: sendsendsendsend IO_SOCKETIO_SOCKETIO_SOCKETIO_SOCKET traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS jumpjumpjumpjump rererere }}}} 事 实上 ,如 果你 留心 的话 ,会 发现 UDP 与TCP 的 通讯 代码 几乎 一样 ,唯 一不 太相 同的 地 方是 lsrv 指 令的 操作 数上 ,UDP 的 程序 是 UDP_SRV、UDP_CLI,TCP 的 程序 是 TCP_SRV, TCP_CLI。 其 余通 讯细 节全 部由 Liu 承担,无 需客 户程 序干 预 。以 上两 种程 序的 通讯 表现 结果 是一 样 的, 发送 的数 据一 样, 接收 的也 一样 ,显 示的 也全 部相 同。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第49页 4.74.74.74.7 测试 CPUCPUCPUCPU 这是一个用SAL 编写的不完整整数运算CPU 测试程序,要求一个运行副本对应一个 CPU 核(超 线程 也算 一个 核 ),如 果是 一颗 双核 四线 程的 处理 器 ,要 运行 4个 副本 。程 序的 基 本理 论是 随机 数运 算, 另 CPU 满 载运 行。 现在 来源 代码 , platform.ax: //////// //////// platform.axplatform.axplatform.axplatform.ax //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" includeincludeincludeinclude "head/math.i""head/math.i""head/math.i""head/math.i" includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" //////// random.ax random.ax random.ax random.ax 源 码在 4-1 4-1 4-1 4-1 节 //////// includeincludeincludeinclude "random.ax""random.ax""random.ax""random.ax" datadatadatadata resultresultresultresult isisisis {{{{ dworddworddworddword res01res01res01res01 isisisis 0000 dworddworddworddword res02res02res02res02 isisisis 0000 }}}} codecodecodecode mainmainmainmain isisisis {{{{ movemovemovemove &th_run&th_run&th_run&th_run totototo r15r15r15r15 crthcrthcrthcrth movemovemovemove 0000 totototo r1r1r1r1 main_re:main_re:main_re:main_re: waitwaitwaitwait 1000100010001000 movemovemovemove res01res01res01res01 totototo r0r0r0r0 traptraptraptrap CON_PUTMCON_PUTMCON_PUTMCON_PUTM movemovemovemove &BLANK&BLANK&BLANK&BLANK totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS movemovemovemove res02res02res02res02 totototo r0r0r0r0 traptraptraptrap CON_PUTMCON_PUTMCON_PUTMCON_PUTM movemovemovemove &ENTER&ENTER&ENTER&ENTER totototo r0r0r0r0 traptraptraptrap CON_PUTSCON_PUTSCON_PUTSCON_PUTS movemovemovemove 0000 totototo res01res01res01res01 movemovemovemove 0000 totototo res02res02res02res02 subsubsubsub 1111 totototo r1r1r1r1 ifjifjifjifj r1r1r1r1 <<<< 100100100100 main_remain_remain_remain_re traptraptraptrap EXITEXITEXITEXIT }}}} SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第50页 codecodecodecode th_runth_runth_runth_run isisisis {{{{ th_re:th_re:th_re:th_re: callcallcallcall randomrandomrandomrandom addaddaddadd 20202020 totototo res01res01res01res01 addaddaddadd 1111 totototo res02res02res02res02 jumpjumpjumpjump th_reth_reth_reth_re }}}} 编 译后 运行 这个 程序 ,结 果如 下: 第一列是规则运算次数/s,第二列是随机数运算次数/s,每秒刷新一行。我只开了一个 运 行副 本, 对应 双核 处理 器上 图的 数据 是一 个核 心的 。 我 提供 一些 自己 测试 过的 机型 的完 整数 据供 参考 : 处 理器 型号 规 则运 算次 数( 秒) 随 机数 运算 次数 (秒 ) P3-600P3-600P3-600P3-600 1,350,0001,350,0001,350,0001,350,000 67,00067,00067,00067,000 CeleronCeleronCeleronCeleron 2.402.402.402.40 5,480,0005,480,0005,480,0005,480,000 275,000275,000275,000275,000 CoreCoreCoreCore T7200T7200T7200T7200 14,000,00014,000,00014,000,00014,000,000 680,000680,000680,000680,000 CoreCoreCoreCore E5300E5300E5300E5300 17,600,00017,600,00017,600,00017,600,000 890,000890,000890,000890,000 CoreCoreCoreCore E7500E7500E7500E7500 20,300,00020,300,00020,300,00020,300,000 1,020,0001,020,0001,020,0001,020,000 CoreCoreCoreCore P9400P9400P9400P9400 18,410,00018,410,00018,410,00018,410,000 923,000923,000923,000923,000 CoreCoreCoreCore i3i3i3i3 2.272.272.272.27 18,400,00018,400,00018,400,00018,400,000 920,000920,000920,000920,000 CoreCoreCoreCore i7i7i7i7 1.601.601.601.60 28,000,00028,000,00028,000,00028,000,000 1,400,0001,400,0001,400,0001,400,000 CoreCoreCoreCore i7i7i7i7 2.802.802.802.80 38,500,00038,500,00038,500,00038,500,000 1,896,0001,896,0001,896,0001,896,000 还 可以 修改 platform.ax 文件,更 好的 获取 CPU 的 数据 ,当然,这 是一 件十 分有 趣的 事 情。 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第51页 4.84.84.84.8 编写程序库 这个是很重要的环节,原则上来说,光有trap 陷入功能是完全不够的,SAL 1.04 没有 LIB 概 念的 支持 ,因 此 “源 码方 式的 LIB”变 成了 主要 程序 库的 方法 ,当 然这 需要 源代 码 。 如4-1 节 涉及 到的 random.ax 就 是一 个标 准的 库形 式。 这一节将提供一个十分熟悉的功能——串复制,作为程序库的演示内容。在SAL 1.10 发 布前 ,我 将提 供大 量这 样的 程序 库, 以 SAL 源 码形 式。 //////// //////// string.axstring.axstring.axstring.ax //////// includeincludeincludeinclude "head/console.i""head/console.i""head/console.i""head/console.i" includeincludeincludeinclude "head/math.i""head/math.i""head/math.i""head/math.i" includeincludeincludeinclude "head/io.i""head/io.i""head/io.i""head/io.i" //////// //////// inininin :::: r0,r0,r0,r0, sourcesourcesourcesource stringstringstringstring addressaddressaddressaddress //////// r1,r1,r1,r1, objectobjectobjectobject stringstringstringstring addressaddressaddressaddress //////// codecodecodecode strcpystrcpystrcpystrcpy isisisis {{{{ pushpushpushpush r0r0r0r0 pushpushpushpush r1r1r1r1 strcpy_re:strcpy_re:strcpy_re:strcpy_re: ifjifjifjifj *r0*r0*r0*r0 ======== NULLNULLNULLNULL strcpy_overstrcpy_overstrcpy_overstrcpy_over movebmovebmovebmoveb *r0*r0*r0*r0 totototo *r1*r1*r1*r1 addaddaddadd 1111 totototo r0r0r0r0 addaddaddadd 1111 totototo r1r1r1r1 jumpjumpjumpjump strcpy_restrcpy_restrcpy_restrcpy_re strcpy_over:strcpy_over:strcpy_over:strcpy_over: movebmovebmovebmoveb NULLNULLNULLNULL totototo *r1*r1*r1*r1 poppoppoppop r1r1r1r1 poppoppoppop r0r0r0r0 retretretret }}}} codecodecodecode strequstrequstrequstrequ isisisis {{{{ ////////…… }}}} SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第52页 第5555章API API API API 简述 SAL 中标准API 由trap 指令的陷入而产生,前面四章中涉及的trap 陷入指令可参考本 章 内容 。SAL 标准API 在1.04 版 本中 涉及 2个 部分 ,Console 与MATH,其中Console 控制 台API 内 容较 多。 5.15.15.15.1 ConsoleConsoleConsoleConsole trap 的 陷入 号在 console.i 中 通过 常量 定义 ,其 中也 包含 很多 常用 的信 息和 数据 。 console.i 文 件内 容如 下: //////// //////// console.iconsole.iconsole.iconsole.i ////////SALSALSALSALAPIAPIAPIAPI //////// create:create:create:create: 2003.2003.2003.2003.00006.136.136.136.13 //////// definedefinedefinedefine FALSEFALSEFALSEFALSE isisisis 0000 definedefinedefinedefine TRUETRUETRUETRUE isisisis 1111 definedefinedefinedefine EOFEOFEOFEOF isisisis -1-1-1-1 definedefinedefinedefine NULLNULLNULLNULL isisisis 0000 definedefinedefinedefine GETM_DECGETM_DECGETM_DECGETM_DEC isisisis 1111 definedefinedefinedefine GETM_OCTGETM_OCTGETM_OCTGETM_OCT isisisis 2222 definedefinedefinedefine GETM_HEXGETM_HEXGETM_HEXGETM_HEX isisisis 3333 //////// 文 件指 针移 动方 式 //////// definedefinedefinedefine SEEK_SETSEEK_SETSEEK_SETSEEK_SET isisisis 0000 definedefinedefinedefine SEEK_CURSEEK_CURSEEK_CURSEEK_CUR isisisis 1111 definedefinedefinedefine SEEK_ENDSEEK_ENDSEEK_ENDSEEK_END isisisis 2222 //////// 文 件检 查方 式 //////// definedefinedefinedefine CHECK_EXISTCHECK_EXISTCHECK_EXISTCHECK_EXIST isisisis 0000 definedefinedefinedefine CHECK_WCHECK_WCHECK_WCHECK_W isisisis 2222 definedefinedefinedefine CHECK_RCHECK_RCHECK_RCHECK_R isisisis 4444 definedefinedefinedefine CHECK_RWCHECK_RWCHECK_RWCHECK_RW isisisis 6666 //////// 文 件使 用模 式 //////// datadatadatadata OPEN_MODEOPEN_MODEOPEN_MODEOPEN_MODE isisisis {{{{ bytebytebytebyte OPEN_ROPEN_ROPEN_ROPEN_R isisisis "r","r","r","r", 0000 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第53页 bytebytebytebyte OPEN_WOPEN_WOPEN_WOPEN_W isisisis "w","w","w","w", 0000 bytebytebytebyte OPEN_AOPEN_AOPEN_AOPEN_A isisisis "a","a","a","a", 0000 bytebytebytebyte OPEN_RBOPEN_RBOPEN_RBOPEN_RB isisisis "rb","rb","rb","rb", 0000 bytebytebytebyte OPEN_WBOPEN_WBOPEN_WBOPEN_WB isisisis "wb","wb","wb","wb", 0000 bytebytebytebyte OPEN_ABOPEN_ABOPEN_ABOPEN_AB isisisis "ab","ab","ab","ab", 0000 bytebytebytebyte OPEN_R_OPEN_R_OPEN_R_OPEN_R_ isisisis "r+","r+","r+","r+", 0000 bytebytebytebyte OPEN_W_OPEN_W_OPEN_W_OPEN_W_ isisisis "w+","w+","w+","w+", 0000 bytebytebytebyte OPEN_A_OPEN_A_OPEN_A_OPEN_A_ isisisis "a+","a+","a+","a+", 0000 bytebytebytebyte OPEN_RB_OPEN_RB_OPEN_RB_OPEN_RB_ isisisis "rb+","rb+","rb+","rb+", 0000 bytebytebytebyte OPEN_WB_OPEN_WB_OPEN_WB_OPEN_WB_ isisisis "wb+","wb+","wb+","wb+", 0000 bytebytebytebyte OPEN_AB_OPEN_AB_OPEN_AB_OPEN_AB_ isisisis "ab+","ab+","ab+","ab+", 0000 }}}} //////// 定 义标 准控 制台 函数 常量 式 //////// definedefinedefinedefine EXITEXITEXITEXIT isisisis 0000 //////// 文 件流 处理 //////// definedefinedefinedefine FILE_OPENFILE_OPENFILE_OPENFILE_OPEN isisisis 1111 definedefinedefinedefine FILE_REOPENFILE_REOPENFILE_REOPENFILE_REOPEN isisisis 2222 definedefinedefinedefine FILE_READFILE_READFILE_READFILE_READ isisisis 3333 definedefinedefinedefine FILE_WRITEFILE_WRITEFILE_WRITEFILE_WRITE isisisis 4444 definedefinedefinedefine FILE_CLOSEFILE_CLOSEFILE_CLOSEFILE_CLOSE isisisis 5555 definedefinedefinedefine FILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALL isisisis 6666 definedefinedefinedefine FILE_SEEKFILE_SEEKFILE_SEEKFILE_SEEK isisisis 7777 definedefinedefinedefine FILE_REWINDFILE_REWINDFILE_REWINDFILE_REWIND isisisis 8888 definedefinedefinedefine FILE_EOFFILE_EOFFILE_EOFFILE_EOF isisisis 9999 definedefinedefinedefine FILE_FGETCFILE_FGETCFILE_FGETCFILE_FGETC isisisis 10101010 definedefinedefinedefine FILE_FUNGETCFILE_FUNGETCFILE_FUNGETCFILE_FUNGETC isisisis 11111111 definedefinedefinedefine FILE_FPUTCFILE_FPUTCFILE_FPUTCFILE_FPUTC isisisis 12121212 definedefinedefinedefine FILE_FLUSHFILE_FLUSHFILE_FLUSHFILE_FLUSH isisisis 13131313 definedefinedefinedefine FILE_FLUSHALLFILE_FLUSHALLFILE_FLUSHALLFILE_FLUSHALL isisisis 14141414 definedefinedefinedefine FILE_TELLFILE_TELLFILE_TELLFILE_TELL isisisis 15151515 //////// 文件,,,, 目 录处 理 //////// definedefinedefinedefine FILE_ACCESSFILE_ACCESSFILE_ACCESSFILE_ACCESS isisisis 50505050 definedefinedefinedefine FILE_CHSIZEFILE_CHSIZEFILE_CHSIZEFILE_CHSIZE isisisis 51515151 definedefinedefinedefine FILE_FILELENFILE_FILELENFILE_FILELENFILE_FILELEN isisisis 52525252 definedefinedefinedefine FILE_RENAMEFILE_RENAMEFILE_RENAMEFILE_RENAME isisisis 53535353 definedefinedefinedefine FILE_REMOVEFILE_REMOVEFILE_REMOVEFILE_REMOVE isisisis 54545454 definedefinedefinedefine FILE_MKDIRFILE_MKDIRFILE_MKDIRFILE_MKDIR isisisis 55555555 definedefinedefinedefine FILE_RMDIRFILE_RMDIRFILE_RMDIRFILE_RMDIR isisisis 56565656 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第54页 definedefinedefinedefine CRCRCRCR isisisis 13131313 definedefinedefinedefine LFLFLFLF isisisis 10101010 datadatadatadata console_strconsole_strconsole_strconsole_str isisisis {{{{ bytebytebytebyte ENTERENTERENTERENTER isisisis 13,13,13,13, 10,10,10,10, NULLNULLNULLNULL }}}} //////// 控 制台 基本 输入 输出 //////// definedefinedefinedefine CON_GETCCON_GETCCON_GETCCON_GETC isisisis 100100100100 definedefinedefinedefine CON_GETSCON_GETSCON_GETSCON_GETS isisisis 101101101101 definedefinedefinedefine CON_PUTCCON_PUTCCON_PUTCCON_PUTC isisisis 102102102102 definedefinedefinedefine CON_PUTSCON_PUTSCON_PUTSCON_PUTS isisisis 103103103103 definedefinedefinedefine CON_GETMCON_GETMCON_GETMCON_GETM isisisis 104104104104 definedefinedefinedefine CON_PUTMCON_PUTMCON_PUTMCON_PUTM isisisis 105105105105 definedefinedefinedefine CON_GETCHCON_GETCHCON_GETCHCON_GETCH isisisis 106106106106 definedefinedefinedefine CON_ATOICON_ATOICON_ATOICON_ATOI isisisis 200200200200 definedefinedefinedefine CON_ITOACON_ITOACON_ITOACON_ITOA isisisis 201201201201 我 们来 看看 console.i 中 定义 的所 有 trap 陷 入说 明, 共 31个: TRAP TRAP TRAP TRAP 陷 入号 入口出口说明 FILE_OPENFILE_OPENFILE_OPENFILE_OPENR0 = 文 件名 字符 串地 址 R1 = 模 式字 符串 地址 R15 = 文件ID 打 开文 件 FILE_REOPENFILE_REOPENFILE_REOPENFILE_REOPEN R0 = 文 件名 字符 串地 址 R1 = 模 式字 符串 地址 R2 = 旧 文件 ID R15 = 新 文件 ID 重新打开文件并 且 关闭 旧文 件 FILE_READFILE_READFILE_READFILE_READ R0 = 缓 冲区 地址 R1 = 字 节数 R2 = 文件ID R15 = 实际读取的字 节数 读 文件 FILE_WRITEFILE_WRITEFILE_WRITEFILE_WRITE R0 = 缓 冲区 地址 R1 = 字 节数 R2 = 文件ID R15 = 实际写入的字 节数 写 文件 FILE_CLOSEFILE_CLOSEFILE_CLOSEFILE_CLOSE R0 = 文件ID R15 = 0, 失败 R15 = 1, 成功 关 闭文 件 FILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALLFILE_CLOSEALL 无 R15 = 0, 失败 R15 = 1, 成功 关 闭所 有文 件 FILE_SEEKFILE_SEEKFILE_SEEKFILE_SEEK R0 = 文件ID R1 = 移 动的 字节 数 R2 = 移 动方 式 R15 = 0, 失败 R15 = 1, 成功 移 动文 件指 针 FILE_REWINDFILE_REWINDFILE_REWINDFILE_REWIND R0 = 文件ID 无定位文件指针到 开头 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第55页 trap trap trap trap 陷 入号 入口出口说明 FILE_EOFFILE_EOFFILE_EOFFILE_EOF R0 = 文件ID R15 = 0, 失败 R15 = 1, 成功 测 试文 件尾 标志 FILE_FGETCFILE_FGETCFILE_FGETCFILE_FGETC R0 = 文件ID R15 = 256, 文件 尾 否则R15 为 读取 到的 字符 从文件当前指针 位置获取一个字 符 FILE_FUNGETCFILE_FUNGETCFILE_FUNGETCFILE_FUNGETC R0 = 文件ID R1 = 放 回的 字符 R15 = 0, 失败 R15 = 1, 成功 将字符重新放回 文 件中 FILE_FPUTCFILE_FPUTCFILE_FPUTCFILE_FPUTC R0 = 文件ID R1 = 写 入的 字符 R15 = 0, 失败 R15 = 1, 成功 在文件当前位置 写 一个 字符 FILE_FLUSHFILE_FLUSHFILE_FLUSHFILE_FLUSH R0 = 文件ID R15 = 0, 失败 R15 = 1, 成功 刷新文件缓冲区 内容 FILE_FLUSHALLFILE_FLUSHALLFILE_FLUSHALLFILE_FLUSHALL 无 无刷新所有文件缓 冲 区内 容 FILE_TELLFILE_TELLFILE_TELLFILE_TELL R0 = 文件ID R15 = 文件指针距文 件 头的 偏移 ,字 节计 获取文件指针位 置 FILE_ACCESSFILE_ACCESSFILE_ACCESSFILE_ACCESSR0 = 文 件名 字符 串地 址 R1 = 属性 R15 = 0, 失败 R15 = 1, 成功 测试文件是否存 在 及其 属性 FILE_CHSIZEFILE_CHSIZEFILE_CHSIZEFILE_CHSIZE R0 = 文件ID R1 = 字 节计 长度 R15 = 0, 失败 R15 = 1, 成功 扩展或者截断文 件 FILE_FILELENFILE_FILELENFILE_FILELENFILE_FILELEN R0 = 文件ID R15 = 0, 失败 R15 = 1, 成功 测 试文 件长 度 FILE_RENAMEFILE_RENAMEFILE_RENAMEFILE_RENAME R0 = 旧 名字 符串 地址 R1 = 新 名字 符串 地址 R15 = 0, 失败 R15 = 1, 成功 更 改文 件名 FILE_REMOVEFILE_REMOVEFILE_REMOVEFILE_REMOVE R0 = 文 件名 字符 串地 址 R15 = 0, 失败 R15 = 1, 成功 删 除文 件 FILE_MKDIRFILE_MKDIRFILE_MKDIRFILE_MKDIR R0 = 目 录路 径 /名R15 = 0, 失败 R15 = 1, 成功 创 建目 录 FILE_RMDIRFILE_RMDIRFILE_RMDIRFILE_RMDIR R0 = 目 录路 径 /名R15 = 0, 失败 R15 = 1, 成功 删 除目 录 CON_GETCCON_GETCCON_GETCCON_GETC 无 R1 = 字符接 收单 个字 符 CON_GETSCON_GETSCON_GETSCON_GETS R0 = 缓 冲区 地址 R1 = 1, 始终 是 1 接 收字 符串 CON_PUTCCON_PUTCCON_PUTCCON_PUTC R0 = 字符无显 示单 个字 符 CON_PUTSCON_PUTSCON_PUTSCON_PUTS R0 = 缓 冲区 地址 无显 示字 符串 CON_GETMCON_GETMCON_GETMCON_GETM 无 R1 = 返回的十进制 数 接收一个10 进 制数 CON_PUTMCON_PUTMCON_PUTMCON_PUTM R0 = 十 进制 数 无显示一个10 进 制数 CON_GETCHCON_GETCHCON_GETCHCON_GETCH 无 R1 = 字符不回显接收单个 字符 CON_ATOICON_ATOICON_ATOICON_ATOI R1 = 位数 R2 = 缓 冲区 地址 R0 = 十 进制 数 将字符串变成十 进 制数 ,从 个位 开 始 转换 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第56页 trap trap trap trap 陷 入号 入口出口说明 CON_ITOACON_ITOACON_ITOACON_ITOA R0 = 十 进制 数 R1 = 位数 R2 = 缓 冲区 地址 无将十进制数变成 字 符串 ,从 个位 开 始 转换 5.25.25.25.2 MATHMATHMATHMATH MATH 是 数学 计算 的 API, 有相 应的 trap 陷 入号 ,当 一些 运算 如 64位 时, 寄存 器无 法 提 供完 整的 支持 ,就 需要 使用 MATH 了。 现 在尚 未加 入完 善的 支持 ,仅 有一 些测 试用 的基 本运 算: //////// //////// mathmathmathmath.i.i.i.i ////////SALSALSALSALAPIAPIAPIAPI //////// create:create:create:create: 2020202011111111....04040404.1.1.1.19999 //////// definedefinedefinedefine MATH_MULMATH_MULMATH_MULMATH_MUL isisisis 1001100110011001 definedefinedefinedefine MATH_DIVMATH_DIVMATH_DIVMATH_DIV isisisis 1002100210021002 definedefinedefinedefine MATH_ADDMATH_ADDMATH_ADDMATH_ADD isisisis 1003100310031003 definedefinedefinedefine MATH_SUBMATH_SUBMATH_SUBMATH_SUB isisisis 1004100410041004 definedefinedefinedefine MATH_MODMATH_MODMATH_MODMATH_MOD isisisis 1005100510051005 definedefinedefinedefine MATH_ABSMATH_ABSMATH_ABSMATH_ABS isisisis 1006100610061006 math.i 中 定义 的 trap 陷 入说 明, 共 6个 TRAP TRAP TRAP TRAP 陷 入号 入口出口说明 MATH_MULMATH_MULMATH_MULMATH_MUL 关闭 64位 乘法 MATH_DIVMATH_DIVMATH_DIVMATH_DIV 64位 乘法 MATH_ADDMATH_ADDMATH_ADDMATH_ADD 64位 乘法 MATH_SUBMATH_SUBMATH_SUBMATH_SUB 64位 乘法 MATH_MODMATH_MODMATH_MODMATH_MOD 64位 取余 MATH_ABSMATH_ABSMATH_ABSMATH_ABS R1 = 所 求数 R2 = 1, 负数 R2 = 0, 正整 数 R3 = R1 的 绝对 值 取 绝对 值 SALSALSALSAL语言参考手册语言参考手册语言参考手册语言参考手册 第57页 附录 SAL 和Liu 是 绿衫 实验 室的 极灵 巧项 目之 一 ,此 篇手 册也 由我 星夜 写成 ,文 中难 免有 不 妥 之处 ,还 请各 位海 涵。 本手 册中 所有 源代 码示 例全 部经 过验 证, 可放 心编 译运 行。 此页完毕,也该开始对SAL 1.10 的规划和创作了,这十分必要,其内容也多次提及, 是 对调 试寄 存器 的开 放 ,调 试器 ,以 及对 JL语 言的 支撑 ,加 强分 布计 算的 能力 等诸 多内 容 , 这 也是 我急 于身 体力 行的 缘故 。 长 夜漫 漫, 想说 的很 多, 却不 知从 何说 起, 唯有 向广 大同 行朋 友们 的敬 意和 感叹 。 2011 年8月24日 蔡雷 cailei@vm2.org
还剩56页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

ayona333

贡献于2012-04-02

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf