官术网_书友最值得收藏!

第4章 MCS-51系列單片機(jī)指令系統(tǒng)

指令是CPU執(zhí)行某種操作的命令,CPU所具有的全部指令的集合稱為指令系統(tǒng)。計(jì)算機(jī)的指令系統(tǒng)是表征計(jì)算機(jī)性能的重要指標(biāo),每種類型的計(jì)算機(jī)都有自己的指令系統(tǒng)。指令系統(tǒng)是制造廠家在設(shè)計(jì)CPU時(shí)所賦予它的功能,用戶必須正確書寫和使用。因此,學(xué)習(xí)指令系統(tǒng),掌握指令的功能和應(yīng)用是十分重要的,這是用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)的基礎(chǔ)。本章我們將詳細(xì)介紹MCS-51系列單片機(jī)指令系統(tǒng)的功能和使用方法。

4.1 概述

4.1.1 指令和指令系統(tǒng)

微型計(jì)算機(jī)的功能是從外部世界接受信息,經(jīng)CPU加工、處理,然后把結(jié)果送到計(jì)算機(jī)外部。設(shè)計(jì)一臺(tái)計(jì)算機(jī),首先要提供一套具有特定功能的操作命令,這種操作命令稱為指令。CPU所能執(zhí)行的各種指令的集合稱為指令系統(tǒng)。從指令是反映計(jì)算機(jī)內(nèi)部的一種操作來(lái)看,指令系統(tǒng)全面展示了計(jì)算機(jī)的操作功能,也就是它的工作原理;從用戶使用的角度看,指令系統(tǒng)是提供用戶使用計(jì)算機(jī)功能的軟件資源。

設(shè)計(jì)一種微處理器,一般從設(shè)計(jì)指令開始。指令系統(tǒng)因機(jī)種不同而異。例如代碼01001111B(4FH),對(duì)Z80CPU是將累加器A中的內(nèi)容傳送給寄存器C;對(duì)于M6800 CPU是將累加器A清零;而對(duì)MCS-51單片機(jī)卻是將累加器A和工作寄存器R7進(jìn)行“與”操作。

指令一般有功能、時(shí)間和空間三種屬性。功能屬性是指每條指令所對(duì)應(yīng)的一個(gè)特定的操作功能;時(shí)間屬性是指一條指令執(zhí)行所用的時(shí)間,一般用機(jī)器周期來(lái)表示;空間屬性是指一條指令在程序存儲(chǔ)器中存儲(chǔ)時(shí)所占用的字節(jié)數(shù)。這三種屬性在使用中最重要的是功能屬性,但時(shí)間、空間屬性在有些場(chǎng)合也要用到。如一些實(shí)時(shí)控制應(yīng)用程序中,有時(shí)需要計(jì)算一個(gè)程序段的確切執(zhí)行時(shí)間或編寫軟件延時(shí)程序,這時(shí)就都要用到每條指令的時(shí)間屬性;在程序存儲(chǔ)器的空間設(shè)計(jì)或進(jìn)行相對(duì)轉(zhuǎn)移指令的偏移量計(jì)算時(shí),就要用到指令的空間屬性。不同情況下關(guān)注的屬性是不同的。

微型計(jì)算機(jī)的指令系統(tǒng)由幾十條到幾百條指令構(gòu)成。每種指令又由兩個(gè)字段構(gòu)成,即操作碼字段和操作數(shù)字段。操作碼字段表明指令執(zhí)行何種性質(zhì)的操作,例如加法操作、減法操作、傳送操作等。它由一組二進(jìn)制代碼表示,在匯編語(yǔ)言中又用助記符代表。操作數(shù)字段指明指令的操作所需要的數(shù)據(jù)。該字段中,可以是操作數(shù)本身或操作數(shù)地址。在指令中,操作數(shù)可有一個(gè)或兩個(gè),前者稱為單操作數(shù)指令,后者稱為雙操作數(shù)指令,而雙操作數(shù)又分別稱為源操作數(shù)和目的操作數(shù)。

一種CPU的指令系統(tǒng)是該CPU本身所固有的,用戶無(wú)法改變,只能接受和應(yīng)用它。雖然各種CPU指令系統(tǒng)各不相同,但它們的指令類型、指令格式、指令基本操作及尋址方式有很多共同之處。因此學(xué)習(xí)好一種CPU的指令系統(tǒng),再掌握其他CPU的指令系統(tǒng)就容易了。

