根據(jù)教育部考試中心頒布的全國計算機等級考試大綱,三級PC技術(shù)考試的基本要求有:熟悉80X86微處理器的結(jié)構(gòu)、原理及其宏匯編語言程序設(shè)計。上機考試操作語言為:匯編語言。筆試考試內(nèi)容之一——微處理器與匯編語言程序設(shè)計部分的重點是:80X86系列微處理器指令系統(tǒng),指令格式與編碼,尋址方式,指令系統(tǒng)。
從上可知匯編語言在三級PC技術(shù)考試中的重要性。熟悉并靈活地應(yīng)用機器所采用的各種尋址方式,對匯編語言程序設(shè)計是至關(guān)重要的。指令系統(tǒng)常常要用到尋址方式,主要是要弄懂具體各條指令的源操作數(shù)和目的操作數(shù)放在什么地方,也就是操作數(shù)的尋址方式。在具體應(yīng)用編程時,如果弄不懂尋址方式就無法下手??梢哉f尋址方式是學(xué)習(xí)匯編這門低級語言的入場券,但尋址方式往往也是學(xué)習(xí)過程中的瓶頸問題。
下面和大家談?wù)勅绾握莆?0X86系列微處理器(以Intel8086/8088為例)的尋址方式。
在學(xué)習(xí)Intel8086/8088微處理器中尋址方式時,涉及的尋址概念有七個:寄存器尋址、立即尋址、直接尋址、寄存器間接尋址、寄存器相對尋址、基址加變址尋址、相對基址加變址尋址。其中寄存器尋址、立即尋址、直接尋址相對來說好理解,而寄存器間接尋址、寄存器相對尋址、基址加變址尋址、相對基址加變址尋址這四種尋址方式之間有許多密切聯(lián)系之處,極其容易混淆。如何找出它們之間的區(qū)別和聯(lián)系,從而形成正確的概念呢?
我們知道,分析、比較與綜合是思維的基本過程,也是重要的邏輯思維方法。根據(jù)匯編抽象的特點,在進行概念學(xué)習(xí)時,借助比較的方法提高我們的辨析能力,最后綜合應(yīng)用所學(xué)到的概念來編程解決實際問題。
下面應(yīng)用比較分析法來談?wù)勥@七種尋址方式的學(xué)習(xí),并結(jié)合三級PC技術(shù)的考題以幫助大家理解。
一、寄存器尋址
指令所指明的寄存器就是操作數(shù)的存放地址。
匯編格式:R (R是寄存器名)
功能:寄存器R的內(nèi)容是操作數(shù)。
寄存器尋址的尋址方式如右圖所示:
對寄存器尋址方式,我們要牢牢掌握操作數(shù)存放在指令規(guī)定的寄存器中,不需訪問內(nèi)存,工作效率高。對于16位操作數(shù),寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP;而對8位操作數(shù),寄存器可以是AH、AL、BH、BL、CH、CL、DH或DL。
例1. MOV AX, BX
執(zhí)行過程如下圖所示:
分析:源操作數(shù)BX和目的操作數(shù)AX都是寄存器尋址。
執(zhí)行前:(AX)=8A9DH (BX)=1234H
執(zhí) 行:(BX)→AX
執(zhí)行后:(AX)=1234H (BX)=1234H
由于寄存器是CPU的一部分,因此采用寄存器尋址方式可以提高工作效率。特別是累加器AX,若用它存放運算結(jié)果,則指令的執(zhí)行時間要短些。對于那些需要經(jīng)常存取的操作數(shù),采用寄存器尋址方式較為合適。
二、立即尋址
在立即尋址方式中,立即操作數(shù)可以是8位或16位,并且是指令的一部分。立即數(shù)據(jù)總是緊跟在指令操作碼之后并和操作碼一起存放在代碼段中,因而立即數(shù)據(jù)總是和操作碼一起被放入BIU中的指令隊列里,在指令執(zhí)行時不需再存取存儲器。
匯編格式:n (n為立即操作數(shù))
功能:指令下一單元的內(nèi)容為操作數(shù)n。
立即尋址的尋址方式如圖所示:
對立即尋址方式,我們可和寄存器尋址比較學(xué)習(xí)。首先這兩種尋址方式都不需要訪問內(nèi)存,這是它們之間的共同點,其次,立即尋址的操作數(shù)就在代碼段里的操作碼之后,是指令的一部分,而寄存器尋址的操作數(shù)則放在指令規(guī)定的寄存器中。 根據(jù)下面定義的數(shù)據(jù)段:
DSEG SEGMENT
DAT1 DB ‘1234‘
DAT2 DW 5678H
ADDR EQU DAT2-DAT1
DSEG ENDS
執(zhí)行MOV AX,ADDR指令后,AX寄存器中的內(nèi)容是:
(A)5678H (B)7856H
(C)4444H (D)0004H
答案:D
內(nèi)存分配示意圖:
分析:首先根據(jù)題目定義的數(shù)據(jù)段畫出內(nèi)存分配示意圖,畫圖時要注意字符在內(nèi)存中是以ASCII碼的形式存放,同時標出每個存儲單元的偏移地址(EA),在相應(yīng)的存儲單元標出變量名。從內(nèi)存分配示意圖,我們可知DAT1和DAT2的EA分別為0和4,因此表達式DAT2-DAT1的值為4。指令EQU是符號定義偽指令,則ADDR為一個符號常量,代表4。MOV AX,ADDR指令中的源操作數(shù)ADDR是立即尋址,執(zhí)行后就是把4的傳給AX。所以答案選D。
立即尋址方式主要用來給寄存器或存儲器賦初值,也可以與寄存器操作數(shù)或存儲器操作數(shù)進行算術(shù)邏輯運算。采用立即尋址方式不僅能簡化數(shù)據(jù)的存取,而且可使指令的書寫直觀、清晰。在程序設(shè)計中,立即尋址方式使用得相當多。
三、直接尋址
在直接尋址方式中,操作數(shù)的偏移地址(EA)是指令的一部分,它與操作碼一起存放在代碼段中,而操作數(shù)可以存放在數(shù)據(jù)段,也可以存放在其他段。操作數(shù)的物理地址(PA)由其所在段的段寄存器內(nèi)容左移4位與指令中給出的偏移地址(EA)相加形成。
匯編格式:含有變量的地址表達式或段寄存器名:[EA]
功能:指令下一字單元的內(nèi)容是操作數(shù)的偏移地址EA。
PA=(段寄存器)×10H+EA
直接尋址的尋址方式如圖所示:
這種尋址方式和前兩種的的區(qū)別就是:指令執(zhí)行時需要再存取存儲器,也就是存取操作數(shù)時需要訪問內(nèi)存,而前兩種尋址方式存取操作數(shù)時不需要訪問內(nèi)存。
例:2003.4三級PC考題
若有BUF DW 1、2、3、4,則可將數(shù)據(jù)02H取到AL寄存器中的指令是
(A)MOV AL, BYTE PTR[BUF+1]
(B)MOV AL, BYTE PTR[BUF+2]
(C)MOV AL, BYTE PTR [BUF+3]
(D)MOV AL,BUF[2]
答案:B
分配示意圖:
分析:根據(jù)數(shù)據(jù)定義偽指令BUF DW 1、2、3、4畫出內(nèi)存分配示意圖,在存儲單元相應(yīng)位置標出變量名和EA。答案D中目的操作數(shù)AL的類型為字節(jié),而源操作數(shù)BUF[2]前無BYTEPTR,則BUF[2]類型為字,兩個操作數(shù)的類型不一致,指令是錯誤的,因此答案D可排除。變量BUF的EA為0,數(shù)據(jù)02H在內(nèi)存中的EA為2。答案ABC中指令的源操作數(shù)都是直接尋址,而只有[BUF+2]的EA為2,所以選B。
到目前為止,我們已經(jīng)復(fù)習(xí)了寄存器尋址、立即尋址、直接尋址這三種尋址方式。前面三種尋址方式相對來說容易理解和掌握,而后四種尋址方式的操作數(shù)都存放在內(nèi)存儲器中,而且其匯編格式有相似之處,容易混淆。學(xué)習(xí)中我們要緊緊抓住這四種尋址方式中操作數(shù)都存放在內(nèi)存儲器中這一特點,而要訪問內(nèi)存儲器存放操作數(shù)的存儲單元,則需要知道存放操作數(shù)的存儲單元在內(nèi)存儲器中的偏移地址(EA)。尋址方式的重要區(qū)別就是得到EA的方式不同。只要掌握如何計算通過這四種尋址方式得到的內(nèi)存操作數(shù)的偏移地址,問題就迎刃而解了。
4.寄存器間接尋址
寄存器間接尋址得到的操作數(shù)存放在內(nèi)存儲器中,而操作數(shù)的偏移地址EA在指令指明的寄存器中,即寄存器的內(nèi)容為操作數(shù)的偏移地址EA。
匯編格式:[R] R(Register 寄存器的簡寫,只能是SI,DI,BX,BP其中之一)
功能:R的內(nèi)容為操作數(shù)的偏移地址EA。即操作數(shù)的有效地EA存放在基址寄存器(BX或BP)或變址寄存器(DI或SI)中:
EA= [R] 用R作間接尋址寄存器時。
寄存器間接尋址的尋址方式如圖所示:
若用寄存器SI,DI,BX間接尋址,則操作數(shù)在當前數(shù)據(jù)段中。
PA=(DS)×10H+EA
若用寄存器BP間接尋址,則操作數(shù)在當前堆棧段中。
PA=(SS)×10H+EA
寄存器間接尋址和寄存器尋址在匯編格式上相比較多了個中括號,也就是因為這樣,他們的尋址方式截然不同,寄存器尋址不需訪問內(nèi)存,操作數(shù)就在指令指定的寄存器中,而寄存器間接尋址需要訪問內(nèi)存,操作數(shù)的偏移地址EA就是寄存器的內(nèi)容。
例:2002.8三級PC考題
根據(jù)下面的指令和偽指令序列,AX寄存器的內(nèi)容是多少?
TAB DW 1, 2, 3, 4, 5, 6
ENTRY EQU 3
MOV BX, OFFSET TAB
ADD BX, ENTRY
MOV AX, WORD PTR [BX]
(A)0300H(B)0003H(C)0506H(D)0403H
答案:A
內(nèi)存分配示意圖:
分析:根據(jù)數(shù)據(jù)定義偽指令BUF DW 1、2、3、4畫出內(nèi)存分配示意圖,在存儲單元相應(yīng)位置標出變量名和EA。OFFSET TAB得到的是變量TAB的EA。TAB這個變量的EA為0則MOV BX,OFFSET TAB這個指令的源操作數(shù)OFFSET TAB是立即尋址,(BX)=0。ENTRY為符號常量,指令A(yù)DD BX,ENTRY的源操作數(shù)ENTRY也是立即尋址(BX)+3→BX,(BX)=3。MOV AX,WORD PTR [BX]指令中源操作數(shù)[BX]是寄存器間接尋址,前面的WORD PTR指明內(nèi)存操作數(shù)為字類型。指令執(zhí)行后把偏移地址為3的字單元的內(nèi)容傳給AX。所以答案選A。
5.寄存器相對尋址
在寄存器相對尋址方式中,操作數(shù)在內(nèi)存儲器中,而操作數(shù)的偏移地址EA是指令指明的寄存器的內(nèi)容與指令中給出的位移量相加之和。
匯編格式:XR (或R+X,X + R)
功能: R的內(nèi)容與X相加之和為操作數(shù)的偏移地址EA。
R(Register 寄存器的簡寫,只能是SI,DI,BX,BP其中之一。)
X表示位移量,其值是用8位或16位二進制補碼表示的有符號數(shù)。
從上可知匯編語言在三級PC技術(shù)考試中的重要性。熟悉并靈活地應(yīng)用機器所采用的各種尋址方式,對匯編語言程序設(shè)計是至關(guān)重要的。指令系統(tǒng)常常要用到尋址方式,主要是要弄懂具體各條指令的源操作數(shù)和目的操作數(shù)放在什么地方,也就是操作數(shù)的尋址方式。在具體應(yīng)用編程時,如果弄不懂尋址方式就無法下手??梢哉f尋址方式是學(xué)習(xí)匯編這門低級語言的入場券,但尋址方式往往也是學(xué)習(xí)過程中的瓶頸問題。
下面和大家談?wù)勅绾握莆?0X86系列微處理器(以Intel8086/8088為例)的尋址方式。
在學(xué)習(xí)Intel8086/8088微處理器中尋址方式時,涉及的尋址概念有七個:寄存器尋址、立即尋址、直接尋址、寄存器間接尋址、寄存器相對尋址、基址加變址尋址、相對基址加變址尋址。其中寄存器尋址、立即尋址、直接尋址相對來說好理解,而寄存器間接尋址、寄存器相對尋址、基址加變址尋址、相對基址加變址尋址這四種尋址方式之間有許多密切聯(lián)系之處,極其容易混淆。如何找出它們之間的區(qū)別和聯(lián)系,從而形成正確的概念呢?
我們知道,分析、比較與綜合是思維的基本過程,也是重要的邏輯思維方法。根據(jù)匯編抽象的特點,在進行概念學(xué)習(xí)時,借助比較的方法提高我們的辨析能力,最后綜合應(yīng)用所學(xué)到的概念來編程解決實際問題。
下面應(yīng)用比較分析法來談?wù)勥@七種尋址方式的學(xué)習(xí),并結(jié)合三級PC技術(shù)的考題以幫助大家理解。
一、寄存器尋址
指令所指明的寄存器就是操作數(shù)的存放地址。
匯編格式:R (R是寄存器名)
功能:寄存器R的內(nèi)容是操作數(shù)。
寄存器尋址的尋址方式如右圖所示:
對寄存器尋址方式,我們要牢牢掌握操作數(shù)存放在指令規(guī)定的寄存器中,不需訪問內(nèi)存,工作效率高。對于16位操作數(shù),寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP;而對8位操作數(shù),寄存器可以是AH、AL、BH、BL、CH、CL、DH或DL。
例1. MOV AX, BX
執(zhí)行過程如下圖所示:
分析:源操作數(shù)BX和目的操作數(shù)AX都是寄存器尋址。
執(zhí)行前:(AX)=8A9DH (BX)=1234H
執(zhí) 行:(BX)→AX
執(zhí)行后:(AX)=1234H (BX)=1234H
由于寄存器是CPU的一部分,因此采用寄存器尋址方式可以提高工作效率。特別是累加器AX,若用它存放運算結(jié)果,則指令的執(zhí)行時間要短些。對于那些需要經(jīng)常存取的操作數(shù),采用寄存器尋址方式較為合適。
二、立即尋址
在立即尋址方式中,立即操作數(shù)可以是8位或16位,并且是指令的一部分。立即數(shù)據(jù)總是緊跟在指令操作碼之后并和操作碼一起存放在代碼段中,因而立即數(shù)據(jù)總是和操作碼一起被放入BIU中的指令隊列里,在指令執(zhí)行時不需再存取存儲器。
匯編格式:n (n為立即操作數(shù))
功能:指令下一單元的內(nèi)容為操作數(shù)n。
立即尋址的尋址方式如圖所示:
對立即尋址方式,我們可和寄存器尋址比較學(xué)習(xí)。首先這兩種尋址方式都不需要訪問內(nèi)存,這是它們之間的共同點,其次,立即尋址的操作數(shù)就在代碼段里的操作碼之后,是指令的一部分,而寄存器尋址的操作數(shù)則放在指令規(guī)定的寄存器中。 根據(jù)下面定義的數(shù)據(jù)段:
DSEG SEGMENT
DAT1 DB ‘1234‘
DAT2 DW 5678H
ADDR EQU DAT2-DAT1
DSEG ENDS
執(zhí)行MOV AX,ADDR指令后,AX寄存器中的內(nèi)容是:
(A)5678H (B)7856H
(C)4444H (D)0004H
答案:D
內(nèi)存分配示意圖:
分析:首先根據(jù)題目定義的數(shù)據(jù)段畫出內(nèi)存分配示意圖,畫圖時要注意字符在內(nèi)存中是以ASCII碼的形式存放,同時標出每個存儲單元的偏移地址(EA),在相應(yīng)的存儲單元標出變量名。從內(nèi)存分配示意圖,我們可知DAT1和DAT2的EA分別為0和4,因此表達式DAT2-DAT1的值為4。指令EQU是符號定義偽指令,則ADDR為一個符號常量,代表4。MOV AX,ADDR指令中的源操作數(shù)ADDR是立即尋址,執(zhí)行后就是把4的傳給AX。所以答案選D。
立即尋址方式主要用來給寄存器或存儲器賦初值,也可以與寄存器操作數(shù)或存儲器操作數(shù)進行算術(shù)邏輯運算。采用立即尋址方式不僅能簡化數(shù)據(jù)的存取,而且可使指令的書寫直觀、清晰。在程序設(shè)計中,立即尋址方式使用得相當多。
三、直接尋址
在直接尋址方式中,操作數(shù)的偏移地址(EA)是指令的一部分,它與操作碼一起存放在代碼段中,而操作數(shù)可以存放在數(shù)據(jù)段,也可以存放在其他段。操作數(shù)的物理地址(PA)由其所在段的段寄存器內(nèi)容左移4位與指令中給出的偏移地址(EA)相加形成。
匯編格式:含有變量的地址表達式或段寄存器名:[EA]
功能:指令下一字單元的內(nèi)容是操作數(shù)的偏移地址EA。
PA=(段寄存器)×10H+EA
直接尋址的尋址方式如圖所示:
這種尋址方式和前兩種的的區(qū)別就是:指令執(zhí)行時需要再存取存儲器,也就是存取操作數(shù)時需要訪問內(nèi)存,而前兩種尋址方式存取操作數(shù)時不需要訪問內(nèi)存。
例:2003.4三級PC考題
若有BUF DW 1、2、3、4,則可將數(shù)據(jù)02H取到AL寄存器中的指令是
(A)MOV AL, BYTE PTR[BUF+1]
(B)MOV AL, BYTE PTR[BUF+2]
(C)MOV AL, BYTE PTR [BUF+3]
(D)MOV AL,BUF[2]
答案:B
分配示意圖:
分析:根據(jù)數(shù)據(jù)定義偽指令BUF DW 1、2、3、4畫出內(nèi)存分配示意圖,在存儲單元相應(yīng)位置標出變量名和EA。答案D中目的操作數(shù)AL的類型為字節(jié),而源操作數(shù)BUF[2]前無BYTEPTR,則BUF[2]類型為字,兩個操作數(shù)的類型不一致,指令是錯誤的,因此答案D可排除。變量BUF的EA為0,數(shù)據(jù)02H在內(nèi)存中的EA為2。答案ABC中指令的源操作數(shù)都是直接尋址,而只有[BUF+2]的EA為2,所以選B。
到目前為止,我們已經(jīng)復(fù)習(xí)了寄存器尋址、立即尋址、直接尋址這三種尋址方式。前面三種尋址方式相對來說容易理解和掌握,而后四種尋址方式的操作數(shù)都存放在內(nèi)存儲器中,而且其匯編格式有相似之處,容易混淆。學(xué)習(xí)中我們要緊緊抓住這四種尋址方式中操作數(shù)都存放在內(nèi)存儲器中這一特點,而要訪問內(nèi)存儲器存放操作數(shù)的存儲單元,則需要知道存放操作數(shù)的存儲單元在內(nèi)存儲器中的偏移地址(EA)。尋址方式的重要區(qū)別就是得到EA的方式不同。只要掌握如何計算通過這四種尋址方式得到的內(nèi)存操作數(shù)的偏移地址,問題就迎刃而解了。
4.寄存器間接尋址
寄存器間接尋址得到的操作數(shù)存放在內(nèi)存儲器中,而操作數(shù)的偏移地址EA在指令指明的寄存器中,即寄存器的內(nèi)容為操作數(shù)的偏移地址EA。
匯編格式:[R] R(Register 寄存器的簡寫,只能是SI,DI,BX,BP其中之一)
功能:R的內(nèi)容為操作數(shù)的偏移地址EA。即操作數(shù)的有效地EA存放在基址寄存器(BX或BP)或變址寄存器(DI或SI)中:
EA= [R] 用R作間接尋址寄存器時。
寄存器間接尋址的尋址方式如圖所示:
若用寄存器SI,DI,BX間接尋址,則操作數(shù)在當前數(shù)據(jù)段中。
PA=(DS)×10H+EA
若用寄存器BP間接尋址,則操作數(shù)在當前堆棧段中。
PA=(SS)×10H+EA
寄存器間接尋址和寄存器尋址在匯編格式上相比較多了個中括號,也就是因為這樣,他們的尋址方式截然不同,寄存器尋址不需訪問內(nèi)存,操作數(shù)就在指令指定的寄存器中,而寄存器間接尋址需要訪問內(nèi)存,操作數(shù)的偏移地址EA就是寄存器的內(nèi)容。
例:2002.8三級PC考題
根據(jù)下面的指令和偽指令序列,AX寄存器的內(nèi)容是多少?
TAB DW 1, 2, 3, 4, 5, 6
ENTRY EQU 3
MOV BX, OFFSET TAB
ADD BX, ENTRY
MOV AX, WORD PTR [BX]
(A)0300H(B)0003H(C)0506H(D)0403H
答案:A
內(nèi)存分配示意圖:
分析:根據(jù)數(shù)據(jù)定義偽指令BUF DW 1、2、3、4畫出內(nèi)存分配示意圖,在存儲單元相應(yīng)位置標出變量名和EA。OFFSET TAB得到的是變量TAB的EA。TAB這個變量的EA為0則MOV BX,OFFSET TAB這個指令的源操作數(shù)OFFSET TAB是立即尋址,(BX)=0。ENTRY為符號常量,指令A(yù)DD BX,ENTRY的源操作數(shù)ENTRY也是立即尋址(BX)+3→BX,(BX)=3。MOV AX,WORD PTR [BX]指令中源操作數(shù)[BX]是寄存器間接尋址,前面的WORD PTR指明內(nèi)存操作數(shù)為字類型。指令執(zhí)行后把偏移地址為3的字單元的內(nèi)容傳給AX。所以答案選A。
5.寄存器相對尋址
在寄存器相對尋址方式中,操作數(shù)在內(nèi)存儲器中,而操作數(shù)的偏移地址EA是指令指明的寄存器的內(nèi)容與指令中給出的位移量相加之和。
匯編格式:XR (或R+X,X + R)
功能: R的內(nèi)容與X相加之和為操作數(shù)的偏移地址EA。
R(Register 寄存器的簡寫,只能是SI,DI,BX,BP其中之一。)
X表示位移量,其值是用8位或16位二進制補碼表示的有符號數(shù)。