在熟悉指令、偽指令和匯編語法的過程中, 首先需要的是輸出顯示的手段. 我剛開始學習時使用的是控制臺輸出, 最后發(fā)現(xiàn)既然是 Win32 匯編還是用 Debug 輸出更好. 下面是之前嘗試出的控制臺輸出的幾種辦法: 1、使用 MASM 提供的 StdOut 函數(shù); 2、使用系統(tǒng) API: 3、使用微軟 C 標準庫 msvcrt.dll 中的 printf 函數(shù). 使用 MASM 的 StdOut 函數(shù): ; Test3_1.asm ; 測試代碼前應先建立一個控制臺工程: 文件 -> 新建工程 -> Console App ... .386 .model flat, stdcall include masm32.inc include kernel32.inc includelib masm32.lib includelib kernel32.lib .data szText db "Hello World!", 0 .code start: invoke StdOut, addr szText ret ;ret 是用于子程序返回的指令, 這里用它代替 ExitProcess(在沒有生成 Win32 窗口時是可以的) end start 使用系統(tǒng) API 函數(shù): ; Test3_2.asm .386 .model flat, stdcall include windows.inc include kernel32.inc includelib kernel32.lib .data szText db 'Hello World!', 0 ;定義兩個 DWORD 類型的變量, 分別是用于輸出句柄和字符串長度 .data? hOut dd ? len dd ? .code start: ; 獲取控制臺輸出設備的句柄, 其返回值會放在 eax 寄存器 invoke GetStdHandle, STD_OUTPUT_HANDLE ; 把獲取到的句柄給變量 hOut mov hOut, eax ; 通過 lstrlen 函數(shù)獲取字符串長度, 返回值在 eax invoke lstrlen, addr szText ; 把獲取到的字符串長度給變量 len mov len, eax ; 輸出到控制臺, 參數(shù)分別是: 句柄、字符串地址、字符串長度; 后面是兩個指針暫用不到 invoke WriteFile, hOut, addr szText, len, NULL, NULL ret end start ; 另外前面用到的 StdOut 也基本就是這樣實現(xiàn)的, 源碼在: masm32\m32lib\stdout.asm 使用微軟 C 標準庫中的 printf 函數(shù); msvscrt.inc 把它聲明做 crt_printf ; Test3_3.asm .386 .model flat, stdcall include msvcrt.inc includelib msvcrt.lib .data szText db 'Hello World!', 0 .code start: invoke crt_printf, addr szText ret end start 三種方法相比之下, 應推薦使用 C 函數(shù) crt_printf; 因為它可以方便輸出更多數(shù)據(jù)類型, 如: ; Test3_4.asm .386 .model flat, stdcall include msvcrt.inc includelib msvcrt.lib .data szFmt db 'EAX=%d; ECX=%d; EDX=%d', 0 .code start: mov eax, 11 mov ecx, 22 mov edx, 33 invoke crt_printf, addr szFmt, eax, ecx, edx ret end start |
|
來自: aaie_ > 《學Win32匯編》