S08-03-Freescale-HCS08匯編指令及程序設計_第1頁
S08-03-Freescale-HCS08匯編指令及程序設計_第2頁
S08-03-Freescale-HCS08匯編指令及程序設計_第3頁
S08-03-Freescale-HCS08匯編指令及程序設計_第4頁
S08-03-Freescale-HCS08匯編指令及程序設計_第5頁
已閱讀5頁,還剩29頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Freescale

單片機原理及應用FreescaleHCS08匯編指令及程序設計Slide1Slide1FreescaleHCS08匯編指令及程序設計ContentsandObjectives:理解匯編指令格式、機器碼、操作周期含義理解匯編指令16種尋址方式的實質掌握常用匯編指令的功能和用法學會幾種常用程序設計方法學會實驗開發板的用法MCU通過執行程序完成人們指定的任務,程序由一條一條指令構成,能為CPU識別并執行的指令的集合就是該MCU的指令系統;不同類型MCU的指令系統通常不一樣,但是都很類似;匯編指令:用符號、指令操作符等編寫的語言稱為匯編語言符號約定數制表示Slide22.1匯編指令格式符號約定

數制表示規定在數字前面加前綴#表示立即數,例如:LDA #%01011010 ;將二進制數%01011010送累加器ALDA #$10 ;將十六進制數$10送到累加器A注意指令中的數值前有、無#前綴的區別:LDA %01011010 ;將地址為%01011010的單元中的內容送ALDA $10 ;將地址為$10的單元中的內容送累加器A括號‘’或“”表示單個ASCII碼字符或字符串,例如:String FCB “MC9S08AW60”用符號*或$作為操作數時表示當前存儲器地址,例如﹕

BRA * ;跳轉到本身,亦即程序在原地“踏步”。BRA $ ;跳轉到本身,亦即程序在原地“踏步”。符號*處于匯編語句中的第一列時表示該行為注釋語句。Slide32.1匯編指令格式匯編語句格式 HCS08的匯編源程序由一行行匯編語句組成,每行匯編語句的格式為: 標號操作碼操作數注釋 標號必需從一行的第一列開始書寫,在一句匯編語句中,標號并不是必需的,匯編程序中的絕大多數語句都沒有標號,通常只在子函數或轉移目的語句處使用標號。注意,標號區分大、小寫字母,AGN和Agn表示不同標號。 操作碼位于標號局部之后,用至少一個空格或Tab符隔開。操作碼可以是偽指令,也可以是指令助記符。對于沒有標號的語句,不能從第一列開始寫操作碼,否那么匯編程序會將指令碼認作標號而編譯出錯,應該至少退后一個空格或Tab符后再書寫操作碼。 操作數跟在操作碼后,也需用至少一個空格或Tab符隔開。操作數可以是地址、標號、表達式或數值。對于隱含尋址方式的指令語句,那么沒有操作數。多個操作數之間那么用逗號“,”隔開。如: INCA ;操作數隱含 LDA #0FFH ;操作數為數值 LDA $40 ;操作數為地址 LDA Labe1 ;操作數為標號 LDA Labe1+4 ;操作數為表達式

Slide42.1匯編指令格式匯編語句格式 HCS08的匯編源程序由一行行匯編語句組成,每行匯編語句的格式為: 標號操作碼操作數注釋 操作數跟在操作碼后,也需用至少一個空格或Tab符隔開。操作數可以是地址、標號、表達式或數值。對于隱含尋址方式的指令語句,那么沒有操作數。多個操作數之間那么用逗號“,”隔開。如: INCA ;操作數隱含 LDA #0FFH ;操作數為數值 LDA $40 ;操作數為地址 LDA Labe1 ;操作數為標號 LDA Labe1+4 ;操作數為表達式 為便于理解程序,可以在程序中添加注釋。在一行語句中,分號“;”后面的內容為注釋。注釋局部經匯編后不會生成任何機器指令碼。假設“*”在一行語句的第一列,那么表示該行為注釋。 注意:匯編指令中的冒號〔:〕、逗號〔,〕、分號〔;〕、星號〔*〕等標點符號要在英文狀態下輸入才合法,如果在中文狀態下輸入,編譯器會認作非法字符,在編寫匯編代碼時應該注意把輸入法的狀態切換到英文輸入狀態。Slide52.1匯編指令格式HCS08的CPU能夠直接識別和執行的是機器語言,每一條匯編指令都有唯一的16進制編碼——機器碼與之對應,最終寫入MCU的程序FLASH空間〔1860h~ffffh〕的都是機器碼

