1. 程式人生 > >組合語言——彙編指令長度的判斷

組合語言——彙編指令長度的判斷

組合語言(王爽)中,講CS:I[暫存器的地方有這樣一則圖示:

其中IP=IP+所讀指令的位元組數。

那麼,所讀指令的位元組數應該怎麼判斷呢?

彙編指令長度與定址方式有關,規律或原則如下:

一、沒有運算元的指令,指令長度為1個位元組

二、運算元只涉及暫存器的的指令,指令長度為2個位元組

    如:mov bx,ax

三、運算元涉及記憶體地址的指令,指令長度為3個位元組

    如:mov ax,ds:[bx+si+idata]

四、運算元涉及立即數的指令,指令長度為:暫存器型別

+1

    8位暫存器,暫存器型別=1,如:mov al,8;指令長度為2個位元組

    16位暫存器,暫存器型別=2,如:mov ax,8;指令長度為3個位元組

五、跳轉指令,分為2種情況:

1、段內跳轉(指令長度為2個位元組或3個位元組)

jmp指令本身佔1個位元組

段內短轉移,8位位移量佔一個位元組,加上jmp指令一個位元組,整條指令佔2個位元組

如:jmp short opr

段內近轉移,16位位移量佔兩個位元組,加上jmp指令一個位元組,整條指令佔3個位元組

如:jmp near ptr opr

2、段間跳轉,指令長度為5個位元組

如:jmp dword ptr table[bx][di]

  jmp far ptr opr

  jmp dword ptr opr 

注意:形如“jmp 1234:5678”的彙編指令,是在Debug中使用的彙編指令,彙編編譯器並不認識,如果在源程式中使用,那麼在編譯時便會報錯。