彙編語句裡面的ret 8是什麼意思?CALL的地址為什麼和跳過去的不一樣

2022-03-07 11:07:54 字數 5189 閱讀 4045

1樓:做而論道

彙編語句裡面的ret 8是什麼意思?

還有 ret 不是彈出棧 pop eip嗎? 8是什麼意思?

答:子程式的執行,有時需要一些資料。

那麼,在呼叫之前,可以把這些資料壓入堆疊,供子程式取用。

子程式返回後,為了保證堆疊的平衡,應該再彈出這些資料。

但是,這些資料,在主程式裡面,如果沒有用處,彈出,就是不必要的操作。

那麼,可以直接修改堆疊指標來保證平衡。

ret:即可返回到呼叫子程式之前的地址;

8:再把 sp 加上8。 有了這個 8,就可以省略 4 條 pop 指令(16位的)。

ret 8,就是直接修改堆疊的指標,使其多加上8,這就省略了 pop 操作,也不用再編寫對 sp 相加的運算指令。

----

call 的地址為什麼和跳過去的不一樣?例如 call 01200000 而到的地址不是012000000 別人說這是偏移。這是怎麼算的?

答:這個01200000,並不是目的地。 它是指 目的地 與 當前地址 之差。

2樓:胖大海君

呵呵 為你正確解答:

1彙編語句裡面的ret 8 是什麼意思?

ret 8 ;為段內帶立即數返回指令, 其中8 為指令 ret 攜帶的立即數 。

執行時,(ip)<----((sp)+1,(sp)) (sp)<----(sp)+2 (sp)<----(sp) + 8

