当前位置: 首页 > news >正文

汇编调用C库函数—printf、scanf和Win32API

RadASM:

;右键 -> 生成依赖项 -> 生成自定义 -> masm
.586
.model flat,stdcall
option casemap:noneinclude msvcrt.inc
include Kernel32.inc
include User32.incincludelib msvcrt.lib
includelib Kernel32.lib
includelib User32.libscanf proto c :ptr,:vararg  					
printf proto c :ptr,:vararg         .dataszBuffer db "Hello Word!",0format db "%s",0readBuffer db 20 dup(0).code
start:invoke scanf,addr format,addr readBufferinvoke printf,addr szBufferinvoke MessageBoxA,0,addr readBuffer,addr readBuffer,0invoke ExitProcess,0
end start

Visual Studio:

;右键 -> 生成依赖项 -> 生成自定义 -> masm
.586
.model flat,stdcall
option casemap:noneincludelib ucrt.lib
includelib legacy_stdio_definitions.lib
includelib Kernel32.lib
includelib User32.libextern scanf:proc					;C函数也可以Extern声明
printf proto c :ptr,:vararg         ;函数必须全部声明
MessageBoxA proto :dword,:ptr,:ptr,:dword
ExitProcess proto :dword.dataszBuffer db "Hello Word!",0format db "%s",0readBuffer db 20 dup(0).code
start:push offset readBufferpush offset formatcall scanfadd esp,8invoke printf,addr szBufferinvoke MessageBoxA,0,addr readBuffer,addr readBuffer,0invoke ExitProcess,0
end start

对于所有要用到的库函数(或Windows API函数),在程序的开始部分必须预先声明(如果不是RadASM,是Visual Studio写汇编,那messagebox和exitprocess也的声明)。包括函数的名称、参数的类型等,如:

在汇编语言程序中,函数声明为:

函数名称         PROTO [调用规则] :[第一个参数类型] [,:后续参数类型]

其中,PROTO后的调用规则是可选项。如果不写,则使用model语句中指定的调用规则。

如果函数使用C调用规则,则PROTO后跟一个C(大小写都可以)。接下来是参数的说明。如果参数个数、类型不定,则用VARARG说明(varible argument)。

先看在C语言头文件stdio.h中printf的函数声明:

_CRTIMP int __cdecl printf(const char *, ...);

可知printf函数的调用规则为C调用规则(__cdecl, 即c declare),第一个参数是字符串指针,后面的参数数量及类型不定。

这里,用ptr sbyte代表const char *。

printf      PROTO C :ptr sbyte,:vararg


下面这篇博客更详细

Windows汇编语言开发环境_windows 汇编语言-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 俄罗斯方块——C语言实践(Dev-Cpp)
  • Unity 特殊文件夹
  • 面试题总结(四) -- STL与算法篇
  • TI DSP下载器XDS100 V2.0无法使用问题
  • MATLAB 从 R2024B 开始支持树莓派 5
  • 【C++】模板进阶:深入解析模板特化
  • 【C++题目】1.日期差值
  • C/C++内存管理——内存泄漏/内存碎片
  • 揭秘LLM计算数字的障碍的底层原理
  • 图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲
  • 洛谷9.16
  • 【C++】入门基础(下)
  • Java 流 (Stream) 详解
  • 电气自动化入门01:电工基础
  • 整型提升整型提升练习题
  • 【mysql】环境安装、服务启动、密码设置
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • leetcode386. Lexicographical Numbers
  • Python语法速览与机器学习开发环境搭建
  • Selenium实战教程系列(二)---元素定位
  • windows下如何用phpstorm同步测试服务器
  • 后端_MYSQL
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • HanLP分词命名实体提取详解
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #07【面试问题整理】嵌入式软件工程师
  • #FPGA(基础知识)
  • $refs 、$nextTic、动态组件、name的使用
  • (12)Linux 常见的三种进程状态
  • (2)MFC+openGL单文档框架glFrame
  • (笔试题)分解质因式
  • (附源码)ssm码农论坛 毕业设计 231126
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十八)SpringBoot之发送QQ邮件
  • .NET 4.0中的泛型协变和反变
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core中Emit的使用
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net项目IIS、VS 附加进程调试
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET周刊【7月第4期 2024-07-28】
  • .考试倒计时43天!来提分啦!
  • @antv/g6 业务场景:流程图
  • [ NOI 2001 ] 食物链
  • [Android]How to use FFmpeg to decode Android f...
  • [C#]C#学习笔记-CIL和动态程序集
  • [C/C++] C/C++中数字与字符串之间的转换
  • [Codeforces1137D]Cooperative Game
  • [ERROR] Plugin 'InnoDB' init function returned error
  • [ES-5.6.12] x-pack ssl