32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件全套 錢曉捷 第1-9章 匯編語(yǔ)言基礎(chǔ)-浮點(diǎn)、多媒體及64位指令_第1頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件全套 錢曉捷 第1-9章 匯編語(yǔ)言基礎(chǔ)-浮點(diǎn)、多媒體及64位指令_第2頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件全套 錢曉捷 第1-9章 匯編語(yǔ)言基礎(chǔ)-浮點(diǎn)、多媒體及64位指令_第3頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件全套 錢曉捷 第1-9章 匯編語(yǔ)言基礎(chǔ)-浮點(diǎn)、多媒體及64位指令_第4頁(yè)
32位匯編語(yǔ)言程序設(shè)計(jì) 第3版 課件全套 錢曉捷 第1-9章 匯編語(yǔ)言基礎(chǔ)-浮點(diǎn)、多媒體及64位指令_第5頁(yè)
已閱讀5頁(yè),還剩550頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

32位匯編語(yǔ)言程序設(shè)計(jì)2主教材 高等院校精品課程系列教材32位匯編語(yǔ)言程序設(shè)計(jì)·第3版

錢曉捷主編,穆玲玲、張行進(jìn)

參編機(jī)械工業(yè)出版社

3教學(xué)內(nèi)容第1章匯編語(yǔ)言基礎(chǔ) 4第2章數(shù)據(jù)表示和尋址 6第3章通用數(shù)據(jù)處理指令 8第4章程序結(jié)構(gòu) 10第5章模塊化程序設(shè)計(jì) 8第6章Windows編程 6第7章與VisualC++的混合編程 4第8章DOS環(huán)境的程序設(shè)計(jì) 4第9章浮點(diǎn)、多媒體及64位指令 1第1章匯編語(yǔ)言基礎(chǔ)1.1英特爾80x86處理器1.2個(gè)人計(jì)算機(jī)系統(tǒng)1.3匯編語(yǔ)言程序格式第1章匯編語(yǔ)言基礎(chǔ)了解軟硬件開發(fā)環(huán)境熟悉通用寄存器和存儲(chǔ)器組織掌握匯編語(yǔ)言的 語(yǔ)句格式、程序框架和開發(fā)方法6Intel80861.1英特爾80x86處理器8038680486奔騰奔騰II奔騰4802868086奔騰III酷睿多核系列4004IA-32處理器16位80x86處理器奔騰多核系列Intel64處理器71.1.116位80x86處理器16位結(jié)構(gòu)處理器8086/8088指令系統(tǒng)提供16位基本指令集80186/80188增加若干條實(shí)用指令8086的工作方式是實(shí)方式(RealMode)80286增加保護(hù)方式(ProtectedMode)80286引入了系統(tǒng)指令為操作系統(tǒng)等核心程序提供處理器控制功能指令系統(tǒng)、指令集(InstructionSet)81.1.2IA-32處理器80386引入英特爾32位指令集結(jié)構(gòu)ISA兼容原16位80286指令系統(tǒng)全面升級(jí)為32位提供虛擬8086工作方式(Virtual8086Mode)80486集成浮點(diǎn)處理單元支持浮點(diǎn)指令Pentium系列陸續(xù)增加若干整數(shù)指令、完善浮點(diǎn)指令增加一系列多媒體指令(SIMD指令)IA-32(IntelArchitecture-32)91.1.3Intel64處理器引入64位英特爾指令集結(jié)構(gòu)兼容32位指令系統(tǒng)新增64位工作方式繼續(xù)豐富多媒體指令處理器集成多核(Multi-core)技術(shù)處理器進(jìn)入64位多核時(shí)代Manycore101.2個(gè)人計(jì)算機(jī)系統(tǒng)硬件(Hardware):物理設(shè)備軟件(Software):程序和文檔運(yùn)算器

控制器寄存器組

