`
chinamming
  • 浏览: 140581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

手工搭建32位汇编语言程序开发环境

 
阅读更多

目标:

以创建一个简单的对话框程序为例搭建环境,目标是用到最少的资源,这样我们能够知道一个程序的来龙去脉。

实现:

从Visual Studio 安装环境中拷贝 ML宏汇编器和LINK链接器;拷贝部分.h头文件和.lib链接库文件。

分析:

[工具]C和C++的编译器为CL.EXE,汇编语言的编译器为ML.EXE,这两个程序都能生成COFF格式的目标文件OBJ;然后用通用的LINK.EXE链接器将OBJ文件链接为EXE文件。编译和链接工具准备完毕。

[lib库]Windows系统是基于DLL的,PE文件会记录他引用的所有DLL和这些DLL中的API,链接器LINK必须根据LIB文件才能将OBJ文件链接为EXE,也就是说LIB文件记录API在DLL中的偏移量,必不可少!如果你只做底层测试,我觉得USER32.LIB、KERNEL32.LIB、GDI32.LIB、ADVAPI32.LIB、NTDLL.LIB、NTOSKRNL.LIB就足够了。

[头文件]至于头文件,你可以将Platform SDK 的.h头文件转换为MASM认可的格式,或者根据引用的API在你的源代码中声明下原型,再或者偷懒的方法,从网络上的MASM32集成开发环境直接拷贝,inc扩展名无所谓!

例如,在msdn站点查询到MessageBox函数的原型如下:

int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType);

对应的汇编一眼声明方式如下:( ExitProcess PROTO :DWORD )

MessageBox proto:dword,:dword,:dword,:dword

我想,照葫芦画瓢,这没什么难度,下面是简单的对话框程序:


;ml /c /coff MessageBox.asm
;link /subsystem:windows MessageBox.obj user32.lib kernel32.lib
.386
.model flat,stdcall

ExitProcess PROTO :DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
MessageBox equ <MessageBoxA>

.data

szContent db 'MessageBox from MASM32! It is so powerful!',0
szCaption db 'MessageBox MASM32',0

.code

start:
;invoke MessageBox,0,offset szContent,addr szCaption,40h
push 40h
lea eax,szCaption
push eax
lea eax,szContent
push eax
push 0
call MessageBox
invoke ExitProcess,0
end start

[环境变量]如上述代码,内置API原型的声明,链接器也直接知名了要引用的lib库,可以不用关心inc头文件,但至少lib库要知道从哪里去查找,还有ml和link工具的路径也需要设置,还需设置lib库和include头文件的环境变量,如下我用到了RadASM这一IDE,我把我的源程序放到c:\codes\masm32,可以新建一个批处理MASM32.BAT

set include=C:\RadASM\masm32\Include;%include%

set lib=C:\RadASM\masm32\lib;%lib%

set path=C:\RadASM\masm32\bin;%path%

cd C:\codes\MASM32

但批处理运行后就直接退出,你就无法在console上运行ml和link指令流,所以还需要cmd的一个快捷方式,目标设置为%comspec% /k "C:\RadASM\masm32\Masm32.bat" 。如此,环境变量设置完毕!

用include环境变量指明头文件的路径,lib环境变量知名lib库文件的路径,path环境变量知名ml和link的路径,且拷贝了inc头文件和lib库文件的情况下,你的代码和编译方式如下:

;ml /c /coff MessageBox.asm

;link /subsystem:windows MessageBox.obj

.386

.model flat,stdcall

include user32.inc

include kernel32.inc

includelib kernel32.lib

includelib user32.lib

.data

szContent db 'MessageBox from MASM32! It is so powerful!',0

szCaption db 'MessageBox MASM32',0

.code

start:

invoke MessageBox,0,offset szContent,addr szCaption,40h

invoke ExitProcess,0

end start

分享到:
评论

相关推荐

    汇编语言程序设计知识点总结

    纯手工总结的《汇编语言程序设计》课程知识点。 若总结与课本存在不一致,请以教材为准

    汇编语言程序.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    radasm-sample... 用RadASM开发的一些示例汇编语言程序....zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    大二学习汇编语言程序设计时的代码记录~.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    先电云计算IAAS平台手工搭建笔记.docx

    先电云计算IAAS平台手工搭建笔记经本人实战操作一点点跳坑修改的,上面有一些命令参数的注释以及各个组件的简介。先电云计算IAAS平台手工搭建笔记经本人实战操作一点点跳坑修改的,上面有一些命令参数的注释以及各个...

    2022稀有H5策略游戏放置三国源码,手工linux搭建服务端+服务器搭建文档和游戏素材

    2022稀有H5策略游戏放置三国源码,手工linux搭建服务端+服务器搭建文档和游戏素材

    16位MASM汇编的压缩程序(字典和霍夫曼两种算法)

    header.asm:汇编的主要头文件,包含了一些通用的宏和变量声明,其中有调试用的宏DEBUG_INFO,这个需要有Irvine16.inc,此文件包含在Intel汇编语言程序设计里。要用调试的话,在汇编的时候加上DEBUG的宏定义就可以。...

    纯手工搭建Linux Nginx MySQL PHP WEB服务器

    纯手工搭建Linux Nginx MySQL PHP WEB服务器

    win7或win8下手工搭建WAMP环境

    win7或win8下手工搭建WAMP环境(Apache2.2.25+MySQL5.6.12.2+PHP5.4.17+phpMyAdmin4.0.4.1)

    汇编语言场景漫游

    通过使用Win32的窗口程序模式,实现角色在场景中漫游程序的设计与开发;给出转向力和随机数发生器的参数控制接口,允许用户在控制范围内自由选择参数;提供随机行走的过程模式和快速生成模式。定义相应的存储结构,...

    汇编语言练习《汇编语言》王爽.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    汇编语言.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    纯手工搭建无盘服务端 附文件.zip

    页面:https://blog.csdn.net/qq_21491871/article/details/113728916

    NX1957在VS2019二次开发的环境配置.rar

    NX1957在VS2019二次开发的环境配置.rar

    ObjectARX2016+AutoCAD2016+VS2012开发环境配置

    手把手教学,从下载到hello world! 是我从网上找各种资源总结亲测的结果。

    汇编语言作业.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    练习汇编语言.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    汇编语言学习.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    汇编语言初探.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    汇编语言实验.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

Global site tag (gtag.js) - Google Analytics