S08指令機器碼和執行周期S08的指令機器碼通常由兩局部組成,前一局部為操作碼,表示指令功能,后一局部為操作數,表示操作對象。不同指令不僅占用程序FLSAH的空間大小有別〔機器碼1~3字節〕,而且不同指令執行的速度快慢也不一樣。指令執行的快慢用指令所占用的機器周期〔總線周期〕來衡量,執行完一條S08的指令通常需要1~4個機器周期〔總線周期〕,根據不同指令而異。Slide62.2指令的機器碼和操作周期S08指令機器碼和執行周期S08的指令機器碼通常由兩局部組成,前一局部為操作碼,表示指令功能,后一局部為操作數,表示操作對象。

不同指令不僅占用程序FLSAH的空間大小有別〔機器碼1~3字節〕,而且不同指令執行的速度快慢也不一樣。指令執行的快慢用指令所占用的機器周期〔總線周期〕來衡量,執行完一條S08的指令通常需要1~4個機器周期〔總線周期〕,根據不同指令而異。如:LDA #$10 ;機器碼A610h,2個總線周期如上述指令為2字節,說明它要占用2B的程序FLASH空間(1860h~0ffffh)假設總線時鐘=4Mhz,那么上述指令需要0.5us時間才能執行完。作業:P73第2題;白紙作業;下周2交Slide72.2指令的機器碼和操作周期指令到機器碼由匯編軟件完成,但要學會查附表ASlide82.3S08完整匯編程序框架完整匯編框架Slide92.4匯編指令尋址方式HCS08系統中有多種數據存放空間形式:CPU存放器、I/O控制和狀態存放器、用戶RAM、Flash區等。其中,除CPU存放器外,其它空間都采用了統一編址方式,結合HCS08的16種不同尋址方式,可以快速、方便、高效地訪問這些存儲空間。Slide102.4匯編指令尋址方式通常將CPU獲取操作碼和操作數的各種方法稱之為尋址方式。在HCS08系統中,所有的存儲器、狀態和控制存放器以及I/O端口共享同一個64Kbyte的線性地址空間,這樣一來利用一個16位的地址就可以唯一確定存儲器空間中的任何一個單元,這意味著使用同一條指令不僅可以訪問Ram空間變量,也能訪問I/O和控制存放器,還能訪問非易失性編程空間。

