微機原理-05-彙編語言

彙編語言程序設計

彙編語言是用助記符(英文字母縮寫)來表示的面向機器的程序設計語言,每條助記符指令都有相對應的機器碼,即彙編語言是機器語言的符號表示。

格式

彙編語言語句一般由4個字段組成,即標號、操作碼、操作數和註釋,它們之間應用分隔符隔開,常用的分隔符有空格“ ”、冒號“:”和分號“;”,而且空格的數目可以不止一個。

[標號:] 操作碼 [操作數] [;註釋]

上述格式中,[ ]中的項爲任選項,其中標號與操作碼之間用“:”分隔,操作碼與操作數之間用空格分隔,操作數與註釋之間用“;”分隔,有多個操作數時,操作數和操作數之間用“,”分隔。

  • 標號規定如下:
    ① 標號由1~8個ASCII碼字符組成,第一個字符必須是字母。
    ② 同一標號在一個程序中只 能定義一次,不能重複定義。
    ③ 不能使用彙編語言已經定義的符號作爲標號,如指令助記符、僞指令及寄存器的符號名稱等。
    ④ 標號的有無,取決於本程序中的其他語句是否訪問該條語句。如無其他語句訪問,則該語句前不需要標號。

  • 操作碼字段
    操作碼是指令的助記符,表示指令的性質,用於指示CPU執行何種操作。操作碼是彙編語言指令中唯一不能空缺的部分。

  • 操作數字段
    操作數字段用於存放指令的操作數或操作數的地址。

    • 即數:#data和#data16。
    • 直接地址:direct,如30H;僞指令定義的符號地址,如SUM;表達式,如SUM+1,特殊功能寄存器的名字等。
  • 註釋字段
    註釋是爲便於讀者的閱讀和理解而對語句或程序段的說明,彙編時不被翻譯成機器碼,機器也不執行。

僞指令

​ 僞指令是在“機器彙編”過程中,用來對彙編過程進行某種控制或者對符號和標號進行賦值。這些指令不屬於指令系統中的指令,彙編時也不產生機器代碼,因此稱爲“僞指令”。

  • ORG(彙編起始地址僞指令)
    ORG用來定義彙編以後的目標程序的起始地址。其格式如下:
    [標號:] ORG addr16
    例如: ORG 2000H
    START: MOV A,#34H
    ORG規定了標號START的地址爲2000H,也就是說該程序應從2000H開始存放。在一個彙編語言源程序中,可以多次使用ORG命令,以規定不同程序段的起始地址,地址一般應從小到大且不能重複。

  • END(彙編結束僞指令)
    END用來表示彙編語言源程序結束,它只能出現在程序的末尾,且只有一個。其指令格式如下:
    [標號:] END

  • EQU(賦值僞指令)
    EQU用來對程序中出現的標號進行賦值。其格式如下:
    字符名稱 EQU 數或彙編符號
    在機器彙編時,彙編語言會自動將EQU後面的數或彙編符號賦給左側的字符名稱。例如,
    AA EQU R1 ;AA等同於R1
    K1 EQU 40H ;K1代表40H
    使用該指令必須注意以下幾點:
    (1)該指令中的字符名稱不是轉移指令中出現的標號,而是出現在操作數中的字符名稱。
    (2)EQU僞指令中的字符名稱必須先定義後使用。
    (3)EQU定義的字符名稱不能出現在表達式中,例如語句MOV A,A10+1是錯誤的。

  • DATA(數據地址賦值僞指令)
    DATA對數據地址或代碼地址賦予規定的字符名稱。其格式如下:
    標號名稱 DATA 表達式

  • B、DW、DS(定義字節、字、空間僞指令)
    DB:從指定的地址單元開始,存放若干字節。
    DW:從指定的地址單元開始,存放若干字(16位二進制數,高8位在前,低8位在後)。
    DS:從指定的地址單元開始,保留若干單元備用。指令格式如下:
    [標號:] DB 字節常數 ;用逗號分隔開的若干項,每項都是一個字節)
    [標號:] DW 字常數 ;用逗號分隔開的若干項,每項都是一個字)
    [標號:] DS 表達式 ;其值表示保留的單元個數)

分析下段程序。  
ORG    2000H
DS      08H
DB      30H,8AH,10,‘B’
DW     54H,1F80H
解:該程序的DS僞指令定義8個存儲單元(2000H~2007H)備用;DB僞指令定義了從地址2008H開始的4個單元的內容;DW僞指令定義了後續4個單元的內容。結果如下:

(2008H) = 30H,  (2009H) = 8AH
(200AH) = 0AH, (200BH) = 42H
(200CH) = 00H,  (200DH) = 54H
(200EH) = 1FH,  (200FH) = 80H

  • BIT(位地址符號僞指令)
    BIT用來將位地址賦給字符名稱。其格式爲:
    字符名稱 BIT 位地址
    例如:
    KEY BIT P1.0 ;將P1.0的位地址賦給符號名KEY
    ST BIT 0D7H ;將位地址爲D7H的位定義爲符號名
    注意:位地址既可以是絕對地址,也可以是符號地址。另外,用BIT定義的“符號名”一經定義便不能重新定義和改變。


彙編程序

步驟

彙編語言程序設計的一般步驟
彙編語言程序設計大致可分成以下幾步:
(1)明確設計要求。
(2)確定算法。
(3)繪製程序流程圖。
(4)按程序流程圖編寫源程序。
(5)上機調試。
(6)優化程序。

結構

#####順序