主存儲(chǔ)器總線輸入輸出接口電路外部設(shè)備軟件微處理器微型計(jì)算機(jī)微型計(jì)算機(jī)系統(tǒng)111.2.1硬件組成I/O接口主存儲(chǔ)器系統(tǒng)總線CPU寄存器控制器運(yùn)算器輔助存儲(chǔ)器輸入設(shè)備輸出設(shè)備匯編語(yǔ)言程序員將硬件抽象為:寄存器、存儲(chǔ)器地址和輸入輸出地址121.2.2寄存器(Register)處理器內(nèi)部的高速存儲(chǔ)單元用于暫時(shí)存放程序執(zhí)行過(guò)程中的代碼和數(shù)據(jù)透明寄存器對(duì)應(yīng)用人員不可見、不能編程直接控制可編程(Programmable)寄存器具有引用名稱、供編程使用通用寄存器(General-PurposeRegister)具有多種用途數(shù)量較多、使用頻度較高專用寄存器各自只用于特定目的13IA-32常用寄存器8個(gè)32位通用寄存器6個(gè)16位段寄存器1個(gè)32位標(biāo)志寄存器1個(gè)32位指令指針141.通用寄存器處理器最常使用的整數(shù)通用寄存器可用于保存整數(shù)數(shù)據(jù)、地址等8個(gè)32位通用寄存器EAX,EBX,ECX,EDXESI,EDI,EBP,ESP8個(gè)16位通用寄存器AX,BX,CX,DXSI,DI,BP,SP8個(gè)8位通用寄存器AH,BH,CH,DHAL,BL,CL,DL31871615AHAL0AXEAX既是一個(gè)整體又可獨(dú)立使用15通用寄存器的名稱EAXAccumulator累加器EBXBase基址寄存器ECXCounter計(jì)數(shù)器EDXData數(shù)據(jù)寄存器ESISourceIndex源變址寄存器EDIDestinationIndex目的變址寄存器EBPBasePointer基址指針ESPStackPointer堆棧指針162.標(biāo)志寄存器標(biāo)志(Flag)反映指令執(zhí)行結(jié)果或控制指令執(zhí)行形式用一個(gè)或多個(gè)二進(jìn)制位表示一種標(biāo)志用0和1的不同組合表達(dá)標(biāo)志的不同狀態(tài)8086支持16位標(biāo)志寄存器FLAGSIA-32處理器形成32位EFLAGS標(biāo)志寄存器狀態(tài)標(biāo)志:記錄指令執(zhí)行結(jié)果的輔助信息控制標(biāo)志:方向標(biāo)志DF,僅用于串操作指令系統(tǒng)標(biāo)志:控制操作系統(tǒng)或核心管理程序的操作方式示意圖17標(biāo)志寄存器EFLAGS返回18處理器最基本的標(biāo)志:狀態(tài)標(biāo)志用來(lái)記錄指令執(zhí)行結(jié)果的輔助信息加減運(yùn)算和邏輯運(yùn)算指令主要設(shè)置它們其他有些指令的執(zhí)行也會(huì)相應(yīng)地設(shè)置它們處理器主要使用其中5個(gè)構(gòu)成各種條件,分支指令判斷這些條件實(shí)現(xiàn)程序分支8086的標(biāo)志OF111512DF10IF9TF8SF7ZF605AF403PF211CF0193.指令指針寄存器EIP保存將要執(zhí)行的指令在主存的存儲(chǔ)器地址EIP是專用寄存器順序執(zhí)行時(shí)自動(dòng)增量(加上該指令的字節(jié)數(shù)),指向下一條指令分支、調(diào)用等操作時(shí)執(zhí)行控制轉(zhuǎn)移指令修改,引起程序轉(zhuǎn)移到指定的指令執(zhí)行出現(xiàn)中斷或異常時(shí)被處理器賦值而相應(yīng)改變311615IP0EIP204.段寄存器段(Segment)是用于安排相關(guān)代碼或數(shù)據(jù)的一個(gè)主存區(qū)域段寄存器表明某個(gè)段在主存中的位置6個(gè)16位段寄存器:CSDSSSESFSGS應(yīng)用程序主要涉及3類段代碼段(CodeSegment) 存放程序中指令代碼數(shù)據(jù)段(DataSegment) 存放當(dāng)前運(yùn)行程序所用數(shù)據(jù)堆棧段(StackSegment) 指明程序使用的堆棧區(qū)域主存空間指令段數(shù)據(jù)段堆棧段程序211.2.3存儲(chǔ)器組織主存儲(chǔ)器容量很大,被劃分成許多存儲(chǔ)單元每個(gè)存儲(chǔ)單元被編排一個(gè)號(hào)碼即存儲(chǔ)單元地址稱為存儲(chǔ)器地址(MemoryAddress)每個(gè)存儲(chǔ)單元以字節(jié)為基本存儲(chǔ)單位即字節(jié)編址(ByteAddressable)一個(gè)字節(jié)(Byte)等于8個(gè)二進(jìn)制位(Bit)二進(jìn)制位是計(jì)算機(jī)存儲(chǔ)信息的最小單位16位(2個(gè)字節(jié))構(gòu)成一個(gè)字(Word)32位(4個(gè)字節(jié))構(gòu)成一個(gè)雙字(DoubleWord)示意圖22數(shù)據(jù)的位格式返回D7D6D5D4D3D2D1D0字節(jié)LSBMSBD15……D1D0字LSBMSBD31……D1D0雙字LSBMSB31871615高字節(jié)低字節(jié)0字雙字231.存儲(chǔ)模型物理存儲(chǔ)器以字節(jié)為基本存儲(chǔ)單位每個(gè)存儲(chǔ)單元被分配一個(gè)唯一的地址這個(gè)地址就是物理地址物理地址空間從0開始順序編排,直到處理器支持的最大存儲(chǔ)單元8086處理器支持1MB存儲(chǔ)器:00000H~FFFFFHIA-32處理器支持4GB存儲(chǔ)器:00000000H~FFFFFFFFH操作系統(tǒng)利用存儲(chǔ)管理單元進(jìn)行存儲(chǔ)管理,程序不直接尋址物理存儲(chǔ)器IA-32處理器提供3種存儲(chǔ)模型,用于程序訪問(wèn)存儲(chǔ)器示意圖24存儲(chǔ)器地址空間返回FFFFFFFFH00000000H00000001H00000002H00000003H00000004H雙字字節(jié)字字節(jié)字節(jié)字字節(jié)25IA-32處理器的存儲(chǔ)模型(1)平展存儲(chǔ)模型(FlatMemoryModel)存儲(chǔ)器是一個(gè)連續(xù)的地址空間:線性地址空間IA-32處理器支持4GB容量線性地址空間(2)段式存儲(chǔ)模型(SegmentedMemoryModel)存儲(chǔ)器由一組獨(dú)立的地址空間:段(Segment)每個(gè)段都可以達(dá)到4GB容量在處理器內(nèi)部,所有的段都被映射到線性地址空間(3)實(shí)地址存儲(chǔ)模型(Real-addressMemoryModel)8086處理器的存儲(chǔ)模型段式存儲(chǔ)模型的特例線性地址空間最大為1MB容量,段最大為64KB262.工作方式(1)保護(hù)方式(ProtectedMode)IA-32處理器固有的工作狀態(tài)具有強(qiáng)大的段頁(yè)式存儲(chǔ)管理和特權(quán)與保護(hù)能力使用全部32條地址總線,可尋址4GB物理存儲(chǔ)器使用平展或段式存儲(chǔ)模型利用虛擬8086方式支持實(shí)地址8086軟件(2)實(shí)地址方式(Real-addressMode)可以進(jìn)行32位處理的快速8086只能尋址1MB物理存儲(chǔ)器空間,每個(gè)段不超過(guò)64KB可以使用32位寄存器、32位操作數(shù)和32位尋址方式只能支持實(shí)地址存儲(chǔ)模型(3)系統(tǒng)管理方式(SystemManagementMode)實(shí)現(xiàn)供節(jié)能和系統(tǒng)安全管理273.邏輯地址(LogicalAddress)在處理器內(nèi)部、程序員編程時(shí)采用的地址邏輯地址=段基地址∶偏移地址段基地址=在主存中的起始地址偏移地址=距離段基地址的位移量某個(gè)存儲(chǔ)單元可以有多個(gè)邏輯地址,但只有一個(gè)唯一的物理地址邏輯地址線性地址物理地址編程使用處理器轉(zhuǎn)換地址總線輸出示意圖28邏輯地址與物理地址返回108208308106206306107207307109209309110105104103102101210205204203202201310305304303302301081828061626071727091929100504030201201514131211302524232221邏輯地址=相對(duì)地址:205(2層05號(hào)房間)物理地址=絕對(duì)地址:15(第15號(hào)房間)29基本段的邏輯地址代碼段(CodeSegment)段基地址:代碼段寄存器CS指示偏移地址:指令指針寄存器EIP保存數(shù)據(jù)段(DataSegment)段基地址:數(shù)據(jù)段寄存器DS指示有時(shí)也用附加段寄存器ES,段寄存器FS和GS指示偏移地址:各種存儲(chǔ)器尋址方式計(jì)算出來(lái)堆棧段(StackSegment)段基地址:堆棧段寄存器SS指示偏移地址:堆棧指針寄存器ESP保存主存空間指令段數(shù)據(jù)段堆棧段程序304.段選擇器16位段寄存器保存16位段選擇器段選擇器指向64位段描述符(Descriptor)段描述符包括段基地址平展存儲(chǔ)模型:指向地址0位置段式存儲(chǔ)模型:指向線性地址空間不同的段實(shí)地址存儲(chǔ)模型:保存段基地址的高16位段選擇器段基地址數(shù)據(jù)或指令段寄存器段描述符主存空間315.Win32的虛擬地址分配應(yīng)用程序起始地址321.2.4程序設(shè)計(jì)語(yǔ)言機(jī)器語(yǔ)言(MachineLanguage)底層的計(jì)算機(jī)語(yǔ)言,對(duì)應(yīng)機(jī)器指令形成目標(biāo)(代碼)程序匯編語(yǔ)言(AssemblyLanguage)將機(jī)器指令用助記符號(hào)代替而形成的一種語(yǔ)言本質(zhì)上是機(jī)器語(yǔ)言需要匯編程序“匯編”(翻譯)高級(jí)語(yǔ)言(HighLevelLanguage)面向問(wèn)題的程序設(shè)計(jì)語(yǔ)言需要“編譯”或“解釋”后執(zhí)行指令是處理器的母語(yǔ)moveax,100addeax,25633Instructions:LanguageoftheMachine

Tocommandacomputer'shardware,youmustspeakitslanguage.Thewordsofamachine'slanguagearecalledinstructions,anditsvocabularyiscalledaninstructionset.

