The Go tools for Windows + Assembler很好玩
我想用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? 不想下个大包。
啥都有,而且有许多例子。这可是像模像样地能生成.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很好玩的更多相关文章
- Install the Active Directory Administration Tools on Windows Server
安装 Active Directory 管理工具 To manage your directory from an EC2 Windows instance, you need to install ...
- [转] 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 ...
- 【Tools】Windows下Github的配置和使用
1.在网址:http://windows.github.com/下载git软件,具体的安装步骤可以参见:Windows 系统下Git安装图解 2.同样根据上面的教程生成SSH key: 3.将publ ...
- 51nod 1378:夹克老爷的愤怒 很好玩的一道树状dp
1378 夹克老爷的愤怒 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 取消关注 夹克老爷逢三抽一之后,由于采用了新师爷的策略,乡民们叫苦不堪,开始组织 ...
- (已解决)在linux的虚拟机上安装vmware tools(实现windows与虚拟机之间的文件交互复制粘贴)
Linux下需要安装VMware Tools工具来实现主机和虚拟机直接文件复制粘贴功能,安装方法如下: ①点击虚拟机VM菜单栏--虚拟机--安装VMware Tools. ②然后RedHat系统中弹出 ...
- 51nod 1276:岛屿的数量 很好玩的题目
1276 岛屿的数量 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 取消关注 有N个岛连在一起形成了一个大的岛屿,如果海平 ...
- Ansible好像很好玩的样子哟
这个比SALTSTACK轻量,,不知道速度如何..... 参考文档: http://linux.cn/article-4215-1.html wget http://download.fedorapr ...
- 图片翻页效果引出的animate.css,很好玩,多动动吧~
有一个项目,客户需要页面翻转的效果,需要应用在合作伙伴里面的图片上,一共有43张图片,我把它做成了随机定时的转动,鼠标经过时转动: animate.css科普文章:http://www.dowebok ...
- 一个很好玩的命令:stty
stty命令修改终端命令行的相关设置.语法stty(选项)(参数)选项-a:以容易阅读的方式打印当前的所有配置:-g:以stty可读方式打印当前的所有配置.参数终端设置:指定终端命令行的设置选项.实例 ...
随机推荐
- TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution
Python Error when calling the metaclass bases Cannot create a consistent method resolution order (MR ...
- hdu 5179 beautiful number(构造,,,,)
题意: 一个如果称作是漂亮数,当且仅当满足: 每一位上的数字是[1,9],从高到时低数字大小降序,且有di%dj=0(i<j) 例:931 给一个区间[L,R],问这个区间里有多少个漂亮数. 1 ...
- sqlldr 导入有中文乱码问题
1.导入成功后,查看导入数据有乱码 2.查看字符集为uft8 select * from v$nls_parameters where PARAMETER like '%NLS_CHARACTERSE ...
- JVM-内存区域与OOM
本篇博客内容主要参考<深入理解Java虚拟机> 内存区域与内存溢出异常 运行时数据区 Java虚拟机运行时数据区: 程序计数器(Program Counter Register)是一块较小 ...
- 这一篇 K8S(Kubernetes)集群部署 我觉得还可以!!!
点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 国内安装K8S的四种途径 Kubernetes 的安装其实并不复杂,因为Kubernetes 属 ...
- C++ 默认拷贝构造函数 深度拷贝和浅拷贝
C++类默认拷贝构造函数的弊端 C++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数.它们的特殊之处在于: (1) 当类中没有定义任何构造函数时,编译器会默认提供一个无参构造函数且 ...
- 【完虐算法】LeetCode 接雨水问题,全复盘
大家好! 动态规划题目是总结的比较完整了.下面是自从和大家刷开题总结的动态规划解题方法. 今年全国夏天雨是真的多,突然想到今年北京的夏天也不像往年那么热.不知不觉就稳稳地度过了夏天来到秋天. 恰巧前几 ...
- Spring Cache 带你飞(二)
接着上一篇讲了 Spring Cache 如何被 Spring Aop 代理加载对应的代码,以及何如注入相关界面逻辑. Spring Cache 带你飞(一) 本篇我们围绕两个要点展开: 一个数据是如 ...
- ARM汇编解决阶乘以及大小写转换
环境以及硬件 一.硬件仿真基于 SAMSUNG's S3C44B0X 16/32-bit RISC microprocessor 芯片,仿真器为 J-LINK 二.编写指令软件为 Integrated ...
- 『学了就忘』Linux软件包管理 — 42、对RPM软件包的查询操作
目录 1.查询RPM软件包是否安装 2.查询系统中所有已安装的RPM软件包 3.查询RPM软件包的详细信息 4.查询RPM软件包中的文件列表 5.查询系统文件属于哪个RPM包 6.查询RPM软件包所依 ...