匯編語(yǔ)言講義第三章-80x86的尋址方式_第1頁(yè)
匯編語(yǔ)言講義第三章-80x86的尋址方式_第2頁(yè)
匯編語(yǔ)言講義第三章-80x86的尋址方式_第3頁(yè)
匯編語(yǔ)言講義第三章-80x86的尋址方式_第4頁(yè)
匯編語(yǔ)言講義第三章-80x86的尋址方式_第5頁(yè)
已閱讀5頁(yè),還剩51頁(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)介

第3章尋址方式一、數(shù)據(jù)尋址方式:與數(shù)據(jù)有關(guān)的尋址方式〔1〕16位尋址:操作數(shù)的偏移地址由16位二進(jìn)制數(shù)組成,段地址保存在CS、DS、ES、SS中,20位物理地址是由段基地址加上操作數(shù)的偏移地址形成的,最大尋址空間為1MB。〔2〕32位尋址:32位微處理器在保護(hù)模式下的一種尋址方式,需要提供32位偏移地址。80x86從386起就把機(jī)器字長(zhǎng)從16位增加在32位,相應(yīng)的16位存放器也擴(kuò)展為32位存放器〔EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI〕。兼容了16位尋址。在實(shí)模式下,這兩種尋址方式可同時(shí)使用,但段的大小被限制在64KB之內(nèi)。8086、80286不支持32位尋址方式。

二、指令尋址方式:與轉(zhuǎn)移地址有關(guān)的尋址方式尋址方式:尋找數(shù)據(jù)和指令存放地址的方式。微型計(jì)算機(jī)系統(tǒng)的每一條指令通常由操作碼字段和操作數(shù)字段兩局部組成?!?〕操作碼字段:指出進(jìn)行什么操作。每條指令都有自己的操作碼;〔2〕操作數(shù)字段:指出大多數(shù)指令涉及的操作數(shù)和操作結(jié)果放在何處。①指出操作數(shù)的值為多少。②指出放在什么地方。③指出操作結(jié)果送到哪里去。三種類型的操作數(shù):〔1〕立即數(shù)操作數(shù):指令中直接給出數(shù)據(jù),即立即數(shù)。〔2〕存放器操作數(shù):操作數(shù)在存放器中?!?〕存儲(chǔ)器操作數(shù):操作數(shù)在存儲(chǔ)器〔內(nèi)存〕中??梢允菙?shù)據(jù)的地址,或其它能間接獲得操作數(shù)的信息。操作數(shù)的設(shè)置情況:〔1〕有些指令需要一個(gè)操作數(shù)。例如:DECAL〔2〕有些指令需要兩個(gè)操作數(shù)。例如:MOVAX,BXADDAX,BX〔3〕有些指令不需要操作數(shù)。例如:HLT有效地址:EA=基址+〔變址×比例因子〕+位移量〔X〕〔1〕位移量:是存放在指令中的一個(gè)8位、16位和32位的數(shù),但它不是立即數(shù),而是一個(gè)地址?!?〕基址:是存放在基址存放器中的內(nèi)容。它通常用來(lái)訪問(wèn)數(shù)組中的某個(gè)元素或字符串中的某個(gè)字符。〔3〕變址:是存放在變址存放器中的內(nèi)容。它通常用來(lái)訪問(wèn)數(shù)組中的某個(gè)元素或字符串中的某個(gè)字符。〔4〕比例因子:是386及其后繼機(jī)型中新增加尋址方式中的一個(gè)術(shù)語(yǔ),其值可為1、2、4、8。在尋址中,可用變址存放器的內(nèi)容乘以比例因子來(lái)取得變址值。這類尋址方式對(duì)訪問(wèn)長(zhǎng)度為2、4、8字節(jié)的數(shù)組特別有用。操作數(shù)字段指出操作結(jié)果送到哪里去。有些指令需要兩個(gè)操作數(shù)。目的操作數(shù),源操作數(shù)例MOVAX,BX;〔BX〕→AX例ADDAX,BX;〔AX〕+〔BX〕→AX例SUBAX,BX;〔AX〕-〔BX〕→AX與數(shù)據(jù)有關(guān)的尋址方式