為了控制計(jì)算機(jī)硬件,必須使用它的語(yǔ)言。機(jī)器語(yǔ)言的單詞稱為指令,它的詞匯表稱為指令集。“ComputerOrganization&Design --TheHardware/SoftwareInterface(2ndEdition)”byJohnL.HennessyandDavidA.PattersonMorganKaufmannPublishers,Inc.1998返回34匯編語(yǔ)言和高級(jí)語(yǔ)言的比較匯編語(yǔ)言與處理器密切相關(guān),可移植性較差高級(jí)語(yǔ)言與具體計(jì)算機(jī)無(wú)關(guān),便于移植匯編語(yǔ)言功能有限、涉及硬件細(xì)節(jié),編寫繁瑣困難高級(jí)語(yǔ)言功能強(qiáng)大,語(yǔ)法自然,容易掌握和應(yīng)用匯編語(yǔ)言的優(yōu)勢(shì):直接、有效地控制硬件,容易產(chǎn)生運(yùn)行速度快、指令序列短小的高效率目標(biāo)程序高級(jí)語(yǔ)言不易直接控制計(jì)算機(jī)的各種操作,編譯程序產(chǎn)生的目標(biāo)程序往往比較龐大混合編程、取長(zhǎng)補(bǔ)短?學(xué)習(xí)匯編語(yǔ)言的意義35匯編語(yǔ)言的主要應(yīng)用場(chǎng)合程序要具有較快的執(zhí)行時(shí)間,或者只能占用較小的存儲(chǔ)容量程序與計(jì)算機(jī)硬件密切相關(guān),程序要直接、有效地控制硬件大型軟件需要提高性能、優(yōu)化處理的部分沒有合適的高級(jí)語(yǔ)言、或只能采用匯編語(yǔ)言的時(shí)候分析具體系統(tǒng)尤其是該系統(tǒng)的低層軟件、加密解密軟件、分析和防治計(jì)算機(jī)病毒等等361.2.5軟件系統(tǒng)Windows操作系統(tǒng)平臺(tái)MASM6.15(及NASM2.16)匯編程序硬件BIOS應(yīng)用程序*.ASM,*.OBJ*.LST,*.EXE操作系統(tǒng)編輯程序,匯編程序連接程序,調(diào)試程序371.操作系統(tǒng)(OperatingSystem)操作系統(tǒng)管理著系統(tǒng)的軟硬件資源為用戶提供使用機(jī)器的交互界面為程序員使用資源提供可供調(diào)用的驅(qū)動(dòng)程序?yàn)槠渌绦驑?gòu)建穩(wěn)定的運(yùn)行平臺(tái)32位控制臺(tái)環(huán)境%SystemRoot%\system32\cmd.exe16位模擬DOS環(huán)境%SystemRoot%\system32\32位控制臺(tái)環(huán)境和16位模擬DOS環(huán)境兩種基本功能和界面一致,但本質(zhì)不同382.匯編程序(Assembler)將匯編語(yǔ)言源程序轉(zhuǎn)換為機(jī)器代碼微軟宏匯編程序MASMMASM6.11是最后一個(gè)獨(dú)立發(fā)行的MASM軟件包MASM6.15來(lái)自VisualC++6.0,支持到Pentium4的SSE2指令系統(tǒng)VisualC++.NET2005提供支持SSE3指令的MASM8.0支持64位指令的ML64.EXE程序匯編語(yǔ)言程序與匯編程序是兩個(gè)不同的概念393.文件路徑目錄(Directory):管理磁盤上文件的文件夾路徑(Path):分區(qū):\根目錄\子目錄\文件名絕對(duì)路徑:文件的完整路徑d:\masm\progs\eg0101.asm相對(duì)路徑:相對(duì)當(dāng)前目錄的路徑progs\eg0101.asm..\bin\ml.exe轉(zhuǎn)換分區(qū)d:進(jìn)入當(dāng)前目錄(CurrentDirectory)cd\masm404.內(nèi)部命令和外部命令內(nèi)部命令:32位控制臺(tái)或DOS環(huán)境本身具有的、直接支持的命令,即駐留主存的命令使用方法:命令關(guān)鍵字參數(shù)選項(xiàng)外部命令:與其他可執(zhí)行文件一樣,以文件形式保存在磁盤上的命令執(zhí)行方法:路徑\文件名參數(shù)路徑搜索順序先當(dāng)前目錄后搜索路徑內(nèi)部命令PATH查看和設(shè)置當(dāng)前的搜索路徑你所執(zhí)行的命令不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件?415.進(jìn)入MASM目錄的批處理文件為便于進(jìn)入MASM目錄,可創(chuàng)建批處理文件32位Windows控制臺(tái):WIN32.BAT

16位DOS環(huán)境:DOS16.BAT為便于訪問(wèn)其中文件,增加搜索路徑:@setPATH=D:\MASM;D:\MASM\BIN;%PATH%在Windows資源管理器打開文件夾“D:\MASM”,雙擊該批處理文件,就可以進(jìn)入MASM環(huán)境42具有搜索路徑的批處理文件返回@echooff@setPATH=D:\MASM;D:\MASM\BIN;%PATH%%SystemRoot%\system32\cmd.exe@echoonWIN32.BAT@echooff@setPATH=D:\MASM;D:\MASM\BIN;%PATH%%SystemRoot%\system32\@echoonDOS16.BAT431.3匯編語(yǔ)言程序格式程序用程序設(shè)計(jì)語(yǔ)言編寫,由指令構(gòu)成指令由操作碼和操作數(shù)(地址碼)組成操作碼(Opcode)表明處理器執(zhí)行的操作例如數(shù)據(jù)傳送、加法運(yùn)算、跳轉(zhuǎn)等操作。操作數(shù)(Operand)是參與操作的數(shù)據(jù)對(duì)象主要以寄存器名或地址形式指明數(shù)據(jù)的來(lái)源通常的指令都有一個(gè)或兩個(gè)操作數(shù)有些指令無(wú)操作數(shù),個(gè)別指令有3或4個(gè)操作數(shù)多數(shù)操作數(shù)需要顯式指明,有些操作數(shù)隱含使用441.3.1指令的代碼格式(InstructionFormat)IA-32處理器采用可變長(zhǎng)度指令格式操作碼可選的指令前綴(用于擴(kuò)展指令功能)1~3字節(jié)的主要操作碼操作數(shù)可選的尋址方式域(包括ModR/M和SIB字段)可選的位移量可選的立即數(shù)45使用最多、最基本的數(shù)據(jù)傳送指令傳送指令的助記符:MOV(取自Move)將數(shù)據(jù)從一個(gè)位置傳送到另一個(gè)位置類似高級(jí)語(yǔ)言的賦值語(yǔ)句

mov

dest,src;源操作數(shù)src:被傳送的數(shù)據(jù)或數(shù)據(jù)所在的位置;目的操作數(shù)dest:數(shù)據(jù)將要傳送到的位置mov

eax,ebx ;機(jī)器代碼:8BC3mov

eax,[ebx] ;機(jī)器代碼:8B03mov

eax,[ebx+esi*4+80h] ;機(jī)器代碼:8B84B3800000

00功能演示46傳送指令MOV的功能演示返回源操作數(shù)src目的操作數(shù)dest30H30H被傳送的數(shù)據(jù)471.3.2語(yǔ)句格式源程序由語(yǔ)句組成一個(gè)語(yǔ)句常占一行(MASM有續(xù)行符“\”)一個(gè)語(yǔ)句不超過(guò)132個(gè)字符,4個(gè)部分執(zhí)行性語(yǔ)句:表達(dá)處理器指令(硬指令)標(biāo)號(hào):硬指令助記符

操作數(shù),操作數(shù) ;注釋說(shuō)明性語(yǔ)句:表達(dá)偽指令,控制匯編方式名字

偽指令助記符

參數(shù),參數(shù),……;注釋這是MASM語(yǔ)法,但具有一般性481.標(biāo)號(hào)與名字標(biāo)號(hào):執(zhí)行性語(yǔ)句中冒號(hào)分隔表示處理器指令在主存中的邏輯地址指示分支、循環(huán)等程序的目的地址名字:說(shuō)明性語(yǔ)句中空格或制表符分隔變量名、段名、子程序名等反映變量、段和子程序等的邏輯地址標(biāo)號(hào)和名字是用戶自定義的標(biāo)識(shí)符49標(biāo)識(shí)符(Identifier)最多由31個(gè)字母、數(shù)字及規(guī)定的特殊符號(hào)(如_、$、?、@)組成,不能以數(shù)字開頭一個(gè)源程序中,用戶定義的每個(gè)標(biāo)識(shí)符必須唯一不能是匯編程序采用的保留字保留字(ReservedWord)是編程語(yǔ)言本身需要使用的各種具有特定含義的標(biāo)識(shí)符、也稱為關(guān)鍵字硬指令助記符:MOV偽指令助記符:BYTE操作符:OFFSET寄存器名:EAX取名原則類似高級(jí)語(yǔ)言MASM默認(rèn)不區(qū)別大小寫字母502.助記符助記符是幫助記憶指令功能的符號(hào)硬指令助記符表示處理器指令偽指令助記符表達(dá)一個(gè)匯編命令處理器指令示例:傳送指令MOV偽指令示例:字節(jié)變量定義助記符:

DB(或BYTE)功能:在主存中占用若干的存儲(chǔ)空間,用于保存變量值,該變量以字節(jié)為單位存取msg

db

'Hello,Assembly!',13,10,0513.操作數(shù)和參數(shù)處理器指令的操作數(shù):表示參與操作的對(duì)象具體的常量保存在寄存器的數(shù)據(jù)保存在存儲(chǔ)器中的變量逗號(hào)前常是目的操作數(shù),逗號(hào)后常是源操作數(shù)偽指令的參數(shù):常量、變量名、表達(dá)式等可以有多個(gè),參數(shù)之間用逗號(hào)分隔msgdb

'Hello,Assembly!',13,10,0mov

eax,offset

