2015-09-26 20 views
8

'jmp' yerine 'jmp' kullanmayı denemem gerek ama 'jmp' beni beğenmiyor .. atladığımda geri dönmüyor (bu yüzden asla çıkmıyor ve mutlu günler değil, ancak aramalar normal olarak geri döner ve çıkar.Assembly 'call' ile 'jmp'

'Çağrı' kullanmaktan mutluluk duyuyorum ama aslında 'jmp' denemem ve denemem için bir neden var mı?

Bu basit kod sadece 'jmp' olduğunda ne zaman geri dönüp ne zaman çıkış yapılacağını gösterir.

Herhangi bir yardım için şimdiden teşekkür ederiz. Bunun konuyla herşeyden önce

+3

Bu belirsiz ve çok belirsizdir. JMP yığıtı (dönüş değerini basarak) ayarlamaz, böylece bir "ret" yaptığınızda, yığından sahte bir adres girilir ve kodunuz atlar. Bir 'j'' ile bir' '' 'çağrı '' yapabilirsin ama jmp yapmadan önce, dönüş adresini kendin üzerine koymalısın. Hangi assembler ve hangi işletim sistemini hedefliyorsunuz? 16 veya 32 bit mi? –

+0

Sorunun buna benzer bir cevabı olabileceğini düşünüyorum: http://stackoverflow.com/a/28133370/3857942. –

+0

Bunun yerine (JFP) 'JMP' yi kullanmanın bir sebebi yok, okulda yapılması gerekenleri öğretmek için "CALL" ve "RET" nin "CALL" ile "JMP" yi simüle ederek nasıl çalıştığını öğretmek için '. Ayrıca size –

cevap

9

Peki, değişirse

_start: 

    jmp _Print 
    jmp _Exit 

ret 


_Exit: 

    ; normal exit 

ret 


_Print 

    ; print something 

ret 

da .. ben hangi (jmp sadece ona vermek etikete 'atlar' bütün bir linux terminalde bu koşuyorum call yığınının bulunduğu yere geri döneceği konumu (call yönergesinin altında), etikete jmp kodunu ve talimatı, jmp yönergesinde hangi konumun saklandığını saklar. Yukarıda belirtildiği gibi, çağrı talimatının altında). Görebildiğiniz gibi bir fark var. IMHO, ben sadece call fonksiyonları, C++ derleyici işlevleri ile yaptığı gibi, ancak jmp, daha sonra, o zaman, sadece geri dönmek için push dönmek veya bir kez bitti dönmek için başka bir etiket oluşturmak bazı kod yürütme. İşte

yapıldığında diğer etikete atlama bir örnektir:

_start: 



jmp _Print; 



_start_label: 



jmp _Exit; 

_Exit: 
; exit stuff goes here 

ret;  

_Print: 

;print stuff goes here 

jmp _start_label; 

ya da sadece çağrı :) kullanabilir

+0

Bu kesinlikle size olan şeyleri temizler! Bu hafta meclis eğitimine yeni başladım, bu yüzden tavsiye almak güzel. – user3502489

+0

sorun değil! Yardım ettiğine sevindim! – nameGoesHere