安徽大學匯編語言程序設計.ppt
《安徽大學匯編語言程序設計.ppt》由會員分享,可在線閱讀,更多相關《安徽大學匯編語言程序設計.ppt(469頁珍藏版)》請在裝配圖網(wǎng)上搜索。
匯編語言程序設計,,引言,課程介紹課程的任務、目的和基本要求主要教學內(nèi)容和學時教學要求主要參考書作業(yè)、實驗和考試,課程介紹,專業(yè)基礎課軟件開發(fā)的一個組成部分一種低級語言的程序設計,課程的任務、目的和基本要求,了解微型計算機的基本結構了解和掌握微型計算機的基本工作原理掌握匯編語言及其應用能獨立完成簡單的匯編語言程序設計認真完成作業(yè)和上機任務,主要教學內(nèi)容和學時,主要內(nèi)容1----8章學時:上課54學時上機36學時,教學要求,課堂上注意聽講、重要的是理解部分補充內(nèi)容需要記筆記課堂外一定要看書復習或預習、完成作業(yè)充分利用上機時間、多編程練習,主要參考書,《80X86匯編語言程序設計教程》,楊季文等著,清華大學出版社?!秴R編語言程序設計》,錢曉捷著,電子工業(yè)出版社?!禝BMPC匯編語言程序設計》,沈美明著,清華大學出版。,作業(yè)、實驗和考試,考勤:15%作業(yè)(15%):1次/1~2周考試(70%):閉卷考試實驗(單獨考試):9次,第一章匯編語言基礎知識,1.1匯編語言簡介1.2計算機中數(shù)據(jù)的表示1.3計算機組織,1.1匯編語言簡介,1.1.1什么是匯編語言1.1.2為什么要學習匯編語言,1.1.1什么是匯編語言,機器指令:cpu能直接識別并遵照執(zhí)行的指令,用二進制編碼表示,由操作碼,操作數(shù)組成,編碼只含二進制0或1。機器語言:用二進制編碼組成的機器指令的集合和一組使用機器指令的規(guī)則。匯編語言:對機器指令中的操作碼用英文單詞的縮寫描述(助記符),對操作數(shù)用標號、變量、常量描述。,,用匯編語言編寫的程序稱為匯編源程序。匯編語言是一種符號語言,比機器語言容易理解和掌握,也容易調(diào)試和維護。但是,匯編語言源程序要翻譯成機器語言程序才可以由計算機執(zhí)行。這個翻譯的過程稱為“匯編”,這種把匯編源程序翻譯成目標程序的語言加工程序稱為匯編程序。,1.1.2為什么要學習匯編語言,匯編語言程序是用符號指令寫成的,本質(zhì)上是機器語言。與具體機器的機型的硬件密切相關,可以直接有效地控制計算機硬件,程序運行速度快,程序短小精悍,占用內(nèi)存少,在某些特殊應用場合更能發(fā)揮作用。如:智能化儀表家用電器實時控制系統(tǒng)單片機控制病毒研究等。使用匯編語言能從根本上認識和理解計算機的工作過程,它可直接而精確地控制計算機硬件的操作。學習匯編語言對從事計算機的研究和開發(fā)有著重要的意義。所以,它作為一門計算機專業(yè)基礎課,并對計算機專業(yè)今后課程的學習是非常重要的。,1.1.3匯編語言的特點,與機器有關:移植性差,但可直接控制硬件。程序效率高。編寫匯編語言源程序比編寫高級語言源程序煩瑣。調(diào)試困難。,1.2計算機中數(shù)據(jù)的表示,1.2.1不同進位計數(shù)制及其相互轉(zhuǎn)換1.2.2二進制數(shù)和十六進制數(shù)的運算1.2.3帶符號數(shù)的表示1.2.4補碼的加法和減法1.2.5無符號數(shù)的表示1.2.6字符的表示1.2.7基本邏輯運算,1.2.1不同進位計數(shù)制及其相互轉(zhuǎn)換,1.進位計數(shù)制對于任意一個進位計數(shù)制,如果用R表示基數(shù),那么任何一個數(shù)S均可用如下多項式表示:S=knRn+kn-1Rn-1+…+k0R0+k-1R-1+k-2R-2+…+k-mR-m,,十進制數(shù):123.6(D)=110^2+210^1+310^0+610^(-1)各位權值10^k二進制數(shù):101101(B)=12^5+12^3+12^2+12^0=45(D)各位權值2^k十六進制數(shù):5F(H)=516^1+1516^0(D)各位權值16^k,,在書寫不同進位計數(shù)制數(shù)時,常常在尾部用一個字母來表示該數(shù)是什么進位計數(shù)制的數(shù)。結尾用B(2進制數(shù))、O(8進制數(shù))、D(10進制數(shù))、H(16進制數(shù))。缺省為十進制數(shù)。例如712O、9198D、10010B、BE49H等等。,,2.各種數(shù)制間的相互轉(zhuǎn)換例如:13.8125D=1101.1101B=D.DH,,二進制數(shù)轉(zhuǎn)換為十進制數(shù)方法:各位二進制數(shù)碼乘以對應的權之和例:1.1十六進制數(shù)轉(zhuǎn)換為十進制數(shù)方法:各位十六進制數(shù)碼乘以對應的權之和例:1.2,,十進制數(shù)轉(zhuǎn)換為二進制數(shù)(1)降冪法:先寫出小于此數(shù)的各位二進制權值,然后再求和。(適用于數(shù)值不大的數(shù))例:1.3(2)除法:不斷除以2,計下余數(shù),直到商為0為止。(僅適用于整數(shù)部分)例:1.4,,對于十進制數(shù)的小數(shù)部分除了可以使用降冪法也可采用乘法,即不斷乘2,并計下整數(shù),而小數(shù)部分再乘2,直到結果為0為止。并非所有的十進制小數(shù)都能用二進制完全表示,可按需要取一定精度即可。例:1.5,,十進制數(shù)轉(zhuǎn)換為十六進制數(shù)(1)降冪法:先寫出小于此數(shù)的各位十六進制權值,然后再求和。(適用于數(shù)值不大的數(shù))例:1.6(2)除法:不斷除以16,計下余數(shù),直到商為0為止。(僅適用于整數(shù)部分)例:1.7,,對于十進制數(shù)的小數(shù)部分除了可以使用降冪法也可采用乘法,即不斷乘16,并計下整數(shù),而小數(shù)部分再乘16,直到結果為0為止。并非所有的十進制小數(shù)都能用十六進制完全表示,可按需要取一定精度即可。,,二進制數(shù)和十六進制數(shù)的相互轉(zhuǎn)換直接轉(zhuǎn)換,每四位一組,整數(shù)從低位開始,小數(shù)從高位開始,不足位補0。例:1.8,1.2.2二進制數(shù)和十六進制數(shù)運算,二進制運算加法規(guī)則:0+0=01+0=10+1=11+1=0(進位1)乘法規(guī)則:00=010=001=011=1十六進制數(shù)運算原則:逢十六進一例1.9,1.10,1.11,1.2.3帶符號數(shù)的表示,帶符號數(shù)最高位是符號位。正數(shù)的符號位為0,負數(shù)的符號位為1。表示方法:原碼、補碼、反碼。,,,,,數(shù)的補碼表示定義:(X>=0時)[X]補=符號+|X|------(1)(X<0時)[X]補=2^n-|X|=(2^n-1-|X|)+1---(2)即X<0時:[X]補+|X|=2^n數(shù)的補碼具體操作是:正數(shù)不變,負數(shù)則用絕對值取反+1,,例1.12[X]補求補等于[-X]補等于|X|(X實踐性很強,結合上機是最好的學習方法。,2.1匯編語言程序?qū)嵗?2.1.1實例12.1.2實例2,例2.1單個字符的鍵盤輸入與顯示輸出程序,codesegmentassumecs:codestart:movah,1int21hmovdl,aladddl,1movah,2int21hmovah,4chint21hcodeendsendstart運行結果:鍵入A接著顯示B,鍵入K接著顯示L,例2.2編寫顯示“HELLO,WORLD!”程序。,datasegmentStringdb‘HELLO,WORLD!$’dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovdx,offsetstringmovah,9int21hmovah,4chint21hcodeendsendstart,2.2工作環(huán)境及上機操作,2.2.1匯編語言的系統(tǒng)工作文件2.2.2進入DOS命令行方式2.2.3編輯建立ASM源程序文件2.2.4匯編產(chǎn)生OBJ二進制目標文件2.2.5連接產(chǎn)生EXE可執(zhí)行文件2.2.6程序的運行和調(diào)試,2.2.1匯編語言的系統(tǒng)工作文件,使用編輯程序編輯源程序文件(.asm)使用匯編程序(MASM)將源程序文件(.asm)匯編成目標文件(.obj)使用連接程序(LINK),將目標文件(.obj)連接成可執(zhí)行文件(.EXE)使用調(diào)式程序(DEBUG),調(diào)式可執(zhí)行文件,運行匯編語言程序需要以下文件,編輯程序EDIT.COM匯編程序MASM.EXE連接程序LINK.EXE調(diào)試程序DEBUG.EXE,注意幾點,本書使用MicrosoftMasm6.0版本。EDIT.COM和DEBUG.EXE為系統(tǒng)自帶。MASM.EXE和LINK.EXE不是系統(tǒng)自帶。為方便操作,系統(tǒng)文件和用戶文件盡可能放在同一文件目錄下。,2.2.2進入DOS命令行方式,程序---附件---命令提示符運行---CMD退出用EXIT,2.2.3編輯建立ASM源程序文件,利用EDIT編輯源文件:C>EDIT↓C>EDIT文件名.ASM↓例如文件名為Hello.ASM在EDIT程序中,將我們編寫的匯編程序輸入到計算機中,并將Hello.ASM保存為源程序。然后退出EDIT程序,回到DOS狀態(tài)。,2.2.4匯編產(chǎn)生OBJ二進制目標文件,源程序建立后,就要用匯編程序?qū)υ闯绦騾R編,匯編后產(chǎn)生二進制的目標文件(OBJ文件),其操作與匯編程序回答如下:C>MASMHello.ASM↓Microsoft(R)MacroAssmblerVersion5.0Copyright(C)MicrosoftCorp1981-1985,1987,AllrightsreservedObjectfilename[Hello.OBJ]:↓Sourcelisting[NUL.LST]:Cross-reference[NUL.CRF]:51646+447778Bytessymbolspacefree0WarningErrors0SevereErrors說明:Hello.OBJ目標文件,這是匯編的主要目的Hello.LST列表文件,可有可無Hello.CRF交叉引用表,可有可無0WarningErrors0個警告錯誤0SevereErrors0個嚴重錯誤,2.2.5連接產(chǎn)生EXE可執(zhí)行文件,匯編程序已產(chǎn)生出二進制的目標文件(OBJ),但OBJ文件并不是可執(zhí)行文件,還必須用連接程序(LINK)把OBJ文件轉(zhuǎn)換為可執(zhí)行的EXE文件。當然,如果一程序由多個模塊組成時,也應該通過LINK把它們連接在一起。操作如下:C>LINKHello.OBJ↓C>LINKHello1+Hello2+Hello3↓Runfile[Hello.ASM.EXE]:↓ListFile[NUL.MAP]:Libraries[.LIB]:LINK:WarningL4012:nostacksegment一般情況下,用戶只需要按回車使用默認值就可以了。兩個輸入文件兩個輸出文件OBJ文件EXE文件LIB文件(庫文件)MAP文件(連接映像文件),2.2.6程序的運行和調(diào)試,建立了EXE文件后,就可以直接在DOS的提示符下,輸入EXE文件的文件名,如:C>Hello↓直接運行程序。對EXE文件無需擴展名就可執(zhí)行。真正的可執(zhí)行文件是生成的,不是用改名操作得到的。,,調(diào)試程序DEBUG.EXE是WINDOWS系統(tǒng)自帶的。DEBUGHello.EXE“-”DEBUG命令提示符,2.3DEBUG主要命令,格式如下:C:\>DEBUG或C:\>DEBUG[盤符][路徑][要調(diào)試的程序]DEBUG中的數(shù)據(jù)顯示均為十六進制。,1.反匯編命令U,格式1:U地址地址用偏移地址或者段地址:偏移地址表示。該命令從指定的地址開始,把機器語言反匯編為匯編語言。若省去指定地址,則以上一個U命令反匯編的最后一條指令地址的下一個單元作為起始地址。格式2:U范圍范圍用a1a2或者aLb表示。對指定范圍的內(nèi)存單元進行反匯編,范圍可以由起始地址、結束地址或起始地址及長度來確定。,2.顯示內(nèi)存命令D,格式1:D地址從指定的地址開始,顯示內(nèi)存,便于用戶看數(shù)據(jù)。格式2:D范圍顯示指定范圍的內(nèi)存內(nèi)容。,3.運行程序命令G,格式:G[=起始地址][中止地址]起始地址規(guī)定了執(zhí)行的起始地址。中止地址是斷點地址,讓程序暫停在某個位置=不能省掉。若省掉起始地址,則以當前CS:IP作為起始地址。默認段地址在段寄存器CS中。,4.寄存器顯示和修改命令R,格式1:R顯示所有寄存器內(nèi)容和全部標志的狀態(tài)。格式2:R寄存器名顯示和修改寄存器內(nèi)容,若不修改其內(nèi)容,則按CR鍵;若要修改,可輸入修改后的1~4個16進制字符值,再按CR鍵。格式3:RF顯示FLAGS寄存器并接受新值。,5.跟蹤程序命令T?Q,格式1:T[=起始地址]單步執(zhí)行程序,在指令執(zhí)行中逐條進行跟蹤,若省去地址,則從CS:IP現(xiàn)行值執(zhí)行。格式2:T[=起始地址][指令條數(shù)]可對多條指令進行跟蹤。注意:對于INT指令不能使用T命令跟蹤。,,,-A匯編命令(輸入程序)格式:A[地址]-N文件命名命令格式:N文件名-L裝入命令格式:L地址驅(qū)動器扇區(qū)號扇區(qū)數(shù)L地址,,-W寫命令格式:W地址驅(qū)動器扇區(qū)號區(qū)段數(shù)W地址-E修改內(nèi)存單元內(nèi)容格式1:E地址內(nèi)容表用給定的內(nèi)容表去代替指定范圍的內(nèi)存單元的內(nèi)容格式2:E地址可連續(xù)逐個修改內(nèi)存單元的內(nèi)容。按CR鍵結束E命令-H十六進制運算命令格式:-Hval1val2輸出為val1+val2val1-val2,,-M移動命令格式:-Mrangeaddress-Q退出命令格式:-Q該命令退出DEBUG程序,并返回到DOS-?查看命令格式格式:-?顯示全部DEBUG命令格式,2.4常用的DOS命令,MD建立目錄E:\>MDMASM建立MASM目錄CD顯示或改變當前目錄E:\>CD顯示當前目錄E:\>CDMASM進入MASM目錄E:\MASM>CD..退到上一目錄E:\MASM>CD\退到根目錄E:,,RD刪除目錄E:\>RDMASM刪除MASM目錄DIR顯示目錄或文件E:\>DIR列出當前目錄下的子目錄和文件E:\>DIR*.ASM列出所有擴展名為ASM的文件,*為通配符E:\>DIRHELLO.*列出所有名為HELLO而擴展名不限的文件E:\>DIRHE*.???列出所有名前兩個字符為HE,而擴展名為三個字符的文件,,REN改變文件名E:\>RENH1.TXTH2.TXTCOPY復制文件E:\>COPYH1.TXTH2.TXTE:\>COPYA+BC.TXT,,TYPE顯示文本文件的內(nèi)容E:\>TYPYH1.TXTCLS清屏SETPATH設置或顯示可執(zhí)行文件的搜索路徑E:\>PATH顯示可執(zhí)行文件的搜索路徑E:\>SETPATH顯示可執(zhí)行文件的搜索路徑,,HELP顯示命令格式和用法E:\>HELP顯示所有命令的格式E:\>HELPDIR顯示DIR命令的用法>輸出的重定向E:\>DIR>C.TXT把DIR顯示結果輸出到文件C.TXT,2.5幾個常用的DOS系統(tǒng)功能調(diào)用,21H號中斷是DOS提供給用戶的用于調(diào)用系統(tǒng)功能的中斷,它有近百個功能供用戶選擇使用,主要包括設備管理、目錄管理和文件管理三個方面的功能。匯編語言程序設計需要采用系統(tǒng)的各種功能程序。,功能調(diào)用的格式,通常按照如下4個步驟進行:⑴在AH寄存器中設置系統(tǒng)功能調(diào)用號⑵在指定寄存器中設置入口參數(shù)⑶執(zhí)行指令INT21H,實現(xiàn)中斷服務程序的功能調(diào)用⑷根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況,1.鍵盤輸入一個字符并回顯,DOS功能調(diào)用INT21H功能號:AH=01H出口參數(shù):AL=輸入字符的ASCII碼功能:等待從鍵盤輸入一個字符,該字符的ASCII碼送AL,并送屏幕顯示。調(diào)用此功能時,若無輸入,則會一直等待,直到輸入后才繼續(xù)。,,movah,01h;功能號:ah←01hint21h;功能調(diào)用cmpal,’Y’;處理出口參數(shù)aljeyeskey;是“Y”cmpal,’N’jenokey;是“N”yeskey:...nokey:...,2.顯示一個字符,DOS功能調(diào)用INT21H功能號:AH=02H入口參數(shù):DL=輸出字符功能:在顯示器當前光標位置顯示給定的字符,光標右移一個字符位置。,,在當前顯示器光標位置顯示一個問號movah,02h;設置功能號:ah←02hmovdl,?;提供入口參數(shù):dl←?int21h;DOS功能調(diào)用:顯示問號,3.顯示字符串,DOS功能調(diào)用INT21H功能號:AH=09H入口參數(shù):DS:DX=欲顯示字符串在主存中的首地址;字符串應以$(24H)結束功能:顯示由DS:DX指定的字符串,,stringdbHello,Everybody!$‘;在數(shù)據(jù)段定義要顯示的字符串...movah,09h;設置功能號ah←09hmovdx,offsetstring;提供入口參數(shù)dx←字符串的偏移地址int21h;DOS功能調(diào)用字符串顯示,4.鍵盤輸入到緩沖區(qū),DOS功能調(diào)用INT21H功能號:AH=0AH入口參數(shù):DS:DX=緩沖區(qū)首地址(DS:DX)=緩沖區(qū)字節(jié)數(shù)功能:輸入到緩沖區(qū),緩沖區(qū)的定義,第1字節(jié)事先填入最多欲接收的字符個數(shù)(包括回車字符,可以是1~255)第2字節(jié)將存放實際輸入的字符個數(shù)(不包括回車符)第3字節(jié)開始將存放輸入的字符串實際輸入的字符數(shù)多于定義數(shù)時,多出的字符丟掉,且響鈴,,bufferdb81;定義緩沖區(qū);第1個字節(jié)填入可能輸入的最大字符數(shù)db?;存放實際輸入的字符數(shù)db81dup(?);存放輸入的字符串...movdx,segbuffer;偽指令seg取得buffer的段地址movds,dx;設置數(shù)據(jù)段DSmovdx,offsetbuffermovah,0ahint21h,5.寫文件或設備,DOS功能調(diào)用INT21H功能號:AH=40H入口參數(shù):DS:DX=數(shù)據(jù)區(qū)首地址BX=文件代號CX=寫入的字節(jié)數(shù)功能:把數(shù)據(jù)區(qū)內(nèi)容輸出到文件或設備,,MOVAH,40H;設置功能號AH←40HLEADX,STR;設置數(shù)據(jù)區(qū)首地址MOVBX,1;文件代號1表示標準設備顯示器MOVCX,9;輸出9個字節(jié)INT21H;,6.結束程序返回DOS,DOS功能調(diào)用INT21H功能號:AH=4CH入口參數(shù):AL=返回碼功能:結束程序返回DOSMOVAH,4CHINT21H,第三章指令系統(tǒng)和尋址方式,3.1尋址方式3.2指令系統(tǒng)3.380386后繼機型的新增擴展指令和尋址方式,3.1尋址方式,3.1.1指令結構3.1.2操作數(shù)的尋址方式,,計算機中的指令由操作碼和操作數(shù)組成。操作數(shù)字段可以有一個、兩個或三個,通常稱為一地址、二地址或三地址指令。二地址指令中兩個操作數(shù)分別稱為源操作數(shù)和目的操作數(shù)。所謂尋址方式就是指令中尋找操作數(shù)的方式。,3.1.1指令結構,80 x86匯編語言指令的一般格式位:[標號:]指令助記符[操作數(shù)][;注釋][]中的內(nèi)容位可選項。,,標號:符號地址,表示指令在內(nèi)存中的位置。標號后應加冒號:。指令助記符:指令名稱,是指令功能的英文縮寫。操作數(shù):指令要操作的數(shù)據(jù)或數(shù)據(jù)所在的地址。寄存器,常量,變量,表達式。注釋:每行以分號“;”開頭,匯編程序不處理。,3.1.2操作數(shù)的尋址方式,立即尋址方式操作數(shù)就在指令中,緊跟在操作碼之后,操作數(shù)作為指令的一部分存放在代碼段。例MOVAL,5H執(zhí)行完此條指令后(AL)=05HMOVAX,3064H,,注意:,執(zhí)行時無需去內(nèi)存取數(shù),因此稱為立即數(shù)。主要用于寄存器賦初值。立即數(shù)只能作為源操作數(shù),并且長度與目的操作數(shù)一致。,,寄存器尋址方式操作數(shù)就是寄存器中的值。指令中給出寄存器名。例MOVAL,BLMOVAX,BXMOVAL,BX錯MOVAX,BL錯,注意:,以上兩種尋址方式都與存儲器無關。以下各種尋址方式的操作數(shù)都在存儲器中。偏移地址也稱為有效地址(EA)。,,直接尋址方式操作數(shù)的有效地址EA就在指令中。機器默認段地址在DS中。,,例3.4例3.5例3.6,,寄存器間接尋址方式操作數(shù)的有效地址在寄存器中,只允許使用BX、BP、SI和DI寄存器。物理地址=16dx(DS)+(BX)物理地址=16dx(DS)+(SI)物理地址=16dx(DS)+(DI)物理地址=16dx(SS)+(BP),,例3.7,,寄存器相對尋址方式操作數(shù)的有效地址是寄存器和位移量之和。位移量可以是8位/16位的常量,也可以是16位的符號地址。只允許使用BX、BP、SI和DI寄存器。默認搭配和寄存器間接尋址方式一樣。例3.8,,,MOVAX,COUNT[SI]MOVAX,[COUNT+SI]當COUNT為16位位移量的符號地址時:如DS=3000H,SI=2000H,COUNT=4000H;(36000H)=34H,(36001H)=12H物理地址=16dx(段值)+EA=30000H+2000H+4000H=36000H,,基址變址尋址方式操作數(shù)的有效地址是一個基址寄存器和一個變址寄存器內(nèi)容之和。物理地址=16dx(DS)+(BX)+(SI)物理地址=16dx(DS)+(BX)+(DI)物理地址=16dx(SS)+(BP)+(SI)物理地址=16dx(SS)+(BP)+(DI),,,相對基址變址尋址方式操作數(shù)的有效地址是一個基址寄存器和一個變址寄存器以及一個位移量之和。基址寄存器BX和BP,變址寄存器SI和DI。默認段寄存器搭配和寄存器間接尋址方式一樣。例3.10,,注意,雙操作數(shù)指令的兩個操作數(shù)中,只能有一個使用存儲器尋址方式。雙操作數(shù)指令的兩個操作數(shù),長度須匹配。操作數(shù)的有效地址前可以加段跨越前綴,但在以下三種情況下不允許:串處理指令的目的串必須用ES段PUSH指令的目的和POP指令的源必須用SS段指令必須存放在CS段,3.2指令系統(tǒng),3.2.1數(shù)據(jù)傳送指令3.2.2類型擴展指令3.2.3算術運算指令3.2.4邏輯指令3.2.5移位指令3.2.6串操作指令3.2.7程序轉(zhuǎn)移指令3.2.8處理器控制指令,,8086指令系統(tǒng)可以分為八組:(1)數(shù)據(jù)傳送指令(2)類型擴展指令(3)算術運算指令(4)邏輯指令(5)移位指令(6)串操作指令(7)程序轉(zhuǎn)移指令(8)處理機控制指令,3.2.1數(shù)據(jù)傳送指令,通用數(shù)據(jù)傳送指令累加器專用傳送指令地址傳送指令標志寄存器傳送,1.通用數(shù)據(jù)傳送指令,MOV傳送PUSH進棧POP出棧XCHG交換,(1)MOV傳送指令,格式:MOVDST,SRC操作:(DST)←(SRC)DST表示目的操作數(shù),SRC表示源操作數(shù)。功能:將源操作數(shù)傳送到目的操作數(shù)。,雙操作數(shù)指令的規(guī)定,源操作數(shù)與目的操作數(shù)的長度必須一致。源操作數(shù)與目的操作數(shù)不能同時為存儲器。目的操作數(shù)不能為CS和IP,因為CS:IP是程序當前地址。,,例3.11例3.12例3.13例3.14例3.15例3.16,(2)PUSH進棧指令,格式:PUSHSRC操作:(SP)←(SP)-2((SP)+1,(SP))←(SRC)堆棧:后進先出內(nèi)存區(qū),以字為單位傳送,SS:SP總是指向棧頂。例3.17,(3)POP出棧指令,格式:POPDST操作:(DST)←((SP)+1,(SP))(SP)←(SP)+2例3.18,(4)XCHG交換指令,格式:XCHGOPR1,OPR2操作:(OPR1)(OPR2)功能:把兩個操作數(shù)互換位置。遵循雙操作數(shù)指令的規(guī)定,但操作數(shù)不能為立即數(shù)。例3.19,,2.累加器專用傳送指令,IN;從I/O端口輸入OUT;向I/O端口輸出XLAT;換碼其中I/O端口是CPU與外設傳送數(shù)據(jù)的接口,單獨編址,不屬于內(nèi)存,端口地址范圍0000~FFFFH.這組指令只限于AX,AL累加器。,(1)IN輸入指令,長格式:INAL,PORT(字節(jié));00~FFHINAX,PORT(字)操作:AL←(PORT)AX←(PORT)功能:把端口PORT的數(shù)據(jù)輸入到累加器。,,短格式:INAL,DX(字節(jié));PORT放入DXINAX,DX(字)操作:AL←((DX))AX←((DX))功能:把DX指向的端口的數(shù)據(jù)輸入到累加器。,,例3.20例3.21,(2)OUT輸出指令,長格式:OUTPORT,AL(字節(jié));00-FFHOUTPORT,AX(字)操作:PORT←ALPORT←AX功能:把累加器的數(shù)據(jù)輸出到端口PORT。,,短格式:OUTDX,AL(字節(jié));0000-FFFFHOUTDX,AX(字)操作:(DX)←AL(DX)←AX功能:把累加器的數(shù)據(jù)輸出到DX指向的端口。例3.22,(3)XLAT換碼指令,格式:XLAT操作:AL←(BX+AL)功能:把BX+AL的值作為有效地址,取出其中的一個字節(jié)送AL。例3.23,3.地址傳送指令,LEA有效地址送寄存器LDS指針送寄存器和DSLES指針送寄存器和ES,(1)LEA有效地址送寄存器指令,格式:LEAREG,SRC操作:REG←SRC功能:把源操作數(shù)的有效地址EA送到指定的寄存器。例3.24例3.25,(2)LDS指針送寄存器和DS指令,格式:LDSREG,SRC操作:REG←(SRC)DS←(SRC+2)功能:把源操作數(shù)SRC所指向的內(nèi)存單元中的兩個字送到指定的寄存器REG和DS。例3.26,(3)LES指針送寄存器和ES指令,格式:LESREG,SRC操作:REG←(SRC)ES←(SRC+2)功能:把源操作數(shù)SRC所指向的內(nèi)存單元中的兩個字送到指定的寄存器REG和ES。例如LESDI,[10H]DS=C000H,(C0010H)=0180H,(C0012H)=2000H結果DI=0180H,ES=2000H,4.標志寄存器傳送指令,LAHF標志寄存器FLAGS的低字節(jié)送AHSAHFAH送FLAGS的低字節(jié)PUSHF標志進棧POPF標志出棧以上傳送類指令均不影響標志位,除SAHF,POPF外.,3.2.2類型擴展指令,CBW:AL擴展為AXCWD:AX擴展為DX,AX擴展方法為符號擴展。例3.28例3.29,3.2.3算術運算指令,加法指令減法指令乘法指令除法指令,1.加法指令,ADD加法ADC帶進位加法INC加1,(1)ADD加法指令,格式:ADDDST,SRC操作:(DST)←(DST)+(SRC)例3.30,溢出判斷,以8位二進制數(shù)為例,,,綜上所述,CF=1為無符號數(shù)的溢出,OF=1為有符號數(shù)的溢出.OF位:若兩個操作數(shù)的符號相同,而結果的符號與之相反時OF=1,否則OF=0。CF位:有進位/借位時CF=1,否則CF=0。,(2)ADC帶進位加法指令,格式:ADCDST,SRC操作:(DST)←(DST)+(SRC)+CF例3.31,,(3)INC加1指令,格式:INCOPR操作:(OPR)←(OPR)+1,,除INC不影響CF,它們都影響條件標志位.條件標志位(條件碼)最主要有:進位CF,零ZF,符號SF,溢出OF,2.減法指令,SUB減法SBB帶借位減法DEC減1NEG求補CMP比較,(1)SUB減法指令,格式:SUBDST,SRC操作:(DST)←(DST)-(SRC),(2)SBB帶借位減法指令,格式:SBBDST,SRC操作:(DST)←(DST)-(SRC)-CF,(3)DEC減1指令,格式:DECOPR操作:(OPR)←(OPR)-1,(4)NEG求補指令,格式:NEGOPR操作:(OPR)←-(OPR)功能:對OPR求補,求-OPR,即反碼+1.只有OPR為0時,CF=0。,(5)CMP比較指令,格式:CMPOPR1,OPR2操作:(OPR1)-(OPR2)不回送結果,只產(chǎn)生標志位。,,CF=1為無符號數(shù)溢出,OF=1為有符號數(shù)溢出.例3.32例3.33例3.34例3.35,3.乘法指令,MUL無符號數(shù)乘法IMUL有符號數(shù)乘法,(1)MUL無符號數(shù)乘法指令,格式:MULSRC操作:操作數(shù)為字節(jié)時:(AX)←(AL)X(SRC)操作數(shù)為字時:(DX,AX)←(AX)X(SRC),(2)IMUL帶符號數(shù)乘法指令,格式:IMULSRC操作:操作數(shù)為字節(jié)時:(AX)←(AL)X(SRC)操作數(shù)為字時:(DX,AX)←(AX)X(SRC),,兩個相乘的數(shù)必須長度相同。SRC不能是立即數(shù)。例3.36,4.除法指令,DIV無符號數(shù)除法IDIV有符號數(shù)除法,(1)DIV無符號數(shù)除法指令,(2)IDIV帶符號數(shù)除法指令,格式:IDIVSRC操作與DIV相同余數(shù)和被除數(shù)同符號。被除數(shù)長度應為除數(shù)長度的兩倍。SRC不能是立即數(shù)。例3.37例3.38,算術運算綜合舉例,例3.39,5.十進制調(diào)整指令,前面提到的所有算術運算指令都是二進制數(shù)的運算,為便于十進制計算,計算機提供了十進制調(diào)整指令,在二進制數(shù)計算的基礎上,給予十進制調(diào)整,直接得到十進制結果。,,BCD碼(BinaryCodedDecimal):用二進制編碼表示十進制數(shù).四位二進制數(shù)表示一位十進制數(shù),由于四位二進制數(shù)的權分別為8,4,2,1,所以又稱為8421碼.,,壓縮的BCD碼4位二進制數(shù)表示一位十進制數(shù)。非壓縮的BCD碼8位二進制數(shù)表示一位十進制數(shù),低4位為8421碼,高4位無意義。,(1)壓縮BCD碼調(diào)整指令,DAA;加法十進制調(diào)整指令DAS;減法十進制調(diào)整指令,,DAA;加法十進制調(diào)整指令格式:DAA操作:IFCF=1orAL高4位是[A~F]THENAL+60H.IFAF=1orAL低4位是[A~F]THENAL+6,,例ADDAL,BL000010019DAA+0000010040000110113+011000010011BCD碼9+4的結果是(10011)BCD即13,,,?DAA使AL自動+6IF每位BCD碼值>9THEN該位值加6例3.40BCD1=1834,BCD2=2789求:BCD331H,2-->32H,3-->33H,A-->41H4.BX循環(huán)左移4位。,,例5.5從鍵盤輸入一個四位的十六進制數(shù)(其中字母為大寫),并將其轉(zhuǎn)換為二進制數(shù)顯示輸出。算法分析1.輸入為數(shù)字0~9(ASCII碼30~39H),減30H,為大寫字母A~F(ASCII碼41~46H),減37H,將四次的輸入拼裝成四位十六進制數(shù)存放在BX中;2.循環(huán)利用16次移位從左到右顯示BX寄存器中的二進制數(shù)。,,例5.6從鍵盤接收八個英文字母,根據(jù)邏輯尺設立的標志顯示輸出相鄰字符,標志為0顯示其前驅(qū)字符,標志為1顯示其后繼字符。算法分析1.循環(huán)次數(shù)已知,但每次循環(huán)所做的操作不同;2.設置標志字,循環(huán)中依據(jù)標志字中的標志位選擇操作。,5.2.3條件循環(huán)程序,例5.7從鍵盤輸入一個單個字符,顯示該字符的ASCII碼(十六進制),回車鍵退出循環(huán),終止程序。算法分析1.從鍵盤輸入一個單個字符,該字符的ASCII碼在AL中,為兩位十六進制數(shù);2.把每位十六進制數(shù)轉(zhuǎn)換成ASCII碼,用2號功能輸出,高位為數(shù)字,低位為數(shù)字或A~F。3.回車鍵退出循環(huán)。,5.2.4條件計數(shù)循環(huán)程序,例5.8設置鍵盤緩沖區(qū)為16個字節(jié),從鍵盤輸入一串字符,然后再從鍵盤輸入一個單個字符,查找這個字符是否在字符串中出現(xiàn),如果找到,顯示該字符串,否則顯示‘NOTFOUND’。,5.2.5多重循環(huán)程序,例5.9顯示輸出20H~7EH的ASCII碼字符表,每行16個字符。例5.10有一個首地址為A的5個字的數(shù)組,請編程使該數(shù)組中的數(shù)從大到小排序.,,冒泡排序算法:KK=N-1DOWHILEKK>0;kk—DI共比較遍數(shù)K=KKI=0DOWHILEK>0;K—CX每遍比較次數(shù)IFA[I]=0)。遞歸定義:0!=1N!=N*(N-1)!計算N!的C語言遞歸程序:jc(intn){intc;if(n==0)c=1;elsec=n*jc(n-1);return(c);},第七章高級匯編語言技術,宏匯編語言提供了類似于高級語言的某些復雜功能,如宏匯編、重復匯編與條件匯編,提高了使用匯編語言進行程序設計的質(zhì)量和效率。,7.1宏匯編,宏是源程序中一段有獨立功能的程序代碼。它只需要在源程序中定義一次,就可以多次調(diào)用,調(diào)用時只需要用一個宏指令語句就可以了。宏功能既可以實現(xiàn)程序復用,又能方便的傳遞多個參數(shù)。,,子程序優(yōu)點:省存儲空間優(yōu)化程序結構便于調(diào)試和修改子程序缺點:調(diào)用、返回、保存、恢復需花開銷參數(shù)傳遞復雜因此,在程序較短,或需要傳送的參數(shù)較多的情況下,用宏匯編更加有利。,7.1.1宏定義、宏調(diào)用和宏展開,宏定義:宏指令名MACRO[形參1,形參2,…]ENDM宏定義體是一組有獨立功能的程序代碼。宏指令名給出宏定義的名稱,調(diào)用時就使用宏指令名來調(diào)用宏定義。第一個符號必須是字符。啞元表給出了宏定義中所用到的形式參數(shù),每個啞元之間用逗號隔開。,,,宏調(diào)用:宏指令名[實參1,實參2,…]宏指令被定義后,在源程序中就可以直接調(diào)用,稱為宏調(diào)用。一般說來,實參的個數(shù)應和形參的個數(shù)相等,但匯編程序并不要求它們必須相等。若實參個數(shù)大于形參個數(shù),則多余的實參不予考慮,若實參個數(shù)小于形參個數(shù),則多余的形參取空值。例:multiply240,BX,SAVE,,宏展開:在對源程序的匯編階段,匯編程序?qū)υ闯绦蛑械拿總€宏調(diào)用都進行了宏展開,即用宏定義體取代源程序中宏指令名,用實參取代形參。應該注意,用實參取代形參后,所得到的語句應該是有效的,否則匯編程序?qū)甘境鲥e。,,例:1pushdx1pushax1movax,2401imulBX1movSAVE,ax1movSAVE+2,dx1popax1popdx表示這些指令是由宏展開而得到的(早期用+),,,例7.1用宏指令實現(xiàn)兩個八位有符號數(shù)的乘法。宏定義:imultiplyMACROx,y,resultpushaxmoval,ximulymovresult,axpopaxENDM,,宏展開:1pushax1moval,cl1imuldl1mov[bx],ax1popax┇1pushax1moval,ary1imulvar1movsave,ax1popax,宏調(diào)用:imultiplycl,dl,[bx]…imultiplyary,var,save,,例7.2某工廠工人的周工資由計時工資和計件工資組成,計時工資按每小時工資率RATE乘以工作小時數(shù)計算;計件工資按超定額部分乘以SUP計算(超定額=實際完成的工件數(shù)MADE-定額工件數(shù)PART),工資總額放在WAGE中。宏定義如下:wagesmacrorate,hout,made,part,supwage=rate*hout+(made-part)*supendmrate=5part=100sup=4,,宏調(diào)用:wagesrate,40,120,part,sup宏展開為:wage=rate*40+(120-part)*sup,,從以上兩個例子可以看出,子程序和宏指令具有類似的功能,但又有以下區(qū)別:空間的區(qū)別:宏指令并不節(jié)省目標程序的空間,而子程序在目標程序中只有一段;時間的區(qū)別:宏指令在運行時不需要其他額外的CPU開銷,而子程序的調(diào)用、返回和保護現(xiàn)場、恢復現(xiàn)場需要占用時間;參數(shù)的區(qū)別:宏調(diào)用可實現(xiàn)多個參數(shù)的直接代換,方式簡單靈活,而子程序參數(shù)傳遞麻煩。,宏調(diào)用和子程序調(diào)用工作方式的區(qū)別,7.1.2宏定義的嵌套,這種嵌套結構的特點是外層宏定義的宏體中又有宏定義,只有調(diào)用外層宏定義一次后,才能調(diào)用內(nèi)層宏指令。例7.3用嵌套的宏定義實現(xiàn)兩個八位數(shù)的算術運算。,,宏定義:mathMACROmathname,action,nummathnameMACROx,y,resulepushaxmovnum,xactionymovresultaxpopaxENDMENDM,,宏調(diào)用:mathimultiply,imul,al宏展開:imultiplyMACROx,y,resultpushaxmoval,ximulymovresult,axpopaxENDM,,宏調(diào)用:mathdivide,div,ax宏展開:divideMACROx,y,resultpushaxmovax,xdivymovresult,axpopaxENDM,,接下來可使用宏調(diào)用:divideary,var,save則宏展開如下:1pushax1movax,ary1divvar1movsave,ax1popax,7.1.3宏定義中使用宏調(diào)用,宏定義中使用的宏調(diào)用必須已經(jīng)定義。例7.4用嵌套的宏定義實現(xiàn)字符顯示。宏定義:INT21MACROFUNCTNMOVAH,F(xiàn)UNCTNINT21HENDMDISPCMACROCHARMOVDL,CHARINT212ENDM,,宏調(diào)用:DISPC‘A’宏展開:1MOVDL,‘A’2MOVAH,22INT21H這里的2表示第二層展開結果。,7.1.4帶間隔符的實參,在宏調(diào)用中,有時實參使用的是字符串(不是單引號括起來的),而是字符串中包含間隔符(如空格、逗號等),為使間隔符成為實參的一部分,則要用尖括號將字符串括起來作為一個實參的整體來替換形參。例7.5在數(shù)據(jù)段中定義40個字節(jié)的存儲空間。defdbmacrobuf,xbufxendmdatasegmentdefdbarray,dataends…宏展開為:1arraydb40dup(?),7.1.5連接操作符否則對進行匯編。,,條件匯編偽指令有八條:IF表達式;表達式不為0,則滿足條件IFE表達式;表達式為0,則滿足條件IFDEF符號;符號已定義或被說明為EXTRN,則滿足條件IFNDEF符號;符號未定義或未說明為EXTRN,則滿足條件IFB;變量為空,則滿足條件IFNB;變量不為空,則滿足條件IFIDN,;兩串相等,則滿足條件IFNIDN,;兩串不等,則滿足條件,,表達式可以是用關系操作符EQ,NE,LT,LE,GT,GE和邏輯運算符AND,OR連接的布爾表達式。例7.16例7.17例7.18,,例7.16用宏指令MAX把三個變元中最大值放在AX中。變元個數(shù)不同產(chǎn)生的程序段也不同。maxmacrok,a,b,clocalnext,out1movax,aif(kge2)and(kle3)ifkeq3cmpc,axjlenextmovax,cendifnext:cmpb,axjleout1movax,bendifout1:endm,,宏調(diào)用:max1,xmax2,x,ymax3,x,y,z宏展開:max1,x1movax,x1??0001:max2,x,y1movax,x1??0002:1cmpy,ax1jle??00031movax,y1??0003:,max3,x,y,z1movax,x1cmpz,ax1jle??00041movax,z1??0004:1cmpy,ax1jle??00051movax,y1??0005:,,例7.17求K的階乘,結果放在AX中。宏定義和子程序一樣,也可以遞歸調(diào)用。用條件偽操作可結束宏遞歸。powmacrokpopaxmovbl,kmulblpushaxk=k-1ifkge1powkendifendm,,宏調(diào)用:movax,1pushaxn=4pown,,宏展開:1popax1movbl,n1mulbl1pushax1n=n-12popdx2movbl,n2mulbl2pushax2n=n-1,3popax3movbl,n3mulbl3pushax3n=n-14popax4movbl,n4mulbl4pushax4n=n-1,,例7.18比較兩個字符串是否相等,若相等則STR=1,否則STR=2。datasegmentstr1db‘a(chǎn)bcdefgh’str2db‘a(chǎn)mkdefgh’ifidn,str=1elsestr=2endifdataends經(jīng)匯編后產(chǎn)生的LST列表文件可以看出STR=2,據(jù)此可以顯示“不相等”,第八章輸入輸出和中斷,,8.1I/O方式,程序直接控制I/O中斷DMA(直接內(nèi)存訪問)匯編使用系統(tǒng)提供的標準I/O程序,用dos系統(tǒng)功能調(diào)用int21h,8.1.1I/O端口,cpu與I/O設備通信有三種信息:控制,狀態(tài),數(shù)據(jù)(1)控制信息:從cpu輸出到I/O接口,用來控制設備動作(2)狀態(tài)信息:從I/O輸入到cpu,表示設備當前狀態(tài)(3)數(shù)據(jù)信息:輸入I/O?cpu,輸出cpu?I/O,,三種寄存器I/O接口部件有三種寄存器:數(shù)據(jù),狀態(tài),控制命令包含在主機cpu中,通過訪問這些寄存器與外部設備交換數(shù)據(jù),把這些寄存器稱為端口port。,,端口編址0000~~ffffh其中00~ffh可直接指定,100h~ffffh須由dx間接尋址。,8.1.2I/O指令,(1)輸入(2)輸出,,8.1.3I/O的數(shù)據(jù)傳送控制方式,無條件傳送外設的數(shù)據(jù)傳送隨時可以進行,而不需要cpu查詢外設的狀態(tài),用IN/OUT指令實現(xiàn)cpu與指定的外設寄存器之間的信息傳送。,,查詢傳送cpu不斷測試外設狀態(tài),等待與外設同步,當多個設備要求傳送時,依次查詢,順序即為優(yōu)先級。,,中斷傳送,,直接存儲器傳送DMA成批交互,DMA控制器8237A過程見P175。,8.2中斷,8.2.1中斷的概念中斷與中斷源中斷:由于某種事件的發(fā)生,使得cpu停止(中斷)正在執(zhí)行的程序,轉(zhuǎn)而去執(zhí)行處理該事件的程序,結束后,再繼續(xù)執(zhí)行先前被中斷的程序。中斷源:引起中斷的事件,,中斷源的分類:1.內(nèi)部中斷:軟件中斷,不需要外部硬件的支持,不受中斷標志IF的限制。(1)中斷指令INT(2)cpu錯誤(3)為調(diào)試程序而設置的中斷:斷點,,2.外部中斷:來自cpu外部,硬件中斷(1)不可屏蔽中斷源NMI:硬件故障(2)可屏蔽中斷源INTR:允許程序員確定是否處理。,,中斷類型號:INTn------是中斷類型號中斷優(yōu)先級和中斷嵌套:從高到低內(nèi)中斷不可屏蔽可屏蔽單步中斷(調(diào)試),8.2.2中斷向量表,中斷向量:中斷程序的入口地址cs:ip中斷向量表:所有中斷處理程序的入口地址表,8.2.3中斷過程,分為四步:請求,響應,處理,返回1.請求:中斷源滿足一定條件,向cpu發(fā)出請求2.中斷響應:,8.3中斷處理程序設計,分為主程序設計和中斷子程序設計,,總復習1-7章,第一章基礎知識,常用的ascii碼表回車:0dh換行:0ah空格:20h0~9:30h~39hA~Z:41h~5aha~z:61h~7ah,,Cpu寄存器:1.數(shù)據(jù):ax,bx,cx,dx2.指針:sp,bp3.變址寄存器:si,di4.段寄存器:cs,ds,ss,es5.控制寄存器:ip,flags(of,cf,zf,sf),,存儲器1.編址:按字節(jié)編址2.字:高字節(jié)在高地址,低字節(jié)在低地址3.存儲器分段:20位地址物理地址=16d*段地址+偏移地址,,外設接口:一組寄存器--狀態(tài),控制,數(shù)據(jù)編址:端口號大于0ffh,放入dx寄存器,第二章上機操作,工作環(huán)境編輯程序EDIT.EXE匯編程序MASM.EXE連接程序LINK.EXE調(diào)試程序DEBUG.EXE,,DEBUG主要命令-u-d-g-t-r,,常用dos功能調(diào)用P31,第三章PC機的指令系統(tǒng)和尋址方式,尋址方式1.立即尋址2.寄存器尋址3.直接尋址4.寄存器間接尋址5.寄存器相對尋址6.基址變址尋址7.相對基址變址尋址,,指令,,第四章偽指令與源程序格式,常用的偽指令1.數(shù)據(jù)定義:db,dw,dd,dq,dt,dup,ptr,label2.equ,=3.段定義:segment…..Endsassume,,過程定義proc………endpnear/far程序結束end$和org,,表達式中常用的操作符1.算術:+,-,/,*,mod2.邏輯:AND,OR,XOR,NOT3.關系:EQ,NE,LT,GT,LE,GE4.數(shù)據(jù)回送:TYPE,LENGTH,SIZE,OFFSET,SEG,,匯編語言的一般格式返回控制臺的方法:pushdsmovah,4chsubax,axint21hpushax…ret,,,第五章循環(huán),分支,跳轉(zhuǎn)指令循環(huán)指令,第六章子程序設計,格式調(diào)用和遞歸,第七章高級匯編技術,宏定義格式macro…………endm宏調(diào)用local,%,&,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 安徽大學 匯編 語言程序設計
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://zhongcaozhi.com.cn/p-12788696.html