Win32汇编语言程序设计.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Win32 API的调用
•汇编与连接
ml /c /coff /Cp hello.asm
/c指示MASM只进行汇编,不调用连接程序; /coff 指示MASM以COFF 格式创建.obj文件; /Cp指示MASM保持用户标识符的大小写。
link /SUBSYSTEM:WINDOWS /LIBPATH:f:\masm32\lib
Win32汇编来自百度文库言程序的结构
• C(cdecl)调用规则和PASCAL调用规则
C调用规则从右向左传递参数,主调函数负责清栈
foo(int first_param, int second_param, int third_param) 采用cdecl调用规则的汇编代码为 push [third_param] ; 第三个参数压栈 push [second_param] ; 第二个参数压栈 push [first_param] ; 第一个参数压栈 call foo add sp, 12 ; 主调函数对堆栈进行平衡 PASCAL调用规则与C调用规则正相反
Microsoft Win32应用程序接口参考手册(上、下), 清华大学出版社 MSDN Library ---Microsoft Visual Studio
Win32 API的调用
• API函数的调用
1. 常规方法
push push push push call
mb_ok ;PUSH value for uType lpCaption ;PUSH Pointer to Caption lpText ;PUSH Pointer to Text hWnd ;PUSH Masterhandle MessageBoxA ;CALL MessageBoxA
§4.2 Win32汇编语言程序设计
一、Win32汇编语言程序的结构
二、Win32 API的调用
一、Win32汇编语言程序的结构
.386 .MODEL FLAT, STDCALL 设置汇编程序使用的指令集 .DATA .DATA ...initialized data 设置汇编程序使用的内存 .DATA? .DATA? ...uninitialized data 模式和参数传递规则 .CONST .CONST ...constants 程序代码 .CODE .CODE <label> .DATA 包含已初始化的数据 <label> ...code .DATA? 包含未初始化的数据 END <label> .CONST 包含常数声明 ..... END <label> .CODE 包含程序代码
Win32汇编语言程序的结构
• STDCALL调用规则
从右向左传递参数,被调函数负责对堆栈进行平衡
• 变长参数问题
int wsprintf( LPTSTR lpOut, LPCTSTR lpFmt, ...) 必须采用cdecl调用规则
二、Win32 API的调用
• Win32 API
API=Application Programming Interface 应用程序编程接口 Win32 API相当于DOS系统功能 kernel32.dll 包含处理内存和进程管理的API函数 user32.dll 主要用来控制用户界面 gdi32.dll 主要负责图形操作
; here begins our .data section .data Text Caption db "Hello, World!",0 db "Hello",0 ;Text, terminated with "0" ;Caption string, 0-terminated
Win32 API的调用
Win32 API的调用
• API函数的定义
int MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box );
位置在程序的开始处,或在包含文件中,用INCLUDE伪指令 包含到当前文件中
INVOKE MessageBoxA, NULL, lpMsgBoxText, lpMsgBoxCaption, MB_OK PROTO负责建立过程原形,INVOKE负责调用过程。
Win32 API的调用
• API函数的返回值
调用Win32 API函数时,函数名必须区分大小写,将 MessageBoxA写成messageboxa是错误的。
Win32 API的调用
• API函数的调用
2. PROTO与INVOKE伪指令(MASM6.x)
MessageBoxA PROTO hWnd:DWORD, lpText:DWORD, lpCaption:DWORD, uType:DWORD
函数调用后的返回值保存在EAX寄存器中
• 涉及字符串的API函数
MessageBoxA MessageBoxW ANSI(8位) Windows 9x
Unicode(16位) Windows NT
Win32 API的调用
•示例
; set options for the assembler .386 .model flat, stdcall ; declaration of all used API-functions ExitProcess MessageBoxA PROTO PROTO :DWORD :DWORD, :DWORD, :DWORD, :DWORD
; here begins our .const section .const NULL equ 0 MB_OK equ 0 ; here we start with our code
.code
Start: INVOKE INVOKE end Start
MessageBoxA, NULL, ADDR Text, ADDR Caption, MB_OK ExitProcess, NULL