UbuntuマシンでNASMとGCCを使って非常に小さなプログラムを作成しようとしているときに、私は何か変わったことに気付きました。i386とx86-64メモリスタックの相違点
次のコードは、64ビットNASMとGCCの下で微細コンパイル:
global main
extern puts
section .text
main:
push rax
mov rdi, message
call puts
jmp exit
exit:
;return stack memory
pop rax
ret
message:
db "Hello from NASM!", 0
しかし、32ビットNASMとGCCの下で(レジスタは変更のみで)同じコードをコンパイルしようとしたとき、それはいずれかの意志結果セグメンテーションフォルトおよび/またはランダムな文字。なぜこうなった? x64アーキテクチャーは、i386と比べてメモリーをスタックに格納する方法が異なりますか?もしそうなら、どのようにこの行動を防ぐことができますか? 32ビットモードで、最も呼び出し規約(cdecl
、stdcall
、などが...)64ビット・モードとは異なり、ないレジスタに、引数がスタックにプッシュされることを期待
呼び出し規約は異なりますか? –
デバッガを使用して、フォルトがどこで発生しているのか調べることができますか? –
先週の言語仕様全体が変更されていない限り、これはC言語ではなくアセンブリ言語です。タグをスパムしないでください! (呼び出すライブラリ関数はこれを変更しません!) – Olaf