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可读方式打印当前的所有配置.参数终端设置:指定终端命令行的设置选项.实例 ...
随机推荐
- 使用Egg改造订单系统展示效果,方便快速浏览
素材准备: 1.Egg.js Born to build better enterprise frameworks and apps with Node.js & Koa 为企业级框架和应用而 ...
- 前端面试手写代码——JS函数柯里化
目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...
- shell 中单引号和双引号的区别
用以下代码来说明: #!/bin/bash url="http://c.biancheng.net" website1='C语言中文网:${url}' website2=" ...
- Redis源码分析(dict)
源码版本:redis-4.0.1 源码位置: dict.h:dictEntry.dictht.dict等数据结构定义. dict.c:创建.插入.查找等功能实现. 一.dict 简介 dict (di ...
- Linux&C———进程间通信
管道和有名管道 消息队列 共享内存 信号 套接字 由于进程之间的并不会像线程那样共享地址空间和数据空间,所以进程之间就必须有自己特有的通信方式,这篇博客主要介绍自己了解到的几种进程之间的通信方式,内容 ...
- geoserver控制服务访问权限-类似百度地图的key
目录 缘起 可行性分析 如何实现key验证访问 如何控制key能访问哪些地图服务? 如何实现服务器ip白名单 流程梳理 申请key 访问地图 实施步骤 拦截器设置 配置key验证规则 配置服务拦截规则 ...
- 公司项目被扫出来一个Druid未授权访问漏洞
这不是阿里druid的监控页面吗?接下来查看项目配置 1.在web.xml中有如下配置: <filter> <filter-name>DruidWebStatFilter< ...
- LOTO示波器实测——光照强度传感器
loto最近推出了很多的周边传感器模块的实测案例,本文介绍和演示LOTO示波器实测光照强度传感器的使用. 下图就是主角感光模块,可以用来测量光照强度. 这个模块也很简单,只有3个引脚,一个电源,3.3 ...
- Scrapy入门到放弃05:让Item在Pipeline中飞一会儿
前言 "又回到最初的起点,呆呆地站在镜子前". 本来这篇是打算写Spider中间件的,但是因为这一块涉及到Item,所以这篇文章先将Item讲完,顺便再讲讲Pipeline,然后再 ...
- Netcat基础使用
netcat命令选项 本文参考文章链接 本文参考文章链接1 本文参考文章链接2 本文参考文章链接3 常用命令选项 ## 网络模式和代理相关 -l 监听,作服务器.不填时作客户端. -u UDP模式.不 ...