16位尋址立即尋址方式存放器尋址方式直接尋址方式存放器間接尋址方式存放器相對(duì)尋址方式基址加變址尋址方式相對(duì)基址加變址尋址方式尋址方式可能有三種情況:操作數(shù)包含在指令中,即指令的操作數(shù)字段就包含著操作數(shù)本身。這種尋址方式稱為立即尋址,這種操作數(shù)就稱為立即數(shù)。操作數(shù)包含在CPU的某一個(gè)內(nèi)部存放器中,這時(shí)指令中的操作數(shù)字段是CPU內(nèi)部存放器的一個(gè)編碼,這種尋址方式稱為存放器尋址。操作數(shù)在內(nèi)存的數(shù)據(jù)區(qū)〔存儲(chǔ)器〕中,這時(shí)指令中的操作數(shù)字段包含著此操作數(shù)的地址。8086/8088系統(tǒng)中的任何內(nèi)存地址是由兩局部組成的,即段基地址和偏移地址。為了適應(yīng)要處理的各種數(shù)據(jù)結(jié)構(gòu)的需要,這個(gè)段內(nèi)偏移地址可以由幾個(gè)局部組成,把它稱為有效地址EA。1、立即尋址方式:n所提供的操作數(shù)〔立即數(shù)〕緊跟在操作碼的后面,與操作碼一起放在指令代碼段中。立即數(shù)可以是8位數(shù)或16位數(shù)。只能用于源操作數(shù)字段,不能用于目的操作數(shù)字段,經(jīng)常用于給存放器賦初值。

例1MOVAL,18;18→AL執(zhí)行后:〔AL〕=12H

例2MOVAX,2000H;2000H→AL執(zhí)行后:〔AX〕=2000H…E8H00H20H………CS以下為錯(cuò)誤的指令:MOV18,AL;18←AL2、存放器尋址方式:R操作數(shù)包含于CPU的內(nèi)部存放器之中。存放器名是操作數(shù)的符號(hào)地址,存放器的內(nèi)容是指令所需的操作數(shù)。例3INCAX;〔AX〕+1→AX執(zhí)行前:〔AX〕=3344H執(zhí)行后:〔AX〕=3345H例4DECCX;〔CX〕-1→CX執(zhí)行前:〔CX〕=78H執(zhí)行后:〔CX〕=77H例5ADDAX,BX;〔AX〕+〔BX〕→AX執(zhí)行前:〔AX〕=1234H,〔BX〕=5620H執(zhí)行后:〔AX〕=6854H,〔BX〕=5620H例6MOVAX,BX;〔BX〕→AX執(zhí)行前:〔AX〕=6789H,〔BX〕=0000H執(zhí)行后:〔AX〕=0000H,〔BX〕=0000H以下為錯(cuò)誤的指令:例MOVAL,256

