請問大家組合語言中子程式呼叫指令和跳轉指令有什麼區別?謝

2021-08-22 11:44:36 字數 1811 閱讀 9162

1樓:匿名使用者

簡單點說,call指令在跳轉前儲存當前指令地址,而jmp一類的指令不儲存當前指令的地址。

詳細點說:

call指令在跳轉前會在棧中儲存當前的程式計數器(ip)的值(有必要的話還要儲存cs),儲存完ip的值後,再去執行跳轉指令。即相當於:

push cs (沒有這種指令,有沒有這一句還要看呼叫的型別:far/near)

push ip (沒有這種指令)

jmp [word ptr/dword ptr] ...

這樣,程式在執行ret/retf指令時就能從棧中取出ip的值,即相當於:

pop ip (沒有這種指令)

pop cs (沒有這種指令,有沒有這一句也要看呼叫的型別)

來繼續執行call指令後的其他指令,當然你也可以選擇不執行ret,而把call當做jmp來用。這樣也沒有問題(沒人這麼幹),只不過棧裡多了點東西罷了,記得處理就好。

而形如jmp一類的指令只是簡單的執行跳轉(修改ip的值),並不儲存ip的值。當然跳轉後程式也就不知道原來是從**跳轉到這裡來的,自然就無法返回。

當然,這個時候ret指令還是可以用的,因為ret指令只是簡單的從棧頂取出一個word然後賦給ip,所以也可以用ret指令來實現jmp的功能(也沒人這麼幹)。如:

mov bx,offset s

push bx

ret這樣就相當於:

jmp s

所以說不要只是記一個指令怎麼用,而是要理解一個指令到底是什麼原理。

2樓:做而論道

call是子程式呼叫的指令,他有儲存他下一條指令地址的能力,當執行完了子程式,在子程式的末尾,應該有個ret指令,ret指令,將會使cpu回到call下面的指令繼續執行程式。

jmp是轉移指令,轉移到另一個地方去執行,他不儲存他下一條指令的地址。

組合語言中的子程式呼叫引數的傳送方式有哪些

3樓:匿名使用者

這個看個人習慣,有的用r0~r7,有的用累加器。還有的用其他暫存器。

4樓:匿名使用者

子程式引數傳遞的方法一般有三種:

1)暫存器傳遞法:適用於引數少時。

2)變數傳遞法:適用於同一原始檔(程式模組)中。

3)堆疊傳遞法:只適用於傳遞入口引數。

組合語言中中斷int和子程式呼叫call保護現場時分別壓入堆疊的是什麼?

5樓:匿名使用者

int指令相當於

pushf

push cs

push ip

jmp ***x:***x

call指令不儲存標誌暫存器

call分為遠呼叫和進呼叫

遠呼叫壓入段暫存器和返回地址

近呼叫只壓入返回地址

6樓:娃哈哈ab鈣奶

中斷int過程:

1.取得中斷型別碼

2.把標誌位壓入棧中

3.把cs壓入棧中

4.把ip壓入棧中

5.更改cs和ip,轉到中斷程式

call:將當前ip或者cs和ip壓入棧中,到底是把ip還是ip和cs壓入棧中。就要看call後到底是一個字還是2個字的,如果是一個字的,就只把ip壓入棧中,例如call ax;如果是兩個字,就先把cs壓入有棧中,再把ip壓入棧中,例如call dword ptr 記憶體單元地址

希望對你有幫助!

7樓:不亦心

push和pop指令

壓入的是pc指標值,即斷點地址

關於組合語言,關於組合語言中的LOOP指令

簡單的說就是 如果時間充裕 先學彙編,因為彙編會極大的幫助你認識晶片的內部,具體在執行的時候它是怎麼工作的。如果時間不充裕 先學c,因為c編寫語言只需要極少的對晶片的瞭解即可。比較 組合語言 程式 效率最高。通俗的說,寫出來的東西佔空間小。缺點 開發週期較長 c語言 程式 效率比較高。通俗的說,佔的...

51微控制器中組合語言如何呼叫c的子程式

我的程式是keil編譯的,如下 先申明extrn code send crc send crc是c中的函式,彙編中加了 呼叫的時候 lcall send crc 如果要專 使用c中的變數,那麼code變成 屬相應的data,xdata等 我的程bai序keil編譯器,extrn code du se...

組合語言中的CLC指令,CPL指令的功能分別是什麼 使用格式又是怎樣的

clc攜帶標誌,cpc是一條 操作碼指令,它不需要運算元,可以直接使用。mcucpl是指匯專編指令,是一種屬邏輯操作指令,是mcu直接定址地址取負100的指令,作用是將儲存器中指定數量的資料中的每一個資料轉換成邏輯反向的資料。cpl是微控制器逆位邏輯指令的簡稱。在mcu中使用這條指令可以將指定的資料...