彙編中call指令和其對應的機器碼

2021-10-04 23:55:53 字數 814 閱讀 2704

call這個指令很神奇,他和別的指令不太一樣

對比下,當我們執行

mov eax,1

的時候,他的對應機器碼是

66 b8 01 00 00 00

這其中「66 b8」對應的是「mov eax,x」

後面的「01 00 00 00」就是「1」在32位中的little endian了

所以說,在對mov指令進行彙編時,裡面的常數會被直接彙編成機器碼

然而call指令比較有意思

這個是一段很簡單的彙編**

start:

call @f

@@: pop ebx

call	@f

nopnop

nop@@: pop ebx

end start

然後通過反彙編後,他變成了這個樣子

仔細觀察機器碼和反彙編**的對應關係,在彙編**中,第一行的

call @f

@f: …

被彙編成了機器碼

e8 00 00 00 00

欸?「@f」所在位址明明是00401005,為什麼沒有被彙編成為

e8 05 10 40 00

呢?再接著看下乙個例子,這是彙編**

call @f

nopnop

nop@@: …

被編譯器編譯後變成了

e8 03 00 00 00

我好像發現了什麼,編譯器你好壞哦。。。

原來call編譯後會把已call所在位置為基址,然後把被call的位置的偏移位址給彙編成位元組碼

組合語言 CALL 和RET指令

call和ret指令都是轉移指令,它們都修改ip,但同時修改cs和ip。ret指令用棧中的資料,修改ip的內容,從而實現近轉移。retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移。cpu執行ret指令時,進行下面兩步操作 ip ss 16 sp sp sp 2 cpu執行retf指令時,...

組合語言 call和ret指令

call和ret指令都是轉移指令,它們都修改ip,或同時修改cs和ip。它們經常被共同用來實現子程式的設計。ret指令用棧中的資料,修改ip的內容,從而實現近轉移 retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移 cpu執行ret指令時,進行下面兩步操作 cpu執行retf指令時,進行...

彙編10 CALL和RET指令

call和ret指令都是轉移指令,它們經常被共同用來實現子程式的設計。ret指令用棧中的資料實現修改ip的內容,從而完成近轉移,執行ret指令時相當於執行 pop ipretf指令用棧中的資料實現修改cs和ip的內容,從而完成遠轉移,執行retf指令相當於執行 pop ip pop cs在程式中就可...