轉移指令jmp和跳轉指令call
【-1】寫在前面
以下內容文字描述來自於 王爽老師的《組合語言》教材,建議大家都買一本,哈哈。不是我打廣告,確實人家寫的好,應該支援。我只是附上了自己的圖片和理解而已。
【0】先上乾貨
只修改ip,稱為段內轉移,如jmp ax
修改cs和ip,稱為段間轉移,如 jmp 1000:0
【1】分類
轉移指令分為:
無條件轉移,如jmp
條件轉移
迴圈指令, loop
過程
中斷
【2】我們的jmp
2.1 )jmp short 標號(轉到標號處執行指令)
對ip的修改範圍在-128~127;
[attention] : cpu在執行jmp指令時,並不需要轉移的目的地址, 而是包含轉移的位移;
2.2) jmp near ptr 標號
它實現的是段內近轉移, 只不過對ip的修改範圍在 -32768~32767;
2.3)jmp far ptr 標號
它實現的是段間轉移,又稱遠轉移; far ptr 指明瞭指令用標號的段地址和偏移地址修改cs和ip;
2.4)轉移地址在記憶體中
2.4.1)jmp word ptr 記憶體單元地址(段內轉移)
function:從記憶體單元地址處開始存放一個字,是轉移的目的偏移地址;
如,mov ax,0123h mov [bx], ax jmp word ptr [bx] 執行後, (ip) = 0123h
2.4.2)jmp dword ptr 記憶體單元地址(段間轉移)
功能:記憶體中存放兩個字,高地址處的字存放轉移的目的段地址;低地址處存放目的偏移地址;
(cs) = 記憶體單元地址 + 2
(ip) = 記憶體單元地址
如:mov ax,0123h mov ds:[0], ax mov word ptr ds:[2],0 jmp dword ptr ds:[0] 執行後, (cs) = 0; (ip) = 0123h 。
[Complementary]
MOV AX, WORD PTR [BX] ; 要有逗號
將DS:BX指向的記憶體地址中的16位數讀到AX裡面。
MOV是數值傳送指令,AX是目的運算元,WORD PTR表示後面的儲存單元是字型別,[BX]表示用BX的值來定址,預設段地址是DS的值。
【3】我們的call
3.0)談談ret和retf
3.0.1)執行ret 相當於執行:
(ip) = (ss) * 16+ (sp); (sp) = (sp) + 2;
3.0.2)執行retf, 相當於執行:
(ip) = (ss) * 16+ (sp) ; (sp) = (sp) + 2 ; cs = ss * 16 + sp ; sp = sp + 2 ;
3.0.3)執行ret,相當於執行 pop IP
3.0.4)執行retf,相當於執行 pop IP; pop CS
(所以retf 返回的時候要先將cs壓棧)
3.1)依據位移進行轉移的call 指令
相當於——將當前的IP或CS和IP壓入棧,然後轉移;
call指令除了不能實現短轉移之外,其他和jmp相同;
3.1.1)cpu執行call時,相當於進行:
push ip jmp near ptr 標號
3.1.2)also, 相當於:
sp = sp - 2 ss *16 +sp = ip ip = ip + 16位位移
3.2)轉移的目的地址在指令中的call指令
call far ptr 標號實現的是段間轉移;
3.2.1)cpu 執行call far ptr 標號時,相當於進行
push cs push ip jmp far ptr 標號
3.2.2)also 相當於
sp = sp - 2 ss * 16 + sp = cs sp = sp - 2 ss * 16 + sp = ip cs = 段基地址 ip = 偏移地址
3.3)轉移地址在register中的call指令
指令格式:call 16為reg
功能:
sp = sp -2
ss * 16 + sp = ip
ip = 16位reg
also 相當於
push ip
jmp 16位reg
3.4)轉移地址在記憶體中的call指令
3.4.1)call word ptr 記憶體單元地址
相當於push ip jmp word ptr 記憶體單元地址
3.4.2)call dword ptr 記憶體單元地址
相當於:push cs push ip jmp dword ptr 記憶體單元地址