微機(jī)系統(tǒng)與接口技術(shù)(錢曉捷)第二章_第1頁(yè)
微機(jī)系統(tǒng)與接口技術(shù)(錢曉捷)第二章_第2頁(yè)
微機(jī)系統(tǒng)與接口技術(shù)(錢曉捷)第二章_第3頁(yè)
微機(jī)系統(tǒng)與接口技術(shù)(錢曉捷)第二章_第4頁(yè)
微機(jī)系統(tǒng)與接口技術(shù)(錢曉捷)第二章_第5頁(yè)
已閱讀5頁(yè),還剩166頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章微處理器內(nèi)部結(jié)構(gòu)及指令系統(tǒng)2.1微處理器的內(nèi)部結(jié)構(gòu)從應(yīng)用角度(不是從內(nèi)部工作原理)展開典型8位微處理器的基本結(jié)構(gòu)8088/8086的功能結(jié)構(gòu)8088/8086的寄存器結(jié)構(gòu)8088/8086的存儲(chǔ)器結(jié)構(gòu)為學(xué)習(xí)指令系統(tǒng)打好基礎(chǔ)例如:關(guān)心用戶“可編程”寄存器,不關(guān)心無(wú)法操縱的“透明”寄存器內(nèi)部數(shù)據(jù)總線控制總線數(shù)據(jù)總線地址總線暫存器累加器ALU標(biāo)志寄存器指令寄存指令譯碼時(shí)序和控制邏輯通用寄存器組地址寄存器組地址總線控制數(shù)據(jù)總線控制2.1.1微處理器的基本結(jié)構(gòu)1.算術(shù)邏輯單元(運(yùn)算器)2.寄存器組3.指令處理單元(控制器)2.1.28088/8086的功能結(jié)構(gòu)8088的內(nèi)部結(jié)構(gòu)從功能上分成兩個(gè)單元1.總線接口單元BIU管理8088與系統(tǒng)總線的接口負(fù)責(zé)CPU對(duì)存儲(chǔ)器和外設(shè)進(jìn)行訪問2.執(zhí)行單元EU負(fù)責(zé)指令的譯碼、執(zhí)行和數(shù)據(jù)的運(yùn)算兩個(gè)單元相互獨(dú)立,分別完成各自操作,還可以并行執(zhí)行,實(shí)現(xiàn)指令預(yù)?。ㄖ噶钭x取和執(zhí)行的流水線操作)2.1.38088/8086的寄存器結(jié)構(gòu) 8088/8086的寄存器組有8個(gè)通用寄存器4個(gè)段寄存器1個(gè)標(biāo)志寄存器1個(gè)指令指針寄存器它們均為16位!圖示

匯編語(yǔ)言程序員看到的處理器,就是寄存器所以,一定要熟悉這些寄存器的名稱和作用1.通用寄存器8088有8個(gè)通用的16位寄存器(1)數(shù)據(jù)寄存器:AXBXCXDX(2)變址寄存器:SIDI(3)指針寄存器:BPSP4個(gè)數(shù)據(jù)寄存器還可以分成高8位和低8位兩個(gè)獨(dú)立的寄存器,這樣又形成8個(gè)通用的8位寄存器AX:AHAL BX:BHBLCX:CHCL DX:DHDL(1)數(shù)據(jù)寄存器AX稱為累加器(Accumulator)使用頻度最高。用于算術(shù)、邏輯運(yùn)算以及與外設(shè)傳送信息等BX稱為基址寄存器(BaseaddressRegister)常用做存放存儲(chǔ)器地址CX稱為計(jì)數(shù)器(Counter)作為循環(huán)和串操作等指令中的隱含計(jì)數(shù)器DX稱為數(shù)據(jù)寄存器(Dataregister)常用來存放雙字長(zhǎng)數(shù)據(jù)的高16位,或存放外設(shè)端口地址(2)變址寄存器16位變址寄存器SI和DI常用于存儲(chǔ)器變址尋址方式時(shí)提供地址SI是源地址寄存器(SourceIndex)DI是目的地址寄存器(DestinationIndex)在串操作類指令中,SI、DI還有較特殊的用法

現(xiàn)在不必完全理解,以后會(huì)詳細(xì)展開(3)指針寄存器指針寄存器用于尋址內(nèi)存堆棧內(nèi)的數(shù)據(jù)SP為堆棧指針寄存器(StackPointer),指示堆棧段棧頂?shù)奈恢茫ㄆ频刂罚〣P為基址指針寄存器(BasePointer),表示數(shù)據(jù)在堆棧段中的基地址SP和BP寄存器與SS段寄存器聯(lián)合使用以確定堆棧段中的存儲(chǔ)單元地址堆棧(Stack)是主存中一個(gè)特殊的區(qū)域,采用“先進(jìn)后出”或“后進(jìn)先出”存取操作方式、而不是隨機(jī)存取方式。用8088/8086形成的微機(jī)系統(tǒng)中,堆棧區(qū)域被稱為堆棧段2.指令指針寄存器IP(InstructionPointer)為指令指針寄存器,指示主存儲(chǔ)器指令的位置隨著指令的執(zhí)行,IP將自動(dòng)修改以指示下一條指令所在的存儲(chǔ)器位置IP寄存器是一個(gè)專用寄存器IP寄存器與CS段寄存器聯(lián)合使用以確定下一條指令的存儲(chǔ)單元地址3.標(biāo)志寄存器標(biāo)志(Flag)用于反映指令執(zhí)行結(jié)果或控制指令執(zhí)行形式8088處理器的各種標(biāo)志形成了一個(gè)16位的標(biāo)志寄存器FLAGS(程序狀態(tài)字PSW寄存器)

程序設(shè)計(jì)需要利用標(biāo)志的狀態(tài)標(biāo)志寄存器-分類狀態(tài)標(biāo)志--用來記錄程序運(yùn)行結(jié)果的狀態(tài)信息,許多指令的執(zhí)行都將相應(yīng)地設(shè)置它CFZFSFPFOFAF控制標(biāo)志--可由程序根據(jù)需要用指令設(shè)置,用于控制處理器執(zhí)行指令的方式DFIFTFOF111512DF10IF9TF8SF7ZF65AF43PF21CF0標(biāo)志寄存器FLAGS進(jìn)位標(biāo)志CF(CarryFlag)當(dāng)運(yùn)算結(jié)果的最高有效位有進(jìn)位(加法)或借位(減法)時(shí),進(jìn)位標(biāo)志置1,即CF=1;否則CF=03AH+7CH=B6H,沒有進(jìn)位:CF=0AAH+7CH=(1)26H,有進(jìn)位:CF=1零標(biāo)志ZF(ZeroFlag)若運(yùn)算結(jié)果為0,則ZF=1;否則ZF=03AH+7CH=B6H,結(jié)果不是零:ZF=084H+7CH=(1)00H,結(jié)果是零:ZF=1

注意:ZF為1表示的結(jié)果是0符號(hào)標(biāo)志SF(SignFlag)運(yùn)算結(jié)果最高位為1,則SF=1;否則SF=03AH+7CH=B6H,最高位D7=1:SF=184H+7CH=(1)00H,最高位D7=0:SF=0

有符號(hào)數(shù)據(jù)用最高有效位表示數(shù)據(jù)的符號(hào)所以,最高有效位就是符號(hào)標(biāo)志的狀態(tài)奇偶標(biāo)志PF(ParityFlag)當(dāng)運(yùn)算結(jié)果最低字節(jié)中“1”的個(gè)數(shù)為零或偶數(shù)時(shí),PF=1;否則PF=03AH+7CH=B6H=10110110B結(jié)果中有5個(gè)“1”,是奇數(shù):PF=0PF標(biāo)志僅反映最低8位中“1”的個(gè)數(shù)是

