首页 > 系统相关 >通过Wine实现在mac和linux上实现masm编程

通过Wine实现在mac和linux上实现masm编程

时间:2024-03-17 17:48:08浏览次数:34  
标签:WINDOWS masm FILENAME mac linux PATH Wine wine

原文链接:Using MASM on Mac or Linux via Wine

抄这个文档是因为它的确有用,mac下也能很好的学习windows api。而且我怕老外的文档无法访问。

Wine是啥

来百度百科一下:

Wine (“Wine Is Not an Emulator” 的缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。

Wine(Windows运行环境)是一个在Linux和UNIX之上的Windows 3.x和 Windows API (以下简称动态接口)的实现。注意,Wine不是模拟Windows的工具,而是运用API转换技术实做出Linux对应到Windows相对应的函数来调用DLL(动态链接库)以运行Windows程序。

Wine可以工作在绝大多数的UNIX版本下,包括Linux, FreeBSD, 和 Solaris。另外,也有适用于Mac OS X的Wine程序。Wine不需要Microsoft Windows系统, 因为这是一个完全由百分之百的免费代码组成的。如果有可利用的副本的话,它也可以随意地使用本地系统的DLLs。Wine的发布是完全公开源代码的,并且是免费发行的。(基于LGPL发布:GNU宽通用公共许可证)
Wine 是一款免费和开源的兼容层,它使得在运行 Linux、FreeBSD 或其他一些操作系统的计算机上运行一些 Windows 应用程序成为可能。它也是 Valve 用来让 Steam Deck 用户在 Linux 驱动的手持设备上玩 Windows 游戏的 Proton 软件的基础。

Wine的安装

在mac下面

brew cask install wine-stable

创建Wine挂载的目录

wine运行在macos环境下的,这里需要一个指定的目录来存放window的相关文件,默认位置是:~/.wine, 但是吧,为了方便的运行各种代码,还是建议将位置放到其他地方: ~/wine-masm
使用下面的命令初始化该配置

WINEARCH=win32 WINEPREFIX=~/wine-masm winecfg

这个命令会在~/win-masm下面创建所有windows需要的文件,文件夹driver_c,代表windows C盘的目录。

masm32的安装

可以从官网下载指定版本的masm32,也可以直接使用下面的版本

wget http://website.assemblercode.com/masm32/masm32v11r.zip
unzip masm32v11r.zip
WINEPREFIX=~/wine-masm wine install.exe

安装过程

不添加masm编辑器的快捷方式

安装过程基本都是点击OK,除了下面的:

因为可以通过命令打开这个编辑器

WINEPREFIX=~/wine-masm wine 'C:\masm32\qeditor.exe'.

测试

使用下面的命令测试是否正确安装了

$ WINEPREFIX=~/wine-masm wine 'C:\masm32\bin\ml.exe'
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

usage: ML [ options ] filelist [ /link linkoptions]
Run "ML /help" or "ML /?" for more info

windows环境变量设置

为方便开发,需要将masm32的工具路径放到系统的环境变量里面,这个操作类似

export GOPATH=/usr/local/go

但是这里是windows,并且没有我的电脑, 只能用命令打开

WINEPREFIX=~/wine-masm wine regedit

配置地址: HKEY_CURRENT_USER/Environment,右击添加新的string值,如下:

PATH= %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\masm32\bin
INCLUDE=C:\masm32\include;C:\Irvine
LIB=C:\masm32\lib;C:\Irvine

测试环境变量

使用下面的命令挨个测试是否新建成功

$ export WINEPREFIX=~/wine-masm
$ wine ml -nologo -c -coff -Zi AddSub.asm
 Assembling: AddSub.asm
$ wine link /NOLOGO /SUBSYSTEM:CONSOLE /ENTRY:main \
    /LIBPATH:'C:\Irvine' irvine32.lib kernel32.lib user32.lib AddSub.obj
$ wine AddSub.exe

  EAX=00030000  EBX=00401000  ECX=0032FF03  EDX=000000D0
  ESI=7B84A20B  EDI=7FFDF000  EBP=0032FEE8  ESP=0032FED4
  EIP=00401014  EFL=00000206  CF=0  SF=0  ZF=0  OF=0  AF=0  PF=1

写入mac的profile

为了方便开发,将下面的命令写入profile,方便以后的开发

export WINE_MASM_DIR=~/wine-masm
function masm() (
    # Stop on errors
    set -e

    # Use the correct wine directory
    export WINEPREFIX=$WINE_MASM_DIR

    # Get the path to the file without a .asm extension
    FILENAME="$(basename "$1")"
    EXTENSION="${FILENAME##*.}"
    shopt -s nocasematch   # String case-insensitive comparison
    if [[ "$EXTENSION" = "asm" ]]; then
        FILENAME="${FILENAME%.*}"   # Remove extension
    fi
    UNIX_PATH="$(dirname "$1")/$FILENAME"

    # Convert forwards slashes into backslashes
    WINDOWS_PATH=$(echo "$UNIX_PATH" | tr '/' '\')

    # Assemble file
    wine ml -nologo -c -coff -Zi "$WINDOWS_PATH.asm"

    # Link files
    # Notes: Irvine's asm32.bat script includes a /DEBUG flag. I found that
    # including this flag causes a link fail:
    #   LINK : fatal error LNK1000: unknown error; consult documentation for
    #   technical support options
    # Therefore, I have omitted it. Additionally, the default entry point
    # for Wine or perhaps later versions of Windows appears to be
    # mainCRTStartup instead of main (see http://stackoverflow.com/a/12391264),
    # so we need to manually specify main as the entry point with /ENTRY.
    wine link /NOLOGO /SUBSYSTEM:CONSOLE /ENTRY:main \
        /LIBPATH:'C:\Irvine' \
        irvine32.lib kernel32.lib user32.lib "$WINDOWS_PATH.obj"

    # Run the linked executable
    wine "$WINDOWS_PATH.exe"
)

后来我为了将生成obj和exe放到一个指定的目录,我就放在C:\Irvine\bin 下面,就改写了这个profile命令

function lib()(
    set -e
    FILENAME="$(basename "$1")"
    EXTENSION="${FILENAME##*.}"
    if [[ "$EXTENSION" = "asm" ]]; then
        FILENAME="${FILENAME%.*}"   # Remove extension
    fi
    UNIX_PATH="$(dirname "$1")/$FILENAME"

    WINDOWS_PATH=$(echo "$UNIX_PATH" | tr '/' '\')

    OBJ_PATH="$(dirname "$1")/bin/$FILENAME"
    WINDOWS_OBJ_PATH=$(echo "$OBJ_PATH" | tr '/' '\')
 
    LIB_PATH="$(dirname "$1")/lib32/$FILENAME"
    WINDOWS_LIB_PATH=$(echo "$LIB_PATH" | tr '/' '\')

    # Assemble file
    wine ml -nologo -Fo "$WINDOWS_OBJ_PATH.obj"  -c -coff -Zi "$WINDOWS_PATH.asm"
    # create as lib
    lib /out:"$WINDOWS_LIB_PATH.lib"  "$WINDOWS_OBJ_PATH.obj"
)
function masm-editor()(
    WINEPREFIX=~/wine-masm wine 'C:\masm32\qeditor.exe'
)
function masm() (
    # Stop on errors
    set -e

    # Use the correct wine directory
    # export WINEPREFIX=$WINE_MASM_DIR

    # Get the path to the file without a .asm extension
    FILENAME="$(basename "$1")"
    EXTENSION="${FILENAME##*.}"
    #shopt -s nocasematch   # String case-insensitive comparison
    if [[ "$EXTENSION" = "asm" ]]; then
        FILENAME="${FILENAME%.*}"   # Remove extension
    fi
    UNIX_PATH="$(dirname "$1")/$FILENAME"

    # Convert forwards slashes into backslashes
    WINDOWS_PATH=$(echo "$UNIX_PATH" | tr '/' '\')

    OBJ_PATH="$(dirname "$1")/bin/$FILENAME"
    WINDOWS_OBJ_PATH=$(echo "$OBJ_PATH" | tr '/' '\')
     

    # Assemble file
    wine ml -nologo -Fo "$WINDOWS_OBJ_PATH.obj"  -c -coff -Zi "$WINDOWS_PATH.asm"

    # Link files
    # Notes: Irvine's asm32.bat script includes a /DEBUG flag. I found that
    # including this flag causes a link fail:
    #   LINK : fatal error LNK1000: unknown error; consult documentation for
    #   technical support options
    # Therefore, I have omitted it. Additionally, the default entry point
    # for Wine or perhaps later versions of Windows appears to be
    # mainCRTStartup instead of main (see http://stackoverflow.com/a/12391264),
    # so we need to manually specify main as the entry point with /ENTRY.
    wine link  /NOLOGO /SUBSYSTEM:CONSOLE /ENTRY:main \
        /LIBPATH:'C:\Irvine\lib32' \
        irvine32.lib kernel32.lib user32.lib "$WINDOWS_OBJ_PATH.obj" /OUT:"$WINDOWS_OBJ_PATH.exe"

    # Run the linked executable
    wine "$WINDOWS_OBJ_PATH.exe"
)

还有没有探索的就是如何debug,该环境下的DEBUG能力还不是很好,目前全靠自己思考

标签:WINDOWS,masm,FILENAME,mac,linux,PATH,Wine,wine
From: https://www.cnblogs.com/willsdu/p/18063046

相关文章

  • Linux 解压指令
    zip/unzip常见格式-ddir:指定解压缩后的目标目录-l:列出zip文件中的内容,但不解压缩(List)-q:安静模式,不显示解压缩过程(Quiet)-o:覆盖已存在的文件而不询问(Overwrite)-n:不覆盖已存在的文件(Neveroverwrite)-x:排除某一文件(eXclude)查看内容unzip-lroot.zip #列出压缩包......
  • Linux - /dev/tcp/<HOSTNAME>/<PORT>
    Linux中存在一个特殊的设备文件/dev/tcp/<HOSTNAME>/<PORT>,该文件可以直接和目标建立TCP通信,利用这一特性可以进行端口检测。 zzh@ZZHPC:/dev$lh|greptcpzzh@ZZHPC:/dev$echo>/dev/tcp/192.168.1.16/21zzh@ZZHPC:/dev$echo>/dev/tcp/192.168.1.16/22bash:conne......
  • macos上远程windows 直接用内网IP 比 用pc电脑名,速度更快;
    若用计算机名字的话,需要先根据ARP等协议获取终端的内网IP,有时候这一步获取不到,会很慢,因为有防火墙等多种因素;解决方法:将要远程的电脑内网IP固定,在路由器里添加到静态IP;用内网IP连接;这样速度就很快了,省去了根据PC电脑名,寻找内网IP的过程;......
  • macos selenium msedgedriver 浏览器驱动 爬虫
    MacOSSelenium跨浏览器环境搭建在macOS上使用Selenium启动新版Edge的方式如下。macOS版本:10.15.5Edge版本:83.0.478.58下载83版本对应的新版Edge驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads解压并移动到/usr/loca......
  • Linux高级命令
    目录Linux命令1.软件安装1.1离线安装----dpkg1.2在线安装----apt-get2.压缩与归档2.1压缩与解压缩2.2归档(打包)和解归档3.查看文件内容3.1cat命令3.2head命令3.3tail命令3.4more命令3.5less命令3.6od命令4.统计文件内容命令5.检索文件内容命令6.查找文件命令7.文件内容截取命令8.......
  • 今日头条Linux 运维工程师面试真题
    今日头条Linux运维工程师面试真题首先我们来看下今日头条Linux运维工程师招聘岗位要求:【岗位定义】系统运维工程师【岗位薪资】10K-24K【基本要求】北京/经验3-5年/本科及以上/全职【职位描述】1、负责业务系统日常运行维护,线上故障紧急处理;2、监控平台的搭建......
  • Linux 运维工程师面试真题-2-Linux 命令及文件操作
    Linux运维工程师面试真题-2-Linux命令及文件操作1.在/tmp/目录下创建test.txt文件,内容为:Hello,World!,用一个命令写出来。2.给test.txt文件除所有者之外增加执行权限,最终以数字写出文件的权限。3.用vi命令编辑test.txt,如何跳转到末行,首行,行首、行末,如何在光标行下一......
  • Linux 运维工程师面试真题-1-必会Linux 操作系统知识
    Linux运维工程师面试真题-1-必会Linux操作系统知识运维的整个面试流程其实是非常繁杂的,为了方便大家准备,我们特地在这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,希望要去参加Linux运维面试的朋友,可以先思考下这些问题。首先我们看看《Linux操作......
  • Linux 运维工程师面试真题-4-Linux 服务配置及管理
    Linux运维工程师面试真题-4-Linux服务配置及管理**1.请写出apache2.X版本的两种工作模式,以及各自工作原理。如何查看apache当前所支持的模块,并且查看是工作在哪种模式下?2.Linux下nfs在客户端无法挂载,请写出排查步骤?3.Linux下已经部署了dhcp服务器,客户端无法获取的......
  • Linux 运维工程师面试真题-3-Linux 磁盘及软件管理操作
    Linux运维工程师面试真题-3-Linux磁盘及软件管理操作1.如何添加一块新的50G硬盘到linux服务器系统作为单独的分区,并正在使用?需要哪些操作步骤?2.有个金士顿U盘,需要往服务器/var/www/html/目录下上传一个index.html文件,如何操作并完成。3.有一块移动硬盘,上面有300G......