例MOVAX,20000H例MOVAL,BX3、直接尋址方式:[n]操作數(shù)在存儲(chǔ)器中。操作數(shù)的偏移地址直接包含在指令中,和指令操作碼一起放在代碼段,而操作數(shù)那么在數(shù)據(jù)段中。操作數(shù)的地址是數(shù)據(jù)段存放器DS中的內(nèi)容左移4位后,加上指令給定的16位地址偏移量。默認(rèn)段為數(shù)據(jù)段。例7MOVAX,[2000H];〔〔DS〕×10H+2000H〕→AX執(zhí)行前:〔DS〕=3000H執(zhí)行后:〔AX〕=5050H32000H………50H50H…CS00H20H………A1HDSAX跨段訪問(wèn)情況8086的存儲(chǔ)器是分段使用的,通常,假設(shè)選用存放器〔BX、BP、SI和DI〕做間接存放器、變址存放器或基址存放器,只要有BP存放器出現(xiàn),操作數(shù)就在當(dāng)前的堆棧段。操作數(shù)的物理地址由堆棧段存放器SS的內(nèi)容左移4位與偏移地址EA相加;否那么,操作數(shù)在當(dāng)前數(shù)據(jù)段,此時(shí),操作數(shù)的物理地址由數(shù)據(jù)段存放器DS的內(nèi)容左移4位與偏移地址EA相加形成。這是8086的具體約定,即默認(rèn)狀態(tài)。當(dāng)要否認(rèn)默認(rèn)狀態(tài),到非約定段尋址操作數(shù)時(shí),必須用跨段前綴指明操作數(shù)所在段的段存放器名。段存放器名:偏移地址功能:冒號(hào)“:〞之前的段存放器指明了操作數(shù)所在段。無(wú)論是段默認(rèn)情況,還是跨段情況,操作數(shù)的物理地址均由系統(tǒng)自動(dòng)計(jì)算。隱含段段約定的寄存器主要用途CSIP指令尋址SSSP,BP堆棧尋址DSBX,SI,DI數(shù)據(jù)尋址ESDI目標(biāo)串尋址隱含段:段地址和存放偏移地址的存放器在組合上有一定的規(guī)那么。假設(shè)操作數(shù)在當(dāng)前數(shù)據(jù)段中,操作數(shù)的物理地址PA由數(shù)據(jù)段存放器DS的內(nèi)容左移四位與地址存放器SI或DI的內(nèi)容相加形成;假設(shè)操作數(shù)在當(dāng)前堆棧段中,那么操作數(shù)的物理地址PA由堆棧段存放器SS的內(nèi)容左移四位與基址存放器BP的內(nèi)容相加形成,這是根本約定??缍螁?wèn)題:段的跨越例如MOVAX,DS:[BP]MOVBX,ES:[BX]MOVCX,SS:[SI]MOVDX,SS:[DI]MOVAX,ES:[2000H]默認(rèn)狀態(tài)不起作用,操作數(shù)的物理地址由“:〞前面的段存放器內(nèi)容左移4位與EA相加形成。段約定的寄存器主要用途CSIP指令尋址SSSP,BP堆棧尋址DSBX,SI,DI數(shù)據(jù)尋址ESDI目標(biāo)串尋址例8MOVAX,ES:[2000H];〔〔ES〕×10H+2000H〕→AX執(zhí)行前:〔ES〕=3000H執(zhí)行后:〔AX〕=5050H…32000H………50H50H…CS00H20H……A2HESAX26HNEXT:MOVAL,DS:[SI]MOVES:[DI],AL跨段前綴跨段前綴NEXT:MOVAL,DS:[SI]MOVES:[2000H],AL操作數(shù)的偏移地址可以以變量的形式出現(xiàn)。在數(shù)據(jù)段中用偽指令DB〔1個(gè)字節(jié)〕、DW〔2個(gè)字節(jié)〕、DD〔4個(gè)字節(jié)〕、DQ〔8個(gè)字節(jié)〕、DT〔10個(gè)字節(jié)〕定義變量。