msg524.注釋和分隔符語(yǔ)句中分號(hào)后的內(nèi)容是注釋對(duì)指令或程序進(jìn)行說(shuō)明匯編程序不對(duì)它們做任何處理注釋利于閱讀,應(yīng)養(yǎng)成書寫注釋的好習(xí)慣語(yǔ)句的4個(gè)組成部分要用分隔符分開標(biāo)號(hào)后的冒號(hào)注釋前的分號(hào)操作數(shù)間和參數(shù)間的逗號(hào)分隔其他部分采用一個(gè)或多個(gè)空格或制表符注釋使用英文或中文均可分隔符都是英文標(biāo)點(diǎn)良好的語(yǔ)句格式有利于編程531.3.3源程序框架;eg0000.asminWindowsConsole includeio32.inc ;包含32位輸入輸出文件

.data ;定義數(shù)據(jù)段

…… ;數(shù)據(jù)定義(數(shù)據(jù)待填)

.code ;定義代碼段start: ;程序執(zhí)行起始位置

…… ;主程序(指令待填)

exit0 ;程序正常執(zhí)行結(jié)束

…… ;子程序(指令待填)

endstart ;匯編結(jié)束541.包含偽指令I(lǐng)NCLUDE將常用的常量定義、過(guò)程說(shuō)明、共享的子程序庫(kù)等內(nèi)容進(jìn)行聲明(相當(dāng)于C和C++語(yǔ)言中,包含頭文件的作用)IO32.INC是配合本書的包含文件前3個(gè)語(yǔ)句:.686 ;32位指令.modelflat,stdcall ;選擇平展模型,標(biāo)準(zhǔn)調(diào)用規(guī)范

optioncasemap:none ;告知MASM區(qū)分用戶定義標(biāo)識(shí)符的大小寫552.段的簡(jiǎn)化定義數(shù)據(jù)段定義偽指令.DATA創(chuàng)建一個(gè)數(shù)據(jù)段定義可讀可寫的變量等代碼段定義偽指令.CODE創(chuàng)建一個(gè)代碼段保存需要執(zhí)行的可執(zhí)行性語(yǔ)句堆棧段定義偽指令.STACK創(chuàng)建一個(gè)堆棧段堆棧段由Windows維護(hù),用戶可不必設(shè)置主存空間指令段數(shù)據(jù)段堆棧段程序563.程序的開始和結(jié)束程序開始執(zhí)行的位置應(yīng)用一個(gè)標(biāo)號(hào)(例如:START)匯編結(jié)束END指令的參數(shù)應(yīng)用程序執(zhí)行結(jié)束語(yǔ)句“EXIT0”將控制權(quán)交還操作系統(tǒng)提供給操作系統(tǒng)一個(gè)返回代碼通常用0表示執(zhí)行正確源程序匯編結(jié)束END語(yǔ)句執(zhí)行結(jié)束

≠匯編結(jié)束moveax,0ret57〔例1-1〕信息顯示程序(使用輸入輸出子程序)在數(shù)據(jù)段給出這個(gè)字符串形式的信息:

;數(shù)據(jù)段msg db'Hello,Assembly!',13,10,0 ;定義要顯示的字符串在代碼段編寫顯示字符串的程序:

;代碼段

mov

eax,offset

msg ;指定字符串的偏移地址

calldispmsg ;調(diào)用I/O子程序顯示信息完整程序58匯編語(yǔ)言源程序EG0101.ASM;eg0101.asm

includeio32.inc

.data ;數(shù)據(jù)段msg db'Hello,Assembly!',13,10,0

.code ;代碼段start: ;程序執(zhí)行起始位置

mov

eax,offset

msg calldispmsg

exit0 ;程序正常執(zhí)行結(jié)束

endstart ;匯編結(jié)束返回Hello,Assembly!運(yùn)行結(jié)果對(duì)比59信息顯示的C語(yǔ)言源程序#include<stdio.h>intmain(){

printf("Hello,world!\n"); exit(0);}返回Hello,world!運(yùn)行結(jié)果604.輸入輸出子程序庫(kù)匯編程序通常不提供任何函數(shù)或程序庫(kù)必須利用操作系統(tǒng)的編程資源本書配套鍵盤輸入和顯示器輸出的I/O子程序含IO32.INC和IO32.LIB,需要包含文件聲明源程序文件開始使用包含命令聲明INCLUDEIO32.INC子程序調(diào)用方法MOVEAX,入口參數(shù)CALL子程序名子程序名DISPMSG入口參數(shù)EAX=字符串地址功能說(shuō)明顯示字符串(以0結(jié)尾)輸入子程序輸出子程序61常用輸出子程序返回子程序名功能說(shuō)明DISPMSG顯示字符串(以0結(jié)尾)DISPC顯示一個(gè)字符DISPCRLF光標(biāo)回車換行,到下一行首個(gè)位置DISPRD顯示8個(gè)32位通用寄存器內(nèi)容DISPRF顯示6個(gè)狀態(tài)標(biāo)志的狀態(tài)DISPHD以十六進(jìn)制形式顯示8位數(shù)據(jù)DISPUID顯示無(wú)符號(hào)十進(jìn)制整數(shù)DISPSID顯示有符號(hào)十進(jìn)制整數(shù)62常用輸入子程序返回子程序名功能說(shuō)明READMSG輸入一個(gè)字符串(回車結(jié)束)READC輸入一個(gè)字符(回顯)READHD輸入8位十六進(jìn)制數(shù)據(jù)READUID輸入無(wú)符號(hào)十進(jìn)制整數(shù)(≤232-1)READSID輸入有符號(hào)十進(jìn)制整數(shù)(-231~231-1)635.C語(yǔ)言標(biāo)準(zhǔn)函數(shù)開發(fā)時(shí)需要使用導(dǎo)入庫(kù)MSVCRT.LIB,MASM需要聲明 externprintf:near,scanf:near匯編語(yǔ)言調(diào)用C語(yǔ)言函數(shù)的方法 push參數(shù)1 ;壓入?yún)?shù)1 push參數(shù)2 ;壓入?yún)?shù)2 … call函數(shù)名 ;調(diào)用C語(yǔ)言函數(shù),返回值在EAX寄存器 addesp,4*參數(shù)個(gè)數(shù) ;調(diào)整堆??臻g、保持堆棧平衡格式化輸出intprintf(constchar*,…);格式化輸入intscanf(char*,…);64〔例1-2〕信息顯示程序(調(diào)用C語(yǔ)言函數(shù));eg0102.asm

includeio32.inc externprintf:near

.data ;數(shù)據(jù)段msg db'Hello,Assembly!',13,10,0

.code ;代碼段start: ;程序執(zhí)行起始位置

push

offset

msg callprintf addesp,4

exit0 ;程序正常執(zhí)行結(jié)束

endstart ;匯編結(jié)束Hello,Assembly!運(yùn)行結(jié)果651.3.4開發(fā)過(guò)程661.開發(fā)軟件抽取MASM6.11和VisualC++6.0集成開發(fā)環(huán)境中有關(guān)文件構(gòu)造基本開發(fā)軟件包MASM主目錄:I/O庫(kù)、包含文件及批處理文件BIN子目錄:進(jìn)行匯編、連接及配套程序文件默認(rèn)安裝到D分區(qū)的MASM目錄快速開發(fā)方法

①進(jìn)入MASM目錄雙擊批處理文件WIN32.BAT

②生成可執(zhí)行文件MAKE32eg0101快速開發(fā)過(guò)程67快速開發(fā)過(guò)程返回感性認(rèn)識(shí)因直觀而印象深刻682.源程序的編輯源程序文件是無(wú)格式文件、純文本類型以ASM為擴(kuò)展名,可使用任何文本編輯器Windows的記事本Notepad其他程序開發(fā)工具中的編輯環(huán)境專注于源程序編寫的編輯軟件本書配套開發(fā)軟件MASM主目錄提供Notepad2.exe程序本書源程序文件的命名規(guī)則EG=例題,EX=習(xí)題

前2位數(shù)字=章號(hào),后2位數(shù)字=序號(hào)693.源程序的匯編生成目標(biāo)模塊文件(.OBJ)MASM6.x的匯編程序是ML.EXE

BIN\ML/c/coffeg0101.asm參數(shù)“/c”(小寫字母)實(shí)現(xiàn)源程序的匯編參數(shù)“/coff”(小寫字母)表示生成COFF格式的目標(biāo)模塊文件溫馨提示:將源文件放在MASM目錄溫馨提示:ML.EXE的參數(shù)區(qū)別大小寫704.目標(biāo)文件的連接把一個(gè)或多個(gè)目標(biāo)文件和庫(kù)文件合成一個(gè)可執(zhí)行文件(.EXE)32位連接程序被更名為L(zhǎng)INK32.EXE