Slide112.4匯編指令尋址方式隱含尋址方式〔INH—Inherentaddressingmode〕操作數由指令隱含,執行指令的所有信息均在操作碼中,CPU不需要從存放器、存儲器中取操作數,操作數隱含在累加器、變址存放器或狀態標志存放器中。具有隱含尋址方式的指令多為單字節指令,匯編后生成的操作碼在程序存儲區只占用一個字節的空間。例如: INCA ;累加器A中的內容加1,指令機器碼為$4C INCX ;變址存放器X中的內容加1,指令機器碼為$5C DECA ;累加器A中的內容減1,指令機器碼為$4A SEI ;中斷屏蔽位I置1,指令機器碼為$9B CLI ;中斷屏蔽位I清0,指令機器碼為$9A RTS ;子程序返回,指令機器碼為$81 RTI ;中斷返回,指令機器碼為$80 TAX ;將累加器A中的值賦給變址存放器X,指令機器碼為$97 TXA ;將變址存放器X中的值賦給累加器A,指令機器碼為$9F08指令系統中的尋址方式是針對整條指令而言,而不像8088系統那樣分別針對源操作數、目的操作數。Slide122.4匯編指令尋址方式立即數尋址方式〔IMM—Immediateaddressingmode〕 操作數包含在操作碼的后繼字節中。具有立即尋址方式的指令主要用于訪問常數,多為二字節指令,第一個字節為操作碼,后面字節為立即數,立即數前面的符號前綴#說明操作碼后面的是操作數值而不是操作數地址。例如: LDA #%01011010 ;將%01011010送到A中,指令操作碼為$A65A ADC #$30 ;將A中的內容與立即數$30進行帶進位加運算, ;和存至累加器A,機器指令碼為$A930。 AND #$FF ;將累加器A中的內容與立即數$FF進行邏輯與運 ;算,結果存至累加器A,機器指令碼為$A4FF LDHX #$2030 ;三字節指令,給變址存放器H:X賦值$2030,指 ;令操作碼為$452030Slide132.4匯編指令尋址方式直接尋址方式〔DIR—Directaddressingmode〕操作數的有效地址包含于操作碼后的一個字節中。由于操作數的有效地址僅為一個字節,因此直接尋址方式只能對存儲器0頁的256字節空間〔$0000~$00FF〕進行操作。0頁存儲區含有I/O控制和狀態存放器,還有局部用戶數據RAM區。一般將經常要訪問的數據放在0頁的用戶數據RAM中,以節省程序空間,提高數據訪問速度。具有直接尋址方式的指令為2字節指令,指令的第一個字節是操作碼,第二個字節是操作數的有效地址。例如: LDA$00 ;將$0000單元〔即端口A的數據存放器〕中的內容送入 ;累加器A中,機器指令碼為$B600。 STA$40 ;將累加器A中的值送入$0040單元中,機器碼為$B740 ADC$50 ;將累加器A中的內容與存儲單元$0050中的內容進行帶進 ;位加運算,和存至累加器A,機器指令碼為$B950。 ASL$60 ;將存儲單元$0060中的值算術左移一位,機器碼為$3860Slide142.4匯編指令尋址方式擴展尋址方式〔EXT—Extendedaddressingmode〕 操作數的有效地址包含于操作碼后的兩個字節中。由于操作數的有效地址為兩個字節,因此,采用擴展尋址方式的指令可以訪問64KB內的任何存儲器空間。具有擴展尋址方式的指令為一般為三字節指令,指令的第一個字節是操作碼,第二、三字節是操作數的有效地址。例如: LDA$0200;將$0200單元中的內容送入A中,機器碼為$C60200 STA$0240;將A中的值送入$0040單元中,機器碼為$C70240ADC$0250;將A的內容與存儲單元$0050中的內容進行帶進位加 ;運算,和存至累加器A,機器為$C90250。對于既有直接尋址方式又有擴展尋址方式的指令,如ADC、ADD、AND等,它們在尋址第0頁存儲空間的存儲單元時,是采用直接尋址還是擴展尋址方式由編譯軟件自動優化,通常是按照直接尋址方式尋址,因為此時采用直接尋址方式的指令執行速度更快、所占用程序空間更小。Slide152.4匯編指令尋址方式變址尋址方式 操作數的有效地址由16位變址存放器H:X中的內容和跟在操作碼后的無符號偏移量決定。根據偏移量的多少,變址尋址又分為無偏移量變址、8位偏移量變址、16位偏移量變址三種尋址方式:無偏移量變址尋址(IX—Indexed,nooffsetaddressingmode)操作數的有效地址在16位變址存放器H:X中。由于H:X為16位,故可訪問存儲器中的所有64K字節空間〔$0000~$FFFF〕。具有無偏移量變址尋址的指令為單字節指令,例如: LDA,X;將以H:X中的值為地址的存儲單元中的內容送至A中, ;指令機器碼為$F6。 STA,X;將A中的值送至以H:X中的值為地址的存儲單元中,指 ;令機器碼為$F7。 ADD,X;將(H:X)+A之和送至A中,機器碼為$FB。 INC,X;將以H:X中的值為地址的存儲單元內容加1,$7C。Slide162.4匯編指令尋址方式變址尋址方式 操作數的有效地址由16位變址存放器H:X中的內容和跟在操作碼后的無符號偏移量決定。根據偏移量的多少,變址尋址又分為無偏移量變址、8位偏移量變址、16位偏移量變址三種尋址方式:8位偏移量變址尋址(IX1—Indexed,8-bitoffsetaddressingmode)操作數的有效地址是16位變址存放器H:X中的無符號整數與操作碼后的一個字節無符號整數之和,這類指令同樣可訪問存儲器中$0000~$FFFF范圍的任一字節單元。具有8位偏移量變址尋址的指令為2字節指令,一字節為操作碼,另一字節為操作數,例如: LDA$10,X;將用H:X中的值加上$10所得的值為地址的存儲單 ;元中的內容送至A中,指令機器碼為$E610。 INC$30,X;將用H:X中的值加上$30所得的值為地址的存儲 ;單元中的內容加1,指令機器碼為$6C30。Slide172.4匯編指令尋址方式變址尋址方式 操作數的有效地址由16位變址存放器H:X中的內容和跟在操作碼后的無符號偏移量決定。根據偏移量的多少,變址尋址又分為無偏移量變址、8位偏移量變址、16位偏移量變址三種尋址方式:16位偏移量變址尋址〔IX2—Indexed,16-bitoffsetaddressingmode〕操作數的有效地址是16位變址存放器H:X中的無符號整數與操作碼后的兩字節無符號整數之和,這類指令同樣可訪問64KB存儲器中的任一單元。具有16位偏移量變址尋址的指令為3字節指令,一字節為操作碼,兩字節為操作數,例如: LDA$0110,X ;將用H:X中的值加上$0110所得的值為地址的 ;存儲單元的內容存儲至累加器A中,機器指 ;令碼為$D60110。 AND$1030,X ;將用H:X中的值加上$1030所得的值為地址的 ;存儲單元中的內容與累加器A中的值進行邏 ;輯與運算,結果存至A中,$D40130。Slide182.4匯編指令尋址方式變址尋址方式 操作數的有效地址由16位變址存放器H:X中的內容和跟在操作碼后的無符號偏移量決定。根據偏移量的多少,變址尋址又分為無偏移量變址、8位偏移量變址、16位偏移量變址三種尋址方式:無偏移量變址〔IX—Indexed,nooffsetaddressingmode〕8位偏移量變址〔IX1—Indexed,8-bitoffsetaddressingmode〕16位偏移量變址〔IX2—Indexed,16-bitoffsetaddressingmode〕三種變址尋址方式雖然都可訪問存儲器中的任一單元,但是其對應的指令執行的快慢和匯編后生成的代碼長短是不相同的,無偏移量變址尋址的指令執行最快,代碼最短,16位偏移量變址尋址的指令執行最慢,代碼最長。在所有變址尋址指令中,雖然出現的是X而不是H:X,但要注意變址尋址方式都是以16位存放器H:X中的值與相應的偏移量相加構成操作數的有效地址,而不是以X中的值與相應的偏移量相加構成操作數的有效地址。另外在變址尋址指令中的無符號整數前并沒有#前綴,但代表的是一偏移量數值,而不是地址,要注意與直接尋址和擴展尋址中無#前綴的數值代表地址區分開來。Slide192.4匯編指令尋址方式相對尋址方式〔REL—Relativeaddressingmode〕 只用于相對轉移指令。在這種尋址方式中,CPU首先測試給定的條件,如果滿足條件,那么發生相對轉移,即把當前程序計數器PC的值加上指令碼所占字節數,再加上指令操作碼后的8位有符號數,使程序轉移到PC指定的新地址處,否那么CPU執行該條指令的下一條指令。 PC值=當前PC值+本指令所占2字節+8位帶符號偏移量 具有相對尋址方式的指令為2字節指令,一字節為操作碼,一字節為相對偏移量,轉移范圍為相對于存放機器指令碼地址的-126到+129。 用戶在編寫匯編語言程序時,用一個地址標號代替偏移量,用戶不必自己去計算相對偏移量,匯編程序會在匯編用戶程序時自動計算出偏移量〔8位補碼表示〕,并進行檢查,以確定是否超出了有效轉移范圍。例如:Slide202.4匯編指令尋址方式相對尋址方式〔REL—Relativeaddressingmode〕 …… $9000 BCCPro1 ;進位標志為0那么轉移到Pro1標號處執 ;行,否那么順序;執行下一條語句,機 ;器指令碼為$24rr,rr為相對偏移量, ;匯編程序會自動計算。 …… $9012 Pro1:INCA ; …… 相對尋址方式指令的機器碼中rr為一字節相對偏移量(8位補碼表示),轉移范圍為相對于存放機器指令碼地址的-126到+129。此處,rr=10h〔9012h=9000h+2+rel〕[思考]為什么是-126到+129?8位補碼:-128到+127&&本身為2B指令Slide212.4匯編指令尋址方式堆棧尋址方式 操作數的有效地址由16位堆棧指針SP中的內容和跟在操作碼后的有符號偏移量決定。根據偏移量的多少,堆棧尋址又分為8位偏移量堆棧尋址和16位偏移量堆棧尋址兩種尋址方式。都可以訪問存儲器中$0000~$FFFF范圍的任一字節單元。8位偏移量堆棧尋址〔SP1〕 LDA$10,SP ;將用SP中的值加上$10所得的和為地址的 ;存儲單元中的值送至累加器A中,指令機器 ;碼為$9EE610。16位偏移量堆棧尋址〔SP2〕 LDA$0110,SP;將用SP中的值加上$0110所得的和為地址 ;的存儲單元中的值送至累加器A中,指令機 ;器碼為$9ED60110Slide222.4匯編指令尋址方式存儲器到存儲器的尋址方式:指令格式為:MOV 源地址,目的地址立即數尋址到直接尋址方式〔IMM/DIR〕 MOV#$FF,PTAD ;初始化端口A數據存放器PTAD(地址 ;為$00)為$FF,機器指令碼為$6EFF00。 MOV#$FF,$00 ;等同于上面一條語句直接尋址到直接尋址方式〔DIR/DIR〕MOVPTBD,PTAD ;將端口B數據存放器〔$01地址〕中的 ;值送至端口A數據存放器〔$00地址〕, ;機器指令碼為$4E0100。MOV$70,PTBD ;將地址為$70存儲單元中的內容送至端 ;口B數據存放器〔$01地址〕中,指令操 ;作碼為$4E7001。實現儲器到存儲器之間的直接數據傳送同8086正好相反Slide232.4匯編指令尋址方式存儲器到存儲器的尋址方式:指令格式為:MOV 源地址,目的地址自動變址尋址到直接尋址方式〔IX+/DIR〕 LDA #$00 STA $0140 ;初始化$0140存儲單元內容為$00 LDA #$01 STA $0141 ;初始化$0141存儲單元內容為$01 LDHX #$0140 ;初始化H:X內容為$0140 MOV X+,$40;將存放器H:X中內容$0140所指的存儲 ;單元中的值$00送至$40存儲單元,同時 ;H:X中的值自加1,變為$0141,指令 ;操作碼為$7E40。 MOV X+,$41;$41存儲單元被賦值為$01,H:X=$0142, ;機器指令碼為$7E41。Slide242.4匯編指令尋址方式存儲器到存儲器的尋址方式:指令格式為:MOV 源地址,目的地址