例9MOVAX,BUFA;〔〔DS〕×10H+1000H〕→AX執(zhí)行前:假定BUFA在數(shù)據(jù)段中定義,EA=1000H,〔DS〕=2000H,〔AX〕=1122H,〔21000H〕=1259H執(zhí)行后:〔AX〕=1259H,〔21000H〕=1259H21000H………59H12H…CS00H10H………E9H?DS1122HAX4、存放器間接尋址方式:[R]操作數(shù)在存儲(chǔ)器中。操作數(shù)的有效地址由變址存放器SI、DI或基址存放器BX、BP提供。如果指令中指定的存放器是BX、SI、DI,那么用DS存放器的內(nèi)容作為段地址。如指令中用BP存放器,那么操作數(shù)的段地址在SS中,即堆棧段。例10ADDAX,[SI];AX+〔〔DS〕×10H+〔SI〕〕→AX執(zhí)行前:〔AX〕=1122H,〔SI〕=20H,〔DS〕=1000H,〔10020H〕=3344H執(zhí)行后:〔AX〕=4466H,〔SI〕=20H,〔DS〕=1000H,〔10020H〕=3344H+10020H………44H33H…CS20H00H………E9H?DS1122HAX+變址尋址方式基址尋址方式例11SUBAX,[BP];AX-〔〔SS〕×10H+〔BP〕〕→AX執(zhí)行前:〔AX〕=3344H,〔BP〕=30H,〔SS〕=2000H,〔20030H〕=1234H執(zhí)行后:〔AX〕=2110H,〔BP〕=30H,〔SS〕=2000H,〔20030H〕=1234H-20030H………34H12H…CS30H00H………E9H?SS3344HAX-5、存放器相對(duì)尋址:X[R]操作數(shù)存放在存儲(chǔ)器中。以指定的存放器內(nèi)容,加上指令中給出的位移量〔8位或16位〕,并以一個(gè)段存放器為基準(zhǔn),作為操作數(shù)的地址。指定的存放器一般是一個(gè)基址存放器或變址存放器。例12MOVAX,5[BX];〔〔DS〕×10H+〔BX〕+5〕→AX執(zhí)行前:〔AX〕=0000H,〔BX〕=1BH,〔DS〕=2000H,〔20020H〕=3789H執(zhí)行后:〔AX〕=3789H,〔BX〕=1BH,〔DS〕=2000H,〔20020H〕=3789H20020H……89H37H…DS0000HAX…00H…5CS……E9H?1BH00例13MOV6[BP],BX;〔BX〕→〔SS〕×10H+〔BP〕+6執(zhí)行前:〔BX〕=4000H,〔BP〕=30H,〔SS〕=2000H,〔20036H〕=0000H執(zhí)行后:〔BX〕=4000H,〔BP〕=30H,〔SS〕=2000H,〔20036H〕=4000H20036H……00H00H…SS4000HBX…00H…6CS……E9H?30H006、基址加變址尋址方式:[BR][IR]操作數(shù)存放在存儲(chǔ)器中。把一個(gè)基址存放器BX或BP的內(nèi)容,加上變址存放器SI或DI的內(nèi)容,并以一個(gè)段存放器作為地址基準(zhǔn),作為操作數(shù)的地址。當(dāng)基址存放器為BX時(shí),段存放器使用DS;當(dāng)基址存放器為BP時(shí),段存放器用SS。例14MOVAX,[BX][SI]MOVAX,[BX+SI];〔〔DS〕×10H+〔BX〕+〔SI〕〕→AX執(zhí)行前:〔AX〕=45H,〔BX〕=30H,〔SI〕=20H,〔DS〕=1000H,〔10050H〕=9988H執(zhí)行后:〔AX〕=9988H,〔BX〕=30H,〔SI〕=20H,〔DS〕=1000H,〔10050H〕=9988H10050H…DS0045HAX…88H99H………00H30H00HCS……E9H?20H例15MOV[BP][DI],BXMOV[BP+DI],BX;〔BX〕→〔SS〕×10H+〔BP〕+〔DI〕執(zhí)行前:〔BX〕=3344H,〔BP〕=10H,〔DI〕=40H,〔SS〕=4000H,〔40050H〕=0000H執(zhí)行后:〔BX〕=3344H,〔BP〕=10H,〔DI〕=40H,〔SS〕=4000H,〔40050H〕=3344H40050H…SS3344HBX…00H00H………00H10H00HCS……E9H?40H7、相對(duì)基址加變址尋址方式:X[BR][IR]操作數(shù)存放在存儲(chǔ)器中。把一個(gè)基址存放器BX或BP的內(nèi)容,加上變址存放器SI或DI的內(nèi)容,再加上指令中給定的8位或16位位移量,并以一個(gè)段存放器作為地址基準(zhǔn),作為操作數(shù)的地址。當(dāng)基址存放器為BX時(shí),段存放器使用DS。當(dāng)基址存放器為BP時(shí),段存放器那么用SS。例16MOV2[BX+SI],AXMOV2[BX][SI],AX;〔AX〕→〔DS〕×10H+〔BX〕+〔SI〕+2執(zhí)行前:〔AX〕=1200H,〔BX〕=300H,〔SI〕=50H,〔DS〕=1000H,〔10352H〕=??執(zhí)行后:〔AX〕=1200H,〔BX〕=300H,〔SI〕=50H,〔DS〕=1000H,〔10352H〕=1200H…2100352HDS1200HAX…??………00H10H00HCS……E9H?40H00例17MOV4[BP+SI],CX;〔CX〕→〔SS〕×10H+〔BP〕+〔SI〕+4執(zhí)行前:〔CX〕=1500H,〔BP〕=400H,〔SI〕=50H,〔SS〕=2000H,〔20454H〕=??執(zhí)行后:〔CX〕=1500H,〔BP〕=400H,〔SI〕=50H,〔SS〕=2000H,〔20454H〕=1500H…420454HSS1500HCX…??………04H00H00HCS……E9H?50H00執(zhí)行前:〔DS〕=1000H,〔SS〕=2000H,〔BX〕=300H,〔BP〕=400H,〔DI〕=60H,〔CX〕=1200H,〔DX〕=1500H,〔10366H〕=1400H,〔20468H〕=1800H例18MOVCX,6[BX+DI];〔〔DS〕×10H+〔BX〕+〔DI〕+6〕→CX執(zhí)行后:〔CX〕=1400H例19MOVDX,8[BP+DI];〔〔SS〕×10H+〔BP〕+〔DI〕+8〕→DX執(zhí)行后:〔DX〕=1800H…610366HDS1200HCX…0014………03H00H00HCS……E9H?60H00…820468HSS1500HDX…0018………04H00H00HCS……E9H?60H00指令尋址方式:與轉(zhuǎn)移地址有關(guān)的尋址方式段內(nèi)直接尋址段內(nèi)間接尋址段間直接尋址段間間接尋址通常情況下,當(dāng)BIU完成一次取指操作后,就自動(dòng)地改變IP的內(nèi)容以指向下一條指令的地址。使程序按預(yù)先存放在代碼段中的指令的次序,由低地址到高地址順序執(zhí)行。如需要改變程序的執(zhí)行順序,需要安排具有控制程序轉(zhuǎn)向的指令〔如無(wú)條件轉(zhuǎn)移指令JMP〕,并按指令的要求修改IP和CS的內(nèi)容,從而將程序轉(zhuǎn)移到指令所指定的目標(biāo)地址去。一條指令入口地址的表示形式為CS:IP。根據(jù)CS和IP的內(nèi)容,指令尋址方式可分為以下四種:段內(nèi)直接,段內(nèi)間接,段間直接,段間間接。無(wú)條件轉(zhuǎn)移指令和子程序調(diào)用指令可以使用四種尋址方式中的任何一種,而條件轉(zhuǎn)移指令只能使用段內(nèi)直接尋址方式,且位移量為8位。1、段內(nèi)直接尋址:JMP,CALL,條件轉(zhuǎn)移指令轉(zhuǎn)移指令語(yǔ)句與該指令執(zhí)行后將跳轉(zhuǎn)到的轉(zhuǎn)向指令語(yǔ)句在同一代碼段內(nèi),轉(zhuǎn)向指令的有效地址在轉(zhuǎn)移指令語(yǔ)句中直接給出,常用的是標(biāo)號(hào)形式。實(shí)質(zhì):CS的值不變,IP的值改變,轉(zhuǎn)移指令中符號(hào)地址的值即為轉(zhuǎn)向的有效地址,類似于數(shù)據(jù)尋址方式中的直接尋址。無(wú)條件轉(zhuǎn)移語(yǔ)句JMP<指令入口地址CS:IP>

