首页 > 编程语言 >汇编:头文件

汇编:头文件

时间:2024-06-09 13:03:27浏览次数:19  
标签:汇编 头文件 函数 invoke source API inc

汇编头文件(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 proc
    push 0
    push offset szText
    push offset szCaption
    push 0
    call MessageBoxA
​
    push 0
    call 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 proc
    invoke  MessageBoxA,NULL,offset szCaption,offset szText,MB_OK
    invoke  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 的调用;这样写的好处是代码更简洁、易读,并且减少了出错的可能性。

代码执行结果:

标签:汇编,头文件,函数,invoke,source,API,inc
From: https://blog.csdn.net/WolvenSec/article/details/139545218

相关文章

  • 【CTF MISC】XCTF GFSJ0249 misc_pic_again Writeup(LSB隐写+ZIP压缩包+反汇编)
    misc_pic_againflag=hctf{[a-zA-Z0-9~]*}解法用binwalk扫描,找到zip压缩包。binwalk719af25af2ca4707972c6ae57060238e.png用foremost提取,得到一张看起来一样的图片。foremost719af25af2ca4707972c6ae57060238e.png-o719再次用binwalk扫描,又找到......
  • Keil一键添加.c文件和头文件路径脚本--可遍历添加整个文件夹
    最近想移植个LVGL玩玩,发现文件实在是太多了,加的手疼都没搞完,实在不想搞了就去找脚本和工具,基本没找到一个。。。。。。主要是自己也懒得去研究写脚本,偶然搜到了一个博主写的脚本,原博客地址:https://blog.csdn.net/riyue2044/article/details/139424599但是有以下问题:1.这个脚本......
  • c++入门笔记——头文件
    【头文件】c++中,一个程序开头必有头文件。头文件有许多个,它们的关系是并列的。<algorithm>:包含STL通用算法。<bitset>:包含bitset类模板。<cassert>:包含断言宏,如assert。<cctype>:包含字符处理函数。<cerrno>:定义错误码变量errno。<cfenv>:提供有关浮点环境的操作。......
  • C语言:详解gcc驱动程序完成编译、汇编、链接的过程
    相关阅读C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482    gcc是一个命令,严格意义上说,它只是一个驱动程序,而不是一个编译器。gcc负责调用GNU工具链中的预处理器、编译器、汇编器、链接器等工具,通过传递不同的选项给g......
  • 【ARM】汇编语言结构
    结构连接器工作机制对应C代码被编译为二进制执行文件的过程:C语言转换为汇编代码file.c->file.asm汇编编译产生.o文件file.o带有未解析地址的中间文件连接器将.o文件排列填入到对应的存储地址中,并记录其函数和变量对应的地址,使得其他函数能够跳转到该函数的入......
  • 八(汇编程序设计):输入5个同学成绩(有学号提示),然后排序,最后显示出名次表(学号,成绩)。要求:应
    代码DSEG SEGMENTGRADEDB5DUP(0)XUEHAODB'1','2','3','4','5'BUFDB4DUP(0)INFDB"Student",'$'NEWLINEDB0DH,0AHDSEGENDSSSEGSEGMENTSTACKSKTOPDB50DUP(0)S......
  • 七(汇编程序设计):已知一个M行N列的矩阵A,它的元素按行的顺序存于内存中,试编写求每行元素
    代码DSEGSEGMENTARRDB15H,22H,3H,0E4H,0A5H,56H,7H,18H DB31H,12H,13H,24H,45H,26H,47H,18H DB12H,25H,33H,34H,45H,66H,47H,81H DB10H,21H,63H,54H,56H,0C6H,0A7H,38HMDB4N DB8RowSumdw4DUP(0)ColSumdw8DUP(0)DSEGENDSCSEGS......
  • 80C51单片机-LED流水灯效果(汇编版)
    8051单片机跑马灯实验:LED流水灯效果本文将介绍一个基于8051单片机的跑马灯实验,通过编写汇编代码实现LED流水灯效果。这个实验将使用8051单片机的P2口来控制8个LED灯,实现流水灯效果。实验准备8051单片机8个LED灯8PIN排线JP11(P2)和J12(LED灯)连接将JP11(P2)和J12(LED灯)使用8PIN排......
  • 8086 汇编笔记(十):标志寄存器
    前言一、ZF标志ZeroFlag,零标记位。用于记录相关指令执行后,其结果是否为0。如果结果为0,则ZF=1,如果结果非0,则ZF=0 movax,1subax,1;ZF=1movax,2subax,1;ZF=0二、PF标志ParityFlag,奇偶标记位。它用于记录相关指令执行后,其结果的所有bit位中1的个......
  • visual studio 2019 c++与汇编混合代码
    1、visualstudio2019下x64架构的CPU配置不支持内联汇编代码的嵌入,即不支持__asm{}语句。2、通过创建.asm汇编代码文件封装汇编函数的方式实现c++代码调用汇编函数:第一步:修改工程的生成依赖项第二步:创建.asm汇编代码文件第三步:编写汇编代码的函数第四步:在c++文件调用汇编函......