直接尋址到自動變址尋址方式〔DIX+〕

MOV #$00,$40 ;初始化$40存儲單元內容為$00 MOV #$01,$41 ;初始化$41存儲單元內容為$01 LDHX #$0140 ;初始化H:X內容為$0140 MOV $40,X+ ;將$40單元的內容$00送至H:X中內 ;容$0140所指的存儲單元中,同時H:X ;中的值自加1,變為$0141, ;機器指令碼為$5E40。 MOV $41,X+ ;$0141存儲單元被賦值為$01, ;H:X=$0142,機器指令碼為$5E41。Slide252.4匯編指令尋址方式存儲器到存儲器的尋址方式:指令格式為:MOV 源地址,目的地址立即數尋址到直接尋址方式〔IMM/DIR〕直接尋址到直接尋址方式〔DIR/DIR〕自動變址尋址到直接尋址方式〔IX+/DIR〕直接尋址到自動變址尋址方式〔DIX+〕 注意:由于存儲器到存儲器尋址方式中,只有用H:X中的內容作為源存儲器地址或目的存儲器地址時才是16位地址,而其余地址都是8位地址,因此MOV指令并不能實現任一存儲器地址到任一存儲器地址的直接數據傳送,而有一定的限制:立即尋址到直接尋址和直接尋址到直接尋址只能實現零存儲頁內〔00h——FFh〕的直接傳送,自動變址尋址到直接尋址只能實現任一地址到零存儲頁內的直接傳送,直接尋址到自動變址尋址只能實現零存儲頁到任一地址的直接傳送。Slide262.4匯編指令尋址方式無偏移量變址后加1尋址方式〔IX+〕 僅CBEQ X+,rel這一條指令采用無偏移量變址后加1尋址方式 〔IX+—Indexed,nooffset,postincrementaddressingmode〕。 CBEQ X+,Pro1 ;假設H:X中的值所指向的存儲單元的內 ;容和A中的值相等,那么轉移到標號 ;Pro1處執行,否那么順序執行下一條 ;語句,最后再將H:X中的值自動加 ;1,機器指令碼為$71rr,rr為相對 ;偏移量,具體數值由匯編程序計算。 本指令為2B指令,又由于指令碼中的相對轉移量只為一個字節,所以這條指令轉移范圍為相對于存放機器指令碼地址的-126到+129字節。Slide272.4匯編指令尋址方式8位偏移量變址后加1〔IX1+〕 僅轉移指令CBEQopr,X+,rel采用8位偏移量變址后加1尋址方式(IX1+—Indexed,8-bitoffset,postincrementaddressingmode)。 CBEQ$10,X+,Pro1 ;假設H:X中的值和8位偏移量$10相加所 ;得的和所指向的存儲單元的內容和A ;中的值相等,那么轉移到標號Pro1處執 ;行,否那么順序執行下一條語句;最后 ;再將H:X中的值自動加1,指令操碼 ;為:$6110rr,rr為相對偏移量。 本指令為3B指令,又由于指令碼中的相對轉移量只為一個字節,所以這條指令轉移范圍為相對于存放機器指令碼地址的-125到+130字節。Slide282.5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論