其中段內(nèi)跳轉(zhuǎn)CS可以省略。段內(nèi)直接尋址轉(zhuǎn)移指令JMP<標(biāo)號(hào)>

例1

JMPLABELJMPNEARPTRADDR1例2JMPSHORTADDR2

CODE1SEGMENT……

JMPNEXT……NEXT:…………CODE1ENDSNEXT是該指令執(zhí)行后將跳轉(zhuǎn)到的轉(zhuǎn)向指令語(yǔ)句的符號(hào)地址。NEARPTR:位移量為16位。SHORT:位移量為8位。轉(zhuǎn)移地址:〔IP〕+位移量。相對(duì)于當(dāng)前IP值的位移量。無(wú)條件絕對(duì)轉(zhuǎn)移:JMP<標(biāo)號(hào)>無(wú)條件相對(duì)轉(zhuǎn)移:JMPNEARPTRADDR1JMPSHORTADDR2datasegmentmessdb'i:$'letterdw?dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axleadx,messjmpnextmovah,09int21hnext:movah,4chint21hcodeendsendstart反匯編命令U[<地址>]|[<范圍>]2、段內(nèi)間接尋址:JMP,CALL轉(zhuǎn)移指令語(yǔ)句與該指令執(zhí)行后將跳轉(zhuǎn)到的轉(zhuǎn)向指令語(yǔ)句在同一代碼段內(nèi),轉(zhuǎn)向指令的有效地址在轉(zhuǎn)移指令語(yǔ)句中間接給出,常用的是一個(gè)存放器或是一個(gè)存儲(chǔ)單元。實(shí)質(zhì):CS的值不變,IP的值改變,轉(zhuǎn)向指令的有效地址存儲(chǔ)在存放器或存儲(chǔ)單元中。這個(gè)存放器或存儲(chǔ)單元的內(nèi)容可以用數(shù)據(jù)尋址方式中除立即尋址方式以外的任何一種尋址方式取得。無(wú)條件轉(zhuǎn)移語(yǔ)句JMP<指令入口地址CS:IP>其中段內(nèi)跳轉(zhuǎn)CS可以省略。段內(nèi)間接尋址轉(zhuǎn)移指令JMP<除立即數(shù)以外的任何一種尋址方式>例3假設(shè)〔DS〕=2000H,〔BX〕=1256H,〔SI〕=528FH,位移量=20A1H,〔232F7H〕=3280H,〔264E5H〕=2450H。那么指令JMPBX執(zhí)行后〔IP〕=1256H。

