首页 > 编程语言 >win32汇编语言学习之二

win32汇编语言学习之二

时间:2023-04-03 17:32:17浏览次数:35  
标签:定义 invoke 汇编语言 之二 win32 API 参数 custom 函数


     对于汇编语言来说win32环境中只有一种类型,那就是32位整数,例如MessageBoxA的四个参数 HWND,LPCTSTR,LPCTSTR,UINT之所以定义成不同的摸样主要是为了说明其

用途,我们在汇编环境下调用MessageBoxA时,DOS状态下会是这样的:

   push uType

   push lpCaption

   push lpText

   push hWnd

   call  MessageBox

如果写的时候少了一句push指令,程序在编译和连接的时候都不会报错,但是执行的时候却会报错,很是不便,解决的方法之一是使用invoke指令

 invoke并不是80386处理器的指令,而是一个MASM伪指令,在编译的时候由编译器,把上面的指令展开成我们需要的4个PUSH指令和一个CALL指令,同时进行参数数量的检查

工作,(至于类型,因为WIN32仅仅使用DWORD类型的参数,所以编译器只关心参数的数量)如果带的参数数量和声明时不符,则会报错。

  API函数的返回值

   API函数的返回值一般是放在EAX当中,如果要返回的不是一个EAX能够容纳的,那么API的办法是EAX中返回的是指向返回数据的指针,或者在调用参数中提供一个缓冲区地

址,把数据直接返回到缓冲区当中去,即输出参数!

函数的声明

  函数名 proto [距离] [语言] [参数1]:数据类型,[参数2]:数据类型,...

  距离可以是NEAR,FAR,NEAR16,NEAR32,WIN32程序使用的是flat,即,数据段和代码段使用同一个4GB的段,无所谓距离,所以在定义时是忽略的

  我们知道API函数是有几种的,ANSI版本和UNICODE版本,但在我们使用的时候只是使用了MessageBox,却没有表明是ANSI还是UNICODE,这是因为在user32.inc中有一

句MessageBox equ <MessageBoxA>,并且在user32.inc中是没有MessageBox的存在的,只有MessageBoxA和MessageBoxW两种

另外PROTO表明了该函数的定义在该语句的后面,也就是说通过该指令,可以先使用后定义哈

   文件包含

使用到了两个伪指令include和includelib,在MASM32中每个dll文件对应一个<dll文件名.inc>编译器对include的处理就是把这一行用该文件的内容替换而已,这里面是我们一般

会使用到的代码模块。

现在说下includelib,一说到lib,我们便会想到库的概念,一个是静态库,一个是导入库,静态库呢,里面放的是一组已经编好函数代码模块,,在程序中可以自由引用,静态

库为程序员节省了大量的开发时间,但是也占用了大量的磁盘空间,以及执行时的内存空间。

第二个呢就是导入库,导入库中放的是函数的定位信息和参数数量,比如user32.inc的导入库就是user32.lib,includelib只是告诉连接器在连接的时候到指定的库文件去找指定

的API函数的位置信息而已


proc和proc的使用实例

.386
.model flat,stdcall
option casemap:none
include <windows.inc>
include <user32.inc>
include <kernel32.inc>
includelib user32.lib
includelib kernel32.lib
;    函数声明
custom proto tTitle:dword,tCaption:dword
;数据段的定义
.data
szTitle  db "说什么呢",0
szBuffer db "不说了吧",0
;代码段的定义

.code

start:
;custom函数的定义
custom proc tTitle:dword,tCaption:dword
invoke MessageBox,NULL,tTitle,tCaption,0
ret
custom endp
;开始执行
invoke custom,offset szTitle,offset szBuffer
invoke ExitProcess,0
end start

Proto的作用就是告诉编译器,该函数的定义在后面,仅此而已

需要注意的是自定义函数custom要定义在.code段,同时应该在开始标号(start)之前!

否则的话,就会执行函数定义部分,(如果有参数的话,里面是没有实际值的!)

另外:自定义函数部分最后一句要加上 RET!!!!

标签:定义,invoke,汇编语言,之二,win32,API,参数,custom,函数
From: https://blog.51cto.com/u_15995156/6166938

相关文章

  • 性能分析之调试工具——GDB之二
    由于上一个GDB的写的水份比较足,所以应看官们的要求,来写些具体的东西。其实网上有很多GDB的教程。我也搜索过。但是总是有那么一两个点缺少的。所以决定自己还是把工作中的记录一些下来。至少是具体工作中的实践操作。前几天因为遇到个redis的问题,所以编译了一下reids,并且做一些监控......
  • PC端应用程序自动化测试——pywinauto、pywin32、pyautogui
    1前言PC端自动化测试使用到的python模块主要有pywinauto、win32gui、pyautogui,主要功能如下:pywinauto:主要使用到Application类,用于应用程序管理(打开与关闭应用等)、窗口管理(最小化、最大化、关闭窗口)pywin32:包含win32gui、win32api、win32con3个子模块,用于窗口管理(定位窗......
  • 数据结构之二叉树
    树是一种非线性数据结构,是由n(n>=0)个有限节点组成的一个具有层次关系的集合。树的逻辑结构看起来像一棵倒挂的树,根朝上,叶子朝下。树一般是递归定义的,每一棵树都可以认为是由根和其子树构成,且各个子树不相交。树树的相关概念节点的度:一个节点含有的子树的个数称为该节点的度;叶节......
  • python win32gui 无法控制 最小化后的桌面
    当远程桌面被最小化时,发现使用win32gui控制某软件置于最前台显示时失效,并报错:File"C:\Users\Administrator\Desktop\py-auto-login\robot\ktt_auth_code.py",line156,inwx_loginwin32gui.SetForegroundWindow(self._main_wnd)pywintypes.error:(0,'SetForegroun......
  • 服务器处理能力估算(CPU、内存、存储)之二
    1  引题  但凡写过技术方案的都知道,在技术方案最终落实到工程实施部署时,必须编制出当前解决方案需要部署的IT设备及环境,包括:需要的网络环境、端口、带宽、组网......
  • pywin32获取窗口截图
    importwin32guiimportwin32uiimportwin32conimportwin32api#获取窗口句柄hwnd=win32gui.FindWindow(None,'窗口标题')#获取窗口位置和大小left,top,......
  • Python实例讲解 -- 操作数据库 附mysqldb win32 py2.7下载
    mysql是一个优秀的开源数据库,它现在的应用非常的广泛,因此很有必要简单的介绍一下用python操作mysql数据库的方法。python操作数据库需要安装一个第三方的模块,在http://mysq......
  • win32api之文件系统管理(七)
    什么是文件系统文件系统是一种用于管理计算机存储设备上文件和目录的机制。文件系统为文件和目录分配磁盘空间,管理文件和目录的存储和检索,以及提供对它们的访问和共享,以下......
  • win32api之内存知识梳理(六)
    虚拟内存和物理内存什么物理内存物理内存指的是计算机主板上的随机存储器(RAM),它是用来存储计算机当前正在运行的程序和数据的。物理内存的大小是由计算机主板上内存插槽的......
  • WIN32 _WIN32 _WIN64
    WIN32仅代表Windows操作系统,_WIN32含义有限#ifdef_MAC#ifndef_WIN32#define_WIN32#endif#endif//_MAC#ifndefWIN32#defineWIN32#endif判断32位还是6......