我想用python做个tiny BASIC编译器。赋值和加减乘除,IF和FOR。

语法分析python有ply包,用ply.lex和ply.yacc做个计算器很简单,我已经做了。

做个解释器应该也不难。但解释器和编译器之间还差着代码生成呢。一来看书,二来用python的dis包看"汇编"形式的bytecode,连蒙带猜,应该也可以做,但不做怎知道难处?

a = b + c + d; 解释器遇到c + d就求值并把结果放在栈里或某处。编译器呢?看到c和d push,遇到+ add 栈顶和次栈顶,pop pop push? 如何分配寄存器?

搞个寄存器名字栈,栈溢出了咋办?编译时显示OOR (Out of Register)错误,表达式忒复杂了,请自行添加临时变量,哈哈。

用汇编可以偷个懒:汇编器支持jmp label啊。不用自己算要跳到哪儿或跳多远了。

汇编器本来想用nasm,但它不带linker. link.exe? 不想下个大包。

Go Tools for Windows (assembler, resource compiler, linker, debugger and information) (godevtool.com)

啥都有,而且有许多例子。这可是像模像样地能生成.exe,而且还是Windows,不是DOS的。

D:\asm>goasm 1.asm

GoAsm.Exe Version 0.61.0.1 - Copyright Jeremy Gordon 2001-2017 - JG@JGnet.co.uk
Output file: 1.obj

D:\asm>golink /console 1.obj kernel32.dll

GoLink.Exe Version 1.0.3.1 Copyright Jeremy Gordon 2002-2020 info@goprog.com
Output file: 1.exe
Format: Win32 Size: 2,048 bytes

D:\asm>1
Hello World (from GoAsm)

DATA SECTION
;
RCKEEP DD 0 ;temporary place to keep things
;
CODE SECTION
;
START:
PUSH -11D ;STD_OUTPUT_HANDLE
CALL GetStdHandle ;get, in eax, handle to active screen buffer
PUSH 0,ADDR RCKEEP ;RCKEEP receives output from API
PUSH 24D,'Hello World (from GoAsm)' ;24=length of string
PUSH EAX ;handle to active screen buffer
CALL WriteFile
XOR EAX,EAX ;return zero
RET

看来return 0 (xor eax, eax)就行,不用int 21。我也不是非得学会调用WriteFile(GetStdHandle),数都留在寄存器里,不print,生成的.exe在调试器(Go Tools里有,甚至还有IDE)运行即可。

D:\asm>copy con 1.py
quit(13)^Z
已复制 1 个文件。

D:\asm>1.py

D:\asm>echo %ERRORLEVEL%
13

我真是太机智了,调试器也不用了。试了下MOV EAX, 257:

D:\asm>echo %ERRORLEVEL%
257

D:\asm>echo %ErrorLevelL%
%ErrorLevelL%

D:\asm>echo %errorlevel%
257

我根本没打算算>100的数。IF x op y THEN算了,光有and算啥?not, or也得有。>= <= 还是得有的吧。

The Go tools for Windows + Assembler很好玩的更多相关文章

  1. Install the Active Directory Administration Tools on Windows Server

    安装 Active Directory 管理工具 To manage your directory from an EC2 Windows instance, you need to install ...

  2. [转] Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7

    (转自:Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7 - Scott Ha ...

  3. 【Tools】Windows下Github的配置和使用

    1.在网址:http://windows.github.com/下载git软件,具体的安装步骤可以参见:Windows 系统下Git安装图解 2.同样根据上面的教程生成SSH key: 3.将publ ...

  4. 51nod 1378:夹克老爷的愤怒 很好玩的一道树状dp

    1378 夹克老爷的愤怒 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 夹克老爷逢三抽一之后,由于采用了新师爷的策略,乡民们叫苦不堪,开始组织 ...

  5. (已解决)在linux的虚拟机上安装vmware tools(实现windows与虚拟机之间的文件交互复制粘贴)

    Linux下需要安装VMware Tools工具来实现主机和虚拟机直接文件复制粘贴功能,安装方法如下: ①点击虚拟机VM菜单栏--虚拟机--安装VMware Tools. ②然后RedHat系统中弹出 ...

  6. 51nod 1276:岛屿的数量 很好玩的题目

    1276 岛屿的数量 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  取消关注 有N个岛连在一起形成了一个大的岛屿,如果海平 ...

  7. Ansible好像很好玩的样子哟

    这个比SALTSTACK轻量,,不知道速度如何..... 参考文档: http://linux.cn/article-4215-1.html wget http://download.fedorapr ...

  8. 图片翻页效果引出的animate.css,很好玩,多动动吧~

    有一个项目,客户需要页面翻转的效果,需要应用在合作伙伴里面的图片上,一共有43张图片,我把它做成了随机定时的转动,鼠标经过时转动: animate.css科普文章:http://www.dowebok ...

  9. 一个很好玩的命令:stty

    stty命令修改终端命令行的相关设置.语法stty(选项)(参数)选项-a:以容易阅读的方式打印当前的所有配置:-g:以stty可读方式打印当前的所有配置.参数终端设置:指定终端命令行的设置选项.实例 ...

随机推荐

  1. 原串反转 牛客网 程序员面试金典 C++ Python

    原串反转 牛客网 程序员面试金典 C++ Python 题目描述 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniS ...

  2. cf12D Ball(MAP,排序,贪心思想)

    题意: N位女士一起聚在一个舞厅.每位女士有三个特征值B,I,R.分别代表美貌,智慧,富有. 对于一位女士而言,如果存在一个女士的B,I,R都分别大于她自己的B,I,R.则她自己会自杀. 统计总共有多 ...

  3. VUE项目实现主题切换

    需求是 做一个深色主题和浅色主题切换的效果 方法一 多套css 这个方法也是最简单,也是最无聊的. <!-- 中心 --> <template> 动态获取父级class名称,进 ...

  4. 使用NLog把日志写入数据库并按天自动分表

    前言 最近用Asp.net Core开发程序的时候 因为时间的关系,就没有过多的去关注日志方面的功能 都是直接用系统的ILogger先记录着,然后看日志的时候就先在命令行看日志 在开发阶段没有什么问题 ...

  5. 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)

    问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...

  6. MySQL 查询语句(1)

    一:创建数据库 1:CREATE DATABASE test; //创建数据库test 2:SHOW DATABASES: //查看目前数据库中可用的数据库,默认会有系统数据库 3:USE test; ...

  7. Vue首屏性能优化组件

    Vue首屏性能优化组件 简单实现一个Vue首屏性能优化组件,现代化浏览器提供了很多新接口,在不考虑IE兼容性的情况下,这些接口可以很大程度上减少编写代码的工作量以及做一些性能优化方面的事情,当然为了考 ...

  8. mybatis中<![CDATA[]]>和转义字符

    在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]&g ...

  9. 从零开始制作一个linux iso镜像

    一.前言     对于一个极简化的linux系统而言,只需要三个部分就能组成,它们分别是一个linux内核.一个根文件系统和引导.以下是本文制作linux iso镜像所用到的系统和软件:     OS ...

  10. CODING添加ssh提示格式错误的问题

    不能去.shh文件夹打开id_rsa.pub文件查看 解决方法: 进入.ssh文件夹,然后右键git bash here 输入代码 cat id_rsa.pub 回车即可