汇编:头文件

汇编头文件(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…

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 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链…

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

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

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

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

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

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

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…

Vue-App桌面程序列表

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

php质量工具系列之PHPCPD

PHPCPD 用于检测重复代码&#xff0c;直观的说就是复制粘贴再稍微改改 该工具作者已经 停止维护 安装 composer global require --dev sebastian/phpcpd执行 phpcpd --log-pmd phpcpd_result.xml ./app参数介绍 --log-pmd 将结果保存在phpcpd_result.xml 中 ./app 是phpcpd扫…

Linux系统之部署Blog-Index导航页

Linux系统之部署Blog-Index导航页 一、Blog-Index介绍1.1 Blog-Index简介1.2 Blog-Index特点1.3 Blog-Index使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍2.3 Yarn介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装yarn 四…

VS-qt中运行程序时报错:fatal error RC1015:cannot open include file ‘afxres.h‘

开发环境&#xff1a;VS2015 qt5.12.10 点击运行时报错如下&#xff1a; 搜索了下afxres.h文件&#xff0c;发现位置如下&#xff1a; 看样子是VS中少安装了部分模块导致的&#xff0c;&#xff0c;看了同事的电脑&#xff0c;该文件应该是在以下目录中的&#xff1a; 所…

如何在Python中向Word文档添加段落

如何在Python中向Word文档添加段落 添加段落代码解析添加前与添加后 在这篇博客文章中&#xff0c;我们使用Python向Word文档添加段落。 添加段落 from docx import Document# 打开一个现有的Word文档 doc Document(rC:\Users\Administrator\Desktop\Word文档\example.docx)…

生成式人工智能如何运作?

一、简述 生成式人工智能是一种可用于创建内容&#xff08;包括对话、故事、图像、视频和音乐&#xff09;的人工智能。人工智能技术试图在图像识别、自然语言处理&#xff08;NLP&#xff09;和翻译等非传统计算任务中模仿人类智能。生成式人工智能是人工智能的发展方向。您可…

Ubuntu22.04下源码编译安装pythonocc-7.8

Ubuntu22.04下源码编译安装pythonocc-7.8 本文介绍Ubuntu下手动编译安装pythonocc&#xff0c;及安装过程遇到的各种坑 基本依赖安装 sudo apt-get update sudo apt-get install -y wget libglu1-mesa-dev libgl1-mesa-dev libxmu-dev libxi-dev build-essential cmake libf…

如何提高网站收录?

GSI服务就是专门干这个的&#xff0c;这个服务用的是光算科技自己研发的GPC爬虫池系统。这个系统通过建立一个庞大的站群和复杂的链接结构&#xff0c;来吸引谷歌的爬虫。这样一来&#xff0c;你的网站就能更频繁地被谷歌的爬虫访问&#xff0c;从而提高被收录的机会。 说到效…

【机器学习】【深度学习】优化器(Optimizer)

一、概述 什么是优化器&#xff1f; 优化器(Optimizer)是深度学习中的一个核心的概念&#xff0c;用于更新神经网络的权重&#xff0c;以减少或最小化损失函数(loss function)的值。损失函数衡量了模型的预测值与真实值之间的差异&#xff0c;而优化器的目标是通过调整网络参…

CPU内部结构窥探·「3」

加法器的工作原理&#xff1a;从简单的逻辑到现代计算 我们在cpu内部结构窥探「1」中提到CPU内部ALU的核心部件就是运算器&#xff0c;今天就以加法器为例&#xff0c;来讲解我们ALU中算数逻辑运算的过程。 1.认识数字电路中的各种门电路 2. 什么是加法器&#xff1f; 加法器…