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 |