[汇编]汇编学习笔记(6):MASM32编译器编译链接16位汇编

        在学习16位汇编的时候,需要用到MASM32编译器,为了方便编辑环境变量装了个XP的虚拟机来学习,刚好也可以用到debug.exe来调试16位汇编代码。

        MASM32安装很简单。可以参考这篇文章,环境变量配置也有,ctrl+c,ctrl+v就OK,事先声明,MASM32版本下载的是masm32v11r

        参考文章中给了个Win32窗口的汇编代码,继续ctrl+c,ctrl+v,编译指令如下:

        先编译资源文件,编译失败:给了个error RC2103错误。说是字符串错误,仔细看了下rc文件,没啥问题,尝试修改rc文件中的字符串。最后找到问题,不支持退出这2个汉字,换成确定啥的汉字都没问题,改成英文的Quit更好,就不需要纠结这个问题。

        修改后:

// 资源文件注释格式为双斜杠
// 包含资源头文件,以能使用头键字
#include    <resource.h>

// 指定对话框ID,asm文件中要定义同值变量才可引用
#define    DLG_HELLOWORLD    1

// 定义对话框结构
DLG_HELLOWORLD    DIALOG 350,200,213,164
STYLE                        DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION                    "Helloworld Program"
FONT                        11,"宋体"
{
    CTEXT    "Win32 Assembly Helloworld Program",-1,50,54,170,21
    CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,79,203,1
    DEFPUSHBUTTON "确定",IDOK,158,86,50,21
}

        编译asm,成功,接着链接,失败,给出一堆乱码的错误。

        解决方案也很简单,把includelib到uer32.lib中间全部删除,换成空格一下,编译ok,链接失败,换了另一个错误,链接kernel32.lib错误,跟uer32.lib的解决方案一样,然后继续编译,链接成功,生成helloworld.exe文件,执行成功。

        修改后的代码:

; asm文件注释格式为分号
; 定义程序模式
.386
.model            flat,stdcall
option            casemap    :none

; 包含必要头文件,基本每个win32 汇编程序都需要包含这几个
include            windows.inc
include            user32.inc
includelib user32.lib
include            kernel32.inc
includelib kernel32.lib

; 指定对话框ID,该ID要与rc文件中的ID值相同
; 理论上,asm文件与rc文件中的控件是通过ID值关联的,控件名并不需要与rc文件相同,不过为了易看一般取一样的
; 比如这里重点是equ 1,叫不叫DLG_HELLOWORLD无所谓,不过为了易看所以选择与rc文件保持一致
DLG_HELLOWORLD    equ    1

; 数据段
.data?
hInstance    dd    ?

; 代码段
.code
; 对话框处理过程
_ProcDlgHelloworld proc uses ebx edi esi hWnd,wMsg,wParam,lParam
    mov    eax,wMsg
    .if eax == WM_CLOSE
            invoke    EndDialog,hWnd,NULL
    .elseif eax == WM_INITDIALOG
            ;invoke    LoadIcon,hInstance,ICO_MAIN
            ;incoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
    .elseif eax == WM_COMMAND
            mov    eax,wParam
            .if ax == IDOK
                    invoke    EndDialog,hWnd,NULL
            .endif
    .else
            mov    eax,FALSE
            ret
    .endif
    mov    eax,TRUE
    ret
_ProcDlgHelloworld    endp

start:
    invoke    GetModuleHandle,NULL
    mov       hInstance,eax
    ; 弹出对话框,对话框与及处理过程在这里绑定
    invoke    DialogBoxParam,hInstance,DLG_HELLOWORLD,NULL,offset _ProcDlgHelloworld,NULL
    invoke    ExitProcess,NULL
    ; 指定程序入口点为start标识处
    end       start

        到此为止,证明MASM32安装成功,虽然Win32窗口有个小瑕疵,就是确定这2个汉字变成了乱码,不喜欢的话,可以改成英文的Quit,这样就めでたしめでたし。不支持汉字感觉是不是漏装了啥,虚拟机的XP是原版的,外加只装了MASM32,没有装任何IDE。

        正在学习的16位汇编都是用MASM32命令来编译的,刚安装的版本是不是太高了,没有MASM32.exe文件,网上查了下好像改名了,改成ML了。如果直接用ML来编译链接asm文件的话,给出一堆连接错误:

        搜了下,解决方案就是ML后加参数/c,ml  /c的意识是只编译不连接。因此还需要手动链接,因为是16位汇编,所以需要用link16,而不是link来链接。

ml /c 1.asm
link16 1.obj

        链接成功后,需要用debug.exe来执行,不然就一闪而过。CS指令段地址是0B46,因此利用反汇编指令来查看。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值