Win64汇编语言与C语言混合编程(精华)

C语言代码



01  #pragma comment(linker, "/ENTRY:EntryPoint")
02  
03  //引入微软函数
04  int MessageBoxA(int,char*,char*,int);
05  //引入汇编编写的函数
06  void Entry();
07  
08  
09  //程序入口点
10  void EntryPoint()
11  {
12  //调用系统函数
13  MessageBoxA(0,"旖旎软件C语言与汇编语言混合编译测试程序","提示",0x40);
14  
15  //调用汇编函数
16  Entry();
17  
18  
19  }


汇编语言代码



001  ;--------------------------------------------------------------------------------
002  ;程序设计:中国·旖旎
003  ;版权所有:旖旎软件 2003-2009
004  ;禁止任何修改与盗版
005  ;请访问64位汇编语言官方站 Http://Www.X64Asm.Com
006  ;电子邮件 [email protected] Tel:139******** 138******** QQ:6405035
007  ;官方论坛:Http://Www.X64Asm.Com/AsmBbs 官方QQ群A群:10126494 官方QQ群B群:8939303
008  ;--------------------------------------------------------------------------------
009  ;编译命令 Ml64.exe /c FristWindow.Asm
010  ;连接命令 Link.exe /SubSystem:Windows /Entry:Entry FristWindow.Obj  /Out:FristWindow.Exe
011  ;--------------------------------------------------------------------------------
012  ;包含文件
013  include    Masm.inc
014  ;--------------------------------------------------------------------------------
015  ;代码
016  .CODE
017  ;--------------------------------------------------------------------------------
018  ;窗口消息处理
019  WndProc    PROC
020      ;保存传递进来的参数寄存器
021      mov [rsp+8H],rcx
022      mov [rsp+10H],rdx
023      mov [rsp+18H],r8
024      mov [rsp+20H],r9
025      ;设置堆栈栈顶指针,
026      push    rbp
027      mov    rbp,rsp
028      ;分配其他局部变量
029  
030      ;保存所有非易失寄存器
031      push    rbx
032        push    rdx
033        push    rdi
034        push    rsi
035        push    r10
036        push    r11
037        push    r12
038        push    r13
039        push    r14
040        push    r15
041      ;为函数调用分配足够堆栈
042      ;注意必须确保堆栈按16字节对齐
043      sub     rsp, 20H
044      ;检查消息
045      cmp rdx,WM_CREATE
046      je @WndCreate
047  
048      cmp rdx,WM_DESTROY
049      je @WndDestroy
050  
051      cmp rdx,WM_CLOSE
052      je @WndClose
053      
054      ;因为RCX,RDX,R8,R9并没有改变,所以直接调用即可
055      call DefWindowProcA
056  
057      ;释放为函数调用分配的堆栈
058      add     rsp, 20H
059      ;恢复所有非易失寄存器
060      pop    r15
061      pop    r14
062      pop    r13
063      pop    r12
064      pop    r11
065      pop    r10
066      pop    rsi
067      pop    rdi
068      pop    rdx
069      pop    rbx
070      ;恢复堆栈栈顶指针
071      pop    rbp
072      ;返回
073      ret
074  
075  @WndClose:
076  
077  
078      ;消息提示确认退出
079      ;消息父窗口
080      mov rcx,[rbp+8H+8H]
081      ;消息文本
082      lea rdx,szTrueExit
083      ;消息标题栏
084      lea r8,szInfo
085      ;消息类型
086      mov  r9,MB_YESNO or MB_ICONQUESTION
087      ;调用消息函数
088      call MessageBoxA
089  
090      ;比较返回值
091      cmp rax,IDYES
092      jne @Exit
093      ;摧毁窗口
094      mov rcx,hWnd
095      call DestroyWindow
096      jmp    @Exit
097  
098  @WndDestroy:
099  
100      xor    rcx,rcx
101      call    PostQuitMessage
102      jmp    @Exit
103  
104  @WndCreate:
105  
106      mov rdx,WM_SETICON
107      mov r8,ICON_SMALL
108      mov r9,hIcon
109      call SendMessageA
110      
111      jmp    @Exit
112  @Exit:
113      ;释放为函数调用分配的堆栈
114      add     rsp, 20H
115      ;恢复所有非易失寄存器
116      pop    r15
117      pop    r14
118      pop    r13
119      pop    r12
120      pop    r11
121      pop    r10
122      pop    rsi
123      pop    rdi
124      pop    rdx
125      pop    rbx
126      ;恢复堆栈栈顶指针
127      pop    rbp
128      ;返回
129      xor    rax,rax
130      ret
131  
132  WndProc    ENDP
133  ;--------------------------------------------------------------------------------
134  ;程序入口点
135  Entry PROC
136      ;设置堆栈栈顶指针
137      push    rbp
138      mov    rbp,rsp
139      ;分配其他局部变量
140      
141      ;保存所有非易失寄存器
142        push    rbx
143        push    rdx
144        push    rdi
145        push    rsi
146        push    r10
147        push    r11
148        push    r12
149        push    r13
150        push    r14
151        push    r15
152        ;为函数调用分配足够堆栈
153      ;注意必须确保堆栈按16字节对齐
154      sub     rsp, 60H
155  
156      ;获得实例句柄
157      xor    rcx,rcx
158      call    GetModuleHandleA
159      mov    hInstance,rax
160  
161      ;初始化窗口类
162      lea    rcx,stWndClsEx
163      mov    rdx,sizeof stWndClsEx
164      call    RtlZeroMemory
165  
166      ;填充窗口类结构
167      mov    stWndClsEx.cbSize,SIZEOF WNDCLASSEX
168      mov       stWndClsEx.style, CS_HREDRAW or CS_VREDRAW
169      lea       rax,WndProc
170      mov       stWndClsEx.lpfnWndProc,rax
171      mov       stWndClsEx.cbClsExtra,NULL
172      mov       stWndClsEx.cbWndExtra,NULL
173      push      hInstance
174      pop       stWndClsEx.hInstance
175      mov       stWndClsEx.hbrBackground,COLOR_BTNFACE+1
176      mov       stWndClsEx.lpszMenuName,NULL
177      lea       rax,szWndClassName
178      mov       stWndClsEx.lpszClassName,rax
179  
180      ;加载图标
181      mov    rcx,hInstance
182      mov    rdx,1000
183      call    LoadIconA
184      mov    stWndClsEx.hIcon,rax
185      mov    stWndClsEx.hIconSm,rax
186      mov    hIcon,rax
187  
188      ;加载光标
189      mov    rcx,NULL
190      mov    rdx,IDC_ARROW
191      call    LoadCursorA
192      mov    stWndClsEx.hCursor,rax
193      
194      ;注册窗口类
195      lea    rcx,stWndClsEx
196      call    RegisterClassExA
197      
198      ;开始创建窗口
199      xor    rcx,rcx
200      lea    rdx,szWndClassName
201      lea    r8,szWndTitleName
202      mov    r9,WS_OVERLAPPEDWINDOW
203      ;窗口长宽高低全部为默认,四个参数后的其他参数依次压入堆栈
204      mov    rax,CW_USEDEFAULT
205      mov    [rsp+32],rax
206      mov    [rsp+40],rax
207      mov    [rsp+48],rax
208      mov    [rsp+56],rax
209      ;窗口菜单等为0
210      xor    rax,rax
211      mov    [rsp+64],rax
212      mov    [rsp+72],rax
213      ;窗口实例句柄
214      mov    rax,hInstance
215      mov    [rsp+80],rax
216      xor    rax,rax
217      mov    [rsp+88],rax
218      ;创建窗口
219      call    CreateWindowExA
220      
221      ;创建失败处理
222      mov    hWnd,rax
223      cmp    rax,0
224      je    @CreateWndError
225      
226      ;显示窗口
227      mov    rcx,hWnd
228      mov    rdx,SW_SHOWNORMAL
229      call    ShowWindow
230  
231      ;更新窗口
232      mov    rcx,hWnd
233      call    UpdateWindow
234  
235      ;消息循环
236  @MsgLoop:
237      
238      ;取得消息
239      lea    rcx,stMsg
240      xor    rdx,rdx
241      xor    r8,r8
242      xor    r9,r9
243      call    GetMessageA
244  
245      ;检查消息返回值,为零则退出
246      cmp    rax,0
247      jz    @Exit
248  
249      ;转化消息
250      lea    rcx,stMsg
251      call    TranslateMessage
252  
253      ;派遣消息
254      lea    rcx,stMsg
255      call    DispatchMessageA
256      
257      ;跳转到消息循环
258      jmp    @MsgLoop
259  
260  
261  @Exit:
262      ;释放为调用函数分配的堆栈
263      add     rsp, 60H
264      ;恢复所有非易失寄存器
265      pop    r15
266      pop    r14
267      pop    r13
268      pop    r12
269      pop    r11
270      pop    r10
271      pop    rsi
272      pop    rdi
273      pop    rdx
274      pop    rbx
275      ;恢复堆栈栈顶指针
276      pop    rbp
277      ;返回
278      mov    rax,stMsg.wParam
279      ret
280      
281      ;创建窗口错误处理
282  @CreateWndError:
283  
284      ;消息框父窗口为默认
285      xor  rcx,rcx
286      ;消息文本
287      lea rdx,szCreateWndErr
288      ;消息标题栏
289      lea r8,szError
290      ;消息类型
291      mov  r9,MB_OK or MB_ICONERROR
292      ;调用消息函数
293      call MessageBoxA
294      
295      ;释放为调用函数分配的堆栈
296      add     rsp, 60H
297      ;恢复所有非易失寄存器
298      pop    r15
299      pop    r14
300      pop    r13
301      pop    r12
302      pop    r11
303      pop    r10
304      pop    rsi
305      pop    rdi
306      pop    rdx
307      pop    rbx
308      ;恢复堆栈栈顶指针
309      pop    rbp
310      ;返回
311      xor    rax,rax
312      ret
313  
314  Entry ENDP
315  ;--------------------------------------------------------------------------------
316  
317  ;程序结束
318  END

原文链接:http://www.x64asm.com/viewthread.php?tid=610&extra=page%3D1
319  

你可能感兴趣的:(Win64汇编语言与C语言混合编程(精华))