BIN\LINK32/subsystem:consoleeg0101.obj/libpath:bin“/libpath:bin”指明導(dǎo)入庫(kù)文件的路徑“/subsystem:console”生成Windows控制臺(tái)環(huán)境的可執(zhí)行文件“/subsystem:windows”生成Windows圖形窗口的可執(zhí)行文件溫馨提示:使用批處理文件方便操作溫馨提示:匯編程序只指出語(yǔ)法錯(cuò)誤715.可執(zhí)行文件的運(yùn)行進(jìn)入控制臺(tái)(或模擬DOS)環(huán)境在命令行提示符下輸入文件名(可以省略擴(kuò)展名)、按下回車鍵運(yùn)行

eg0101.exe運(yùn)行錯(cuò)誤,就需要靜態(tài)排錯(cuò):閱讀分析源程序動(dòng)態(tài)排錯(cuò):利用調(diào)試程序溫馨提示:不要在Windows下雙擊運(yùn)行726.列表文件列表文件(.LST)含有源程序和目標(biāo)代碼

ML/c/coff/Fleg0101.asm“/Fl”創(chuàng)建列表文件(大寫F、小寫l,不是數(shù)字1)列表文件有兩部分內(nèi)容第一部分:源程序及其代碼第二部分:各種標(biāo)識(shí)符錯(cuò)誤Error:比較嚴(yán)重的語(yǔ)法錯(cuò)誤警告Warning:不太關(guān)鍵的語(yǔ)法錯(cuò)誤737.調(diào)試程序WinDbg是微軟提供的Windows調(diào)試程序WinDbg支持源程序級(jí)調(diào)試,但要在匯編、連接過(guò)程中加入?yún)?shù)匯編時(shí)用“/Zi”(大寫Z、小寫i)參數(shù)

ML/c/coff/Fl/Zieg0101.asm連接時(shí)用“/debug”參數(shù) LINK32/subsystem:console/debugeg0101.obj源程序可執(zhí)行文件目標(biāo)模塊文本編輯器匯編程序連接程序調(diào)試程序第1章習(xí)題:匯編語(yǔ)言基礎(chǔ)1.1簡(jiǎn)答題(1、3、6、7、8)1.2

判斷題(1、6、7、8、9)1.3

填空題(3、4、5、7、10)1.9、1.13、1.15、1.16第2章數(shù)據(jù)表示和尋址2.1數(shù)據(jù)表示2.2常量表達(dá)2.3變量應(yīng)用2.4數(shù)據(jù)尋址方式第2章數(shù)據(jù)表示和尋址理解計(jì)算機(jī)的數(shù)據(jù)表達(dá)熟悉匯編語(yǔ)言的常量表達(dá)掌握匯編語(yǔ)言的變量定義和屬性掌握處理器指令的數(shù)據(jù)尋址方式772.1數(shù)據(jù)表示數(shù)據(jù)(Data):計(jì)算機(jī)處理的對(duì)象對(duì)應(yīng)指令操作的對(duì)象:操作數(shù)(Oprand)計(jì)算機(jī)中的數(shù)據(jù)要用二進(jìn)制的0和1組合表示進(jìn)入計(jì)算機(jī)的任何信息都要轉(zhuǎn)換成0和1數(shù)碼IA-32整數(shù)指令支持的基本數(shù)據(jù)類型8、16、32、64位無(wú)符號(hào)整數(shù)8、16、32、64位有符號(hào)整數(shù)ASCII字符、字符串和BCD碼782.1.1數(shù)制人習(xí)慣使用十進(jìn)制計(jì)數(shù)計(jì)算機(jī)使用二進(jìn)制進(jìn)行數(shù)據(jù)處理十六進(jìn)制數(shù)便于表達(dá)二進(jìn)制數(shù)二進(jìn)制數(shù)用后綴字母B十六進(jìn)制數(shù)用后綴字母H791.二進(jìn)制便于計(jì)算機(jī)存儲(chǔ)及物理實(shí)現(xiàn)特點(diǎn):逢二進(jìn)一,由0和1兩個(gè)數(shù)碼組成,基數(shù)為2,各個(gè)位權(quán)以2k表示二進(jìn)制數(shù):

anan-1…a1a0.b1b2…bm= an×2n+an-1×2n-1+…+a1×21+a0×20

+b1×2-1+b2×2-2+…+bm×2-m 其中ai,bj非0即1二進(jìn)制數(shù)的算術(shù)運(yùn)算:逢2進(jìn)1、借1當(dāng)2示意圖二進(jìn)制數(shù)的算術(shù)運(yùn)算返回2.邏輯運(yùn)算事件的假和真可用數(shù)碼0和1表示事件之間的關(guān)系可以利用二進(jìn)制表達(dá)數(shù)字電路的低高電平用數(shù)碼0和1表示數(shù)字信號(hào)之間的關(guān)系可以利用二進(jìn)制描述數(shù)碼0和1僅僅代表兩種狀態(tài)它們的運(yùn)算是邏輯運(yùn)算邏輯與AND: 1101

0011=0001邏輯或OR: 1101

0011=1111邏輯非NOT:

1101=0010邏輯異或XOR: 1101

0011=11103.十六進(jìn)制用于表達(dá)二進(jìn)制數(shù),相互轉(zhuǎn)換簡(jiǎn)單基數(shù)16,逢16進(jìn)位,位權(quán)為16k16個(gè)數(shù)碼:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(xiàn)十六進(jìn)制數(shù):

anan-1…a1a0.b1b2…bm= an×16n+an-1×16n-1+…+a1×161+a0×160 +b1×16-1+b2×16-2+…+bm×16-m 其中ai,bj是0~F中的一個(gè)數(shù)碼十六進(jìn)制數(shù)的加減:逢16進(jìn)位1,借1當(dāng)16減法加法十六進(jìn)制數(shù)的加法運(yùn)算

23D9+94BEB8979+14=23=16(carry)+713+11+1(carry)=25=16(carry)+93+4+1(carry)=82+9=11=B返回十六進(jìn)制數(shù)的減法運(yùn)算

A59F-62B842E715-8=716(borrow)+9-11=14=E5-2-1(borrow)=210-6=4返回854.數(shù)制之間的轉(zhuǎn)換十進(jìn)制二進(jìn)制十六進(jìn)制BCD碼常用二進(jìn)制位權(quán)00000002-3=0.12510001112-2=0.2520010222-1=0.5300113320=1401004421=2501015522=4601106623=8701117724=16810008825=32910019926=64101010A27=128111011B28=256121100C29=512131101D210=1024141110E215=32768151111F216=6553686二進(jìn)制數(shù)或十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)方法:按權(quán)展開二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)

0011.1010B =1×21+1×20+1×2-1+0×2-2+1×2-3 =3.625十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)

1.2H

=1×160+2×16-1

=1.12587十進(jìn)制整數(shù)轉(zhuǎn)換為二或十六進(jìn)制數(shù)整數(shù)部分轉(zhuǎn)換:用除法十進(jìn)制數(shù)整數(shù)部分不斷除以基數(shù)2或16,并記下余數(shù),直到商為0為止由最后一個(gè)余數(shù)起逆向取各個(gè)余數(shù),則為轉(zhuǎn)換成的二進(jìn)制和十六進(jìn)制數(shù)

126=01111110B 126=7EH示意圖88十進(jìn)制整數(shù)的轉(zhuǎn)換返回89十進(jìn)制小數(shù)轉(zhuǎn)換為二或十六進(jìn)制數(shù)小數(shù)部分轉(zhuǎn)換:用乘法分別乘以各自的基數(shù),記錄整數(shù)部分,直到小數(shù)部分為0為止

0.8125=0.1101B 0.8125=0.DH小數(shù)轉(zhuǎn)換會(huì)發(fā)生總是無(wú)法乘到為0的情況可選取一定位數(shù)(精度)將產(chǎn)生無(wú)法避免的轉(zhuǎn)換誤差示意圖90十進(jìn)制小數(shù)的轉(zhuǎn)換返回91二進(jìn)制和十六進(jìn)制數(shù)的相互轉(zhuǎn)換二進(jìn)制和十六進(jìn)制數(shù)之間具有對(duì)應(yīng)關(guān)系以小數(shù)點(diǎn)為基準(zhǔn)整數(shù)從左向右,小數(shù)從右向左每4個(gè)二進(jìn)制位對(duì)應(yīng)一個(gè)十六進(jìn)制位

