?? 用masmplus學習win32匯編(2) .txt
字號:
用MasmPlus學習Win32匯編(2)
作者:Zoologist 于2007-9-16上傳
--------------------------------------------------------------------------------
控制臺,就是Windows下面那個黑色的窗口。進入控制臺有兩種方式,一種是運行 Command.com:
另一種是運行 Cmd.exe:
這兩種方式上存在一些差別… …我們要運行Win32 Console程序,建議選擇后者。之所以要介紹這種就是因為很輕松的看到結果。
一.第一個console程序
MasmPlus已經為我們準備好了模板:新建
選擇Masm工程標簽頁:
選中 “Win32 Console”確定即可。我們將它存為Console1.asm之后出現的這個模板本身就是一個可以編譯通過的小程序,加載之后我們立即就可以運行看到結果。
按下回車即結束。在保存目錄下,我們可以看到編譯生成了的 console.exe 文件。(可以嘗試一下從運行 cmd 或者 command 先進入dos box 再進入這個目錄運行 console 看看結果有什么不同)
下面我們對這個簡單的程序進行一下的分析:
invoke StdOut,CTXT("Hello World!")
;StdOut 并不是Windows的API,而我暫時找不到Aogo把Macro藏到什么地方了
;所以就不講述了,知道后面跟著字符串的地址就可以了
invoke StdIn,addr buffer,sizeof buffer
;暫停顯示,回車鍵關閉
;同樣,這個我也不解釋了,輸入的應該是ascii碼,存放在前面定義的buffer中
invoke ExitProcess,0
;這個就是退出結束的意思。
修改,輸入,然后顯示輸入:
invoke StdIn,addr buffer,sizeof buffer
invoke StdOut,addr buffer
invoke ExitProcess,0
編譯運行程序會一閃而過,但是如果你在dos box下面看就能看到整個過程。
二.Ascii碼
我發現實際上很多人無法理解Ascii 十六進制 二進制 ……這些亂其八糟的東西,在這里我覺得有必要講述一下。
ASCII 全稱是 American Standard Code for Information Interchange美國信息交換標準碼。起始于50年代后期,在1967年定案。ASCII 碼使用指定的 7 位或 8 位二進制數組合來表示 128 或 256 種可能的字符。一般情況下我們使用的是8位的。一個字節也是8位的,因此正好能夠將它們按照數字對字符一一對應起來。
比如: mov al,25h (注意,是十六進制的25h) 然后將 al 直接輸出,結果就是“%”。這就是簡單的對應。額外的:
十六進制 顯示出來的字符
30h 0
31h 1
32h 2
33h 3
34h 4
35h 5
36h 6
37h 7
38h 8
39h 9
就是說 mov al,31h 顯示出來就是 “1”。如果還不明白,不妨動手實驗下面的程序:(注意:.data 不是 .data? 字符串放在后者顯示不出來)
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
buffer db 31h,32h,33h,34h,35h,36h,37h,38h,0
.CODE
START:
invoke StdOut,addr buffer
invoke ExitProcess,0
end START
需要注意的是不是所有的Ascii都是可見的,因此我們直接用記事本打開一個可執行文件時會看到很多亂碼,比如我們使用記事本打開 D:\MASMPlus\Bin\CVTRES.exe 結果如下:
而使用十六進制編輯軟件ultraEdit打開這個文件,看到的就是:
左邊是按照十六進制表示的,右邊是左邊數值對應的Ascii,很多無法顯示的Ascii都用“.”來表示了。可以看出來和用Notepad打開的看起來很“像”。
觀察上面那個十六進制對Ascii的表可以發現一點點“規律”,一個數字 N 加上30h之后顯示出來就是這個數字。如果我們要按照十六進制顯示 AL中的數值,就可以將Al的高4位加上30h顯示一下,再按照同樣的方式處理低4位。不過 0-9的數值和A-F的并不連續,這里需要特殊處理一下。下面的dos程序段就是這個原理(非常不幸的是Dos Box中,我們的conole程序無法直接調用int 21h).
;Input AL,Bl,No Output
ShowAL proc
pusha
mov dl,al ;保存AL
mov cl,04
shr al,cl ;AL高4位移至低4位
mov cx,02h ;循環2次
Low4bit: cmp al,09
jbe larger ;低4位超過9
add al,07
larger: add al,30h
push cx
mov bh,0h
mov cx,1h
mov ah,09h
int 10h
pop cx
add shX,1
call SetCur
mov al,dl ;恢復保存
and al,0Fh
loop Low4bit
popa
ret
ShowAL endp
如果有興趣的話,可以將這個程序改造為你自己的console的showal.
另外,有些書上說 一個字節(Byte)是9位(bit),這樣的說法中多出來的這一位是奇偶校驗位,是硬件上使用的,對我們軟件來說是透明的。我教過一個人編寫DDR2內存檢測軟件,需要找出內存哪個芯片壞了,他寫的程序就使用了9位,我在查看他代碼的時候覺得非常崩潰,他委屈的說這是從網上查到的......
三.更簡單的解決方法
上面是典型的DOS時代的思想:了解原理,同硬件做最親密的接觸。但是,用小刀在硬盤上刻操作系統的時代已經過去了... ...上網搜索一下,有一個API wsprintf,原型請參考API手冊或MSDN,或直接在線查看:http://msdn2.microsoft.com/en-us/library/ms647550.aspx
試驗一下:
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data?
buffer db 100 dup(?)
lpszSize db 50 dup(?)
.CODE
START:
mov eax,1235
invoke wsprintf,offset lpszSize,CTXT("%d"),eax
;將EAX 按照Signed decimal integer格式化,然后放到
;lpszSize中
invoke StdOut, offset lpszSize
;暫停顯示,回車鍵關閉
invoke StdIn,addr buffer,sizeof buffer
invoke ExitProcess,0
end START
運行結果:
(之后建議讀者試驗一下如何使用此API顯示十六進制)
三. WinExec
上面的內容可能讓人覺得乏味,下面就介紹1個好玩的API。WinExec ,原型請參考API手冊或MSDN,或直接在線查看:http://msdn2.microsoft.com/en-us/library/ms687393.aspx
試驗一下:
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
szCmdline db '\windows\notepad.exe',0
.data?
buffer db 100 dup(?)
.CODE
START:
invoke StdOut,CTXT("I will run a program...")
invoke WinExec,ADDR szCmdline,SW_SHOWNORMAL
invoke StdIn,addr buffer,sizeof buffer
invoke ExitProcess,0
end START
前面提到,可以添加參數,我們可以實驗一下
szCmdline db '\windows\notepad.exe c:\boot.ini',0
另外,還可以實驗一下返回值,看看錯誤的情況下返回值是多少。
掌握了控制臺的輸入輸出方式,我們就可以很容易的驗證一些API,很容易的就能看到結果。
--------------------------------------------------------------------------------
<<<上一篇 歡迎訪問AoGo匯編小站:http://www.aogosoft.com 下一篇>>>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -