小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

學(xué) Win32 匯編[3]: 控制臺(tái)下的幾種輸出方式

 aaie_ 2012-02-21
在熟悉指令、偽指令和匯編語(yǔ)法的過(guò)程中, 首先需要的是輸出顯示的手段.

我剛開(kāi)始學(xué)習(xí)時(shí)使用的是控制臺(tái)輸出, 最后發(fā)現(xiàn)既然是 Win32 匯編還是用 Debug 輸出更好.

下面是之前嘗試出的控制臺(tái)輸出的幾種辦法:
1、使用 MASM 提供的 StdOut 函數(shù);
2、使用系統(tǒng) API:
3、使用微軟 C 標(biāo)準(zhǔn)庫(kù) msvcrt.dll 中的 printf 函數(shù).

使用 MASM 的 StdOut 函數(shù):
; Test3_1.asm
; 測(cè)試代碼前應(yīng)先建立一個(gè)控制臺(tái)工程: 文件 -> 新建工程 -> 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(在沒(méi)有生成 Win32 窗口時(shí)是可以的)
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

;定義兩個(gè) DWORD 類型的變量, 分別是用于輸出句柄和字符串長(zhǎng)度
.data?
    hOut dd ?
    len  dd ?

.code
start:
    ; 獲取控制臺(tái)輸出設(shè)備的句柄, 其返回值會(huì)放在 eax 寄存器
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    ; 把獲取到的句柄給變量 hOut 
    mov hOut, eax
    ; 通過(guò) lstrlen 函數(shù)獲取字符串長(zhǎng)度, 返回值在 eax                        
    invoke lstrlen, addr szText      
    ; 把獲取到的字符串長(zhǎng)度給變量 len      
    mov len, eax
    ; 輸出到控制臺(tái), 參數(shù)分別是: 句柄、字符串地址、字符串長(zhǎng)度; 后面是兩個(gè)指針暫用不到                           
    invoke WriteFile, hOut, addr szText, len, NULL, NULL
    ret
end start

; 另外前面用到的 StdOut 也基本就是這樣實(shí)現(xiàn)的, 源碼在: masm32\m32lib\stdout.asm


使用微軟 C 標(biāo)準(zhǔn)庫(kù)中的 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


三種方法相比之下, 應(yīng)推薦使用 C 函數(shù) crt_printf; 因?yàn)樗梢苑奖爿敵龈鄶?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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多