00111010B=3AH F2H=11110010B922.1.2數(shù)值的編碼編碼:用文字、符號(hào)或者數(shù)碼來(lái)表示某種信息(數(shù)值、語(yǔ)言、操作指令、狀態(tài)等)的過(guò)程二進(jìn)制編碼:組合0和1數(shù)碼機(jī)器數(shù):計(jì)算機(jī)用0和1數(shù)碼組合表達(dá)的數(shù)值真值:現(xiàn)實(shí)中真實(shí)的數(shù)值數(shù)值的兩種編碼方式定點(diǎn)格式(第2章)浮點(diǎn)格式(第9章)931.定點(diǎn)整數(shù)定點(diǎn)格式:固定小數(shù)點(diǎn)的位置表達(dá)數(shù)值定點(diǎn)整數(shù):小數(shù)點(diǎn)固定在機(jī)器數(shù)的最右側(cè)定點(diǎn)小數(shù):小數(shù)點(diǎn)固定在機(jī)器數(shù)的最左側(cè)無(wú)符號(hào)整數(shù)(無(wú)符號(hào)數(shù))只表達(dá)0和正整數(shù)的定點(diǎn)整數(shù)N位無(wú)符號(hào)整數(shù)表達(dá)范圍:0~2N-1有符號(hào)整數(shù)(有符號(hào)數(shù)、帶符號(hào)數(shù))表達(dá)負(fù)整數(shù)、0和正整數(shù)的定點(diǎn)整數(shù)最高位表達(dá)數(shù)值正負(fù)符號(hào)位用0表示正數(shù)、1表示負(fù)數(shù)示意圖94定點(diǎn)整數(shù)格式返回952.補(bǔ)碼有符號(hào)整數(shù)在計(jì)算機(jī)中默認(rèn)采用補(bǔ)碼最高位表示符號(hào):正數(shù)用0,負(fù)數(shù)用1正數(shù)補(bǔ)碼:直接表示數(shù)值大?。ㄍ瑹o(wú)符號(hào)數(shù))負(fù)數(shù)補(bǔ)碼:將對(duì)應(yīng)正數(shù)補(bǔ)碼取反加1 [105]補(bǔ)碼=01101001B [-105]補(bǔ)碼=[01101001B]取反+1 =10010110B+1=10010111B8位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-128~+12716位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-215~+215-132位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-231~+231-1N位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-2N-1~+2N-1-196負(fù)數(shù)求補(bǔ)負(fù)數(shù)真值“取反加1”得機(jī)器數(shù)補(bǔ)碼負(fù)數(shù)補(bǔ)碼“取反加1”得到負(fù)數(shù)真值補(bǔ)碼:11100000B真值:-([11100000]求反+1)=-(00011111+1)=-00100000=-25=-32負(fù)數(shù)求補(bǔ)運(yùn)算,等效于用帶借位的0作減法真值:-8,補(bǔ)碼:[-8]補(bǔ)碼=00H-08H=F8H補(bǔ)碼:11111000,真值:-(00H-F8H)=-08H=-8+8= 00001000 11110111+ 1-8= 11111000

0= 00000000-(8= 00001000)-8= 11111000973.補(bǔ)碼運(yùn)算利用無(wú)符號(hào)數(shù)加法結(jié)合補(bǔ)碼表達(dá),實(shí)現(xiàn)無(wú)符號(hào)數(shù)加法無(wú)符號(hào)數(shù)減法有符號(hào)數(shù)加法有符號(hào)數(shù)減法無(wú)符號(hào)數(shù)加減運(yùn)算,需要利用進(jìn)位或借位有符號(hào)數(shù)加減運(yùn)算,注意避免出現(xiàn)溢出[X]補(bǔ)碼+[Y]補(bǔ)碼=[X+Y]補(bǔ)碼[X]補(bǔ)碼-[Y]補(bǔ)碼=[X]補(bǔ)碼+[-Y]補(bǔ)碼=[X-Y]補(bǔ)碼984.原碼和反碼正數(shù)的原碼、反碼和無(wú)符號(hào)數(shù)一樣求負(fù)數(shù)的原碼、反碼和補(bǔ)碼首先計(jì)算其對(duì)應(yīng)正數(shù)的編碼然后取反符號(hào)位(設(shè)置為1)成為原碼再取反其他位得到反碼最后加1就是補(bǔ)碼真值:32,機(jī)器數(shù):00100000B=20H真值:-32,機(jī)器數(shù):

[-32]原碼=10100000B=A0H [-32]反碼=11011111B=DFH [20H]補(bǔ)碼=11100000B=E0H992.1.3

字符的編碼在計(jì)算機(jī)中,各種字符需要用若干位的二進(jìn)制碼的組合表示,即字符的二進(jìn)制編碼由于字節(jié)為計(jì)算機(jī)的基本存儲(chǔ)單位,所以常以8個(gè)二進(jìn)制位為單位表達(dá)字符0123456789English漢字1001.BCD(二進(jìn)制表達(dá)的十進(jìn)制)二進(jìn)制編碼的十進(jìn)制數(shù)一個(gè)十進(jìn)制數(shù)位用4位二進(jìn)制編碼來(lái)表示8421BCD碼:低10個(gè)4位二進(jìn)制編碼表示0~9壓縮BCD碼:一個(gè)字節(jié)表達(dá)兩位BCD碼非壓縮BCD碼:一個(gè)字節(jié)表達(dá)一位BCD碼(低4位表達(dá)數(shù)值,高4位常設(shè)置為0)BCD碼很直觀BCD碼:0100100101111000.000101001001十進(jìn)制真值: 4978.149BCD碼便于輸入輸出,表達(dá)數(shù)值準(zhǔn)確1012.ASCII(美國(guó)標(biāo)準(zhǔn)信息交換碼)標(biāo)準(zhǔn)ASCII碼用7位二進(jìn)制編碼,有128個(gè)不可顯示的控制字符:前32個(gè)和最后一個(gè)回車CR:0DH

換行LF:0AH

響鈴BEL:07H可顯示和打印的字符:20H及以后的95個(gè)編碼數(shù)碼0~9:30H~39H大寫字母A~Z:41H~5AH小寫字母a~z:61H~7AH空格:20H擴(kuò)展ASCII碼:最高D7位為1,表達(dá)制表符號(hào)1023.Unicode(統(tǒng)一碼)8位ASCII碼表達(dá)英文字符16位國(guó)標(biāo)碼表達(dá)漢字字符漢字機(jī)內(nèi)碼:國(guó)標(biāo)碼在計(jì)算機(jī)中使用的編碼國(guó)際信息交換碼Unicode16位編碼對(duì)世界上所有語(yǔ)言的大多數(shù)字符進(jìn)行編碼提供擴(kuò)展能力Unicode兼容ASCIIUnicode給每個(gè)字符提供了一個(gè)唯一的數(shù)字,不論是什么平臺(tái),不論是什么程序,不論是什么語(yǔ)言103什么是統(tǒng)一碼?WhatisUnicode?Unicodeprovidesauniquenumberforeverycharacter,

nomatterwhattheplatform,

nomatterwhattheprogram,

nomatterwhatthelanguage.Unicode給每個(gè)字符提供了一個(gè)唯一的數(shù)字, 不論是什么平臺(tái), 不論是什么程序, 不論是什么語(yǔ)言返回1042.2

常量表達(dá)1.常數(shù)十、十六和二進(jìn)制形式表達(dá)的數(shù)值以后綴字母區(qū)分,十進(jìn)制數(shù)可以不加以字母A~F開頭的十六進(jìn)制常數(shù),要加前導(dǎo)02.字符和字符串英文縮略號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼值3.符號(hào)常量使用標(biāo)識(shí)符表達(dá)一個(gè)數(shù)值符號(hào)定義偽指令:等價(jià)EQU,等號(hào)=4.數(shù)值表達(dá)式用運(yùn)算符連接各種常量構(gòu)成的算式算術(shù)運(yùn)算符:+(加)-(減)*(乘)/(除)常量具有確定數(shù)值105〔例2-1〕數(shù)據(jù)表達(dá)程序-100000000 6464

64

64

