win32匯程式設計序的學習之一

2021-06-18 02:25:51 字數 1682 閱讀 4357

首先說明筆者的學習環境:win7,masm for windows 整合實驗環境 2012.5

任何種類的語言,總是有基本的源程式結構規範,同樣win32 匯程式設計序也有,現在寫下乙個helloworld的匯程式設計序

.386

.model flat,stdcall

option casemap:none

include windows.inc

include user32.inc

include kernel32.inc

includelib user32.lib

includelib kernel32.lib

.data

sztitle db "helloworld",0

szcaption db "first experinment",0

.code

start:

invoke messagebox,null,offset sztitle,offset szcaption,mb_ok

invoke exitprocess,0

end start

現在解釋下以上的各個語句前三行呢,就是模式和源程式格式定義語句

.386 ;確定了本程式中使用的指令集

;.386呢,確定了匯程式設計序工作在80386及以上的處理器中

;額外解釋:後面帶p的偽指令則表示程式中可以使用特權指令-即.386p

;這樣程式就可以執行在ring0層上

.model ;定義了程式的工作模式

.model 記憶體模式,語言模式

.model flat,stdcall

記憶體模式可以有一下的幾種選擇

tiny      用於建立com檔案,所有的**,資料,堆疊都在同乙個64k空間內

small     建立**和資料分別用乙個64k段的exe檔案

medium    **段可以有多個64k段,資料段則只有乙個64k段

compact   **段只有乙個64k段,資料段則有多個段

large     **段和資料段都可以有多個段

huge      同large,資料段中的乙個陣列則可以超過64k段

flat      win32程式使用的模式,**段和資料段可以使用乙個4gb

stdcall   定義了呼叫模式,表示api函式引數自右向左壓入堆疊,並由函式自身清理堆疊

;option   casemap:none 定義了該程式是區分字母大小寫的

另外程式中的start標號,則是該程式的入口標號,對於單模組的程式而言,一般我們都會在.code中進行標號,但是標號的有誤並非是確定的,也可以沒有start,程式同樣可以

執行,除此之外入口標號不一定是start,second也是可以的!

還有就是段的定義有.data和.data?兩個段,但是兩個是有不同的

.data

szbuffer   db  100*1024 dup(?)

.data段中,編譯器認為這些資料在程式裝入的開始就必須有效,所以他在生成可執行程式的時候就保留了該100kb的控制項,如果程式其他內容是50kb,那麼生成後就是150kb

.data?

szbuffer  db 100*1024* dup(?)

.data? 編譯器則會認為該資料在開始執行時才會用到,所以在生成可執行程式時,不會開闢這些空間,只是保留了大小資訊

Win32彙編學習筆記(一)

一 基礎 資訊以位元組為單位儲存,即byte。1個byte有8個bit,從高到低是7 6 5 4 3 2 1 0。第7最高,叫msb,most significant bit。第0最低,叫lsb,least xx。32位cpu一次操作可以處理32bit個二進位制位。因此需要比位元組更大的單位。比如 ...

開始學習win32彙編

前段時間對於csdn的部落格系統徹底失望,在我現在寫的東西都還不知道能不能正常發出去,鬱悶,加上過年有這麼久沒有來了。這段時間開始學習彙編,說到彙編,大學開過兩門相關課程,微機原理和微控制器都是學這方面的,不過那都是8086,51級別的彙編,感覺根本跟不上時代,那時候學的還不錯 現在想學習學習win...

Win32彙編基本程式設計框架

win32彙編程式設計框架如下 386 model flat,stdcall option casemap none 一些include語句 stack 堆疊段的大小 data 一些初始化過的變數定義 data?一些沒有初始化過的變數定義 const 一些常量定義 code 開始標號 其它語句 en...