汇编:头文件

汇编头文件(header files)在汇编语言编程中类似于高层语言中的头文件,它们通常包含宏定义、常量定义、数据结构定义、函数声明以及其他在多个汇编源文件中共享的代码;使用头文件可以提高代码的可维护性和可读性,并使代码更加模块化,最常见的汇编头文件扩展名.inc,表示包含文件(include file)。

汇编头文件的使用方法

项目文件:这两个文件最好放一块,否则源文件在指定的时候还需要写路径。

头文件:source.inc      源文件:source.asm

source.inc代码
.586
.model flat,stdcall
option casemap:none
​
includelib Kernel32.lib
includelib User32.lib
​
MessageBoxA proto hWndx:DWORD,lpText:Byte,lpCaption:Byte,uType:DWORD 
ExitProcess proto nCode:DWORD
​
szText db 'Message',0
szCaption db 'Hello World!',0
代码功能:

①定义编译选项和环境:通过.586, .model flat,stdcalloption casemap:none设置编译选项。

②链接必要的库文件:通过includelib指令链接Kernel32和User32库,以便使用这些库中的函数。

③声明Windows API函数的原型:声明了MessageBoxAExitProcess函数的原型,使得在后续代码中可以直接调用这些函数。

④定义数据变量:定义了两个字符串变量szTextszCaption,用于消息框的内容和标题。

source.asm代码
include source.inc
​
.code
main procpush 0push offset szTextpush offset szCaptionpush 0call MessageBoxA
​push 0call ExitProcess
main endp
end 

include source.inc:包含一个名为source.inc的头文件;假设source.inc中定义了必要的宏、常量、数据段和函数原型;在包含了这个头文件后,就可以去call调用在头文件中声明了的MessageBoxAExitProcess函数(Win32 API)。

代码功能:

①显示消息框:调用Windows API函数MessageBoxA,显示一个标题为"Hello World!"、内容为"Message"的消息框。 ②退出程序:调用Windows API函数ExitProcess,以退出代码0(正常退出)终止程序。

代码执行结果:

但是Win32 API非常多,若每个要用到的API都需要自行声明且需要编辑函数对应的参数这未免也太麻烦了,那么此时我们可以使用MASM32 SDK软件开发工具包来配合Win32程序开发。

MASM32 SDK

MASM32 SDK(Microsoft Macro Assembler 32-bit Software Development Kit)是一个软件开发工具包,包含了Microsoft Macro Assembler(MASM)、链接器、库、示例代码和文档,专为开发32位Windows应用程序而设计。

MASM32 SDN安装

下载地址:Download The MASM32 SDK

下载后得到压缩包,解压缩后可以得到一个安装程序;

双击运行:点击install安装;

选择安装的盘符,文件不大可以想安装在哪个盘就安装在哪个盘:

选择后,接下去的窗口都默认选择yes/确认;接着这边直接Extract

后续几个窗口也是直接点击确认YesOK

至此安装完成,masm32默认的安装路径为盘符:/masm32,而在默认路径中的include路径中就存放着我们需要的Win32 API函数的头文件;

若此时要使用这些头文件那么首先需要在项目属性页中添加对应的头文件路径

接着我们需要将在代码中使用到的头文件复制到项目文件夹中,最好与程序代码放在同一个文件夹下(否则在使用include进行头文件包含时需要指定路径);如果此时我需要用到Windows.incUser32.incKernel32.inc头文件,直接复制过来即可。

invoke指令

这个时候若要调用MessageBoxAExitProcess等API则直接使用invoke指令直接调用即可:

invoke 指令是 Microsoft Macro Assembler (MASM) 中的一条高级指令,用于简化对函数的调用。invoke 指令会自动处理函数调用的参数传递和调用约定,使得代码更简洁和易读。

基本用法
invoke FunctionName, arg1, arg2, ..., argN
  • FunctionName 是要调用的函数名。

  • arg1, arg2, ..., argN 是传递给函数的参数。

