| SJMP | 相對(duì)跳轉(zhuǎn),包括條件跳轉(zhuǎn)(CJNE,DJNZ,JB,JBC,JC,……)和非條件SJMP指令?蓪ぶ返钠屏繛殡x開(kāi)緊跟在相對(duì)跳轉(zhuǎn)指令后面的指令的首字節(jié)-128到+127字節(jié)。當(dāng)我們?cè)诖a中使用相對(duì)跳轉(zhuǎn)指令時(shí),我們必須用一個(gè)表達(dá)式來(lái)估計(jì)跳轉(zhuǎn)目標(biāo)的代碼地址。匯編器完成所有的偏移運(yùn)算。如果目標(biāo)地址超出范圍,匯編器會(huì)產(chǎn)生一條出錯(cuò)信息。 |
| ACALL AJMP | 塊內(nèi)跳轉(zhuǎn)和調(diào)用只能訪問(wèn)程序空間的2K字節(jié)塊內(nèi)的地址。當(dāng)跳轉(zhuǎn)或調(diào)用指令被執(zhí)行時(shí),程序計(jì)數(shù)器的低11位被替換。對(duì)于Dallas 390連續(xù)型模式,塊的大小為512KB或19位。如果ACALL或AJMP是塊中的最后一條指令,程序計(jì)數(shù)器的高端位改變,跳轉(zhuǎn)將被限制在ACALL或AJMP指令后面的程序塊內(nèi)。 |
| LCALL LJMP | 長(zhǎng)跳轉(zhuǎn)和調(diào)用允許訪問(wèn)程序空間的64K字節(jié)段中任意地址。當(dāng)跳轉(zhuǎn)或調(diào)用指令被執(zhí)行時(shí),程序計(jì)數(shù)器的低16位被替換。對(duì)于Dallas 390連續(xù)型模式,塊的大小為16MB或24位。對(duì)于菲利浦80C51MX和英特爾/愛(ài)特梅爾WM 251:如果LCALL或LJMP是64K字節(jié)段中的最后一條指令,程序計(jì)數(shù)器的高端位改變,跳轉(zhuǎn)指令將被限制在LCALL或LJMP指令后面的程序段內(nèi)。 |
| ECALL EJMP | 擴(kuò)展的跳轉(zhuǎn)和調(diào)用允許在英特爾/愛(ài)特梅爾WM 251或菲利浦80C51MX擴(kuò)展的程序空間內(nèi)訪問(wèn)。 |
| CALL JMP | 通用跳轉(zhuǎn)和調(diào)用是兩條不代表具體操作碼的指令助記符。JMP可以被匯編為SJMP,AJMP,LJMP,EJMP。CALL可以被匯編為ACALL,LCALL或ECALL。通用助記符通常被估計(jì)為一條指令,沒(méi)有必要是最短的指令,只要達(dá)到指定的程序地址操作數(shù)就可以。 |
適用于所有8051版本的例子
| EXTRN CODE (my_function) | |||
| CSEG | AT 3 | ||
| JMP | ext_int | ; 一個(gè)中斷向量 | |
| ?PR?myintr | SEGMENT | CODE | ; 為程序代碼定義一個(gè)段 |
| RSEG | ?PR?myintr | ||
| ext_int: | JB | FLAG, flag_OK | |
| INC | my_var | ||
| flag_OK: | CPL | FLAG | |
| RETI | |||
| ; http://gonghighloam.21ic.org 羅畝的筆記 | |||
| ?PR?myprog | SEGMENT | CODE INBLOCK | ; 2K塊內(nèi)的一個(gè)段 |
| RSEG | ?PR?myprog | ||
| func1: | CALL | sub_func | ; 將產(chǎn)生ACALL |
| loop: | CALL | my_function | ; 外部函數(shù) -> LCALL |
| MOV | A,my_var | ||
| JNZ | loop | ||
| RET | |||
| http://gonghighloam.21ic.org 羅畝的筆記 | |||
| sub_func: | CLR | FLAG | |
| MOV | R0, #20 | ||
| loop1: | CALL | my_function | |
| DJNZ | R0, loop1 | ||
| RET | |||
在菲利浦80C51MX和英特爾/愛(ài)特梅爾WM 251中使用EJMP,ECALL的例子





