在linux上通过wine使用MASM汇编器

What MASM

The Microsoft Macho Assembler (MASM) is an x86 assembler(汇编器) that uses the Intel syntax for MS-DOS and Microsoft Windows. Beginning with MASM 8.0 there are two versions of the assembler - one for 16-bit and 32-bit assembly sources, and another (ML64) for 64-bit sources only.

Why

这学期学校开了汇编语言与接口技术课程。教材中使用的汇编器是微软的MASM,但MASM只支持win平台,不支持mac和linux平台。虽然linux平台也有很多汇编器,比如NSMA(使用intel语法)、GAS(使用AT&T语法)。但考虑到NASM和GAS的语法跟MASM的语法还是有差异,和老师讲课内容有出入,而且又不想使用Windows。所以打算在linux通过wine安装使用MASM。也希望自己多动手,多学点东西。

安装Wine

sudo pacman -Sy wine

其他发行版可以百度or谷歌搜索安装方法

初始化Wine

Wine有个东西叫做wineprefix,wineprefix默认是~/.wine,如果你只在终端里使用wine program,那么wine将在用户home目录创建一个.wine文件夹,然后在.wine文件夹中初始化wine环境, 该环境的配置保存在~/.wine/*.reg文件中,C:\的文件树保存在~/.wine/drive_c文件夹下。 当然,你也可以自定义wineprefix,使用下列命令初始化你自己的wine环境:

WINEARCH=win32 WINEPREFIX=~/你自定义的文件夹名 winecfg

比如,我的是:

WINEARCH=win32 WINEPREFIX=~/.wine_ml11 winecfg

这样我的wine环境就初始化到了~/.wine_ml11文件夹下,Windows文件系统储存在~/.wine_ml11/drive_c文件夹下

下载解压MASM32

使用wget下载 masm32v11r.zip:

wget  http://www.masm32.com/download/masm32v11r.zip

解压:

unzip masm32v11r.zip

安装MASM

使用命令安装:

WINEPREFIX=~/wine的初始化目录 wine install.exe

比如我的:

WINEPREFIX=~/.wine_ml11 wine install.exe

设置环境变量

设置环境变量:

WINEPREFIX=~/你的wine目录 wine regedit

比如我的:

WINPREFIX=~/.wine_ml11 wine regedit

在弹出的窗口中定位到HKEY_LOCAL_MACHINE->System->CurrentControlSet->Control->Session Manager->Environment

在PATH的值后面加上;C:\masm32\bin

新建String Value,新增INCLUDE变量,填写值C:\masm32\include以及新增LIB变量,填写值C:\masm32\lib

退出wine,使环境变量更改生效

编写运行第一个Hello World程序

DATA SEGMENT
     MSG DB "Hello World!","$"
DATA ENDS

CODE SEGMENT
     ASSUME CS:CODE, DS:DATA
	 START:
	     MOV AX, DATA
		 MOV DS, AX

         MOV AH, 09H
		 LEA DX, MSG     ;Print String
		 INT 21H

	STOP:
	     MOV AX, 4C00H
		 INT 21H
CODE ENDS
     END START
export WINEPREFIX=~/.wine_ml11(改为你的目录)

永久设置: 把export WINEPREFIX=~/.wine_ml11(改为你的目录)写入.bashrc文件或者.zshrc文件中

wine ml /c Hello.asm

编译后会生成Hello.obj文件

wine link Hello.obj

链接报错,fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt,使用link16进行链接可解决

链接成功。

wine Hello.exe

提示需要安装dosbox 安装dosbox:

sudo pacman -S dosbox

命令运行dosbox: 挂载当前目录为C:

补充

上课的时候发现老师讲的编译命令是MASM,一脸懵,一查才发现MASM是旧版本的编译命令,貌似从6.x版本后,编译命令就从MASM改为ML了。而且发现教材用的masm版本是6.15的。 需要的童鞋,可以从**这里**下载MASM6.15压缩版(其中提供了MASM.EXE和LINK.EXE等程序,感觉有可能是从5.x版本中提取出来的)(你也可以从网上找5.x版本的)的,解压之后将其复制到你的wine的drive_c下,然后改一下wine中的环境变量,然后就可以通过wine MASM wine LINK使用了。

MOUNT C .
C:

保存退出

现在就可以运行dosbox,然后在弹出的窗口中使用DEBUG了。

总结

MASM下载安装下来,也就几M,而且运行起来挺流畅。配合bash脚本使用就更方便了。


【参考】:https://reberhardt.com/blog/programming/2016/01/30/masm-on-mac-or-linux.html

comments powered by Disqus