子程序調用與返回指令
發布時間:2014/6/5 21:10:51 訪問次數:2557
1.絕對調用
絕對調用指令ACALL是一條兩字節指令, AD536AJDZ指令提供了11位目標地址addrll,所以和前面AJMP指令相似,其調用地址必須與ACALL指令的下一條指令首字節位于程序存儲器的同一個2KB區內。ACALL指令與AJMP指令不同的是它需要保存子程序的返回地址,
而AJMP指令不用。
指令執行過程是:執行ACALL指令時,PC+2后獲得了下一條指令的地址,然后把PC的當前值壓棧(棧指針SP加l,PC低字節進棧,SP再加l,PC高字節進棧)。最后把PC的高5位和指令給出的11位地址addrll連接組成16位目標地址(PCis~11aio~ao),并作為
子程序入口地址送入PC中,使CPU轉向執行子程序。因此,所調用的子程序入口地址必須和ACALL揩令下一條指令的第一個字節在同一個2KB區域的程序存儲器空間,否則就調用不到了。
2.長調用指令
LCALL addr16(長調用指令)
可以在64KB程序存儲器內調用子程序的指令,它是三字節指令。指令執行過程是:把PC加3獲得的下一條指令的地址進棧(先壓入低字節,后壓入高字節),進棧操作使SP加l兩次。接著把指令的第二和第三字節(a15~a8,a7~ao)分別裝入PC的高位和低位字節中,然后從該地址addr16(ais~a o)開始執行子程序。
3.子程序返回
這條返回指令的功能是從堆棧中取出斷點地址,送給PC,并從斷點處開始繼續執行程序。RET應放在一般子程序的末尾。
4.中斷返回
這條返回指令的功能也是從堆棧中取出斷點地址,送給PC,并從斷點處開始繼續執行程序。RETI應放在中斷服務子程序的末尾。在執行RETI指令時,還將清除MCS-51中斷響應時所置位的優先級狀態觸發器,開放中斷邏輯,使得已申請的較低級中斷源可以響應。且必須在RETI指令執行完之后,至少要再執行一條指令才能響應這個中斷。
1.絕對調用
絕對調用指令ACALL是一條兩字節指令, AD536AJDZ指令提供了11位目標地址addrll,所以和前面AJMP指令相似,其調用地址必須與ACALL指令的下一條指令首字節位于程序存儲器的同一個2KB區內。ACALL指令與AJMP指令不同的是它需要保存子程序的返回地址,
而AJMP指令不用。
指令執行過程是:執行ACALL指令時,PC+2后獲得了下一條指令的地址,然后把PC的當前值壓棧(棧指針SP加l,PC低字節進棧,SP再加l,PC高字節進棧)。最后把PC的高5位和指令給出的11位地址addrll連接組成16位目標地址(PCis~11aio~ao),并作為
子程序入口地址送入PC中,使CPU轉向執行子程序。因此,所調用的子程序入口地址必須和ACALL揩令下一條指令的第一個字節在同一個2KB區域的程序存儲器空間,否則就調用不到了。
2.長調用指令
LCALL addr16(長調用指令)
可以在64KB程序存儲器內調用子程序的指令,它是三字節指令。指令執行過程是:把PC加3獲得的下一條指令的地址進棧(先壓入低字節,后壓入高字節),進棧操作使SP加l兩次。接著把指令的第二和第三字節(a15~a8,a7~ao)分別裝入PC的高位和低位字節中,然后從該地址addr16(ais~a o)開始執行子程序。
3.子程序返回
這條返回指令的功能是從堆棧中取出斷點地址,送給PC,并從斷點處開始繼續執行程序。RET應放在一般子程序的末尾。
4.中斷返回
這條返回指令的功能也是從堆棧中取出斷點地址,送給PC,并從斷點處開始繼續執行程序。RETI應放在中斷服務子程序的末尾。在執行RETI指令時,還將清除MCS-51中斷響應時所置位的優先級狀態觸發器,開放中斷邏輯,使得已申請的較低級中斷源可以響應。且必須在RETI指令執行完之后,至少要再執行一條指令才能響應這個中斷。