檢查和修改存放器內(nèi)容命令R[<存放器名>]|[<F>]匯編命令A(yù)[=<地址>]跟蹤命令T[=<地址>][<n>]例4假設(shè)〔DS〕=2000H,〔BX〕=1256H,〔SI〕=528FH,位移量=20A1H,〔232F7H〕=3280H,〔264E5H〕=2450H。那么指令JMPWORDPTRTABLE[BX]JMPWORDPTR[BX+TABLE]執(zhí)行后〔IP〕=〔〔DS〕×10H+〔BX〕+位移量〕=〔20000H+1256H+20A1H〕=〔232F7H〕=3280H跟蹤命令T[=<地址>][<n>]∵〔BX〕=0000,〔15901H〕=0000H∴〔IP〕=〔〔DS〕×10H+〔BX〕+位移量〕=〔13860H+0000H+20A1H〕=〔15901H〕=0000H例4假設(shè)〔DS〕=2000H,〔BX〕=1256H,〔SI〕=528FH,位移量=20A1H,〔232F7H〕=3280H,〔264E5H〕=2450H。那么指令JMPWORDPTRTABLE[BX]JMPWORDPTR[BX+TABLE]執(zhí)行后〔IP〕=〔〔DS〕×10H+〔BX〕+位移量〕=〔20000H+1256H+20A1H〕=〔232F7H〕=3280H∵〔15901H〕=0000H∴〔IP〕=〔〔DS〕×10H+〔BX〕+位移量〕=〔13860H+1256H+20A1H〕=〔16B57H〕=0000H例5假設(shè)〔DS〕=2000H,〔BX〕=1256H,〔SI〕=528FH,位移量=20A1H,〔232F7H〕=3280H,〔264E5H〕=2450H。那么指令JMPWORDPTR[BX][SI]JMPWORDPTR[BX+SI]執(zhí)行后〔IP〕=〔〔DS〕×10H+〔BX〕+〔SI〕〕=〔20000H+1256H+528FH〕=〔264E5H〕=2450H

∵〔BX〕=0000,〔SI〕=0000∴〔IP〕=〔〔DS〕×10H+〔BX〕+〔SI〕〕=〔13860H+0000H+0000H〕=〔13860H〕=20CDH3、段間直接尋址:JMP,CALL轉(zhuǎn)移指令語(yǔ)句與該指令執(zhí)行后將跳轉(zhuǎn)到的轉(zhuǎn)向指令語(yǔ)句在不同一代碼段內(nèi),轉(zhuǎn)向指令的有效地址在轉(zhuǎn)移指令語(yǔ)句中直接給出,常用的是一個(gè)標(biāo)號(hào)。實(shí)質(zhì):CS的值改變,IP的值改變,用段地址取代CS存放器的內(nèi)容,用轉(zhuǎn)移指令中指定的偏移地址取代IP存放器的內(nèi)容。無(wú)條件轉(zhuǎn)移語(yǔ)句JMP<指令入口地址CS:IP>其中段內(nèi)跳轉(zhuǎn)CS可以省略。段間直接尋址轉(zhuǎn)移指令JMPFARPTR<標(biāo)號(hào)>例6CALLSUB_NAME例7CALLSORT其中,SORT是一個(gè)排序子程序名。CODE1SEGMENT……

