質問: 自分はubuntuで動くアセンブリ言語のプログラムを作りましたが予想したように動かず質問させて頂きます。アセンブリはnasmです 【プログラムの説明】PSP(プログラムセグメントプリフィックス)に格納されている文字列の引数を読み込み再び出力するプログラムです。 【利用した考え方】 ・まずPSPの80H番地に引数の文字数が格納されている ・82H番地から引数が文字列として格納されている 【実行方法】 端末にて nasm -f elf64 filename.asm ld -s -o filename filename.o ./filename abcd ←abcdが文字引数として格納されますよね? これを実行するとコアダンプが起こります 【プログラム 及びその説明】 section .bss buffer: resb 1024h nub: resb 1h section .text global _start _start: mov edx, 80h mov ecx, [edx] mov edx, 82 mov ebx, buffer mov [nub], ecx cope: ;引数をbufferに格納している コピーは文字引数の数を参考している mov eax, [edx] mov [ebx], eax xor eax, eax inc edx inc ebx loop cope print0: mov edx, [nub] mov eax, 4 mov ebx, 1 mov ecx, buffer int 80h end: mov eax,1 int 80h 改善法やもし誤った認識があれば教えてください よろしくお願いします。
回答: アセンブリ言語でプログラムを組む場合、該当環境のABI(Application Binary Interface)を参照する必要があります。 Linux(ELF)環境のIntel x86アセンブラであれば、 にある "Intel386 psABI" を参照ください。一通り目を通されることを強くお勧めします。 上記ドキュメントの 2.3 Process Initialization - 2.3.1 Initial Stack and Register State を参照ください。`esp`レジスタを介してあなたの望む情報にアクセスできます。 > > ・まずPSPの80H番地に引数の文字数が格納されている > > ・82H番地から引数が文字列として格納されている > > > これはLinuxのABIではありません。PSP(Program Segment Prefix)はDOS OS向けABIです。