控制轉移指令用于控制程序的流向,所控制的范圍即為程序存儲器區間,MCS-51系列單片機的控制轉移指令相對豐富,有可對64kB程序空間地址單元進行訪問的長調用、長轉移指令,也有可對2kB字節進行訪問的絕對調用和絕對轉移指令,還有在一頁范圍內短相對轉移及其它無條件轉移指令,這些指令的執行一般都不會對標志位有影響。
????[1].?無條件轉移指令(4條)
????這組指令執行完后,程序就會無條件轉移到指令所指向的地址上去。長轉移指令訪問的程序存儲器空間為16地址64kB,絕對轉移指令訪問的程序存儲器空間為11位地址2kB空間。
????????LJMP ?addr16 ????;addr16→(PC),給程序計數器賦予新值(16位地址)
????????AJMP ?addr11 ????;(PC)+2→(PC),addr11→(PC10-0)程序計數器賦予新值(11位地址),(PC15-11)不改變
????????SJMP ?rel ????????;(PC)+ 2 + rel→(PC)當前程序計數器先加上2再加上偏移量給程序計數器賦予新值
????????JMP ?@A+DPTR ??;(A)+ (DPTR)→(PC),累加器所指向地址單元的值加上數據指針的值給程序計數器賦予新值
????[2].?條件轉移指令(8條)
????程序可利用這組豐富的指令根據當前的條件進行判斷,看是否滿足某種特定的條件,從而控制程序的轉向。
????????JZ ?rel???????????????; A=0,(PC)+ 2 + rel→(PC),累加器中的內容為0,則轉移到偏移量所指向的地址,否則程序往下執行
????????JNZ ?rel??????????????; A≠0,(PC)+ 2 + rel→(PC),累加器中的內容不為0,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?A, data, rel?????; A≠(data),(PC)+ 3 + rel→(PC),累加器中的內容不等于直接地址單元的內容,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?A, #data, rel????; A≠#data,(PC)+ 3 + rel→(PC),累加器中的內容不等于立即數,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?Rn, #data, rel??; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的內容不等于立即數,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?@Ri, #data, rel?; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址單元中的內容不等于立即數,則轉移到偏移量所指向的地址,否則程序往下執行
????????DJNZ ?Rn, rel?; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)工作寄存器Rn減1不等于0,則轉移到偏移量所指向的地址,否則程序往下執行
????????DJNZ ?data, rel?; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)直接地址單元中的內容減1不等于0,則轉移到偏移量所指向的地址,否則程序往下執行
????[3].?子程序調用指令(1條)
????子程序是為了便于程序編寫,減少那些需反復執行的程序占用多余的地址空間而引入的程序分支,從而有了主程序和子程序的概念,需要反復執行的一些程序,我們在編程時一般都把它們編寫成子程序,當需要用它們時,就用一個調用命令使程序按調用的地址去執行,這就需要子程序的調用指令和返回指令。
????????LCALL ?addr16?; 長調用指令,可在64kB空間調用子程序。此時(PC)+ 3→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr16→(PC),即分別從堆棧中彈出調用子程序時壓入的返回地址
????????ACALL ?addr11?; 絕對調用指令,可在2kB空間調用子程序,此時(PC)+ 2→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr11→(PC10-0)
????????RET ?; 子程序返回指令。此時(SP)→(PC15-8),(SP)- 1→(SP),(SP)→(PC7-0),(SP)- 1→(SP)
????????RETI ?; 中斷返回指令,除具有RET功能外,還具有恢復中斷邏輯的功能,需注意的是,RETI指令不能用RET代替
????[4].?空操作指令(1條)
????這條指令將累加器中的內容清0。
????????NOP ????; 這條指令除了使PC加1,消耗一個機器周期外,沒有執行任何操作。可用于短時間的延時
????[1].?無條件轉移指令(4條)
????這組指令執行完后,程序就會無條件轉移到指令所指向的地址上去。長轉移指令訪問的程序存儲器空間為16地址64kB,絕對轉移指令訪問的程序存儲器空間為11位地址2kB空間。
????????LJMP ?addr16 ????;addr16→(PC),給程序計數器賦予新值(16位地址)
????????AJMP ?addr11 ????;(PC)+2→(PC),addr11→(PC10-0)程序計數器賦予新值(11位地址),(PC15-11)不改變
????????SJMP ?rel ????????;(PC)+ 2 + rel→(PC)當前程序計數器先加上2再加上偏移量給程序計數器賦予新值
????????JMP ?@A+DPTR ??;(A)+ (DPTR)→(PC),累加器所指向地址單元的值加上數據指針的值給程序計數器賦予新值
????[2].?條件轉移指令(8條)
????程序可利用這組豐富的指令根據當前的條件進行判斷,看是否滿足某種特定的條件,從而控制程序的轉向。
????????JZ ?rel???????????????; A=0,(PC)+ 2 + rel→(PC),累加器中的內容為0,則轉移到偏移量所指向的地址,否則程序往下執行
????????JNZ ?rel??????????????; A≠0,(PC)+ 2 + rel→(PC),累加器中的內容不為0,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?A, data, rel?????; A≠(data),(PC)+ 3 + rel→(PC),累加器中的內容不等于直接地址單元的內容,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?A, #data, rel????; A≠#data,(PC)+ 3 + rel→(PC),累加器中的內容不等于立即數,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?Rn, #data, rel??; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的內容不等于立即數,則轉移到偏移量所指向的地址,否則程序往下執行
????????CJNE ?@Ri, #data, rel?; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址單元中的內容不等于立即數,則轉移到偏移量所指向的地址,否則程序往下執行
????????DJNZ ?Rn, rel?; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)工作寄存器Rn減1不等于0,則轉移到偏移量所指向的地址,否則程序往下執行
????????DJNZ ?data, rel?; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)直接地址單元中的內容減1不等于0,則轉移到偏移量所指向的地址,否則程序往下執行
????[3].?子程序調用指令(1條)
????子程序是為了便于程序編寫,減少那些需反復執行的程序占用多余的地址空間而引入的程序分支,從而有了主程序和子程序的概念,需要反復執行的一些程序,我們在編程時一般都把它們編寫成子程序,當需要用它們時,就用一個調用命令使程序按調用的地址去執行,這就需要子程序的調用指令和返回指令。
????????LCALL ?addr16?; 長調用指令,可在64kB空間調用子程序。此時(PC)+ 3→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr16→(PC),即分別從堆棧中彈出調用子程序時壓入的返回地址
????????ACALL ?addr11?; 絕對調用指令,可在2kB空間調用子程序,此時(PC)+ 2→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr11→(PC10-0)
????????RET ?; 子程序返回指令。此時(SP)→(PC15-8),(SP)- 1→(SP),(SP)→(PC7-0),(SP)- 1→(SP)
????????RETI ?; 中斷返回指令,除具有RET功能外,還具有恢復中斷邏輯的功能,需注意的是,RETI指令不能用RET代替
????[4].?空操作指令(1條)
????這條指令將累加器中的內容清0。
????????NOP ????; 這條指令除了使PC加1,消耗一個機器周期外,沒有執行任何操作。可用于短時間的延時
評論
查看更多