4.1.2 程序與程序設(shè)計(jì)

計(jì)算機(jī)要完成一項(xiàng)工作,必須按要求去執(zhí)行各種操作,即一步步地執(zhí)行一條條指令,這些按預(yù)定要求編排的指令序列稱為程序。編排程序的過(guò)程稱為程序設(shè)計(jì)。程序必須存放在存儲(chǔ)器中,CPU逐條取出指令并執(zhí)行之,從而完成預(yù)定的任務(wù)。下面通過(guò)一個(gè)例子進(jìn)行說(shuō)明。

例4-1】 在程序存儲(chǔ)器中存放著一個(gè)ASCII碼表,通過(guò)查表,將十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼。設(shè)十六進(jìn)制數(shù)存放在R0中的低4位,要求將轉(zhuǎn)換后的ASCII碼送回到R0中(用MCS-51單片機(jī)指令編寫)。

如圖4-1 所示,程序和數(shù)據(jù)塊已存放在存儲(chǔ)器中,都是以二進(jìn)制數(shù)的形式存放的。帶“·”的地址中存放的是指令的操作碼,這些操作碼規(guī)定了機(jī)器執(zhí)行什么操作;程序中還有指令的操作數(shù),是指令的操作對(duì)象,地址單元3008H~3017H中存放的是0~F的ASCII碼。在微機(jī)應(yīng)用中,大量的工作是編寫程序。程序設(shè)計(jì)過(guò)程就是根據(jù)任務(wù)要求和算法,從指令系統(tǒng)中選取合適的指令,給出必要的操作數(shù)(或操作數(shù)地址),加以合理的排列而得到程序的一個(gè)過(guò)程。

圖4-1 程序和表格在存儲(chǔ)器中存放示意圖

上例中的二進(jìn)制代碼稱為指令代碼。由于計(jì)算機(jī)的CPU只能認(rèn)識(shí)和識(shí)別二進(jìn)制代碼,所以又稱為機(jī)器碼。一種計(jì)算機(jī)有幾十種甚至上百種機(jī)器指令,都用二進(jìn)制碼表示是很困難的。所以,通常用十六進(jìn)制碼表示指令碼,但這仍解決不了記憶問(wèn)題和閱讀問(wèn)題。

為了記憶和閱讀方便,制造廠家對(duì)指令系統(tǒng)中的每一條指令都給出了符號(hào)作為指令助記符。如圖4-1中的第一個(gè)操作碼“11101000”用MOV A,R0表示,“01010100”和“00001111”用ANL A,#0FH表示等,這就容易記憶,容易理解,清晰可讀。

用助記符(操作符)、操作數(shù)(或其地址)和標(biāo)號(hào)編寫的程序稱為匯編(符號(hào))語(yǔ)言程序。用匯編語(yǔ)言編寫的例4-1的程序如下:

              標(biāo)號(hào)         操作碼   操作數(shù)                  注釋
                        ORG     0000H
            ASCCB:      MOV     A,R0                ;取數(shù)
                        ANL     A,#0FH              ;屏蔽高4位
                        ADD     A,#02H              ;變址調(diào)整
                        MOVC    A,@A+PC             ;查表
                        MOV     R0,A                ;送結(jié)果
                        RET                          ;返回
            ASCTAB:     DB      30H,31H,32H,33H,34H,35H,36H,37H
                        DB      38H,39H,41H,42H,43H,44H,45H,46H

匯編(符號(hào))語(yǔ)言程序也稱為源程序,計(jì)算機(jī)要執(zhí)行程序,需要將源程序翻譯成機(jī)器語(yǔ)言,這個(gè)過(guò)程稱為匯編。有時(shí)需要將機(jī)器語(yǔ)言翻譯成源程序,這個(gè)過(guò)程稱為反匯編。

為了完成源程序的匯編工作,匯編程序給程序員在程序格式上做了一些規(guī)定。上例中給出的是匯編語(yǔ)言的標(biāo)準(zhǔn)格式。一個(gè)匯編語(yǔ)言程序由若干行組成,每行包含一條指令。每行分為4個(gè)區(qū)段:

            [標(biāo)號(hào):]     操作碼       [操作數(shù)]     [;注釋]

每行除操作碼部分是必需的外,其他帶中括號(hào)的區(qū)段是任選項(xiàng),不是必需的。