作用:在子程式返回時,從堆疊將斷點地址取出後,允許修改堆疊指標,(在呼叫子程式時,把子程式需要用到的引數壓入堆疊,以便使用,當子程式結束,返回時,放在堆疊中的這些引數就沒有保留的必要了,這時可以在子程式返回時,使用段內帶立即數的返回指令,修改回原來堆疊指標所指的內容。

2 call 01200000 是段內直接呼叫指令

012000000 是偏移量,轉移的目標地址是:它是轉移地址和返回地址(斷點地址)的差值。

所以你程式的轉移地址應為: 斷點地址+012000000 。

備註:斷點地址就是 call 01200000 指令的下一條指令的地址

呵呵 還有不清楚的 可以繼續問 如果感到滿意 請給俺加分 以示鼓勵

3樓:

如果王爽出32彙編,估計我們就沒那麼難學了,王爽的講解真的是通俗易懂.

給子例程傳引數有用暫存器傳遞的,和堆疊傳遞的

我給你說下ret 8 的動作順序 吧

首先 彈出偏移地址 (ret)

然後 esp+8 (8)

為什麼後面要有個8呢?因為呼叫子例程的時候壓進了2個32位的引數(傳遞給子例程的引數),也就是8個位元組,如果是壓進1個引數那就是ret 4了,所以子例程結束返回的時候esp+8是讓棧指標回到沒壓進引數的時候的值。。這個叫做子例程負責清理堆疊,,c是呼叫者負責清理

看例子:

push eax

push ebx ;假設要向子例程傳遞的引數存放在eax和ebx裡

call myabc ;呼叫myabc子例程

????????? ;你覺得這裡應該是什麼**呢?

呵呵,壓棧了2個32位數,是不是應該恢復下棧啊

add esp, 8 ;你也可以想象成,pop ebx pop eax

c就是這樣做的,呼叫者負責清理堆疊

彙編裡的是在子例程裡面的最後返回時清理,由被呼叫的子例程負責清理

不要以為這樣是多餘的,如果不清理,在子例程裡面再呼叫其它子例程就會發生

返回時錯誤,彈出棧的是你壓進去的引數,而不是正確的返回地址

希望能幫到你。加油 。。。。另外希望大家回答的時候儘量別說太多的術語。。。。。。

4樓:

stdcall 的呼叫約定,把返回地址前壓入堆疊的引數 進行清理,也就是把實參給pop,而具體8是8個位元組,堆疊指標以4個位元組移動的,ret 後總是4的倍數。

這些行為相當於c呼叫約定的sub esp,8

當然用invoke proc之類高階偽指令,proc 會對自動清理傳遞的引數

5樓:

如果,「call 01200000」為「e800002001」,那麼01200000是相對偏移值,這個近跳轉不算「近」啊!

ret 8,返**用處,並彈出棧頂8個位元組!

同一助記符不一定有相同的機器操作碼,這與許多因素有關!提問時應提供儘量多的資訊,例如,同時提供機器碼及暫存器狀態是個好習慣。另外在提問前,可以先參看下相關的文件,如《intel® 64 and ia-32 architectures software developer』s manual》中包含你所需要的答案。

6樓:匿名使用者

ret imm16

retimm16 ; 近返回或遠返回,並調整堆疊:sp = sp + imm16

功能描述:

retimm16:在返回地址出棧後,cpu立即將imm16加到堆疊指標sp.這種機制用來在返回前將引數從棧中移出.

對標誌位的影響:無.

說明:ret由彙編程式根據其所在過程的型別(near或far)決定是近返回還是遠返回.預設為近返回.qq804948664

7樓:匿名使用者

計算機自己算的。 由你指定標號,例如jmp loop 只要知道標號就好了。。然後計算機計算出標號距離跳轉位置的偏移地址。

ret 8 看樓上做而論道的吧、

不必給我滿意。。不過有什麼不懂可以hi我、

微控制器組合語言ret沒有和acall配套使用時返回到**?

8樓:匿名使用者

微控制器中很多子程式為了簡潔,可以有很多的ret返回語句的,這跟c語言一樣,一個函式或子程式也可以有多個return一樣,你這段程式也可以只有一個ret,這樣的話就需要用sjmp或ljmp轉移到程式返回處,效果一樣,但程式看起來就不那麼清晰明瞭。

9樓:亂七胡說八糟亂想

如不是在呼叫後ret了那就只會回到你堆疊最上高二地址(棧)中所指的地址上去了,你可這試試,先用二個壓棧指令pop壓二個數後(低位先壓)再ret,這會程式就會轉到你壓的這個數的地方執行起走。一般書上的例程絕大多數是以子程式方式表示的,所以是隻等你呼叫的。

10樓:

取決於棧指標所指向的內容。

就你貼出的這段程式而言,鬼才知道會飛到**去……

11樓:匿名使用者

這是一個完整的子程式。

學過分支結構嗎?這裡就是,相當於把前兩個ret換成sjmp 最後一行,但是sjmp的機器碼比ret長,所以直接寫個ret了事。

呼叫時,肯定是acall sin,然後到分支處,可以不跳,可以跳sin1,可以跳sin2,總之選一個,然後執行到最近的ret處就返回了,其它的ret對這次呼叫來說,等於是廢**。

實際上,對這個程式來說,除非跑飛,否則不使用acall,是不可能執行到3個ret中的任何一個的,使用acall sin,則會執行到3箇中的1個,然後就退出子程式了。至於sin1與sin2寫法上與sin相同,但是sin是函式入口,sin1與sin2是跳轉分支入口,而非函式入口。

51微控制器子程式中使用jmp(ajmp,ljmp,sjmp)指令 執行ret能不能回到主程式?

12樓:風間一葉

我仔細看了一下所有人的回答,有根本沒看懂樓主問題答非所問的,也有回答的差不離的,我來切一下重點好了。

樓主這所有問題其實歸根結底就是一個問題,堆疊和sp(堆疊指標)的問題

call指令執行時,就是先把當前程式指標壓入堆疊並使sp加1,然後開始執行call指令呼叫的子程式,當遇到ret指令時,把前面壓入堆疊的程式指標取出並sp減1(出棧),然後就回到call程式呼叫前位置了。

jmp指令並不會把程式指標壓入堆疊更不會影響sp(當然自己在jmp後用push指令除外)。自然call呼叫後使用jmp指令跳轉,最後遇到ret指令一樣能回到call程式呼叫前位置。就算你在jmp指令後使用push指令,只要和pop成對出現,還是會回到呼叫前的位置,不成對?

這堆疊不能這麼用的。。飛了。。飛了。

中斷其實和call指令時一樣的道理,至於用reti就如張庚(3樓)兄弟說的中斷是要多處理一些標誌位。

至於呼叫call多少次出錯,這還是堆疊和sp的問題。

如我上面所寫,call指令一次就得壓棧一次,而你在ret指令前又來一次call指令,那麼還得壓一次,這樣一直下去堆疊指標愈來愈大,就會佔用程式所要使用的ram地址,自然肯定會出錯,一半51微控制器預設sp為07h,而一般程式設計ram地址20h開始就會被程式佔用,一算就知道了,大概10幾20次吧,如果你中間還是用堆疊那麼就少點,如果你的程式佔用ram的地址靠後那麼就多點,不過一般夠用是肯定的了

13樓:做而論道

jmp(ajmp,ljmp,sjmp)指令,是轉移指令,它們在轉移的時候,並不保留當前的地址,所以使用ret指令,是無法回到原來的位置的。

使用lcall、acall指令,就是呼叫子程式的指令,是可以用ret指令返回的,因為lcall、acall指令儲存了原來的地址,可供ret使用。

另外,中斷程式中是可以使用jmp指令的,但是要保證,要儘快使用reti返回原來的斷點,否則就一直處於中斷之中,cpu以後就不會再相應同級別的中斷了。

------------------------

問題補充:

...,最後使用ret能不能回到call(acall,lcall)呼叫前的位置?

可以。...,多少次就會出錯?

lcall、acall指令儲存了原來的地址,是存放到堆疊裡面。

51微控制器的堆疊,是在片內ram中,空間是有限的。

空間究竟有多大,和你的棧底初始化的地址有關,另外,堆疊中,還會儲存其它的內容。所以,儲存返回地址的空間究竟能有多大,需要你自己計算。

多少次會出錯,是和你編寫的程式有關的。

你可以用keil軟體來除錯,把你的程式單步的執行走一遍,即可知道堆疊空間的使用情況了。

14樓:lixiao瀟瀟瀟

在子程式內用跳轉可以。但是如果在子程式內用跳轉 跳出了這個子程式執行別的去了,這個就要小心了,你的ret沒有執行(地址沒有出棧),可能會出現資料的錯誤,如果後面反覆呼叫該函式 也有可能因為地址只進棧不出棧 導致最終記憶體佔滿。

手機裡面的英文是什麼意思,英文to是什麼意思

damage這個詞需要看是在什麼樣的語境下,可以作為動詞損害損傷,也可以作為名詞損害,賠償金。英文to是什麼意思 prep.到 向,朝著 關於 屬於 adv.朝一個方向的 到某種狀態 關閉 embn英文是什麼意思?mba英文又是什麼意思?emba英文全稱為executive master of bu...

大學裡面的小學期是什麼,大學的小學期什麼意思啊

小學期,是中國高校向美國高校學習的產物。一些大學對這個為期只有短短一月左右的新生事物寄予厚望,期待它能承擔起眾多沉重的使命。正如有的高校在其官方 上雄心勃勃地表示,開辦小學期是為了 加強課程建設,創新人才培養模式,提升教師素質,提高教學質量,全面提升國際性 開放小學期課程還建立在學分互認的基礎上,制...

生肖相害是什麼意思生肖裡面的相害是什麼意思

大家在卜易居算命網進行生肖配對測試時,會看一個 生肖相害 的概念,那麼生肖相害是什麼意思呢?生肖本源於地支,根據周易命理,十二地支,因陰陽氣場的不同,對角相沖。比如子水在正北方,午火在正南方,所以子午相沖,子為鼠,午為馬,所以鼠馬相沖。生肖相沖,代表兩個人的氣場不和,若在一起談戀愛,一起共事,總會引...