JMPFARPTRNEXT……CODE1ENDSCODE2SEGMENTNEXT:…………CODE2ENDS4、段間間接尋址:JMP,CALL轉(zhuǎn)移指令語(yǔ)句與該指令執(zhí)行后將跳轉(zhuǎn)到的轉(zhuǎn)向指令語(yǔ)句在不同一代碼段內(nèi),轉(zhuǎn)向指令的段地址和偏移地址也被存放在存儲(chǔ)器中間接提供。實(shí)質(zhì):CS的值改變,IP的值改變,用存儲(chǔ)器中的相繼兩個(gè)字單元的內(nèi)容來(lái)取代IP和CS存放器中的原始內(nèi)容。存儲(chǔ)單元的地址由轉(zhuǎn)移指令指定,可以通過(guò)數(shù)據(jù)尋址方式中存儲(chǔ)器尋址〔除立即尋址方式和存放器尋址方式之外的任何一種尋址方式〕取得。無(wú)條件轉(zhuǎn)移語(yǔ)句JMP<指令入口地址CS:IP>其中段內(nèi)跳轉(zhuǎn)CS可以省略。段間直接尋址轉(zhuǎn)移指令JMPFARPTR<存儲(chǔ)器尋址>例8JMPFARPTRX[R]例9假設(shè)〔DS〕=2000H,〔BX〕=1000H,TABLE=200H,〔DS:1200H〕=11223344H,〔264E5H〕=2450H。那么指令JMPFARPTRTABLE[BX]執(zhí)行后CS:IP的內(nèi)容為4433:2211。

∵〔21200H〕=0000H∴〔IP〕=〔〔DS〕×10H+〔BX〕+偏移量〕=〔20000H+1000H+200H〕=〔21200H〕=0000H1、段內(nèi)直接尋址JMP<標(biāo)號(hào)>2、段內(nèi)間接尋址JMP<除立即數(shù)以外的任何一種尋址方式>3、段間直接尋址JMPFARPTR<標(biāo)號(hào)>4、段間間接尋址JMPFARPTR<存儲(chǔ)器尋址>總結(jié)STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATA1SEGMENTBUF1DB20H,21H,22H,23H,24H,25H,26H,27H,28H,29HDATA1ENDSDATA2SEGMENTBUF2DB10DUP(0)DATA2ENDSCODESEGMENT

ASSUMECS:CODE,DS:DATA1,ES:DATA2,SS:STACKSTART:MOVAX,DATA1MOVDS,AXMOVAX,DATA2MOVES,AXMOVSI,OFFSETBUF1MOVDI,OFFSETBUF2MOVCX,10NEXT:MOVAL,DS:[SI]MOVES:[DI],ALINCSIINCDIDECCX

JNZNEXTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART綜合例題:例1編程實(shí)現(xiàn)把BUF1存儲(chǔ)空間的內(nèi)容移動(dòng)到BUF2存儲(chǔ)空間中去。DS…20H21H22H23H24H25H26H27H28H……29HSIES………DI指定了段與段存放器之間的對(duì)應(yīng)關(guān)系OFFSET運(yùn)算符:對(duì)緊跟其后的變量取偏移地址DATA1SEGMENT

BUF1DB20H,21H,22H,23H,24H,25H,26H,27H,28H,29HDATA1ENDSDATA2SEGMENT

BUF2DB10DUP(0)DATA2ENDSSTART:MOVAX,DATA1MOVDS,AXMOVAX,DATA2MOVES,AXMOVSI,OFFSET

BUF1MOVDI,OFFSETBUF2MOVCX,10NEXT:MOVAL,DS:[SI]MOVES:[DI],ALINCSIINCDIDECCX

JNZNEXTEXIT:MOVAH,4CHINC21H標(biāo)號(hào)符號(hào)地址變量符號(hào)地址跨段前綴跨段前綴調(diào)試程序:

①編譯、②連接、③運(yùn)行

DEBUG命令的使用

-u在兩臺(tái)電腦上運(yùn)行同一個(gè)程序第一步:第三步:第四步:7+7×10+2第二步:第五步:第六步:DATASEGMENT

BUF1DB20H,21H,22H,23H,24H,25H,26H,27H,28H,29H

BUF2DB10DUP(0)DATAENDSCODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVCX,10NEXT:MOVAL,BUF1[SI]MOVBUF2[SI],ALINCSIDECCX

JNZNEXTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART例1’…DS…20H21H22H23H24H25H26H27H28H29HSIBUF1[SI]BUF2[SI]STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATA1SEGMENTBUF1DB20H,21H,22H,23H,24H,25H,26H,27H,28H,29HDATA1ENDSDATA2SEGMENTBUF2DB10DUP(0)DATA2ENDSCODESEGMENT

