汇编语言学习笔记-按指定的字体输出文本
生活随笔
收集整理的這篇文章主要介紹了
汇编语言学习笔记-按指定的字体输出文本
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代碼 .386
.model flat,stdcall;內(nèi)存平坦,參數(shù)傳遞約定
option casemap:none;大小寫敏感
;;;;;;引用一些必要的數(shù)據(jù)
include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include \masm32\include\gdi32.inc
includelib D:\masm32\lib\user32.lib
include D:\masm32\include\kernel32.inc
includelib D:\masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD;函數(shù)聲明,將在后面進行函數(shù)的定義
RGB macro red,green,blue;宏定義
xor eax,eax;eax置零
mov ah,blue
shl eax,8;左移8位
mov ah,green
mov al,red
endm
;;;;;;已定義數(shù)據(jù)的數(shù)據(jù)段
.DATA
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "hello world",0
FontName db "script",0
;;;;;;未定義數(shù)據(jù)的數(shù)據(jù)段
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
;;;;;;代碼段
.CODE
start: ;程序的入口與end start對應(yīng)
invoke GetModuleHandle,NULL;調(diào)用API函數(shù)獲取應(yīng)用程序句柄并把句柄存入eax寄存器
mov hInstance,eax
invoke GetCommandLine;獲取命令行的字符串指針
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT;調(diào)用子函數(shù),也就是前面我們定義的函數(shù)
invoke ExitProcess,eax;退出程序
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD;子函數(shù)的定義,包括函數(shù)名稱,參數(shù)類型,參數(shù)名稱
;子程序的開始必須先定義該子程序用到的變量
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
;初始化窗口類,這個窗口類描述我們的窗口長的什么樣子
mov wc.cbSize,SIZEOF WNDCLASSEX;窗口類結(jié)構(gòu)將占用多少個字節(jié)
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION;獲取一個系統(tǒng)圖標(biāo)
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW;獲取一個系統(tǒng)光標(biāo)
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc;注冊窗體
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL;創(chuàng)建窗體
mov hwnd,eax;保存窗口句柄
invoke ShowWindow,hwnd,CmdShow;顯示窗口
invoke UpdateWindow,hwnd;刷新窗口
;開始消息循環(huán)
.WHILE TRUE
invoke GetMessage,ADDR msg,NULL,0,0;獲取消息隊列中的消息
.BREAK .IF (!eax);如果獲取的消息為WM_QUIT就退出消息循環(huán)
invoke TranslateMessage,ADDR msg;按鍵消息的轉(zhuǎn)義
invoke DispatchMessage,ADDR msg;把消息發(fā)送到負責(zé)消息處理的函數(shù),回調(diào)方法
.ENDW
mov eax,msg.wParam;把退出的消息代碼碼放到EAX里然后回到主函數(shù)
ret
WinMain endp
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM;消息處理函數(shù),此函數(shù)可以隨便命名
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
LOCAL hfont:HFONT
.IF uMsg == WM_DESTROY;銷毀窗口的消息
invoke PostQuitMessage,NULL
.ELSEIF uMsg == WM_PAINT
invoke BeginPaint,hWnd,ADDR ps
mov hdc,eax
invoke CreateFont,64,56,0,0,400,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,ADDR FontName
invoke SelectObject,hdc,eax;把指向字體的句柄放入設(shè)備環(huán)境
mov hfont,eax
RGB 200,200,50
invoke SetTextColor,hdc,eax;設(shè)置文本顏色
RGB 0,0,255
invoke SetBkColor,hdc,eax;設(shè)置文本背景顏色
invoke GetClientRect,hWnd,ADDR rect;得到當(dāng)前窗體的大小
;invoke TextOut,hdc,0,0,ADDR OurText,SIZEOF OurText;寫文本
invoke DrawText,hdc,ADDR OurText,-1,ADDR rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER;畫文本
;invoke SelectObject,hdc,hfont;如果是text out 則必須調(diào)用這一句
invoke EndPaint,hWnd,ADDR ps;釋放環(huán)境句柄
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam;默認(rèn)的消息處理函數(shù)
ret;退出此子程序
.ENDIF
xor eax,eax;eax置零
ret
WndProc endp
end start
.model flat,stdcall;內(nèi)存平坦,參數(shù)傳遞約定
option casemap:none;大小寫敏感
;;;;;;引用一些必要的數(shù)據(jù)
include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include \masm32\include\gdi32.inc
includelib D:\masm32\lib\user32.lib
include D:\masm32\include\kernel32.inc
includelib D:\masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD;函數(shù)聲明,將在后面進行函數(shù)的定義
RGB macro red,green,blue;宏定義
xor eax,eax;eax置零
mov ah,blue
shl eax,8;左移8位
mov ah,green
mov al,red
endm
;;;;;;已定義數(shù)據(jù)的數(shù)據(jù)段
.DATA
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "hello world",0
FontName db "script",0
;;;;;;未定義數(shù)據(jù)的數(shù)據(jù)段
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
;;;;;;代碼段
.CODE
start: ;程序的入口與end start對應(yīng)
invoke GetModuleHandle,NULL;調(diào)用API函數(shù)獲取應(yīng)用程序句柄并把句柄存入eax寄存器
mov hInstance,eax
invoke GetCommandLine;獲取命令行的字符串指針
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT;調(diào)用子函數(shù),也就是前面我們定義的函數(shù)
invoke ExitProcess,eax;退出程序
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD;子函數(shù)的定義,包括函數(shù)名稱,參數(shù)類型,參數(shù)名稱
;子程序的開始必須先定義該子程序用到的變量
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
;初始化窗口類,這個窗口類描述我們的窗口長的什么樣子
mov wc.cbSize,SIZEOF WNDCLASSEX;窗口類結(jié)構(gòu)將占用多少個字節(jié)
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION;獲取一個系統(tǒng)圖標(biāo)
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW;獲取一個系統(tǒng)光標(biāo)
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc;注冊窗體
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL;創(chuàng)建窗體
mov hwnd,eax;保存窗口句柄
invoke ShowWindow,hwnd,CmdShow;顯示窗口
invoke UpdateWindow,hwnd;刷新窗口
;開始消息循環(huán)
.WHILE TRUE
invoke GetMessage,ADDR msg,NULL,0,0;獲取消息隊列中的消息
.BREAK .IF (!eax);如果獲取的消息為WM_QUIT就退出消息循環(huán)
invoke TranslateMessage,ADDR msg;按鍵消息的轉(zhuǎn)義
invoke DispatchMessage,ADDR msg;把消息發(fā)送到負責(zé)消息處理的函數(shù),回調(diào)方法
.ENDW
mov eax,msg.wParam;把退出的消息代碼碼放到EAX里然后回到主函數(shù)
ret
WinMain endp
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM;消息處理函數(shù),此函數(shù)可以隨便命名
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
LOCAL hfont:HFONT
.IF uMsg == WM_DESTROY;銷毀窗口的消息
invoke PostQuitMessage,NULL
.ELSEIF uMsg == WM_PAINT
invoke BeginPaint,hWnd,ADDR ps
mov hdc,eax
invoke CreateFont,64,56,0,0,400,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,ADDR FontName
invoke SelectObject,hdc,eax;把指向字體的句柄放入設(shè)備環(huán)境
mov hfont,eax
RGB 200,200,50
invoke SetTextColor,hdc,eax;設(shè)置文本顏色
RGB 0,0,255
invoke SetBkColor,hdc,eax;設(shè)置文本背景顏色
invoke GetClientRect,hWnd,ADDR rect;得到當(dāng)前窗體的大小
;invoke TextOut,hdc,0,0,ADDR OurText,SIZEOF OurText;寫文本
invoke DrawText,hdc,ADDR OurText,-1,ADDR rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER;畫文本
;invoke SelectObject,hdc,hfont;如果是text out 則必須調(diào)用這一句
invoke EndPaint,hWnd,ADDR ps;釋放環(huán)境句柄
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam;默認(rèn)的消息處理函數(shù)
ret;退出此子程序
.ENDIF
xor eax,eax;eax置零
ret
WndProc endp
end start
?
轉(zhuǎn)載于:https://www.cnblogs.com/liulun/archive/2010/01/16/1649471.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的汇编语言学习笔记-按指定的字体输出文本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Span元素的 width属性 无效果原
- 下一篇: ASP 文件引用