偶或奇,即使是進(jìn)行16位字操作溢出標(biāo)志OF(OverflowFlag)若算術(shù)運(yùn)算的結(jié)果有溢出,則OF=1;否則OF=03AH+7CH=B6H,產(chǎn)生溢出:OF=1AAH+7CH=(1)26H,沒有溢出:OF=0?溢出和進(jìn)位的區(qū)別溢出標(biāo)志OF和進(jìn)位標(biāo)志CF是兩個(gè)意義不同的標(biāo)志進(jìn)位標(biāo)志表示無(wú)符號(hào)數(shù)運(yùn)算結(jié)果是否超出范圍,運(yùn)算結(jié)果仍然正確溢出標(biāo)志表示有符號(hào)數(shù)運(yùn)算結(jié)果是否超出范圍,運(yùn)算結(jié)果已經(jīng)不正確?輔助進(jìn)位標(biāo)志AF(AuxiliaryCarryFlag)3AH+7CH=B6H,D3有進(jìn)位:AF=1運(yùn)算時(shí)D3位(低半字節(jié))有進(jìn)位或借位時(shí),AF=1;否則AF=0方向標(biāo)志DF(DirectionFlag)用于串操作指令中,控制地址的變化方向:設(shè)置DF=0,存儲(chǔ)器地址自動(dòng)增加;設(shè)置DF=1,存儲(chǔ)器地址自動(dòng)減少CLD指令復(fù)位方向標(biāo)志:DF=0STD指令置位方向標(biāo)志:DF=1中斷允許標(biāo)志IF(Interrupt-enableFlag)控制可屏蔽中斷是否可以被處理器響應(yīng):設(shè)置IF=1,則允許中斷;設(shè)置IF=0,則禁止中斷CLI指令復(fù)位中斷標(biāo)志:IF=0STI指令置位中斷標(biāo)志:IF=1陷阱標(biāo)志TF(TrapFlag)用于控制處理器進(jìn)入單步操作方式:設(shè)置TF=0,處理器正常工作;設(shè)置TF=1,處理器單步執(zhí)行指令單步執(zhí)行指令——處理器在每條指令執(zhí)行結(jié)束時(shí),便產(chǎn)生一個(gè)編號(hào)為1的內(nèi)部中斷這種內(nèi)部中斷稱為單步中斷所以TF也稱為單步標(biāo)志利用單步中斷可對(duì)程序進(jìn)行逐條指令的調(diào)試這種逐條指令調(diào)試程序的方法就是單步調(diào)試2.1.48088/8086的存儲(chǔ)器結(jié)構(gòu)存儲(chǔ)器是計(jì)算機(jī)存儲(chǔ)信息的地方。掌握數(shù)據(jù)存儲(chǔ)格式,以及存儲(chǔ)器的分段管理對(duì)以后的匯編程序設(shè)計(jì)非常重要你能區(qū)別寄存器、存儲(chǔ)器(主存)、外存(包括硬盤、光盤、磁帶等存儲(chǔ)介質(zhì))嗎?答案寄存器、存儲(chǔ)器和外存的區(qū)別寄存器是處理器(CPU)內(nèi)部暫存數(shù)據(jù)的存儲(chǔ)單元,以名稱表示,例如:AX,BX..….等存儲(chǔ)器也就是平時(shí)所說的主存,也叫內(nèi)存,可直接與CPU進(jìn)行數(shù)據(jù)交換。主存利用地址區(qū)別外存主要指用來長(zhǎng)久保存數(shù)據(jù)的外部存儲(chǔ)介質(zhì),常見的有硬盤、光盤、磁帶、U盤等。外存的數(shù)據(jù)只能通過主存間接地與CPU交換數(shù)據(jù)程序及其數(shù)據(jù)可以長(zhǎng)久存放在外存,在運(yùn)行需要時(shí)才進(jìn)入主存1.數(shù)據(jù)的存儲(chǔ)格式計(jì)算機(jī)中信息的單位二進(jìn)制位Bit:存儲(chǔ)一位二進(jìn)制數(shù):0或1字節(jié)Byte:8個(gè)二進(jìn)制位,D7~D0字Word:16位,2個(gè)字節(jié),D15~D0雙字DWord:32位,4個(gè)字節(jié),D31~D0最低有效位LSB:數(shù)據(jù)的最低位,D0位最高有效位MSB:數(shù)據(jù)的最高位,對(duì)應(yīng)字節(jié)、字、雙字分別指D7、D15、D31位圖示存儲(chǔ)單元及其存儲(chǔ)內(nèi)容每個(gè)存儲(chǔ)單元都有一個(gè)編號(hào);被稱為存儲(chǔ)器地址每個(gè)存儲(chǔ)單元存放一個(gè)字節(jié)的內(nèi)容圖示0002H單元存放有一個(gè)數(shù)據(jù)34H表達(dá)為 [0002H]=34H多字節(jié)數(shù)據(jù)存放方式多字節(jié)數(shù)據(jù)在存儲(chǔ)器中占連續(xù)的多個(gè)存儲(chǔ)單元:存放時(shí),低字節(jié)存入低地址,高字節(jié)存入高地址;表達(dá)時(shí),用它的低地址表示多字節(jié)數(shù)據(jù)占據(jù)的地址空間。圖2-5中0002H“字”單元的內(nèi)容為:[0002H]=1234H0002H號(hào)“雙字”單元的內(nèi)容為:[0002H]=78561234H80x86處理器采用“低對(duì)低、高對(duì)高”的存儲(chǔ)形式,被稱為“小端方式LittleEndian”。相對(duì)應(yīng)還存在“大端方式BigEndian”。圖示數(shù)據(jù)的地址對(duì)齊同一個(gè)存儲(chǔ)器地址可以是字節(jié)單元地址、字單元地址、雙字單元地址等等字單元安排在偶地址(xxx0B)、雙字單元安排在模4地址(xx00B)等,為“地址對(duì)齊(Align)”(N字節(jié)數(shù)據(jù)安排的起始地址能夠被N整除)對(duì)于不對(duì)齊地址的數(shù)據(jù),處理器訪問時(shí),需要額外的訪問存儲(chǔ)器時(shí)間應(yīng)該將數(shù)據(jù)的地址對(duì)齊,以取得較高的存取速度2.存儲(chǔ)器的分段管理8088CPU有20條地址線最大可尋址空間為220=1MB物理地址范圍從00000H~FFFFFH8088CPU將1MB空間分成許多邏輯段(Segment)每個(gè)段最大限制為64KB段地址的低4位為0000B這樣,一個(gè)存儲(chǔ)單元除具有一個(gè)唯一的物理地址外,還具有多個(gè)邏輯地址物理地址和邏輯地址8088CPU存儲(chǔ)系統(tǒng)中,對(duì)應(yīng)每個(gè)物理存儲(chǔ)單元都有一個(gè)唯一的20位編號(hào),就是物理地址,從00000H~FFFFFH分段后在用戶編程時(shí),采用邏輯地址,形式為段基地址

:

段內(nèi)偏移地址分隔符物理地址14700H邏輯地址1460H:100H邏輯地址段地址說明邏輯段在主存中的起始位置8088規(guī)定段地址必須是模16地址:xxxx0H省略低4位0000B,段地址就可以用16位數(shù)據(jù)表示,就能用16位段寄存器表達(dá)段地址偏移地址說明主存單元距離段起始位置的偏移量每段不超過64KB,偏移地址也可用16位數(shù)據(jù)表示物理地址和邏輯地址的轉(zhuǎn)換將邏輯地址中的段地址左移4位,加上偏移地址就得到20位物理地址一個(gè)物理地址可以有多個(gè)邏輯地址邏輯地址 1460:100、1380:F00物理地址 14700H14700H14600H+100H14700H13800H+F00H14700H段地址左移4位加上偏移地址得到物理地址3.段寄存器8088有4個(gè)16位段寄存器CS指明代碼段的起始地址SS指明堆棧段的起始地址DS指明數(shù)據(jù)段的起始地址ES指明附加段的起始地址每個(gè)段寄存器用來確定一個(gè)邏輯段的起始地址,每種邏輯段均有各自的用途代碼段寄存器CS(CodeSegment)代碼段用來存放程序的指令序列代碼段寄存器CS存放代碼段的段地址指令指針寄存器IP指示下條指令的偏移地址處理器利用CS:IP取得下一條要執(zhí)行的指令堆棧段寄存器SS(StackSegment)堆棧段確定堆棧所在的主存區(qū)域堆棧段寄存器SS存放堆棧段的段地址堆棧指針寄存器SP指示堆棧棧頂?shù)钠频刂诽幚砥骼肧S:SP操作堆棧頂?shù)臄?shù)據(jù)數(shù)據(jù)段寄存器DS(DataSegment)數(shù)據(jù)段存放運(yùn)行程序所用的數(shù)據(jù)數(shù)據(jù)段寄存器DS存放數(shù)據(jù)段的段地址各種主存尋址方式(有效地址EA)得到存儲(chǔ)器中操作數(shù)的偏移地址處理器利用DS:EA存取數(shù)據(jù)段中的數(shù)據(jù)附加段寄存器ES(ExtraSegment)附加段是附加的數(shù)據(jù)段,也保存數(shù)據(jù):附加段寄存器ES存放附加段的段地址各種主存尋址方式(有效地址EA)得到存儲(chǔ)器中操作數(shù)的偏移地址處理器利用ES:EA存取附加段中的數(shù)據(jù)串操作指令將附加段作為其目的操作數(shù)的存放區(qū)域如何分配各個(gè)邏輯段程序的指令序列必須安排在代碼段程序使用的堆棧一定在堆棧段程序中的數(shù)據(jù)默認(rèn)是安排在數(shù)據(jù)段,也經(jīng)常安排在附加段,尤其是串操作的目的區(qū)必須是附加段數(shù)據(jù)的存放比較靈活,實(shí)際上可以存放在任何一種邏輯段中段超越前綴指令沒有指明時(shí),一般的數(shù)據(jù)訪問在DS段;使用BP訪問主存,則在SS段默認(rèn)的情況允許改變,需要使用段超越前綴指令;8088指令系統(tǒng)中有4個(gè):CS: ;代碼段超越,使用代碼段的數(shù)據(jù)SS: ;堆棧段超越,使用堆棧段的數(shù)據(jù)DS: ;數(shù)據(jù)段超越,使用數(shù)據(jù)段的數(shù)據(jù)ES: ;附加段超越,使用附加段的數(shù)據(jù)示例段超越的示例沒有段超越的指令實(shí)例:MOVAX,[2000H] ;AX←DS:[2000H];從默認(rèn)的DS數(shù)據(jù)段取出數(shù)據(jù)采用段超越前綴的指令實(shí)例:MOVAX,ES:[2000H];AX←ES:[2000H];從指定的ES附加段取出數(shù)據(jù)總結(jié)段寄存器的使用規(guī)定訪問存儲(chǔ)器的方式默認(rèn)可超越偏移地址取指令CS無(wú)IP堆棧操作SS無(wú)SP一般數(shù)據(jù)訪問DSCSESSS有效地址EABP基址的尋址方式SSCSESDS有效地址EA串操作的源操作數(shù)DSCSESSSSI串操作的目的操作數(shù)ES無(wú)DI寄存器的總結(jié)8088有8個(gè)8位通用寄存器、8個(gè)16位通用寄存器8088有6個(gè)狀態(tài)標(biāo)志和3個(gè)控制標(biāo)志8088將1MB存儲(chǔ)空間分段管理,有4個(gè)段寄存器,對(duì)應(yīng)4種邏輯段8088有4個(gè)段超越前綴指令,用于明確指定數(shù)據(jù)所在的邏輯段