ASSUMECS:CODE,DS:DATA1,ES:DATA2,SS:STACKSTART:MOVAX,DATA1MOVDS,AXMOVAX,DATA2MOVES,AXMOVSI,OFFSETBUF1MOVDI,OFFSETBUF2MOVCX,10NEXT:MOVAL,DS:[SI]MOVES:[DI],ALINCSIINCDIDECCX

JNZNEXTEXIT:MOVAH,4CHINC21HCODEENDSENDSTARTDATASEGMENT

BUF1DB20H,21H,22H,23H,24H,25H,26H,27H,28H,29H

BUF2DB10DUP(0)DATAENDSCODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVCX,10NEXT:MOVAL,BUF1[SI]MOVBUF2[SI],ALINCSIDECCX

JNZNEXTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART例1’例1調(diào)試程序3.27的修改程序:

①編譯、②連接、③運(yùn)行

DEBUG命令的使用

-uDATASEGMENT

BUF1DB20H,21H,22H,23H,24H,25H,26H,27H,28H,29H

BUF2DB10DUP(0)DATAENDS標(biāo)號(hào)符號(hào)地址變量符號(hào)地址START:MOVAX,DATAMOVDS,AXMOVSI,0MOVCX,10NEXT:MOVAL,BUF1[SI]MOVBUF2[SI],ALINCSIDECCX

JNZNEXTEXIT:MOVAH,4CHINT21H第一步:第三步:第四步:4+5×10+2第二步:第五步:第六步:.MODELSMALL.386.DATADATA1DQ1111111111111111HDATA2DQ2222222222222222HDATA3DQ?.CODESTART:MOVEAX,@DATAMOVDS,EAXCLCLEAESI,DATA1LEAEDI,DATA2LEAEBX,DATA3MOVECX,2BACK:MOVEAX,[ESI]

ADCEAX,[EDI]MOV[EBX],EAXPUSHFADDESI,4ADDEDI,4ADDEBX,4

LOOPBACKMOVEAX,4C00HINT21HENDSTART綜合例題:例2用32位尋址方式編程,求兩個(gè)4字長(zhǎng)數(shù)據(jù)之和。其中,初值存放在DATA1、DATA2存儲(chǔ)單元中,結(jié)果存放在DATA3存儲(chǔ)單元中。…64位DSESIEDIEBX11H11H11H11H11H11H11H11H…22H22H22H22H22H22H22H22H…〔1〕ECX-1→ECX〔2〕假設(shè)ECX不為0,那么轉(zhuǎn)移32位加法小匯編程序ASM例2’STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTDATA1DQ1111111111111111HDATA2DQ2222222222222222HDATA3DQ?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVEAX,DATAMOVDS,EAXCLCLEAESI,DATA1LEAEDI,DATA2LEAEBX,DATA3MOVECX,2BACK:MOVEAX,[ESI]

ADCEAX,[EDI]MOV[EBX],EAXPUSHFADDESI,4ADDEDI,4ADDEBX,4

LOOPBACKMOVEAX,4C00HINT21HCODEENDSENDSTART宏匯編程序MASM.MODELSMALL.386.DATADATA1DQ1111111111111111HDATA2DQ2222222222222222HDATA3DQ?.CODESTART:MOVEAX,@DATAMOVDS,EAXCLCLEAESI,DATA1LEAEDI,DATA2LEAEBX,DATA3MOVECX,2BACK:MOVEAX,[ESI]

ADCEAX,[EDI]MOV[EBX],EAXPUSHFADDESI,4ADDEDI,4ADDEBX,4

LOOPBACKMOVEAX,4C00HINT21HENDSTART小匯編程序ASMSTACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTDATA2DQ2222222222222222HDATA3DQ?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXCLCLEASI,DATA1LEADI,DATA2LEABX,DATA3MOVCX,4BACK:MOVAX,[SI]ADCAX,[DI]MOV[BX],AXPUSHFADDSI,2ADDDI,2

ADDBX,2LOOPBACKMOVAX,4CHINT21HCODEENDSENDSTARTSTACKSEGMENTSTACKDB200DUP(0)STACKENDSDATA

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論