匯編JMP語句
不一樣。
假設BX的內容是1234H, 內存1234H單元的內容是5678H。JMP BX是跳轉到1234H去執行。
JMP [BX]是跳轉到5678H去執行(用BX中內容1234H作為地址,取內存1234H中的內容5678H作為目標)雖然都是間接尋址的跳轉指令,但尋址方式不同。前者是寄存器數據尋址,后者是內存數據尋址。
順便說一下,JMP [BX] 這樣寫在語法上是錯的,未標明數據類型。正確的寫法是JMP WORD PTR [BX],或者JMP DWORD PTR [BX](前一個是段內轉移,后一個是段間轉移)。
【jmpshort..指令的用法
jmp short s 這里編譯器在處理這條語句的時候,會把jmp short翻譯成機器碼EB,把后面的標號s翻譯成一個數字,這個數字有多大呢?前面的short給出了說明,是2個字節,這里的short限制了這個數字范圍,也就是-128~+127之間.這里開始解釋這個數字的值,一般有點匯編知識的人都會認為這個數字是目的地址,實際上不是這樣的(自己寫個例子調試一下就知道了,機器碼EB后面跟的并非是目的地址),這里放的數字實際上是目的地址和當前jmp之間的距離:例如:當前jmp short s 的偏移地址是0003s:標號所在的地址是0008jmp short 被翻譯成了機器碼EB,占一個字節標號s被翻譯成了一個數字,也占一個字節(本條指令共占0003和0004兩個字節)所以當前jmp指令距離標號s之間共隔了3個字節(0005,0006,0007)因此,編譯器就會在EB后面加上目的地址和當前jmp之間的距離3H這條指令沒有使cpu修改cs段,所以這個指令是段內跳轉指令,實際上CPU檢測到EB的時候就會在保持CS段不變的情況下,向前或是向后跳N個字節,N取決于EB后面的數字,該數字如果為正,則向前跳,為負則向回跳.使用上注意跳轉的距離不要超出8位有符號數的表示范圍就行.。
匯編JMP語句
不一樣。
假設BX的內容是1234H, 內存1234H單元的內容是5678H。
JMP BX是跳轉到1234H去執行。
JMP [BX]是跳轉到5678H去執行(用BX中內容1234H作為地址,取內存1234H中的內容5678H作為目標)
雖然都是間接尋址的跳轉指令,但尋址方式不同。
前者是寄存器數據尋址,后者是內存數據尋址。
順便說一下,JMP [BX] 這樣寫在語法上是錯的,未標明數據類型。
正確的寫法是JMP WORD PTR [BX],或者JMP DWORD PTR [BX]
(前一個是段內轉移,后一個是段間轉移)
JMP只是一個無條件跳轉指令,可以任意跳轉。
按照你說一直在循環是這種結構
NEXT:。
。。.
JMP NEXT (只是隨便舉個例子)
這結構如果在中間不加任何跳轉就是個死循環 ,因為程序是順序執行的,跳到NEXT時,又順序往下執行,所以是死循環。
要讓程序跳轉出,可以通過其他有條件的條件的跳轉指令(如 JC JZ JNZ等等)跳出,不過跳出的地址一定不能是在剛才例子的程序內部(NEXT~JMP之間),不然還是死循環。
而其他結構如
NEXT:。..
。。.
JMP LP
。。。.
LP: 。
這程序就不是死循環,因為它直接跳到了下面只是不執行 JMP 和 LP 之間的程序了。有一些程序還是用這種結構的。
由于JMP不具有判斷等原因,所以一般不建議用JMP指令,除非特殊情況。
匯編JMP語句 IP值和偏移量的問題
1、jmp short 的機器碼是 EB ,EB后面跟一個字節的帶符號的偏移量。
所以內存單元:
0624:EB
0625:27
當這條指令讀入CPU后, IP指向之后的地址,即0b27。 加上偏移量,地址為0b4e。
2、 jmp near ptr的機器碼是E9,E9后面跟兩個字節的帶符號偏移量。
所以內存單元:
0100:E9
0101:XX
0102:XX
上面的兩個字節(XX XX)是要求的值, 此時的IP(0102H) + 偏移量 = 1000H
所以偏移量= 1000H - 0102H = 0FF8H
關鍵在于,把指令讀入后IP地址已經指向了新的地址(下一條指令的地址),為了到達目標地址計算偏移量時,要用目標地目標減去此時的地址。 用補碼表示結果。