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在程式中就可...