汇编proto、proc、invoke伪指令与函数声明、函数定义、函数调用

2024-06-17 01:08

本文主要是介绍汇编proto、proc、invoke伪指令与函数声明、函数定义、函数调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、proto伪指令–函数声明

功能和高级语言中的函数声明一样,在代码最前面写函数声明,在后面写函数定义

  • proto伪指令的格式
    函数名 proto [距离] [语言] [参数1]:数据类型,[参数2]:数据类型,……

  • 代码示例:

    Asm_Function_1 proto stdcall arg1:dword,arg2:dword
  • 一些注意事项

    • 32位汇编不需要指定距离
    • 可以指定语言也可也不指定,直接写参数,这里的语言就是和调用约定对等的。写“C”就是cdecl调用约定,写“stdcall”就是stdcall调用约定
    • proto指令、距离、语言和参数之间用空格隔开
    • 在参数与参数之间用“,”隔开
    • 在参数与参数对应的数据类型之间用“:”隔开
    • 可以不用写参数名称,但必须要写上数据类型和“:”

二、proc伪指令–函数定义

使用proto指令用来函数声明,使用proc函数用来函数定义。使用规则和proto指令一样

  • 代码示例:

    proc stdcall arg1:dword,arg2:dword函数体代码块...
    Asm_Function_1 endp
  • 注意事项:

    • 函数定义语句和proto一样,写完函数体代码之后需要以[函数名] endp结束函数定义
    • 但proc和proto搭配使用时,proto可以省略参数名,但proc不能省略。(和C中的规则一模一样)

三、invoke伪指令–函数调用

使用invoke伪指令会帮你完成参数校检和压参操作,也就是说不用写压参的push指令。直接和高级语言一样直接调用函数即可

  • invoke伪指令的格式
    invoke 函数名[,参数1][,参数2]……
  • 代码示例:

    invoke  Asm_Function_1,100,0x100
  • 注意事项:
    • 函数名称和参数,参数和参数之间都用 空格 隔开

四、测试代码

.386
.MODEL FLAT, C       
.DATA.CODE
;------------------------------------------------------
;函数声明
Asm_Function_1 proto stdcall :dword,:dword;------------------------------------------------------
;主函数
main_proc PROC;函数调用invoke    Asm_Function_1,100,100hmov        edx,eax
main_proc ENDP;------------------------------------------------------
;函数定义,实现简单功能 返回 arg1 + arg2 的值
Asm_Function_1 PROC  stdcall arg1:dword,arg2:dwordmov        eax,arg1add        eax,arg2ret    8
Asm_Function_1 endpEND

这篇关于汇编proto、proc、invoke伪指令与函数声明、函数定义、函数调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068064

相关文章

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

C# 委托中 Invoke/BeginInvoke/EndInvoke和DynamicInvoke 方法的区别和联系

《C#委托中Invoke/BeginInvoke/EndInvoke和DynamicInvoke方法的区别和联系》在C#中,委托(Delegate)提供了多种调用方式,包括Invoke、Begi... 目录前言一、 Invoke方法1. 定义2. 特点3. 示例代码二、 BeginInvoke 和 EndI

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错