熟悉上述內(nèi)容后,就可以進(jìn)入下節(jié)8088的內(nèi)部結(jié)構(gòu)1234內(nèi)部暫存器

IP

ES

SSDSCS輸入/輸出控制電路總線執(zhí)行部分控制電路∑ALU標(biāo)志寄存器AHALBHBLCHCLDHDLSPBPSIDI通用寄存器地址加法器指令隊(duì)列執(zhí)行部件(EU)總線接口部件(BIU)16位20位8位8位8088的指令執(zhí)行過程圖2-58088的存儲(chǔ)格式D7D0字節(jié)D15D0字D31D0雙字D7D000006H78H00005H56H00004H12H00003H34H00002H00001H00000H低地址LSBMSB2.28088/8086的數(shù)據(jù)尋址方式從8088/8086的指令格式入手,論述:立即數(shù)尋址方式寄存器尋址方式存儲(chǔ)器尋址方式進(jìn)而熟悉8088/8086匯編語(yǔ)言指令格式,尤其是其中操作數(shù)的表達(dá)方法為展開8088/8086指令系統(tǒng)做好準(zhǔn)備指令的助記符格式操作數(shù)2,常被稱為源操作數(shù)src,它表示參與指令操作的一個(gè)對(duì)象操作數(shù)1,成被稱為目的操作數(shù)dest,它不僅可以作為指令操作的一個(gè)對(duì)象,還可以用來存放指令操作的結(jié)果分號(hào)后的內(nèi)容是對(duì)指令的解釋

操作碼

操作數(shù)1,操作數(shù)2

;注釋匯編語(yǔ)句格式操作數(shù)的尋址方式指令系統(tǒng)設(shè)計(jì)了多種操作數(shù)的來源尋找操作數(shù)的過程就是操作數(shù)的尋址把尋找操作數(shù)的方式叫做(操作數(shù))尋址方式理解操作數(shù)的尋址方式是理解指令功能的前提操作數(shù)采取哪一種尋址方式一方面,會(huì)影響處理器執(zhí)行指令的速度和效率另一方面,對(duì)程序設(shè)計(jì)也很重要MOV指令2.2.1立即數(shù)尋址方式指令中的操作數(shù)直接存放在機(jī)器代碼中,緊跟在操作碼之后(操作數(shù)作為指令的一部分存放在操作碼之后的主存單元中)這種操作數(shù)被稱為立即數(shù)imm可以是8位數(shù)值i8(00H~FFH)也可以是16位數(shù)值i16(0000H~FFFFH)立即數(shù)尋址方式常用來給寄存器和存儲(chǔ)單元賦值,多以常量形式出現(xiàn)演示MOVAX,0102H ;AX←0102H2.2.2寄存器尋址方式操作數(shù)存放在CPU的內(nèi)部寄存器reg中:8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4個(gè)段寄存器seg:CS、DS、SS、ES寄存器名表示其內(nèi)容(操作數(shù))演示MOVAX,BX ;AX←BX2.2.3存儲(chǔ)器尋址方式操作數(shù)在主存儲(chǔ)器中,用主存地址表示程序設(shè)計(jì)時(shí),8088采用邏輯地址表示主存地址段地址在默認(rèn)的或用段超越前綴指定的段寄存器中指令中只需給出操作數(shù)的偏移地址(有效地址EA)8086設(shè)計(jì)了多種存儲(chǔ)器尋址方式1、直接尋址方式2、寄存器間接尋址方式3、寄存器相對(duì)尋址方式4、基址變址尋址方式5、相對(duì)基址變址尋址方式1.直接尋址方式直接尋址方式的有效地址在指令中直接給出默認(rèn)的段地址在DS段寄存器,可使用段超越前綴改變用中括號(hào)包含有效地址,表達(dá)存儲(chǔ)單元的內(nèi)容演示MOVAX,[2000H] ;AX←DS:[2000H]MOVAX,ES:[2000H] ;AX←ES:[2000H]2.寄存器間接尋址方式有效地址存放在基址寄存器BX或變址寄存器SI、DI中默認(rèn)的段地址在DS段寄存器,可使用段超越前綴改變演示MOVAX,[BX] ;AX←DS:[BX]3.寄存器相對(duì)尋址方式有效地址是寄存器內(nèi)容與有符號(hào)8位或16位位移量之和,寄存器可以是BX、BP或SI、DI有效地址=BX/BP/SI/DI+8/16位位移量段地址對(duì)應(yīng)BX/SI/DI寄存器默認(rèn)是DS,對(duì)應(yīng)BP寄存器默認(rèn)是SS;可用段超越前綴改變演示MOVAX,[SI+06H] ;AX←DS:[SI+06H]MOVAX,06H[SI] ;AX←DS:[SI+06H]4.基址變址尋址方式有效地址由基址寄存器(BX或BP)的內(nèi)容加上變址寄存器(SI或DI)的內(nèi)容構(gòu)成:有效地址=BX/BP+SI/DI段地址對(duì)應(yīng)BX基址寄存器默認(rèn)是DS,對(duì)應(yīng)BP基址寄存器默認(rèn)是SS;可用段超越前綴改變演示MOVAX,[BX+SI] ;AX←DS:[BX+SI]MOVAX,[BX][SI] ;AX←DS:[BX+SI]5.相對(duì)基址變址尋址方式有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個(gè)8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址對(duì)應(yīng)BX基址寄存器默認(rèn)是DS,對(duì)應(yīng)BP基址寄存器默認(rèn)是SS;可用段超越前綴改變演示MOVAX,[BX+DI+6] ;AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]存儲(chǔ)器尋址方式中的變量變量指示內(nèi)存中的數(shù)據(jù),變量名具有地址屬性。存儲(chǔ)器尋找方式中經(jīng)常采用變量形式變量的定義WVARDW1234H;定義16位變量WVAR,具有初值1234H;假設(shè)其偏移地址為10H單獨(dú)引用變量名是直接尋址方式MOVAX,WVAR;指令功能:AX=1234H;等同于MOVAX,[0010H]相對(duì)尋址方式中,變量名表示其偏移地址,相當(dāng)于位移量MOVAX,[DI+WVAR];=MOVAX,WVAR[DI];等同于MOVAX,[DI+0010H]相對(duì)尋址方式中的位移量在寄存器相對(duì)和相對(duì)基址變址尋址方式中,其位移量不僅可用常量表示,也可用符號(hào)表示這個(gè)符號(hào)可以是變量名,例如WVAR變量,而且支持多種表達(dá)形式MOVAX,[DI+WVAR];;等同于MOVAX,WVAR[DI]MOVAX,[BX+SI+WVAR]