在使用invoke指令对函数进行调用时就不需要与call指令一样将参数压入栈内了,可以直接将参数跟再函数名后面即可。

使用示例:

此时项目中的文件

编辑:source.inc       source.asm 

source.inc

头文件中设置了编译选项、包含了必要的库和头文件,并定义了一些数据(字符串)。

.586
.model flat,stdcall
option casemap:none
​
;头文件包含声明
include  Windows.inc
include User32.inc
include Kernel32.inc
​
;包含静态库
includelib Kernel32.lib
includelib User32.lib
​
.data
szText db 'wolvenc',0
szCaption db 'Hello World!',0
source.asm
include source.inc
​
.code
main procinvoke  MessageBoxA,NULL,offset szCaption,offset szText,MB_OKinvoke  ExitProcess,0
main endp
end 

include source.inc:包含头文件

invoke MessageBoxA, NULL, offset szCaption, offset szText, MB_OK:调用 Windows API 的 MessageBoxA 函数,显示一个消息框。

  • NULL:消息框的父窗口句柄,表示没有父窗口。

  • offset szCaption:消息框标题字符串的地址。

  • offset szText:消息框中显示的文本字符串的地址。

  • MB_OK:消息框的类型,表示带有“确定”按钮的消息框。

invoke ExitProcess, 0:调用 Windows API 的 ExitProcess 函数,以退出代码 0 退出程序。

代码段中使用 invoke 指令简化对 Windows API 函数 MessageBoxAExitProcess 的调用;这样写的好处是代码更简洁、易读,并且减少了出错的可能性。

代码执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全开源】云调查考试问卷系统(FastAdmin+ThinkPHP+Uniapp)

便捷、高效的在线调研与考试新选择​ 云调查考试问卷是一款基于FastAdminThinkPHPUniapp开发的问卷调查考试软件,可以自由让每一个用户自由发起调查问卷、考试问卷。发布的问卷允许控制问卷的搜集、回答等各个环节的设置,同时支持系统模板问卷&#xff…

11、架构-从类库到服务之客户端负载均衡

目录 主要概念 客户端负载均衡的定义与重要性 历史背景 技术细节 客户端负载均衡的实现方式 工作原理 常见的客户端负载均衡策略 实际应用 Netflix Ribbon Spring Cloud LoadBalancer 服务网格(Service Mesh) 代理负载均衡器 工作原理 优点…

Android UI:Drawable:DrawableContainer

文章目录 定义API 类操作源码分析 ImageView.setImageLevel选择LevelListDrawable中的DrawableDrawableContainer封装Drawable[]数组AnimationScaleListDrawable.start总结定义 DrawableContainer封装一组Drawable,不同的DrawableContainer实现Drawable不同的展示方式 API …

linux内存缓存占用过高分析和优化

1、什么是buffer/cache ? buffer/cache其实是作为服务器系统的文件数据缓存使用的,尤其是针对进程对文件存在read/write操作的时候,所以当你的服务进程在对文件进行读写的时候,Linux内核为了提高服务的读写速度,则将会…

机器学习之数学基础 时间复杂度和空间复杂度

机器学习之数学基础中,时间复杂度和空间复杂度是两个至关重要的概念,它们分别用于描述算法在执行过程中所需的时间和空间资源。在机器学习的各个领域中,从数据预处理到模型训练,再到最终的预测和评估,都需要考虑到这两…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版 VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U2 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链…

TMS320F280049学习4:GPIO输入检测

TMS320F280049学习4:GPIO输入检测 文章目录 TMS320F280049学习4:GPIO输入检测前言一、工程代码总结 前言 DSP的内部输入上拉是弱上拉,上拉后的电压只有2.1V左右,需要外部加上拉电阻,具体参考这篇文章。 一、工程代码…

UG编程序怎么加刀补:深度解析与实用技巧