64const1 db100,100d,01100100b,64h,'d'00000005 017F8080FFFFconst2 db1,+127,128,-128,255,-10000000B 699720E032CEconst3 db105,-105,32,-32,32h,-32h00000011 303132333435 363738396162 6378797A4142 4358595Aconst4 db'0123456789','abcxyz','ABCXYZ'106〔例2-1〕數(shù)據(jù)表達(dá)程序-200000027 0D0A00crlf db0dh,0ah,0=0000000A

minint equ10

=000000FF

maxint

equ0ffh0000002A 0A0FFAF5const5 dbminint,minint+5,maxint-5,maxint-minint0000002E 105615EBconst6 db4*4,34h+34,67h-52h,52h-67h1072.3

變量應(yīng)用變量(Variable)程序運(yùn)行中隨之發(fā)生變化的結(jié)果保存在可讀可寫的主存空間實(shí)質(zhì)是主存單元的數(shù)據(jù),因而可以改變變量需要事先定義才能使用變量具有屬性方便應(yīng)用變量表達(dá)主存數(shù)據(jù),即存儲(chǔ)器操作數(shù)1082.3.1

變量定義申請(qǐng)存儲(chǔ)空間,還可以進(jìn)行存儲(chǔ)單元初始化

變量名變量定義偽指令初值表變量名是用戶標(biāo)識(shí)符,表示首元素邏輯地址變量定義偽指令有DB(BYTE)、DW(WORD)、DD(DWORD)、DQ(QWORD)初值表是用逗號(hào)分隔的參數(shù)各種形式的常量“?”表示初值不確定,即未賦初值復(fù)制操作符DUP

重復(fù)次數(shù)DUP(重復(fù)參數(shù))1091.變量定義偽指令助記符:DB變量類型:字節(jié)分配一個(gè)或多個(gè)字節(jié)單元;每個(gè)數(shù)據(jù)是字節(jié)量可用于定義字符串常量表示8位無(wú)符號(hào)數(shù)或有符號(hào)數(shù),字符的ASCII碼值助記符:DW變量類型:字分配一個(gè)或多個(gè)字單元;每個(gè)數(shù)據(jù)是字量、16位數(shù)據(jù)表示16位無(wú)符號(hào)或有符號(hào)數(shù)、16位段選擇器、16位偏移地址助記符:DD變量類型:雙字分配一個(gè)或多個(gè)雙字單元;每個(gè)數(shù)據(jù)是雙字量、32位數(shù)據(jù)表示32位無(wú)符號(hào)或有符號(hào)數(shù)、32位段基地址、32位偏移地址助記符:DQ變量類型:4個(gè)字分配一個(gè)或多個(gè)8字節(jié)單元;8字節(jié)量表示64位數(shù)據(jù)1102.字節(jié)量數(shù)據(jù)DB定義8位、字節(jié)量變量數(shù)據(jù)可以表達(dá)無(wú)符號(hào)整數(shù)0~255補(bǔ)碼表示的有符號(hào)整數(shù):-128~+127一個(gè)字符(ASCII碼值)壓縮BCD碼:0~99非壓縮BCD碼:0~9……字符串定義使用字節(jié)變量定義DB111〔例2-2〕字節(jié)變量程序=0000000A minintequ1000000000 0080FF80007Fbvar1 db0,128,255,-128,0,+12700000006 01FF26DA38C8bvar2 db1,-1,38,-38,38h,-38h0000000C 00bvar3 db?0000000D 00000005[24]bvar4 db5dup('$')00000012 0000000A[00]0000000A[0A00]bvar5 dbminintdup(0),minintdup(minint,?)00000030 00000002[020300000002[04]]

db2dup(2,3,2dup(4))1123.字量數(shù)據(jù)DW定義16位、字量變量數(shù)據(jù)可以表達(dá)16位無(wú)符號(hào)和有符號(hào)整數(shù)16位段選擇器,16位偏移地址16位數(shù)據(jù)含高低2個(gè)字節(jié),占2個(gè)連續(xù)的字節(jié)存儲(chǔ)單元小端方式(LittleEndian)低字節(jié)數(shù)據(jù)存放在低地址存儲(chǔ)單元高字節(jié)數(shù)據(jù)存放在高地址存儲(chǔ)單元大端方式(Big

Endian)低字節(jié)數(shù)據(jù)存放在高地址存儲(chǔ)單元高字節(jié)數(shù)據(jù)存放在低地址存儲(chǔ)單元113〔例2-3〕字變量程序-1=0000000A minintequ1000000000 00008000FFFF800000007FFFwvar1 dw0,32768,65535,-32768,0,+327670000000C 0001FFFF0026FFDA0038FFC8wvar2 dw1,-1,38,-38,38h,-38h00000018 0000 wvar3 dw?0000001A 20101020wvar4 dw2010h,1020h0000001E 00000005[000A0000]

dw5dup(minint,?)114〔例2-3〕字變量程序-200000032 31393832wvar6 dw3139h,3832h00000036 39313238bvar6 db39h,31h,32h,38h0000003A 00

db091289128運(yùn)行結(jié)果?1154.雙字量數(shù)據(jù)DD定義32位、雙字量變量數(shù)據(jù)可以表達(dá)32位無(wú)符號(hào)和有符號(hào)整數(shù)32位偏移地址、線性地址或段基地址32位數(shù)據(jù)包含4個(gè)字節(jié),以“高對(duì)高、低對(duì)低”原則占用4個(gè)連續(xù)字節(jié)空間Howtoopenanegg,fromthelittleendorthebigend?示意圖116返回小端存儲(chǔ)方式117〔例2-4〕雙字變量程序-1=0000000A minintequ1000000000 0000000080000000FFFFFFFF 80000000000000007FFFFFFFdvar1 dd0,80000000h,0ffffffffh,-80000000h,0,7fffffffh00000018 00000001FFFFFFFF00000026 FFFFFFDA00000038FFFFFFC8dvar2 dd1,-1,38,-38,38h,-38h00000030 00000000dvar3 dd?00000034 0000201000001020

dd2010h,1020h118〔例2-4〕雙字變量程序-20000003C 0000000A[0000000A00000000]dvar5 ddminintdup(minint,?)0000008C 38323139dvar6 dd38323139h00000090 39313238bvar6 db39h,31h,32h,38h00000094 00 db091289128運(yùn)行結(jié)果!1195.變量定位:指定偏移地址變量定義的存儲(chǔ)空間 按照書寫的先后順序一個(gè)接著一個(gè)分配“ORG參數(shù)”控制存放的偏移地址

org100h ;從偏移地址100H處安排指令代碼也由匯編程序 按照語(yǔ)句的書寫順序安排存儲(chǔ)空間定位偽指令也可以用于控制代碼的偏移地址1205.變量定位:對(duì)齊地址邊界N字節(jié)數(shù)據(jù)起始于能夠被N整除的地址2字節(jié)、16位數(shù)據(jù)是被2整除的地址(偶地址)4字節(jié)、32位數(shù)據(jù)是被4整除的地址(模4地址)8字節(jié)、64位數(shù)據(jù)是被8整除的地址(模8地址)IA-32處理器允許不對(duì)齊邊界存放數(shù)據(jù),性能有下降“ALIGN

N”控制對(duì)齊N字節(jié)邊界

align

4

;對(duì)齊4字節(jié)地址邊界地址A對(duì)齊N字節(jié)邊界AmodN=0

(能夠被N整除的地址)121〔例2-5〕變量定位程序

org100h

0000010064

bvar1 db100

align2

000001020064 wvar2 dw100

align4

0000010400000000

dvar3 dd?

align4

0000010800000000

dvar4 dd?1222.3.2

變量屬性變量定義分配存儲(chǔ)空間賦初值創(chuàng)建變量名變量名具有兩類屬性:⑴地址屬性:首個(gè)變量所在存儲(chǔ)單元的邏輯地址,含有段基地址和偏移地址⑵類型屬性:變量定義的數(shù)據(jù)單位字節(jié)量BYTE

字量WORD

雙字量DWORD

3字量FWORD4字量QWORD10字節(jié)量TBYTE123⒈地址操作符地址操作符用于獲取變量名的地址屬性[]括起的表達(dá)式作為存儲(chǔ)器地址指針$返回當(dāng)前偏移地址OFFSET變量名返回變量名所在段的偏移地址SEG變量名返回段基地址(實(shí)地址存儲(chǔ)模型)124〔例2-6〕變量地址屬性程序-1