;等同于MOVAX,[BX][SI+WVAR]

;等同于MOVAX,WVAR[BX+SI]

;等同于MOVAX,WVAR[BX][SI]操作數(shù)的表達(dá)符號(hào)尋址方式操作數(shù)符號(hào)及含義立即數(shù)尋址imm代表i8或i16,i8:一個(gè)8位立即數(shù),i16:一個(gè)16位立即數(shù)寄存器尋址reg代表r8或r16,r8:8位通用寄存器,r16:16位通用寄存器seg段寄存器存儲(chǔ)器尋址mem代表m8或m16

,m8:8位存儲(chǔ)器操作數(shù),m16:16位存儲(chǔ)器操作數(shù)

掌握操作數(shù)的尋址方式后,進(jìn)入指令學(xué)習(xí)匯編語(yǔ)言的兩種語(yǔ)句格式⑴執(zhí)行性語(yǔ)句——執(zhí)行性語(yǔ)句用于表達(dá)處理器指令(也稱為硬指令),匯編后對(duì)應(yīng)一條指令代碼。由處理器指令組成的代碼序列是程序設(shè)計(jì)的主體標(biāo)號(hào):

硬指令助記符操作數(shù),操作數(shù) ;注釋⑵說明性語(yǔ)句——說明性語(yǔ)句用于表達(dá)偽指令,指示源程序如何匯編、變量怎樣定義、過程怎么設(shè)置等名字

偽指令助記符參數(shù),參數(shù),…;注釋MOV指令的功能立即數(shù)尋址方式寄存器尋址方式直接尋址方式間接尋址方式相對(duì)尋址方式基址變址尋址方式相對(duì)基址變址尋址方式2.3數(shù)據(jù)傳送類指令數(shù)據(jù)傳送是計(jì)算機(jī)中最基本、最重要的一種操作,傳送指令也是最常使用的一類指令傳送指令把數(shù)據(jù)從一個(gè)位置傳送到另一個(gè)位置除標(biāo)志寄存器傳送指令外,均不影響標(biāo)志位重點(diǎn)掌握MOVXCHGXLATPUSHPOPLEA2.3.1通用數(shù)據(jù)傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGXLATMOVXCHGXLAT1.傳送指令MOV(move)把一個(gè)字節(jié)或字的操作數(shù)從源地址傳送至目的地址MOVreg/mem,imm;立即數(shù)送寄存器或主存MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存MOVreg/seg,mem;主存送(段)寄存器MOVreg/mem,seg;段寄存器送寄存器或主存演示MOV指令--立即數(shù)傳送movcl,4 ;cl←4,字節(jié)傳送movdx,0ffh

;dx←00ffh,字傳送movsi,200h

;si←0200h,字傳送movbvar,0ah

;字節(jié)傳送;假設(shè)bvar是一個(gè)字節(jié)變量,定義如下:bvar

db0movwvar,0bh

;字傳送;假設(shè)wvar是一個(gè)字變量,定義如下:wvar

dw0明確指令是字節(jié)操作還是字操作以字母開頭的常數(shù)要有前導(dǎo)0MOV指令--寄存器傳送mov

ah,al

;ah←al,字節(jié)傳送mov

bvar,ch

;bvar←ch

,字節(jié)傳送mov

ax,bx

;ax←bx,字傳送mov

ds,ax

;ds←ax,字傳送mov[bx],al

;[bx]←al,字節(jié)傳送

寄存器具有明確的字節(jié)和字類型MOV指令--存儲(chǔ)器傳送mov

al,[bx] ;al←ds:[bx]mov

dx,[bp] ;dx←ss:[bp+0]movdx,[bp+4] ;dx←ss:[bp+4]mov

es,[si] ;es←ds:[si]

不存在存儲(chǔ)器向存儲(chǔ)器的傳送指令MOV指令--段寄存器傳送mov[si],dsmov

ax,ds

;ax←dsmov

es,ax

;es←ax←ds

對(duì)段寄存器的操作不靈活MOV指令傳送功能圖解MOV指令也并非任意傳送!立即數(shù)段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存儲(chǔ)器非法指令的主要現(xiàn)象:兩個(gè)操作數(shù)的類型不一致無(wú)法確定是字節(jié)量還是字量操作兩個(gè)操作數(shù)都是存儲(chǔ)器段寄存器的操作有一些限制非法指令--兩個(gè)操作數(shù)類型不一致在絕大多數(shù)雙操作數(shù)指令中,目的操作數(shù)和源操作數(shù)必須具有一致的數(shù)據(jù)類型,或者同為字量,或者同為字節(jié)量,否則為非法指令

MOVAL,050AH ;非法指令,修正: ;movax,050ah MOVSI,DL ;非法指令,修正: ;movdh,0

;mov

si,dx非法指令--無(wú)法確定是字節(jié)量還是字量操作當(dāng)無(wú)法通過任一個(gè)操作數(shù)確定是操作類型時(shí),需要利用匯編語(yǔ)言的操作符顯式指明

MOV[BX+SI],255 ;非法指令,修正: ;mov

byteptr[bx+si],255

;byteptr

說明是字節(jié)操作

;mov

wordptr[bx+si],255

;wordptr

說明是字操作非法指令--兩個(gè)操作數(shù)都是存儲(chǔ)器8088指令系統(tǒng)除串操作指令外,不允許兩個(gè)操作數(shù)都是存儲(chǔ)單元(存儲(chǔ)器操作數(shù))

MOVbuf2,buf1 ;非法指令,修正:

;假設(shè)buf2和buf1是兩個(gè)字變量

;movax,buf1

;movbuf2,ax

;假設(shè)buf2和buf1是兩個(gè)字節(jié)變量

;moval,buf1

;movbuf2,al非法指令--段寄存器的操作有一些限制8088指令系統(tǒng)中,能直接對(duì)段寄存器操作的指令只有MOV等個(gè)別傳送指令,并且不靈活

MOVDS,ES ;非法指令,修正: ;mov

ax,es

;mov

ds,ax MOVDS,100H ;非法指令,修正: ;movax,100h

;mov

ds,ax

MOVCS,[SI] ;非法指令 ;指令存在,但不能執(zhí)行2.交換指令XCHG(exchange)把兩個(gè)地方的數(shù)據(jù)進(jìn)行互換寄存器與寄存器之間對(duì)換數(shù)據(jù)寄存器與存儲(chǔ)器之間對(duì)換數(shù)據(jù)不能在存儲(chǔ)器與存儲(chǔ)器之間對(duì)換數(shù)據(jù)XCHGreg,reg/mem;reg

reg/mem演示例2.2數(shù)據(jù)交換movax,1199h ;ax=1199hxchg

ah,al

;ax=9911h;等同于xchg

al,ahmovwvar,5566h ;wvar是一個(gè)字量變量xchg

ax,wvar

;ax=5566h,wvar=9911h;等同于xchg

wvar,ax

xchg

al,byte

ptrwvar+1

;ax=5599h,wvar=6611h

;“byteptrwvar+1”強(qiáng)制為字節(jié)量,只取高字節(jié)與AL類型交換,否則數(shù)據(jù)類型不匹配3.換碼指令XLAT(translate)將BX指定的緩沖區(qū)中、AL指定的位移處的一個(gè)字節(jié)數(shù)據(jù)取出賦給AL換碼指令執(zhí)行前:在主存建立一個(gè)字節(jié)量表格,內(nèi)含要轉(zhuǎn)換成的目的代碼表格首地址存放于BX,AL存放相對(duì)表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標(biāo)代碼XLAT

;al←ds:[bx+al]演示2.3.2堆棧操作指令堆棧是一個(gè)“后進(jìn)先出FILO”(或說“先進(jìn)后出FILO”)的主存區(qū)域,位于堆棧段中;SS段寄存器記錄其段地址堆棧只有一個(gè)出口,即當(dāng)前棧頂;用堆棧指針寄存器SP指定堆棧只有兩種基本操作:進(jìn)棧和出棧,對(duì)應(yīng)兩條指令PUSH和POP圖示進(jìn)棧指令PUSH進(jìn)棧指令先使堆棧指針SP減2,然后把一個(gè)字操作數(shù)存入堆棧頂部PUSHr16/m16/seg

;SP←SP-2

;SS:[SP]←r16/m16/seg演示pushaxpush[2000h]出棧指令POP出棧指令把棧頂?shù)囊粋€(gè)字傳送至指定的目的操作數(shù),然后堆棧指針SP加2POPr16/m16/seg

