编译大于运算符

原定的计划中这一篇应当是要讲如何编译if表达式的,但是我发现没什么东西可以作为if的test-form的部分的表达式,所以觉得,要不还是先实现一下比较两个数字这样子的功能吧。说干就干,我决定用大于运算符来作为例子——大于运算符就是指>啦。所以,我的目标是要编译下面这样的代码

(> 1 2)

并且比较之后的结果要放在EAX寄存器中。鉴于现在这门语言还非常地简陋,没有布尔类型这样子的东西,所以在此仿照C语言的处置方式,以数值0表示逻辑假,其它的值表示逻辑真。所以上面的表达式在编译成汇编代码并最终运行后,应当可以看到EAX寄存器中的值为0。

为了编译大于运算符,并且将结果放入到EAX寄存器中,需要用到新的指令CMP、JG,以及JMP了。我的想法是,先将第一个操作数放入到EAX寄存器,将第二个操作数放入到EBX寄存器。然后,使用CMP指令比较这两个寄存器。如果EAX中的数值大于EBX,那么就使用JG指令跳到一个MOV指令上,这道MOV会将寄存器EAX的值修改为1;否则,JG不被执行,执行后续的一道MOV指令,将数值0写入到EAX寄存器,然后使用JMP跳走,避免又执行到了刚才的第一道MOV指令。思路还是挺简单的。

在修改jjcc2之前,还需要在inside-out/aux中对>予以支持,但没什么特别的,就是往member的参数中加入>这个符号而已。之后,将jjcc2改为如下的形式

(defun jjcc2 (expr globals)

"支持两个数的四则运算的编译器"

(check-type globals hash-tabl

c语言程序如何调用标准库函数,如何调用C标准库的exit函数详解相关推荐

  1. bind() c语言,c/c++ 标准库 bind 函数详解

    bind函数定义在头文件 functional 中.可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表. bin ...

  2. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  3. Python|线程和进程|阻塞|非阻塞|同步|异步|生成器和协程|资源竞争|进程间通信|aiohttp库|daemon属性值详解|语言基础50课:学习(11)

    文章目录 系列目录 原项目地址 第34课:Python中的并发编程-1 线程和进程 多线程编程 使用 Thread 类创建线程对象 继承 Thread 类自定义线程 使用线程池 守护线程 资源竞争 G ...

  4. puts和fputs函数及其区别,C语言puts和fputs函数详解

    puts和fputs函数及其区别,C语言puts和fputs函数详解 与 gets 函数一样,对于 puts 函数,同样建议使用 fputs 函数来代替 puts 函数.如下面的示例代码所示: int ...

  5. c语言中用来指示文件缓冲区中具体读写位置,C语言文件读写操作中缓冲区问题和setbuf函数详解...

    清除和设置文件缓冲区 (1).清除文件缓冲区函数: int fflush(FILE *stream); int flushall(); fflush()函数将清除由stream指向的文件缓冲区里的内容 ...

  6. Python 标准库之 sys 模块详解

    Python sys 模块详解 1. 简介 "sys"即"system","系统"之意.该模块提供了一些接口,用于访问 Python 解释器 ...

  7. gets和fgets函数及其区别,C语言gets和fgets函数详解

    gets和fgets函数及其区别,C语言gets和fgets函数详解 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 ...

  8. Java调用SMSLib用单口短信猫发送短信详解

    技术园地 当前位置:短信猫网站主页 > 技术园地 > [转载]Java调用SMSLib用单口短信猫发送短信详解 发布时间:2017/02/09 点击量:620 SMSLib是Apache的 ...

  9. C语言-入门级别函数详解

    C语言-入门级别函数详解 写在开始 关于函数 1. 函数的定义形式 2.函数的声明 3. 返回语句 4.函数参数 4.1 形式参数(传值调用) 4.2 实际参数(传址调用) 4.3无参数 5.函数的调 ...

最新文章

  1. element elcolumn 使用本地图片_年末了,教你如何使用Python实现上班摸鱼
  2. Swift UIAlertView 的使用
  3. 上海Uber优步司机奖励政策(1月18日~1月24日)
  4. 百度地图API(二)
  5. php限定时间内同一ip只能访问一次
  6. python框架Flask学习笔记之get和post请求
  7. ubuntu16.04修改xfce下的gedit的背景颜色
  8. Mybatis快速入门的代码实现及报错处理解决org.apache.ibatis.exceptions.PersistenceException
  9. linux accept过程,Linux协议栈accept和syn队列问题
  10. 关闭VS警告#pragma warning(disable:4996)
  11. 迪士尼自研算法突破百万高清像素用AI换脸来拍电影
  12. linux系统用户登陆时脚本执行顺序
  13. mysql 查看密码_Ubuntu安装和配置MySQL数据库
  14. RSA的JavaScript程序
  15. ztree异步加载数据amp;amp;amp;amp;amp;amp;amp;amp;给父节点动态追加子节点
  16. 项目分析-纷享车链AutoChain的数据保险柜解读
  17. 工业照明节能减碳难?致远ZWS云平台有妙招
  18. C#视频采集方法对比
  19. html需要背的标签,html的header标签需要怎么使用
  20. VS2019 配色_新手设计师如何做好设计配色

热门文章

  1. soft nproc 与 soft nofile
  2. MFC 基于多文档的打印和打印预览功能的实现
  3. Python中类的定义与实例化
  4. 【shell】shell标准输出与错误输出重定向
  5. 网络安全通识全解|第14期 那些常见的网络安全“黑话”
  6. linux更换桌面图,桌面应用|在 Linux 上安装必应桌面墙纸更换器
  7. window 版 Charles 抓包 手机 app (以抓取 “华图在线” App为例)
  8. 【已解决】如何使用Intel® oneAPI HPC Toolkit中的Fortran编译器ifort?
  9. 【COMSOL要点整体概述】
  10. 大学生计算机专业四年应该做的(资源推荐、练习网站、论文写作、考试经验、求职方法、出国计划)