




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Windows組合語言程式基礎3.1機器語言、組合語言和高級語言
程式設計程式語言分為三大類:機器語言、組合語言和高級語言。
高級語言目前使用較多的是高級語言編程用高級語言編寫的程式便於閱讀和修改電腦不能直接執(zhí)行需要由編譯程序或解釋程式將它翻譯成電腦能夠接受的機器語言程式
C,C++,java等都是高級語言。機器語言電腦能夠直接識別的語言機器指令用二進位代碼組成每條機器指令都由CPU執(zhí)行,控制電腦完成一個基本操作機器語言編寫的程式是電腦惟一能夠直接識別並執(zhí)行的程式,而用其他語言編寫的程式必須經過翻譯變換成機器語言程式。
組合語言介於機器語言和高級語言之間充分利用電腦的硬體特性和操作系統(tǒng)底層功能直接利用CPU的指令系統(tǒng)3.2組合語言程式的上機過程開發(fā)過程的最終目的是產生一個可執(zhí)行檔先要編寫相應的程式原始檔案(根源程式)再進行編譯鏈接3.2.1組合語言程式的開發(fā)過程組合語言程式的開發(fā)過程分為編輯、編譯、鏈接、運行等幾個步驟3.2.1組合語言程式的開發(fā)過程(續(xù))1.組合語言程式的尾碼為.asm,可以用任何文本編輯程式來編寫,但是必須使用“純文本”格式保存。2.在編輯生成原始檔案後,下一步操作就是運行組合語言程式對原始檔案進行彙編,如果沒有錯誤就生成obj目標代碼檔。3.目標代碼檔不能直接運行,將.obj檔和用到的庫檔鏈接起來,生成最終的.exe檔。4.在得到可執(zhí)行檔後,再運行可執(zhí)行檔,檢查程式是否可以正確運行。如何找到邏輯錯誤?一般來說,有3種常用的方法來查找錯誤:靜態(tài)分析、中間結果列印、動態(tài)調試。
3.2.2MASM彙編器MASM彙編器的命令行用法為:
ml[/選項]組合語言程式原始檔案[/link鏈接選項]選項功能/c僅進行編譯,不自動進行鏈接
/coff產生的obj檔格式為COFF格式
/Cp根源程式中區(qū)分大小寫
/Fofilename指定輸出的obj檔案名
/Fl[filename]產生.lst列表檔
/Ipathname指定include檔的路徑
/link指定鏈接時使用的選項
3.2.3LINK鏈接器LINK編譯器的命令行用法為:link[選項][文件列表]選項功
能
/out:輸出檔案名輸出的檔案名,擴展名默認為.exe/map:檔案名生成MAP檔
/libpath:目錄名指定庫檔的目錄路徑
/implib:檔案名指定導入庫檔
/entry:標號指定入口
/comment:字串在PE檔的檔頭後面加上文本注釋(版權資訊)
/stack:數(shù)字設定堆疊的大小
/subsystem:系統(tǒng)名指定程式運行的環(huán)境,可以是以下幾種之一:Native,Windows,Console,Windowsce,Posix以一個根源程式檔hello.asm為例,對它進行彙編鏈接,最後運行。用MASM彙編一個程式的方法為ml/c/coffhello.asm用LINK鏈接生成可執(zhí)行檔的方法為:link/subsystem:consolehello.obj可以簡化為:ml/coffhello.asm/link/subsystem:console
3.2.4彙編鏈接步驟
3.3彙編根源程式的格式
3.3.1一個顯示字串的組合語言程式舉例hello.asm等同於下麵的C程式#include<stdio.h>intmain(){
printf("HelloWorld!\n");return0;}3.3.2程式格式
1.模式定義程式的第一部分是有關模式定義的3條語句:.386.modelflat,stdcalloptioncasemap:none這些語句定義了程式使用的指令集、工作模式。下麵講一下指令集和工作模式(1)指令集.386語句是組合語言的偽指令,說明使用的指令集是哪一種CPU的。如果用組合語言編寫的是驅動程式或者驅動程式的一個小模組,而且驅動程式在特權級0上運行,就需要使用.386p,後面帶p的偽指令表示程式中可以使用特權指令。在編程中如果使用了MMX指令,除了定義.586之外,還要加上一句.mmx偽指令:.586.mmx
(2)工作模式.model語句用來定義程式工作的模式,它的格式是:.model記憶體模式[,調用規(guī)則][,其他模式]記憶體模式的定義影響最後生成的可執(zhí)行檔在DOS的可執(zhí)行程式中,可用到.com檔和.exe檔。在Windows環(huán)境下,可執(zhí)行程式只有一種記憶體模式,即Flat(平坦)模式。(2)工作模式(續(xù))在DOS下的組合語言程式中,常常有這樣的程式片段:MOVAX,DATAMOVDS,AX其作用是給數(shù)據段寄存器DS賦值。在編程時,必須考慮這些DS,ES,SS等段寄存器是否正確設置。在Windows組合語言程式中,則不必考慮這些問題。在程式中,不需要也不應該給CS,DS,ES,SS等段寄存器賦值。(3)option語句option語句有許多選項,這裏介紹一種:optioncasemap:none這條語句說明程式中的變數(shù)和副程式名是否對大小寫敏感。由於WindowsAPI函數(shù)中的函數(shù)名稱是區(qū)分大小寫的,所以應該指定這個選項“casemap:none”3.3.2程式格式2.includelib語句組合語言程式中也需要調用一些外部模組(副程式/函數(shù))來完成部分功能。例如:使用下麵語句通知鏈接程式使用msvcrt.libincludelibmsvcrt.lib若要使用使用其他庫檔,只需重複編寫Includelib庫檔案名3.3.2程式格式3.函數(shù)聲明語句對於所有要用到的庫函數(shù)或WindowsAPI函數(shù),在程式的開始部分必須預先聲明,包括函數(shù)的名稱、參數(shù)的類型等。格式:函數(shù)名稱PROTO[調用規(guī)則]:[第一個參數(shù)類型][,:后續(xù)參數(shù)類型]3.3.2程式格式4.include語句include語句的語法是:include檔案名例如:includekernel32.incincludeuser32.inc以後程式中用到user32.dll和kernel32.dll中的函數(shù)時,不需要事先聲明就可以直接使用。3.3.2程式格式5.數(shù)據和代碼部分程式中的數(shù)據部分和代碼部分是分開定義的,分別以.data和.code開始,以end結束。
end語句一般是整個程式的最後一條語句,end語句後面跟的是起始標號,指出了程式執(zhí)行的第一條指令的位置。3.3.2程式格式6.跨行的語句
當根源程式的某一語句過長,不利於書寫和閱讀時,可以用反斜杠(\)作為換行符,將這條語句分為幾行來寫。3.3.3一個Windows介面的組合語言程式
下麵給出一個使用Windows圖形介面的彙編根源程式。hellow2.asm(顯示一個Windows消息框)在編譯鏈接時,必須在subsystem選項中指定“windows”,而不是“console”。命令為:ml/coffhellow.asm/link/subsystem:windows運行結果:
3.4運算元的尋址方式
尋址方式就是如何表示運算元的各種方法。以MOV指令為例:格式:MOVDST,SRCDST為目標運算元,SRC為源運算元,即SRC→DSTDST和SRC的數(shù)據類型應該一致
舉例例如,以下的一些數(shù)據傳送操作都是用MOV指令完成的MOVAL,127;將AL的內容設置為127,即7FHMOVDX,100;將DX的內容設置為100,即0064HMOVEAX,0;將EAX的內容設置為0MOVEBX,EAX;將EAX的內容複製到EBXMOVX,-1;將X設置為-1,變數(shù)X可定義為字 節(jié)、字、雙字類型
3.4.1立即尋址運算元直接包含在指令中,緊跟在操作碼之後的尋址方式稱為立即尋址方式,該運算元也被稱為立即數(shù)。舉例:MOVAL,00,190,-1和MOVAX,1900FFFFFFFFH為MOVEAX,-1立即數(shù)。MOVEAX,0FFFFFFFFH運算元包含在CPU內部的寄存器中舉例:MOVBL,80源運算元使用的是立即尋址;目標運算元使用寄存器尋址舉例:MOVEAX,EBXEBX和EAX都是寄存器尋址
3.4.2寄存器尋址
3.4.3直接尋址指令中直接給出了運算元的地址例如:dVar是定義好的一個雙字型變MOVEAX,dVarMOVdVar,EBX
執(zhí)行指令“MOVEAX,dVar”時,CPU從指令中得知dVar的地址,再從地址取出一個雙字,送給EAX。3.4.4寄存器間接尋址
運算元的地址放在寄存器中,CPU從寄存器中取得運算元的地址,例如:MOVESI,00404011HMOVEAX,[ESI]ESI外面加一對方括號,表示把ESI作為地址,從記憶體中取出一個雙字。
3.4.5寄存器相對尋址運算元的地址是寄存器和一個立即數(shù)相加後得到的結果
舉例:MOVESI,0040200AHMOVEDI,[ESI+4]ESI加上4後得到的結果,作為一個運算元的地址。再從這個地址中取出一個雙字送給EDI。
3.4.6基址變址尋址運算元的地址是兩個寄存器相加後得到的結果,兩個寄存器分別稱為基址寄存器和變址寄存器。舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI]
3.4.6基址變址尋址(續(xù))基址寄存器有兩個:BX和BP變址寄存器也有兩個:SI和DI基址變址寄存器只能是4種組合之一:[BX+SI],[BX+DI],[BP+SI]和[BP+DI]。3.4.7基址變址相對尋址
運算元的地址是兩個寄存器以及一個立即數(shù)相加後得到的結果,即基址寄存器、變址寄存器和相對量。舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI+4]
3.4.8基址變址比例相對尋址
運算元的地址是由基址寄存器、變址寄存器乘以一個比例數(shù)和相對量這3個部分相加得到的結果。比例數(shù)只能有1,2,4,8,這4種取值。
舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[ESI+EBX*2+4]3.4.9尋址方式總結
有效地址的計算方式
EA的計算中包括基址、變址、比例、相對這4個部分。每個部分都可以從上面的可選項中任選其一。它可以轉換為以下幾種尋址方式:比例數(shù)取1時,就變成基址變址相對尋址方式。比例數(shù)取1且相對量不出現(xiàn)時,就變成基址變址尋址方式。變址寄存器不出現(xiàn)時,就變成寄存器相對尋址方式。變址寄存器和相對量不出現(xiàn)時,就變成寄存器間接方式。基址寄存器和變址寄存器不出現(xiàn)時,就變成直接方式。3.4.10段超越記憶體運算元的地址由兩個部分指定:段和有效地址。尋址方式中只確定有效地址段寄存器確定段地址沒有指定段寄存器且尋址方式使用了ESP和EBP寄存器,就使用SS段寄存器。其他情況,使用DS段寄存器。
例如,下麵指令中的記憶體運算元在SS段中:MOVEAX,[EBP+8]MOVEBX,[ESP-4]下麵指令中的記憶體運算元在DS段中:MOVEAX,[EBX+8]MOVEBX,[ESI-4]MOVEAX,[0040200AH]
3.5數(shù)據定義3.5.1常數(shù)的表示3.5.2簡單數(shù)據類型3.5.3DUP偽操作3.5.4數(shù)據定義的例子程式
3.5.1常數(shù)的表示二進位數(shù)字後面跟b或B,如00011011b八進制數(shù)字後面跟o或O;如33o十進位數(shù)字後面跟d或D,如27d十六進制數(shù)字後面跟h或H,如1BH數(shù)字後面不跟字母時,被當做十進位數(shù)可用.radix指定默認數(shù)值(一般不用)
3.5.2簡單數(shù)據類型3.5.2簡單數(shù)據類型(續(xù))定義數(shù)據的語句為:[變數(shù)名]助記符運算式[,運算式…]舉例:bVarDB120wVarWORD 200,3003.5.3DUP偽操作
為連續(xù)的存儲單元提供重複數(shù)據格式:NDUP(運算式)N為重複因數(shù),只能取正整數(shù)DUP還可以嵌套常用來定義數(shù)組,例如:bArrayWORD50DUP(0)表示字型數(shù)組bArray,有50個元素,每個元素初值為0
3.5.4數(shù)據定義的例子程式說明數(shù)據變數(shù)的定義和使用方法的例子defvar.asm命令:ml/coffdefvar.asm/linksubsystem:console結果:在VC調試程式中查看數(shù)據區(qū)的內容如圖:3.6操作符3.6.1常用偽操作1.PTR偽操作2.EQU偽操作3.
(等號)偽操作4.$偽操作5.ORG偽操作6.offset操作符7.type操作符8.length操作符9.size操作符
1.PTR偽操作用法:類型PTR地址運算式
類型的取值:BYTE,WORD,DWORD等作用(1)在指令中臨時改變變數(shù)的類型(2)確定指令中運算元的類型
2.EQU偽操作用法為:符號名 EQU運算式舉例:NULL EQU0MB_OK EQU0在程式中就可以使用這些符號來替代這些常量,EQU的作用和C語言中的“#define”相似。
3.
(等號)偽操作用法:符號名
運算式
作用:為常量、運算式及其他各種符號定義一個等價的符號名
舉例:I=100可多次重複定義,以最後一次定義的值為準而EQU定義的符號名則只能定義一次4.$偽操作
$在程式中表示當前地址計數(shù)器的值
舉例:wVarWORD0102h,1000,100*100BYTESOFWVAREQU$-wVar$代表該行所在的地址計數(shù)器,減去wVar的地址,就得到了wVar所佔用的位元組數(shù)。5.ORG偽操作
用法為:ORG數(shù)值運算式作用:將程式下一行的地址計數(shù)器的值設置成數(shù)值運算式的值舉例:aVarBYTE01hORG$+10bVarBYTE02h在aVar和bVar兩個變數(shù)中插入10位元組的空間
6.offset操作符用法為:offset[變數(shù)|標號]作用:取出變數(shù)或標號的地址
舉例:下麵2條語句等價dVar3DWORDwVar2dVar3DWORDoffsetwVar27.type操作符
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教陜西 九年級 下冊 語文 第五單元《 天下第一樓(節(jié)選)》習題課 課件
- 人教陜西 九年級 下冊 語文 第四單元《 口語交際》習題課 課件
- 銀行新營銷課件
- 針灸治療痹癥
- 平頂山市學年第二學期期末調研考試高一語文測試題
- 勞動合同范例80
- 余快遞合作合同范例
- 出釜合同范例
- 公司食堂外包合同范例
- 勞務提成合同范例
- 3.2依法行使權利 課件 -2024-2025學年統(tǒng)編版道德與法治八年級下冊
- 2025年貴州遵義正安縣事業(yè)單位招聘工作人員歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 日常采購維修合同范本
- 2024-2025年第二學期一年級語文教學進度表
- 企業(yè)員工職務犯罪預防
- 2025年貴州省高職單招醫(yī)學類職業(yè)技能測試題庫及答案(備考刷題)
- 5《水污染》教學設計-2023-2024學年科學六年級下冊冀人版
- 2024年執(zhí)業(yè)藥師繼續(xù)教育專業(yè)答案
- 教師教學常規(guī)工作檢查記錄表
- 中央空調系統(tǒng)水處理投標書.doc
- 第三章財政支出總論PPT課件
評論
0/150
提交評論