;r16/m16/seg←SS:[SP]

;SP←SP+2popaxpopwvar演示堆棧操作的特點(diǎn)堆棧操作的單位是字,進(jìn)棧和出棧只對(duì)字量字量數(shù)據(jù)從棧頂壓入和彈出時(shí),都是低地址字節(jié)送低字節(jié),高地址字節(jié)送高字節(jié)堆棧操作遵循先進(jìn)后出原則,但可用存儲(chǔ)器尋址方式隨機(jī)存取堆棧中的數(shù)據(jù)堆棧段是程序中不可或缺的一個(gè)內(nèi)存區(qū),常用來臨時(shí)存放數(shù)據(jù)傳遞參數(shù)保存和恢復(fù)寄存器2.3.3標(biāo)志操作指令1.標(biāo)志位操作指令CLC

;復(fù)位進(jìn)位標(biāo)志:CF←0STC

;置位進(jìn)位標(biāo)志:CF←1CMC

;求反進(jìn)位標(biāo)志:CF←~CFCLD

;復(fù)位方向標(biāo)志:DF←0STD

;置位方向標(biāo)志:DF←1CLI

;復(fù)位中斷標(biāo)志:IF←0STI

;置位中斷標(biāo)志:IF←12.標(biāo)志寄存器低字節(jié)與AH的傳送指令3.標(biāo)志寄存器出入堆棧指令將存儲(chǔ)器操作數(shù)的有效地址送至指定的16位通用寄存器有效地址傳送指令LEA(loadeffectiveaddress)LEAr16,mem;r16←mem的有效地址EA例題2.5

有效地址的獲取

movbx,400h

movsi,3ch leabx,[bx+si+0f62h]

;BX←400H+3CH+0F62H=139EH例2.6地址傳送與內(nèi)容傳送wvar

dw4142h ;假設(shè)偏移地址為04H…mov

ax,wvar

;內(nèi)容傳送:AX=4142Hleasi,wvar

;地址傳送:SI=0004H;等同于leasi,[0004h]mov

cx,[si] ;內(nèi)容傳送:CX=4142Hmov

di,offset

wvar

;=movdi,0004h

;利用操作符OFFSET獲取變量的有效地址mov

dx,[di] ;內(nèi)容傳送:DX=4142H調(diào)試程序DEBUGDEBUG是常用的匯編語(yǔ)言級(jí)調(diào)試工具,為匯編語(yǔ)言程序員提供了分析指令、跟蹤程序的有效手段常用命令:-A匯編 -U反匯編-T單步執(zhí)行 -G斷點(diǎn)執(zhí)行-D數(shù)據(jù)顯示 -R寄存器啟動(dòng)方法DOS下執(zhí)行DEBUG.EXE程序Windows9x中進(jìn)入MS-DOS環(huán)境執(zhí)行DEBUG.EXE程序Windows2000/XP/NT下運(yùn)行COMMAND命令(不是CMD命令,也不要從“命令提示符”)進(jìn)入MS-DOS環(huán)境執(zhí)行DEBUG.EXE程序MOV指令的功能XCHG指令的功能XLAT指令的功能堆棧的圖示SSSP0000H(棧頂)存儲(chǔ)器高地址堆棧段PUSH指令的功能POP指令的功能2.4算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令用來執(zhí)行二進(jìn)制的算術(shù)運(yùn)算:加減乘除。這類指令會(huì)根據(jù)運(yùn)算結(jié)果影響狀態(tài)標(biāo)志,有時(shí)要利用某些標(biāo)志才能得到正確的結(jié)果;使用他們時(shí)請(qǐng)留心有關(guān)狀態(tài)標(biāo)志重點(diǎn)掌握加法指令:ADD、ADC、INC減法指令:SUB、SBB、DEC、CMP、NEG2.4.1加法和減法指令加法指令:ADD,ADC和INC減法指令:SUB,SBB,DEC,NEG和CMP他們分別執(zhí)行字或字節(jié)的加法和減法運(yùn)算,除INC和DEC不影響CF標(biāo)志外,其他按定義影響全部狀態(tài)標(biāo)志位操作數(shù)組合:運(yùn)算指令助記符reg,imm/reg/mem運(yùn)算指令助記符mem,imm/reg1.加和減指令

ADD

dest,src

;加法:dest←dest+src

;ADD指令使目的操作數(shù)加上源操作數(shù),和的結(jié)果送到目的操作數(shù)

SUB

dest,src

;減法:dest←dest-src

;SUB指令使目的操作數(shù)減去源操作數(shù),差的結(jié)果送到目的操作數(shù)例題2.7加法movax,7348h ;AX=7348Haddal,27h

;AL=48H+27H=6FH,AX=736FH

;OF=0,SF=0,ZF=0,PF=1,CF=0addax,3fffh

;AX=736FH+3FFFH=B36EH

;OF=1,SF=1,ZF=0,PF=0,CF=0例題2.7減法subah,0f0h

;AH=B3H-F0H=C3H,AX=C36EH

;OF=0,SF=1,ZF=0,PF=1,CF=1movwordptr[200h],0ef00h

;[200H]=EF00H,標(biāo)志不變sub[200h],ax

;[200H]=EF00H-C36EH=2B92H

;OF=0,SF=0,ZF=0,PF=0,CF=0sub

si,si

;SI=0

;OF=0,SF=0,ZF=1,PF=1,CF=02.帶進(jìn)位加和減指令A(yù)DC

dest,src

;加法:dest←dest+src+CF

;ADC指令除完成ADD加法運(yùn)算外,還要加上進(jìn)位CF,結(jié)果送到目的操作數(shù)SBB

dest,src

;減法:dest←dest-src-CF

;SBB指令除完成SUB減法運(yùn)算外,還要減去借位CF,結(jié)果送到目的操作數(shù)例2.8無(wú)符號(hào)雙字加法和減法movax,7856h ;AX=7856Hmovdx,8234h ;DX=8234Haddax,8998h ;AX=01EEH,CF=1adcdx,1234h ;DX=9469H,CF=0subax,4491h ;AX=BD5DH,CF=1sbbdx,8000h ;DX=1468H,CF=0DX.AX=82347856H+12348998H-80004491H=1468BD5DH3.比較指令CMP(compare)CMP

dest,src

;做減法運(yùn)算:dest-src

;CMP指令將目的操作數(shù)減去源操作數(shù),但差值不回送目的操作數(shù)比較指令通過減法運(yùn)算影響狀態(tài)標(biāo)志,用于比較兩個(gè)操作數(shù)的大小關(guān)系cmp

ax,bxcmpal,1004.增量和減量指令I(lǐng)NCreg/mem

;增量(加1):reg/mem←reg/mem+1DECreg/mem

;減量(減1):reg/mem←reg/mem-1INC指令和DEC指令是單操作數(shù)指令與加法和減法指令實(shí)現(xiàn)的加1和減1不同的是:INC和DEC不影響CF標(biāo)志incsi

;si←si+1decbyteptr[si] ;[si]←[si]-15.求補(bǔ)指令NEG(negtive)NEGreg/mem

;reg/mem←0-reg/memNEG指令對(duì)操作數(shù)執(zhí)行求補(bǔ)運(yùn)算,即用零減去操作數(shù),然后結(jié)果返回操作數(shù)求補(bǔ)運(yùn)算也可以表達(dá)成:將操作數(shù)按位取反后加1NEG指令對(duì)標(biāo)志的影響與用零作減法的SUB指令一樣NEG指令也是一個(gè)單操作數(shù)指令2.4.2符號(hào)擴(kuò)展指令符號(hào)擴(kuò)展是指用一個(gè)操作數(shù)的符號(hào)位(最高位)形成另一個(gè)操作數(shù),后一個(gè)操作數(shù)的高位是全0(正數(shù))或全1(負(fù)數(shù))符號(hào)擴(kuò)展雖然使數(shù)據(jù)位數(shù)加長(zhǎng),但數(shù)據(jù)大小并沒有改變,擴(kuò)展的高部分僅是低部分的符號(hào)擴(kuò)展符號(hào)擴(kuò)展指令有兩條,用來將字節(jié)轉(zhuǎn)換為字,字轉(zhuǎn)換為雙字

CBW

;AL符號(hào)擴(kuò)展成AX

CWD

;AX符號(hào)擴(kuò)展成DX例題2.10符號(hào)擴(kuò)展moval,64h

;AL=64H(機(jī)器數(shù))

,表示10進(jìn)制數(shù)100(真值)cbw

;將符號(hào)0擴(kuò)展,AX=0064H,仍然表示100movax,0ff00h