;數(shù)據(jù)段00000000 1234bvar db12h,34h00000002

000100020003000400050006 000700080009000Aarray dw1,2,3,4,5,6,7,8,9,1000000016

5678wvar dw5678h=00000016

arr_sizeequ$-array=0000000B arr_lenequarr_size/200000018 9ABCDEF0dvar

dd9abcdef0h125〔例2-6〕變量地址屬性程序-2

;代碼段00000000 A000000000R

moval,[bvar]00000005 8A2500000001R

movah,[bvar+1]0000000B 66|8B1D 00000022R

movbx,wvar[2]00000012 B90000000B

movecx,arr_len00000017 BA00000017R

movedx,$0000001C BE00000022R

movesi,offsetdvar126〔例2-6〕變量地址屬性程序-300000021 8B3E

movedi,[esi]00000023 8B2D00000022R

movebp,[dvar]00000029 E800000000E

calldisprd運(yùn)行結(jié)果127⒉類型操作符類型操作符使用變量名的類型屬性類型名PTR變量名將變量名按照指定的類型使用TYPE變量名返回占用字節(jié)空間的字量數(shù)值LENGTHOF變量名返回整個(gè)變量的數(shù)據(jù)項(xiàng)數(shù)SIZEOF

變量名返回整個(gè)變量占用的字節(jié)數(shù)128〔例2-7〕變量類型屬性程序-1

;代碼段00000000 A10000000CR

moveax,dwordptr[array] ;獲得數(shù)據(jù)00000005 BB00000001

movebx,typebvar

;獲得字節(jié)類型值0000000A B900000002

movecx,typewvar

;獲得字類型值0000000F BA00000004

movedx,typedvar

;獲得雙字類型值129〔例2-7〕變量類型屬性程序-200000014 BE0000000A

movesi,lengthofarray

;獲得數(shù)據(jù)個(gè)數(shù)00000019 BF00000014

movedi,sizeofarray

;獲得字節(jié)長(zhǎng)度0000001E BD00000016

movebp,arr_size

;獲得字節(jié)長(zhǎng)度00000023 E800000000E

calldisprd

運(yùn)行結(jié)果1302.4數(shù)據(jù)尋址方式指令有兩部分:操作碼和操作數(shù)操作碼:處理器要執(zhí)行哪種操作不可缺少,用助記符表示操作數(shù):指令執(zhí)行的參與者各種操作的對(duì)象,需要通過(guò)地址指示數(shù)據(jù)尋址方式:通過(guò)地址查找數(shù)據(jù)(操作數(shù))立即數(shù)尋址:數(shù)據(jù)在指令代碼中,用常量表達(dá)寄存器尋址:數(shù)據(jù)在寄存器中,用寄存器名表示存儲(chǔ)器尋址:數(shù)據(jù)在主存中,用存儲(chǔ)器地址指示1312.4.1立即數(shù)尋址操作數(shù)緊跟操作碼,是機(jī)器代碼的一部分操作數(shù)從指令代碼中立即得到,即立即數(shù)(Immediate),用常量形式直接表達(dá)立即數(shù)尋址方式只用于源操作數(shù),常用來(lái)給寄存器和存儲(chǔ)單元賦值例如:MOVEAX,33221100H機(jī)器代碼:B800112233操作碼:B8立即數(shù):33221100示意圖132立即數(shù)尋址返回133〔例2-8〕立即數(shù)尋址程序-1

;數(shù)據(jù)段=00000040 const equ64000000008749 bvar db87h,49h00000002123456780000000C dvar dd12345678h,12

;代碼段00000000B012 moval,12h00000002B464 movah,'d'0000000466|BBFFFF

labl: movbx,-100000008B900000040

movecx,const134〔例2-8〕立即數(shù)尋址程序-20000000DBA00000040

movedx,const*4/typedvar00000012BE00000000R

movesi,offsetbvar00000017BF00000004R

movedi,labl0000001CC60500000000R4C

movbyteptr[bvar],01001100b00000023C70500000006R00000012

movdwordptr[dvar+4],12h1352.4.2寄存器尋址操作數(shù)存放在處理器的內(nèi)部寄存器中用寄存器名表示它的內(nèi)容絕大多數(shù)指令采用通用寄存器尋址部分指令支持專用寄存器,例如段寄存器寄存器尋址方式簡(jiǎn)單快捷,最常使用例如:MOVEBX,EAX32位通用寄存器:EAXEBXECXEDX……16位通用寄存器:AXBXCXDX……8位通用寄存器:AHALBHBL……136〔例2-9〕寄存器尋址程序

;代碼段000000008AC4 moval,ah0000000266|8BD8 movbx,ax000000058BD8 movebx,eax0000000766|8CDA movdx,ds0000000A66|8EC2 moves,dx

movedi,sieg0209.asm(11):errorA2022:instructionoperandsmustbethesamesize出錯(cuò)了!1372.4.3存儲(chǔ)器尋址操作數(shù)在主存中,通過(guò)存儲(chǔ)器地址指示編程時(shí),存儲(chǔ)器地址使用包含段選擇器和偏移地址的邏輯地址段選擇器(段寄存器)指示段基地址默認(rèn)規(guī)定:數(shù)據(jù)在DS指向的數(shù)據(jù)段;EBP或ESP作為基地址,數(shù)據(jù)在SS指向的堆棧段顯式說(shuō)明:使用段超越指令前綴,段寄存器名后跟英文冒號(hào)偏移地址由各種尋址方式計(jì)算常被稱為有效地址EA(EffectiveAddress)1381.段寄存器的默認(rèn)和超越訪問(wèn)存儲(chǔ)器的方式默認(rèn)可超越偏移地址取指令CS無(wú)EIP堆棧操作SS無(wú)ESP一般數(shù)據(jù)訪問(wèn)DSCSESSSFSGS有效地址EAEBP基址的尋址方式SSCSESDSFSGS有效地址EA串操作的源操作數(shù)DSCSESSSFSGSESI串操作的目的操作數(shù)ES無(wú)EDI主存操作數(shù)常通過(guò)變量形式引用,一般不需要使用段超越前綴指令1392.偏移地址的組成32位有效地址=基址寄存器+(變址寄存器×比例)+位移量基址寄存器:任何8個(gè)32位通用寄存器之一變址寄存器:除ESP外的任何32位通用寄存器之一比例:1,2,4或8位移量:8或32位有符號(hào)值變化出多種主存尋址方式1403.直接尋址有效地址只有位移量部分,直接包含在指令代碼中常用于存取變量例如:

MOVECX,[COUNT]

;COUNT是變量

MOVECX,COUNT ;MASM支持

MOVECX,DS:[405000H]指令代碼:8B0D00504000操作碼和尋址方式:8B0D操作數(shù):有效地址00405000H示意圖141存儲(chǔ)器直接尋址返回142〔例2-10〕存儲(chǔ)器直接尋址程序-1

;數(shù)據(jù)段00000000

8749 bvar db87h,49h00000002

123456780000000C dvar dd12345678h,12

;代碼段00000000

8A0D00000000R movcl,[bvar]00000006

8B1500000002R movedx,[dvar]143〔例2-10〕存儲(chǔ)器直接尋址程序-20000000C883500000001R mov[bvar+1],dh0000001266|891500000004R movwordptr[dvar+2],dx00000019C70500000002R87654321 movdwordptr[dvar],87654321h

movdwordptr[dvar+4],dvareg0210.asm(13):errorA2070:invalidinstructionoperands出錯(cuò)了!1444.寄存器間接尋址有效地址存放在寄存器中(寄存器內(nèi)容=偏移地址=有效地址)MASM用中括號(hào)括起寄存器可以方便地對(duì)數(shù)組的元素或字符串的字符進(jìn)行操作寄存器間接尋址沒有說(shuō)明存儲(chǔ)單元類型例如:movedx,[ebx]movcx,[esi]mov[edi],al145〔例2-11〕寄存器間接尋址程序-1 ;數(shù)據(jù)段srcmsg db'Tryyourbest,whynot.',0count equ$-srcmsg ;計(jì)算字符串字符個(gè)數(shù),賦給符號(hào)常量dstmsg dbcountdup(0) ;代碼段

movecx,count ;ECX=字符串字符個(gè)數(shù)

movesi,offsetsrcmsg ;ESI=源

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論