將片內RAM的20H單元中的壓縮BCD碼拆成兩個ACSII碼存入21H、22H單元。低4位存在21H單元,高4位存 在22H單元。

ORG	 2000H
MOV	 A,20H
MOV	 B,#10H ;除以10H
DIV	 AB
ORL	 B,#30H ;低4位BCD碼轉換爲ASCII碼
MOV	 21H,B
ORL	 A,#30H ;高4位BCD碼轉換爲ASCII碼
MOV	 22H,A
END

#####分支

求單字節有符號數的二進制補碼。

GCMPT:JNB   ACC.7,RETURN	;(A) > 0,不需轉換
MOV  C,ACC.7	             ;符號位保存
CPL   A		         	;(A)求反,加1
ADD  A,#1				
MOV  ACC.7,C      ;符號位回存A的最高位
RETURN:RET

循環
設有100個單字節數。連續存放在內部M單元開始的數據存儲器中,且總和也爲單字節數,存放到N單元。試編寫求這100個數之和的程序。

參考程序:
N	  EQU	30H
M	  EQU	31H
 	  ORG	2020H
 	  MOV	A,#00H
 	  MOV	R0,#M
 	  MOV	R1,#64H
LOOP:ADD 	A,@R0
 	  INC	R0
 	  DJNZ	R1,LOOP
 	  MOV	N,A
 	  SJMP $
 	  END

現場保護與恢復工作

由於主調程序和子程序經常是分開編制的,所以它們所使用的寄存器或存儲單元往往會發生衝突。爲避免子程序在運行過程中,修改主調程序中使用的寄存器/存儲單元的原有內容,在子程序開始運行時應進行相應寄存器/存儲單元內容的保存,在子程序運行結束,再將這些寄存器/存儲單元的內容進行恢復,以保證調用程序的正常運行。

在主程序中實現
        現場保護與恢復工作在主程序中實現,特點是結構靈活。例如,
PUSH   PSW      	;保護現場(含當前工作寄存器組號)
PUSH   ACC     
PUSH   B        
MOV    PSW,#10H 	;切換當前工作寄存器組
LCALL  addr16    	;子程序調用
POP    B         		;恢復現場
POP    ACC     
POP    PSW      		;含當前工作寄存器組切換

在子程序中實現
        現場保護與恢復工作在子程序中實現,特點是程序結構規範、清晰。例如,
SUB1: PUSH  PSW      ;保護現場(含當前工作寄存器組號)
       PUSH  ACC     
       PUSH  B        
       MOV   PSW,#10H ;切換當前工作寄存器組
       … 
       POP   B         	;恢復現場
       POP   ACC    
       POP   PSW      	;內含當前工作寄存器組切換
       RET


###習題

  1. 用於程序設計的語言分爲哪幾種?它們各有什麼特點?

答:51系列單片機的編程語言可以分爲彙編語言和高級語言(如C語言)兩種,各自的特點如下:

名稱 特點 缺點 優點 適用場合
彙編語言 用符號書寫指令(用助記符表示操作碼,特殊符號表示操作數) 機器不能直接識別;程序員必須瞭解機器的結構和指令系統,不易推廣和普及;不能移植,不具備通用性 較易爲人們識別、記憶和讀寫 實時控制系統
高級語言 用以英語爲基礎的語句編程 機器不能直接識別;執行時間長 易於推廣和交流;不依賴於機器,具有通用性 科學運算和數據處理
  1. 設常量和數據標號的定義爲:
	ORG	2000H

	DAT1:		DB  1, 2, 3, 4, 5

	DAT2:		DB  ‘ABCD’

	DAT3:		DW  1200H,-2

	TAB: 		DW  DAT1, DAT3

補充:A爲65,也就是十六進制的41H

​ (1)畫出上述數據或地址的存儲形式。

​ (2)寫出各標號的地址。

答:(1)

地址 內容(H)
2000H 01
02
03
04
05
2005H 41
42
43
44
2009H 12
00
FF
FE
200DH 20
00
20
09

(2)DAT1=2000H; DAT2=2005H; DAT3=2009H; TAB =200DH

  1. 試編寫程序,找出片內RAM 30H~5FH單元中無符號數的最大數,並將結果存入60H單元。

答:

        ORG  0000H
		MOV  R0,  #30H
		MOV  R7,  #2FH
		MOV  A,   @R0
AGAIN:	INC  R0
		MOV  B,	A
		CLR	C
		SUBB  A,  @R0
		JNC   L1
        MOV   A,  @R0
		AJMP  L2
L1:     MOV   A,  B
L2:     DJNZ  R7, AGAIN
		MOV   60H, A
		SJMP  $
		END

6.試編寫程序,統計片內RAM的20H~5FH單元中出現55H的次數,並將統計結果送60H單元。

答:

       TAB		EQU   20H
				ORG  0000H
       START:   MOV  60H, #0
                MOV  R0, #TAB
       LOOP2:   MOV  A,  #55H
                CLR  C
				SUBB  A,  @R0
				JNZ   NEXT
				INC   60H
		NEXT:   INC   R0
	        	CJNE  R0,  #60H,  LOOP2
				SJMP  $
				END

7.編寫程序,將片外數據存儲區中3000H~30FFH單元全部清零。

答:

                ORG  0000H
       START:   MOV  A, #0
 				MOV  R7,  #0
                MOV  DPTR,  #3000H
       LOOP:    MOVX  @DPTR,  A
                INC   DPTR
	        	DJNZ  R7, LOOP
				SJMP  $
				END
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章