2016-04-09 10 views
0

少し宿題です。Nasm return structure

我々はいくつかの構造

typedef struct{ 
    int min; 
    int max; 
} M; 
M mima(int N, ...); 

int main(){ 
    M l = mima(5, 1, -2, 4 , 90, 4); 
    printf("mi = %d, ma = %d \n", l.min, l.max); 
    return 0; 
} 

との* .cファイルを持っていると我々はNASMで "美馬" を書き込む記述する必要があります。 私の唯一の問題は、最小値と最大値を見つけた後、構造として "c"プログラムに送ることができないことです。 -2と90の代わりに私はいくつかのランダムな負の数を取得します。

構造体を送り返すだけで十分であると言われました。

mov eax, (here is our min) 
mov edx, (here is our max) 

しかし、残念ながらそれは動作しません。ここで

は私のasmファイルは

BITS 32 
section .text 

global mima 

mima:     
push ebp 
mov ebp, esp 


start: 
    ; doing magic 


leave 
ret    

答えて

2

短い構造体を返すために使用されている2つの規則がありますどのように見えるかです。 edx/eaxのように、またはより大きな構造体のように、隠された最初の引数が指し示すメモリにあります。あなたの環境で使用されているデフォルトの規約について誤解されているようです。呼び出し元または呼び出し先のいずれかを変更して、その規則が一致するようにする必要があります。 gccを使用している場合は、-freg-struct-returnコマンドラインスイッチがあり、必要に応じてレジスタリターンを有効にします。アセンブリ面を変更すると、次のようになります。

mima:     
    push ebp 
    mov ebp, esp 
start: 
    ; doing magic 
    mov eax, [ebp+8] ; hidden arg pointing to return space 
    mov [eax], min  ; fill in return values 
    mov [eax + 4], max 
    ; must leave pointer in eax 
    leave 
    ret 
+0

ありがとうございました。プログラムはeaxで動作します。しかし、それは 'leave mov [ebp-16]、min mov [ebp-20]、max ret'でも機能します。なぜ私は何の説明も見つけられません。 –

+1

呼び出し元が返されたバッファをその場所に割り当て、 'eax'リターンを気にしなければ、偶然になります。 – Jester