欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-01 20:12:04
...

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

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

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

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

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

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

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

        修改后:

// 资源文件注释格式为双斜杠
// 包含资源头文件,以能使用头键字
#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,成功,接着链接,失败,给出一堆乱码的错误。

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

        解决方案也很简单,把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

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

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

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

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

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

ml /c 1.asm
link16 1.obj

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

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