在4個(gè)區(qū)段之間要用分隔符分開,標(biāo)號(hào)后接一冒號(hào),操作碼和操作數(shù)之間用一空格隔開,注釋段用一分號(hào)開始。另外,使用匯編語(yǔ)言編寫的程序(源程序)不要求每行的各個(gè)區(qū)段都一一對(duì)齊,但將各個(gè)區(qū)段對(duì)齊可使程序就更加清晰、可讀。

① 標(biāo)號(hào)是該指令的符號(hào)地址,標(biāo)號(hào)值代表這條指令在程序存儲(chǔ)器中的存放地址,可根據(jù)需要設(shè)定。標(biāo)號(hào)必須以字母開始,以冒號(hào)“:”結(jié)束,所用字符一般不超過(guò)8個(gè)(視匯編程序版本不同而異)。系統(tǒng)中保留使用的字符或字符組成不能用做標(biāo)號(hào)。一旦某個(gè)標(biāo)號(hào)賦給某個(gè)語(yǔ)句,則其他語(yǔ)句的操作數(shù)可以直接引用該標(biāo)號(hào),以便尋址或控制程序轉(zhuǎn)移。標(biāo)號(hào)在每條語(yǔ)句中是任選項(xiàng)。

② 操作碼在匯編語(yǔ)言中由英文字母縮寫而成。操作碼是匯編語(yǔ)言程序每一句所必需的部分,它決定了語(yǔ)句的操作性質(zhì),反映了指令的功能。操作碼和操作數(shù)之間用空格分開。

③ 操作數(shù)指示出的是參加運(yùn)算的數(shù)據(jù),可以是數(shù)字、操作數(shù)地址、寄存器等。操作數(shù)又分為目的操作數(shù)和源操作數(shù)兩種,二者之間用逗號(hào)“,”分開。另外,有些語(yǔ)句中可以無(wú)操作數(shù),只是一個(gè)命令。

④ 注釋以分號(hào)“;”開頭,計(jì)算機(jī)在匯編時(shí)對(duì)這部分不予處理,是程序員對(duì)指令操作的解釋。注釋必須在一行之內(nèi)寫完,換行時(shí)需要另外以分號(hào)“;”開始。注釋內(nèi)容可為任何字符。不需要每行都加注釋,僅在某些關(guān)鍵行注釋就可以了。

編程者(程序員)在編程時(shí),一定要嚴(yán)格按規(guī)定的格式書寫程序。

4.1.3 操作數(shù)的類型

計(jì)算機(jī)在工作過(guò)程中,主要是對(duì)數(shù)據(jù)的處理,即對(duì)操作數(shù)的處理。

操作數(shù)的類型有三種:立即數(shù)、寄存器操作數(shù)、存儲(chǔ)器操作數(shù)。

1.立即數(shù)

立即數(shù)是作為指令代碼的一部分出現(xiàn)在指令中的,它通常作為源操作數(shù)使用。

在匯編指令中,立即數(shù)可以用二進(jìn)制、十六進(jìn)制或十進(jìn)制等數(shù)制形式表示,也可以寫成一個(gè)可求出確定值的表達(dá)式來(lái)表示。

2.寄存器操作數(shù)

寄存器操作數(shù)把操作數(shù)存放在寄存器中,即用寄存器存放源操作數(shù)或目的操作數(shù)。

通常在指令中給出寄存器的名稱,在雙操作數(shù)指令中,可以作為源操作數(shù),也可以作為目的操作數(shù)。

3.存儲(chǔ)器操作數(shù)

存儲(chǔ)器操作數(shù)把操作數(shù)放在存儲(chǔ)器中,因此在匯編指令中給出的是存儲(chǔ)器的地址。

主站蜘蛛池模板: 莱阳市| 博罗县| 南充市| 海晏县| 杭锦后旗| 大城县| 泰安市| 兴业县| 拜城县| 旌德县| 郧西县| 察哈| 迁安市| 横峰县| 天门市| 林芝县| 油尖旺区| 卢湾区| 武义县| 永安市| 朔州市| 高台县| 呈贡县| 平塘县| 四会市| 任丘市| 明星| 花莲县| 曲松县| 莱阳市| 蓬安县| 长垣县| 阜新市| 务川| 丽江市| 上栗县| 榆树市| 孟州市| 文化| 佳木斯市| 酒泉市|