;AX=FF00H,表示有符號(hào)10進(jìn)制數(shù)-256cwd

;將符號(hào)位“1”擴(kuò)展,DX.AX=FFFFFF00H

;仍然表示-2562.4.3乘法和除法指令乘法指令分無(wú)符號(hào)和有符號(hào)乘法指令MULreg/mem

;無(wú)符號(hào)乘法IMULreg/mem

;有符號(hào)乘法除法指令分無(wú)符號(hào)和有符號(hào)除法指令DIVreg/mem

;無(wú)符號(hào)除法IDIVreg/mem

;有符號(hào)除法乘法指令

乘法運(yùn)算是雙操作數(shù)運(yùn)算,但是,在指令中卻只指定一個(gè)操作數(shù),另一個(gè)操作數(shù)是隱含規(guī)定的。

根據(jù)乘法運(yùn)算的隱含規(guī)則,其中的操作數(shù)可以是寄存器操作數(shù)或存儲(chǔ)器操作數(shù)(不能是立即數(shù)),而隱含的為AL或AX。

兩個(gè)8位數(shù)相乘,其結(jié)果是16位數(shù);兩個(gè)16位數(shù)相乘,其結(jié)果是32位數(shù)。操作數(shù)位數(shù)決定了是8位還是16位乘法。乘法指令乘法指令 MULCX ;(DX:AX)=(AX)*(CX),為字操作 IMULCL ;(AX)=(AL)*(CL),為字節(jié)操作

下列指令是非法的。 MULAL,BL

;DST(被乘數(shù))應(yīng)為隱含尋址 IMUL05H ;

SRC(乘數(shù))不能為立即數(shù)尋址乘法指令例:字節(jié)×字運(yùn)算:計(jì)算兩個(gè)有符號(hào)數(shù)15H、FB78H的乘積。解:實(shí)際上,有符號(hào)數(shù)FB78H為負(fù)數(shù)。程序段為:

MOV AL,15H CBW

;將AL的內(nèi)容擴(kuò)展為16位有符號(hào)數(shù) MOV BX,0FB78H IMUL BX (DX,AX)=(AX)×(BX)除法指令除法指令(DIV,IDIV)

除法運(yùn)算也是雙操作數(shù)運(yùn)算,它的隱含規(guī)則操作數(shù)與乘法指令相同。

在除法運(yùn)算中,如果除數(shù)8位的,則要求被除數(shù)是16位的;如果除數(shù)是16位的,則要求被除數(shù)是32位的。除法指令除法指令規(guī)則除法指令DIVSRC ;無(wú)符號(hào)數(shù)的除法IDIVSRC ;有符號(hào)數(shù)的除法

除法不允許出現(xiàn)除數(shù)為0或商溢出,若發(fā)生除數(shù)為0或商溢出則其結(jié)果沒有意義,并引起中斷。

DIVBL ;AX÷BLIDIVCX ;DA,AX÷CXDIVWORDPTR[BX][SI];

DX,AX÷[BX+SI]單元的字除法指令例:有符號(hào)數(shù)字節(jié)÷字節(jié)的除法運(yùn)算。設(shè)要完成除法運(yùn)算—16÷53。(數(shù)據(jù)存放在字節(jié)單元中)解:應(yīng)該先將字節(jié)變?yōu)樽?,再進(jìn)行除法運(yùn)算。 DA1 DB —16 DA2 DB 53 …… MOV AL,DA1 CBW ;將AL中的有符號(hào)數(shù)變?yōu)?6位數(shù) MOV BL,DA2 IDIV BL2.4.4十進(jìn)制調(diào)整指令十進(jìn)制數(shù)調(diào)整指令對(duì)二進(jìn)制運(yùn)算的結(jié)果進(jìn)行十進(jìn)制調(diào)整,以得到十進(jìn)制的運(yùn)算結(jié)果,以此實(shí)現(xiàn)十進(jìn)制BCD碼運(yùn)算8088指令系統(tǒng)支持兩種BCD碼調(diào)整運(yùn)算壓縮BCD碼就是通常的8421碼;它用4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位,一個(gè)字節(jié)可以表示兩個(gè)十進(jìn)制位,即00~99非壓縮BCD碼用8個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位,只用低4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位0~9,高4位任意,通常默認(rèn)為0編碼的比較真值(十進(jìn)制) 8 64二進(jìn)制編碼 08H 40H壓縮BCD碼 08H 64H非壓縮BCD碼 08H 0604HASCII碼 38H 3634H壓縮BCD碼加減法調(diào)整指令DAADAS非壓縮BCD碼加減乘除法調(diào)整指令A(yù)AAAASAAMAAD十進(jìn)制調(diào)整指令 實(shí)現(xiàn)BCD十進(jìn)制調(diào)整的指令有六個(gè),它們一般緊跟在相應(yīng)運(yùn)算指令之后。1)加法的十進(jìn)制調(diào)整(AAA,DAA)AAA ;加法分離BCD碼調(diào)整DAA ;加法組合BCD碼調(diào)整 AAA指令為分離BCD碼加法運(yùn)算后的調(diào)整指令,表示對(duì)相加結(jié)果AL的低4位進(jìn)行加6修正。 DAA指令為組合BCD碼加法運(yùn)算后的調(diào)整指令,表示對(duì)相加結(jié)果AL的低4位和高4位分別進(jìn)行加6修正。十進(jìn)制調(diào)整指令例:計(jì)算4+8,采用分離BCD碼解: MOVAL,4 MOVBL,8 ADDAL,BL AAA結(jié)果:AL=02H,CF=1例:計(jì)算34+28,采用組合BCD碼解: MOVAL,34H MOVBL,28H ADDAL,BL DAA結(jié)果:AL=62H,CF=0十進(jìn)制調(diào)整指令例:多字節(jié)組合十進(jìn)制加法:將1000H開始的8字節(jié)十進(jìn)制十進(jìn)制數(shù)與2000H開始的8字節(jié)數(shù)相加,結(jié)果放到2000H開始單元。

MOV SI,1000H ;SI指向第一個(gè)數(shù)據(jù)

MOV DI,2000H ;DI指向第二個(gè)數(shù)據(jù)

MOV CX,8 ;字節(jié)長(zhǎng)度

CLC ;清除進(jìn)位標(biāo)志LOOP1: MOV AL,[SI] ;取第一個(gè)字節(jié)

ADC AL,[DI] ;加上第二個(gè)字節(jié)

DAA ;十進(jìn)制調(diào)整

MOV [DI],AL ;存放結(jié)果

INC SI INC DI ;修改指針

DEC CX ;計(jì)數(shù)

JNZ LOOP1 ……十進(jìn)制調(diào)整指令2)減法的十進(jìn)制調(diào)整(AAS、DAS)AAS;減法分離BCD碼調(diào)整DAS;減法組合BCD碼調(diào)整 AAS指令為分離BCD碼減法運(yùn)算后的調(diào)整指令,表示對(duì)相減結(jié)果AL的低4位進(jìn)行減6修正。 DAS指令為組合BCD碼減法運(yùn)算后的調(diào)整指令,表示對(duì)相減結(jié)果AL的低4位和高4位分別進(jìn)行減6修正。十進(jìn)制調(diào)整指令例:計(jì)算5-9,采用分離BCD碼解: MOVAL,05H MOVBL,09H SUBAL,BL AAS結(jié)果:AL=04H,CF=1例:計(jì)算31-87,采用組合BCD碼。解: MOVAL,31H MOVBL,87H SUBAL,BL DAS結(jié)果:AL=56H,CF=1十進(jìn)制調(diào)整指令3)乘法的十進(jìn)制調(diào)整(AAM)AAM;乘法分離BCD碼調(diào)整 AAM為分離BCD碼乘法的調(diào)整指令,兩個(gè)分離BCD碼相乘之后,需用AAM調(diào)整。例:計(jì)算7×8解: MOV AL,7 MOV BL,8 MUL BL AAM結(jié)果:AX=0506H十進(jìn)制調(diào)整指令4)除法的十進(jìn)制調(diào)整(AAD)AAD ;除法分離BCD碼調(diào)整 AAD為分離BCD碼除法的調(diào)整指令,兩個(gè)分離BCD碼除法指令之前應(yīng)采用AAD進(jìn)行調(diào)整。例:計(jì)算27÷4。解: MOVAX,0207H MOVBL,4 AAD ;(AX)←001BH DIVBL結(jié)果:AL=06H,AH=03H2.5位操作類指令位操作類指令以二進(jìn)制位為基本單位進(jìn)行數(shù)據(jù)的操作當(dāng)需要對(duì)字節(jié)或字?jǐn)?shù)據(jù)中的各個(gè)二進(jìn)制位操作時(shí),可以考慮采用位操作類指令注意這些指令對(duì)標(biāo)志位的影響1.邏輯運(yùn)算指令A(yù)NDORXORNOTTEST2.移位指令SHLSHRSAR3.循環(huán)移位指令ROLRORRCLRCR2.5.1邏輯運(yùn)算指令雙操作數(shù)邏輯指令A(yù)ND、OR、XOR和TEST設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對(duì)AF未定義;它們的操作數(shù)組合與ADD、SUB等一樣:運(yùn)算指令助記符reg,imm/reg/mem運(yùn)算指令助記符mem,imm/reg

