2016-04-13 46 views
1

Montajda kodu çalıştıran C'deki ana işlevim var. Sadece basit toplamı yapmak istiyorum:Parametreleri C'den GNU'ya geçirme 64bit'de montaj işlevi

main.c

#include <stdio.h> 

extern int addByAssembly(int first_number, int second_number); 

int main (int argc, char **argv) 
{ 
    int sum=0; 
    sum = addByAssembly(5,4); 
    printf ("%d\n",sum); 
    return 0; 
} 

addByAssembly.s

.data 
SYSREAD = 0 
SYSWRITE = 1 
SYSEXIT = 60 
STDOUT = 1 
STDIN = 0 
EXIT_SUCCESS = 0 

.text 
#.global main 
#main: 
#call write 
#movq $SYSEXIT, %rax 
#movq $EXIT_SUCCESS, %rdi 
#syscall 

#******** 
.globl addByAssembly 
addByAssembly: 
pushq %rbp 
movq %rsp, %rbp 
movq 16(%rsp), %rax 
addq 24(%rsp), %rax 

movq %rbp, %rsp 
popq %rbp 

Ama benim sum karışıklık var.

movq $123, %rax 

dönüş değeri ben birçok yol denedim 123. olmakla toplamına düzgün bu nasıl bulamıyor: Ben bunu yaparsam beause i kötü, argümanlar geçmesi gibi görünüyor.

+0

düzgün argümanlar yakalayan, aslında, sen doğrulamak için bir hata ayıklayıcı ile arasında adım adım denediniz mi? –

+3

ABI'yi okudunuz, anladınız ve takip ettiniz mi? Tartışmanın yığından geçtiğini düşünmüyorum. Genel olarak, inline-assembler kullanın. – Olaf

+0

Şey, yapmadım. Benim dilimde bu konuyla ilgili herhangi bir bilgi yoktur ve ingilizcede sanat eserleri oldukça tekniktir. C'den kayıt defterine int geçişinin yanlış olduğunu farz ediyorum, ama neyin uygun olduğunu bilmiyorum. Hiç bir örnek bulamadım, bu yüzden buradayım. 32bit eşek – user2678074

cevap

0

Bu 'Jester' için çok fazla çaba harcadığımı ve zamanı anlattığımı açıkla! Özetlemek gerekirse

. Parametreleri C'den As'e (ve ayrıca C'den C'ye) geçmek, kendi ABI convention'a sahiptir. Orada gördüğünüz gibi , parametreler sipariş üzerine göndermek gibidir: 1) rdi 2) RSI 3) rdx ... vb ... durumunda

bunu, kongre daha fazla parametre var yığılmak için itilecek.

Yani benim durumumda

:

.globl addByAssembly 
addByAssembly: 
pushq %rbp 
movq %rsp, %rbp 
--movq 16(%rsp), %rax #this was wrong as my params are 
--addq 24(%rsp), %rax # first in %rdi, second in %rsi 
++lea (%rdi, %rsi), %rax # in my case this line will do 
         # %rdi+%rsi -> %rax (learn lea, usefull command) 
         # REMEMBER return value is always in %rax! 
movq %rbp, %rsp 
popq %rbp