2016-04-03 21 views
0
section .data 

    intArray dw 100,90,80,70,60 

    twoNums db ' %d %d ',0,10 

num dw 10 
numIs db ' %d ',10,0 


hello : db 'hello',10,0 


section .text 


global main 
extern printf 


main : 


mov ebx,intArray 

mov esi,0 



arrayTravel: 

movzx eax,word[intArray+esi] 

movzx ebx,word[intArray+esi+2] 



push ebx 

push eax 

push twoNums 

call printf 

add esp,12 



sub eax,ebx 

push eax 

push numIs 

call printf 

add esp,8 



ret 

sonuç yerine printf o EAX basılan karakter sayısını döndürür aradığınızda i t bu durumda, bundan 12. Çıkart 90 -78neden çıkarma sonucudur? Montaj x86

cevap

1

veren ve -78 olsun 10 olmalıdır.

Çağrılan işlevlerin özellikle EAX kayıtlarındaki değerleri değiştirmeyeceğini, bunları korumanız gerektiğini düşünemezsiniz. Çağırma kuralı hangi kayıtların korunacağını ve hangilerinin bulunmadığını tanımlayacaktır.

+0

yerine esp, 12 ile esp ekle, 4 sonra her iki regs için pop kullanılır. iyi çalışıyor. çok teşekkürler. – matheromqq

+1

@matheromqq, düzeltmeniz bu durumda da işe yarayacaktır. Burada işlev parametreleri (değere göre geçirilir) işleve geçmek için yığına kopyalanır. Ancak, çağrı yapan kongre aksi belirtilmedikçe, çağrılan işlev bu kopyaları değiştirme hakkına sahiptir. Bu nedenle, değerleri arama işlevinin kontrol ettiği bir yerde korumalısınız. örneğin, bir (korunmuş) kayıt, yığın, hafıza vb. Öte yandan, eğer yaptığınız gibi, yazmaçların saklanmadığını varsayarsanız, kendiniz için hayatı çok daha zorlaştırırsınız! –