單操作數(shù)邏輯指令NOT不影響標(biāo)志位,操作數(shù)與INC、DEC和NEG一樣:NOTreg/mem邏輯與指令A(yù)ND對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送目的操作數(shù)ANDdest,src

;dest←dest∧src

只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為0邏輯或指令OR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送目的操作數(shù)ORdest,src

;dest←dest∨src只要相“或”的兩位有一位是1,結(jié)果就是1;否則,結(jié)果為0邏輯異或指令XOR對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送目的操作數(shù)XORdest,src

;dest←dest⊕src只有相“異或”的兩位不相同,結(jié)果才是1;否則,結(jié)果為0測(cè)試指令TEST對(duì)兩個(gè)操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果并不送目的操作數(shù),僅按AND指令影響標(biāo)志用TEST指令來檢測(cè)指定位是1還是0。 TEST AL,08H ;測(cè)試AL的D3是0還是1。如果ZF=1,說明D3位為0。TESTdest,src

;dest∧src

AND與TEST指令的關(guān)系,同SUB與CMP指令的關(guān)系一樣邏輯非指令NOT對(duì)一個(gè)操作數(shù)執(zhí)行邏輯非運(yùn)算NOTreg/mem

;reg/mem←~reg/mem

按位取反,原來是“0”的位變?yōu)椤?”;原來是“1”的位變?yōu)椤?”例2.13邏輯運(yùn)算moval,75h ;AL=75Handal,32h ;AL=30H

;CF=OF=0,SF=0,ZF=0,PF=1oral,71h ;AL=71H

;CF=OF=0,SF=0,ZF=0,PF=1xoral,0f1h ;AL=80H

;CF=OF=0,SF=1,ZF=0,PF=0notal ;AL=7FH,標(biāo)志不變例2.14邏輯運(yùn)算指令的應(yīng)用andbl,11110110b

;BL中D0和D3清0,其余位不變orbl,00001001b

;BL中D0和D3置1,其余位不變xorbl,00001001b

;BL中D0和D3求反,其余位不變

AND指令可用于某些位置0(同0相與),不影響其他位

OR指令可用于某些位置1(同1相或),不影響其他位

XOR指令可用于某些位取反(同1相異或),不影響其他位TEST指令可用于測(cè)試某些位為0或?yàn)?2.5.2移位指令將操作數(shù)移動(dòng)一位或多位,分成邏輯移位和算術(shù)移位,分別具有左移或右移操作移位指令的第一個(gè)操作數(shù)是指定的被移位的操作數(shù),可以是寄存器或存儲(chǔ)單元;后一個(gè)操作數(shù)表示移位位數(shù):該操作數(shù)為1,表示移動(dòng)一位該操作數(shù)為CL,CL寄存器值表示移位位數(shù)(移位位數(shù)大于1只能CL表示)按照移入的位設(shè)置進(jìn)位標(biāo)志CF,根據(jù)移位后的結(jié)果影響SF、ZF、PF邏輯左移指令SHLSHLreg/mem,1/CL

;reg/mem左移1或CL位 ;最低位補(bǔ)0,最高位進(jìn)入CF演示邏輯右移指令SHRSHRreg/mem,1/CL

;reg/mem右移1/CL位 ;最高位補(bǔ)0,最低位進(jìn)入CF演示算術(shù)左移指令SALSALreg/mem,1/CL

;與SHL是同一條指令演示算術(shù)右移指令SARSARreg/mem,1/CL

;reg/mem右移1/CL位 ;最高位不變,最低位進(jìn)入CF演示例2.15數(shù)據(jù)移位movdx,6075h

;DX=0110000001110101Bshldx,1

;DX=1100000011101010B

;CF=0,SF=1、ZF=0、PF=0sardx,1

;DX=1110000001110101B

;CF=0,SF=1、ZF=0、PF=0shrdx,1

;DX=0111000000111010B ;CF=1,SF=0、ZF=0、PF=1movcl,4

;CL=4,標(biāo)志不變sar

dx,cl

;DX=0000011100000011B

;CF=1,SF=0、ZF=0、PF=1例2.16將AL寄存器中的無(wú)符號(hào)數(shù)乘以10xor

ah,ah

;實(shí)現(xiàn)AH=0,同時(shí)使CF=0shlax,1

;AX←2×ALmov

bx,ax

;BX←AX=2×ALshlax,1

;AX←4×ALshlax,1

;AX←8×ALaddax,bx

;AX←8×AL+2×AL=10×ALsubah,ahandah,0

邏輯左移一位相當(dāng)于無(wú)符號(hào)數(shù)乘以2

邏輯右移一位相當(dāng)于無(wú)符號(hào)數(shù)除以22.5.3循環(huán)移位指令循環(huán)移位指令類似移位指令,但要將從一端移出的位返回到另一端形成循環(huán)。分為:ROLreg/mem,1/CL

;不帶進(jìn)位循環(huán)左移RORreg/mem,1/CL

;不帶進(jìn)位循環(huán)右移RCLreg/mem,1/CL ;帶進(jìn)位循環(huán)左移RCRreg/mem,1/CL ;帶進(jìn)位循環(huán)右移循環(huán)移位指令的操作數(shù)形式與移位指令相同,按指令功能設(shè)置進(jìn)位標(biāo)志CF,但不影響SF、ZF、PF、AF標(biāo)志演示演示演示演示32位數(shù)據(jù)移位;將DX.AX中32位數(shù)值左移一位shlax,1rcldx,1DXAXCF0考慮32位數(shù)據(jù)的右移等操作例2.18非壓縮BCD碼合并為壓縮BCD;DBCD有2位非壓縮BCD碼mov

dl,dbcd

;取低字節(jié)anddl,0fh

;只要低4位movdh,dbcd+1

;取高字節(jié)movcl,4shl

dh,cl

;低4位移到高4位ordl,dh

;合并到DLrol

dh,clrcr

dh,clNo!SHL和SAL指令的功能SHR指令的功能SAR指令的功能ROL指令的功能ROR指令的功能RCL指令的功能RCR指令的功能2.6控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令用于實(shí)現(xiàn)分支、循環(huán)、過程等程序結(jié)構(gòu),是僅次于傳送指令的常用指令重點(diǎn)掌握:

JMP/Jcc/LOOP/JCXZ

CALL/RET

INT

n/IRET

常用系統(tǒng)功能調(diào)用

控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實(shí)現(xiàn)程序執(zhí)行順序的改變目標(biāo)地址的尋址方式相對(duì)尋址方式指令代碼中提供目的地址相對(duì)于當(dāng)前IP的位移量,轉(zhuǎn)移到的目的地址(轉(zhuǎn)移后的IP值)就是當(dāng)前IP值加上位移量直接尋址方式指令代碼中提供目的邏輯地址,轉(zhuǎn)移后的CS和IP值直接來自指令操作碼后的目的地址操作數(shù)間接尋址方式指令代碼中指示寄存器或存儲(chǔ)單元,目的地址從寄存器或存儲(chǔ)單元中間接獲得用標(biāo)號(hào)表達(dá)用標(biāo)號(hào)表達(dá)用寄存器或存儲(chǔ)器操作數(shù)表達(dá)目標(biāo)地址的尋址范圍:段內(nèi)尋址段內(nèi)轉(zhuǎn)移——近轉(zhuǎn)移(near)在當(dāng)前代碼段64KB范圍內(nèi)轉(zhuǎn)移(±32KB范圍)不需要更改CS段地址,只要改變IP偏移地址段內(nèi)轉(zhuǎn)移——短轉(zhuǎn)移(short)轉(zhuǎn)移范圍可以用一個(gè)字節(jié)表達(dá),在段內(nèi)-128~+127范圍的轉(zhuǎn)移代碼段代碼段目標(biāo)地址的尋址范圍:段間尋址段間轉(zhuǎn)移——遠(yuǎn)轉(zhuǎn)移(far)從當(dāng)前代碼段跳轉(zhuǎn)到另一個(gè)代碼段,可以在1MB范圍需要更改CS段地址和IP偏移地址目標(biāo)地址必須用一個(gè)32位數(shù)表達(dá),叫做32位遠(yuǎn)指針,它就是邏輯地址代碼段代碼段

