1. 程式人生 > >轉移指令jmp和跳轉指令call

轉移指令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 記憶體單元地址
    

    這裡寫圖片描述