UG编程序怎么加刀补:深度解析与实用技巧 在UG编程中,刀补的添加是一个关键且复杂的步骤。正确地进行刀补设置,不仅能提高加工精度,还能有效避免刀具磨损和工件损伤。本文将从四个方面、五个方面、六个方面和七个方面详细解析如何…

Scratch编程从入门到精通:探索编程的奇幻世界

Scratch编程从入门到精通:探索编程的奇幻世界 在数字化时代的浪潮中,编程技能已成为一项不可或缺的能力。而Scratch,作为一款为青少年设计的图形化编程语言,以其直观易懂的界面和强大的功能,成为了编程初学者的理想选…

HQL面试题练习 —— 求连续段的最后一个数及每个连续段的个数

目录 1 题目2 建表语句3 题解 题目来源:拼多多。 1 题目 有一张表t_id记录了id,id不重复,但是会存在间断,求出连续段的最后一个数及每个连续段的个数。 ----- | id | ----- | 1 | | 2 | | 3 | | 5 | | 6 | | 8 | | …

风电功率预测 | 基于支持向量机结合ARIMA-SVM实现风电功率预测附matlab代码

基本介绍 引言:介绍风电功率预测的背景和意义,以及目前常用的预测方法的局限性。 相关理论介绍: ARIMA模型:解释ARIMA模型的基本原理和应用范围,包括自回归(AR)、差分(I&#xff09…

网线制作(双绞线+水晶头)——T568B标准

参考视频:https://www.bilibili.com/video/BV1KQ4y1i7zP/ 1、使用剥线器 2、将线捋顺、排序、剪掉牵引线 记忆技巧 1.线序颜色整体是一浅一深 2.颜色顺序是黄、蓝、绿、棕 一个黄种人、从上向下看,分别看到的是蓝天、青草(绿)、泥土(棕色) 3.中间两根浅…

手撸一个动态多数据源注入框架

创建一个动态多数据源注入插件涉及到设计一个能够在运行时根据配置或参数动态选择和使用不同数据源的机制。在Java Spring框架中,这通常通过自定义数据源路由、配置管理和依赖注入来实现。以下是一个简化的示例,展示了如何创建一个基本的动态多数据源注入…

数据挖掘--聚类分析:基本概念和方法

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析:基本概念和方法 聚类分析 聚类分析是把一个数据对象&…

Element UI上传图片和PDF,支持预览,并支持复制黏贴上传

背景 如上图&#xff0c;使用Element UI的el-upload组件&#xff0c;并且预览的时候可以展示图片和PDF格式文件&#xff1b; 做法 index.vue <template><div><el-uploadv-model"diaForm.list":limit"5":on-exceed"handleExceed"…

微信小程序毕业设计-综合文化信息管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

算法课程笔记——蓝桥第17次直播云课

算法课程笔记——蓝桥第17次直播云课 递归 改成signed&#xff0c;把所有int 改成longlong 100会越界

使用Ollama+OpenWebUI本地部署Gemma谷歌AI开放大模型完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月4日10点50分 &#x1f004;️文章质量&#xff1…

axios设置 responseType为 “stream“流式获取后端数据

使用前景&#xff1a; 工作过程中遇到了后端接口响应过慢&#xff0c;前端界面一致loading的情况&#xff0c;这个时候可以尝试采用将Axios的responseType参数被设置为stream类型实现。 stream介绍&#xff1a; stream类型意味着你希望服务器响应的数据以Node.js流&#xff…

Vue-App桌面程序列表

Vue-App桌面程序列表 文章说明讲解视频核心代码效果展示项目链接 文章说明 采用Vue实现PC端的桌面程序列表&#xff0c;采用HBuilderX将程序转化为5App&#xff0c;实现移动端的适配&#xff1b;支持桌面打开新应用&#xff0c;底部导航展示当前应用列表&#xff0c;可切换或关…