實(shí)際編程時(shí),匯編程序會(huì)根據(jù)目標(biāo)地址的屬性,自動(dòng)處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移程序員可用操作符short、nearptr

或farptr

強(qiáng)制成為需要的轉(zhuǎn)移類型2.6.1無(wú)條件轉(zhuǎn)移指令只要執(zhí)行無(wú)條件轉(zhuǎn)移指令JMP,就使程序轉(zhuǎn)到指定的目標(biāo)地址,從目標(biāo)地址處開始執(zhí)行指令操作數(shù)label是要轉(zhuǎn)移到的目標(biāo)地址(目的地址、轉(zhuǎn)移地址)JMP指令分成4種類型:⑴段內(nèi)轉(zhuǎn)移、相對(duì)尋址⑵段內(nèi)轉(zhuǎn)移、間接尋址⑶段間轉(zhuǎn)移、直接尋址⑷段間轉(zhuǎn)移、間接尋址JMPlabel

;程序轉(zhuǎn)向label標(biāo)號(hào)指定的地址無(wú)條件轉(zhuǎn)移指令JMP(jump)JMPlabel ;段內(nèi)轉(zhuǎn)移、相對(duì)尋址

;IP←IP+位移量

JMPr16/m16 ;段內(nèi)轉(zhuǎn)移、間接尋址

;IP←r16/m16

JMPfarptrlabel ;段間轉(zhuǎn)移、直接尋址

;IP←偏移地址,CS←段地址

JMPfarptr

mem

;段間轉(zhuǎn)移,間接尋址

;IP←[mem],CS←[mem+2]演示演示演示演示演示2.6.2條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令Jcc根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移。其通用格式為:

Jcclabel ;條件滿足,發(fā)生轉(zhuǎn)移 ;IP←IP+8位位移量;

;否則,順序執(zhí)行l(wèi)abel是一個(gè)標(biāo)號(hào)、一個(gè)8位位移量,表示Jcc指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移label只支持短轉(zhuǎn)移的相對(duì)尋址方式Jcc指令的分類Jcc指令不影響標(biāo)志,但要利用標(biāo)志(表2-3)根據(jù)利用的標(biāo)志位不同,分成三種情況:⑴判斷單個(gè)標(biāo)志位狀態(tài)⑵比較無(wú)符號(hào)數(shù)高低⑶比較有符號(hào)數(shù)大小

Jcc指令實(shí)際雖然只有16條,但卻有30個(gè)助記符采用多個(gè)助記符,目的是為了方便記憶和使用1.判斷單個(gè)標(biāo)志位狀態(tài)⑴

JZ/JE和JNZ/JNE

利用零標(biāo)志ZF,判斷結(jié)果是否為零(或相等)⑵JS和JNS

利用符號(hào)標(biāo)志SF,判斷結(jié)果是正是負(fù)⑶JO和JNO

利用溢出標(biāo)志OF,判斷結(jié)果是否產(chǎn)生溢出⑷JP/JPE和JNP/JPO

利用奇偶標(biāo)志PF,判斷結(jié)果中“1”的個(gè)數(shù)是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE

利用進(jìn)位標(biāo)志CF,判斷結(jié)果是否進(jìn)位或借位例題2.19題目:將AX中存放的無(wú)符號(hào)數(shù)除以2,如果是奇數(shù)則加1后除以2問題:如何判斷AX中的數(shù)據(jù)是奇數(shù)還是偶數(shù)?解答:判斷AX最低位是“0”(偶數(shù)),還是“1”(奇數(shù))??梢杂梦徊僮黝愔噶?:用邏輯與指令將除最低位外的其他位變成0,保留最低位不變。判斷這個(gè)數(shù)據(jù)是0,AX就是偶數(shù);否則,為奇數(shù)2:將最低位用移位指令移至進(jìn)位標(biāo)志,判斷進(jìn)位標(biāo)志是0,AX就是偶數(shù);否則,為奇數(shù)3:將最低位用移位指令移至最高位(符號(hào)位),判斷符號(hào)標(biāo)志是0,AX就是偶數(shù);否則,為奇數(shù)例題2.19解答1用JZ指令實(shí)現(xiàn) testax,01h;測(cè)試AX的最低位D0(不用AND指令,以免改變AX)

jz

even;標(biāo)志ZF=1,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移

addax,1;標(biāo)志ZF=0,即D0=1:AX內(nèi)的奇數(shù),加1even:

shrax,1

;AX←AX÷2用右移一位的方法實(shí)現(xiàn)除以2。本例中用RCR指令比SHR指令更好。例題2.19解答2用JNC指令實(shí)現(xiàn)

mov

bx,ax

shrbx,1;將AX的最低位D0移進(jìn)CF

jnc

even;標(biāo)志CF=0,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移

addax,1;標(biāo)志CF=1,即D0=1:AX內(nèi)的奇數(shù),加1even:

shrax,1

;AX←AX÷2還可用SAR、ROR和RCR指令例題2.19解答3用JNS指令實(shí)現(xiàn)

mov

bx,ax

rorbx,1;將AX的最低位D0移進(jìn)最高位(符號(hào)位SF)

jns

even;標(biāo)志SF=0,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移

addax,1;標(biāo)志SF=1,即D0=1:AX內(nèi)的奇數(shù),加1even:

shrax,1

;AX←AX÷2錯(cuò)誤!循環(huán)指令不影響SF等標(biāo)志ADDBX,0

;增加一條指令例2.20判斷是否為字母Y;寄存器AL中是字母Y(含大小寫),則令A(yù)H=0,否則令A(yù)H=-1

cmp

al,’y’ ;比較AL與小寫字母y

jenext

;相等,轉(zhuǎn)移

cmp

al,’Y’ ;不相等, ;繼續(xù)比較AL與大寫字母Y

jenext

;相等,轉(zhuǎn)移

movah,-1

;不相等,令A(yù)H=-1

jmpdone

;無(wú)條件轉(zhuǎn)移指令next: movah,0

;相等的處理:令A(yù)H=0done: ……例2.21偶校驗(yàn);對(duì)DL寄存器中8位數(shù)據(jù)進(jìn)行偶校驗(yàn);校驗(yàn)位存入CF標(biāo)志

testdl,0ffh

;使CF=0,同時(shí)設(shè)置PF標(biāo)志

jpe

done

;DL中“1”的個(gè)數(shù)為偶數(shù)

;正好CF=0,轉(zhuǎn)向done

stc

;DL中“1”的個(gè)數(shù)為奇數(shù),設(shè)置CF=1done:

;完成2.比較數(shù)值大小:無(wú)符號(hào)數(shù)的高低無(wú)符號(hào)數(shù)的大小用高(Above)、低(Below)表示,需要利用CF確定高低、利用ZF標(biāo)志確定相等(Equal)兩數(shù)的高低分成4種關(guān)系,對(duì)應(yīng)4條指令JB(JNAE):目的操作數(shù)低于(不高于等于)源操作數(shù)JNB(JAE):目的操作數(shù)不低于(高于等于)源操作數(shù)JBE(JNA):目的操作數(shù)低于等于(不高于)源操作數(shù)JNBE(JA):目的操作數(shù)不低于等于(高于)源操作數(shù)2.比較數(shù)值大?。河蟹?hào)數(shù)的大小判斷有符號(hào)數(shù)的大(Greater)、?。↙ess),需要組合OF、SF標(biāo)志、并利用ZF標(biāo)志確定相等與否兩數(shù)的大小分成4種關(guān)系,分別對(duì)應(yīng)4條指令JL(JNGE):目的操作數(shù)小于(不大于等于)源操作數(shù)JNL(JGE):目的操作數(shù)不小于(大于等于)源操作數(shù)JLE(JNG):目的操作數(shù)小于等于(不大于)源操作數(shù)JNLE(JG):目的操作數(shù)不小于等于(大于)源操作數(shù)例2.22求較大值

cmp

ax,bx

;比較AX和BX

jaenext ;若AX≥BX,轉(zhuǎn)移

xchg

ax,bx

;若AX<BX,交換next: mov

wmax,ax如果AX和BX存放的是有符號(hào)數(shù),則條件轉(zhuǎn)移指令應(yīng)采用JGE指令例2.22求較大值(另解)

cmp

ax,bx

;比較AX和BX

jae

next

mov

wmax,bx

;若AX<BX,wmax←BX

jmp

donenext: mov

wmax,ax

;若AX≥BX,wmax

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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)論