アセンブラでコマンドライン引数を取得する方法

このQ&Aのポイント
  • アセンブラでコマンドライン引数を取得する方法を知りたい
  • 50歳からアセンブラプログラムを趣味で勉強しているが、コマンドライン引数の取得方法について困っている
  • Windows7でアセンブラプログラムを作成しているが、コマンドライン引数がどこにあるのかわからない
回答を見る
  • ベストアンサー

アセンブラでコマンドライン引数を取得する方法

50歳からアセンブラプログラムを趣味で勉強しております。 一つ壁に当たりました。 コマンドライン引数が何処にあるのかわかりません。 Windows7で nasm -fwin32 test.asm alink -oPE -subsys console test.obj crtdll.lib -entry start アセンブル、リンクしています。 test.asm extern printf section .text global _start _start: push ebp mov ebp,esp mov eax,[ebp+8] push eax mov eax,A101 push eax call printf add esp,8 pop ebp ret section .data A101: db 'argc = %d', 10, 0 で、argc = 2147340288 と表示されます。 どうぞよろしくお願いいたします。

  • omogo
  • お礼率85% (6/7)

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

Win32 API は詳しくないのですが、CRTスタートアップルーチン使わないのであれば、GetCommandLine() を自分でコールする必要があるんじゃないかと。

omogo
質問者

お礼

どうもありがとうございました。 専門的な知識がなく、もっと勉強しなければ…。 本当に感謝、目からウロコです。

その他の回答 (3)

回答No.4

あと、printf への引数の渡し方が逆のようです。 以下のようにすると、A101が生きるようです。 _start: push ebp mov eax,A101 push eax call GetCommandLineA push eax call printf add esp,8 pop ebp ret section .data A101: db 'argc = %d', 10, 0

omogo
質問者

お礼

どうもありがとうございました。 納得できました。 なんだか、魔法のようです。 プログラムは、面白いです。

回答No.3

#2の方の方法でよいようです。 ただし、printfの設定方法が分からないので、そのままの表示 にしました。 なお、リンカのコマンドラインは「 -entry _start」でした。 extern GetCommandLineA extern printf section .text global _start _start: push ebp call GetCommandLineA push eax call printf add esp,4 pop ebp ret section .data

回答No.1

_start: push ebpがありますからスタックは ebp        ←esp return address argc argv[0] argv[1] になりますからargcは[ebp+8]ではなく[ebp+16] では?

omogo
質問者

お礼

考えていただいてありがとうございます。 早速、[ebp+16]で試してみましたが argc = 2005415915 という結果でした。 4byteじゃないのかな?と思い 2byte 1byte で試してみましたが思うような結果が得られませんでした。 後、セグメントレジスタも調べてみましたが、今のままで問題ないようです。 恐縮です。

関連するQ&A

  • nasmでhello, world

    FreeBSD4.6.2にを使っているのですが、 以下のソースはコンパイル、実行はできるのですが 、 hello, worldが画面上に表示されません。 ebxに代入する標準出力って1であっていますよね?? どこが間違っているのかわかりません。教えて下さい。 アセンブルは nasm -f elf hello.asm ld hello.o ./a.out とやりました。 以下が ソースです。 section .data msg db "Hello, world!" section .text global _start _start: mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, 13 int 80h mov eax, 1 mov ebx, 0 int 80h

  • VC2008のアセンブラ出力

    Visual C++ 2008 Express Editionで勉強をしています。 Cで簡単なプログラムを作り、そのアセンブラ出力を見ているのですが、下のアセンブラリストの###部のようなCの記述と関係ないコードが追加されます。この行を削除してアセンブルしても動作に問題ないように見えます。 このコードが追加される意味を教えて下さい。名前からセキュリティに関係しそうですが…… またプログラムによって追加される場合と、されない場合があります。何故でしょう? ご教示いただければ幸いです。 ----scanf.c #include <stdio.h> #include <stdlib.h> int main(void) { int i; char buf[256]; scanf("%s",buf); i = atoi(buf); printf("%d\n",i); return 0; } ----- -----scanf.asm ; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 TITLE D:\vc_asm\scanf.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES _DATA SEGMENT $SG3702 DB '%s', 00H ORG $+1 $SG3703 DB '%d', 0aH, 00H _DATA ENDS PUBLIC __$ArrayPad$ PUBLIC _main EXTRN _printf:PROC EXTRN _atoi:PROC EXTRN _scanf:PROC EXTRN ___security_cookie:DWORD EXTRN @__security_check_cookie@4:PROC ; Function compile flags: /Odtp _TEXT SEGMENT _buf$ = -264 ; size = 256 __$ArrayPad$ = -8 ; size = 4 _i$ = -4 ; size = 4 _main PROC ; Line 5 push ebp mov ebp, esp sub esp, 264; 00000108H mov eax, DWORD PTR ___security_cookie ###この行 xor eax, ebp ###この行 mov DWORD PTR __$ArrayPad$[ebp], eax ###この行 ; Line 8 lea eax, DWORD PTR _buf$[ebp]  (中略  Cで記述した内容の動作が記載) ; Line 11 xor eax, eax ; Line 12 mov ecx, DWORD PTR __$ArrayPad$[ebp] ###この行 xor ecx, ebp ###この行 call @__security_check_cookie@4 ###この行 mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END -----

  • スタックポインタ取得 アセンブラ

    unsigned long sp(void) { __asm__("movl %esp,%eax"); } int main() { printf("0x%x\n", sp()); return 0; } このプログラムはスタックポインタのアドレスを表示することができるそうなのですが、何故なのか分からないので理由を教えていただきたいです。よろしくお願いします。

  • アセンブラの読み方

    お世話になります。 アセンブラを勉強しています。 下記について教えていただけないでしょうか。 よろしくお願いいたします。 1 .file 2 .data 3 var: .long 0x1234 4.text 5 .global main 6 main: 7 movb $1, %al // 値1をレジスタalに代入 8 push %eax // レジスタeaxの内容をスタックに格納 9 call IncReg // 関数呼び出し 10 pop %eax // スタックからレジスタeaxに引き出し 11 push var // 変数varの内容をスタックに格納 12 call IncReg // 関数呼び出し 13 pop %ecx // スタックからレジスタecxに引き出し 14 ret // リターン 15 IncReg: 16 movl %esp, %ebp // pushによって動いたスタックの先頭アドレスをレジスタ ebp に代入 17 movl 4(%ebp), %edx // mainから渡された eax(var) の値をレジスタ edx に代入 18 incw %edx // レジスタ edx の値を2増やす 19 movl %edx, 4(%ebp) // 2増やしたものを引数のあるスタックの場所に代入 20 ret // リターン (質問) 7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 17 の4(%ebp)はスタックポインタの1つ下、つまりmainから渡された引数でよろしいでしょうか。 18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 13 でレジスタ ecx の値は 1236 になるので正しいでしょうか。

  • アセンブリのプログラムです。

    アセンブリのプログラムで質問があります。cのプログラムのオブジェクトファイルを生成して、objdumpというコマンドでアセンブリ言語を表示させてみたのですが、全然分からなくて、困っています 。どうか、アセンブリプログラムの、解説をよろしくお願いします。できれば、1文1文解説してもらえるとありがたいです。あと、スタックの動き、確保などの解説もあるとありがたいです。よろしくお願いします。 cのプログラム int fact(int p) { if(p<=1) return 1; else return fact(p-1); } アセンブリのプログラム push %ebp mov %esp,%ebp sub $0x8,%esp cmpl $0x1,0x8(%ebp) jg 15 <_fact+0x15> movl $0x1,-0x4(%ebp) jmp 24 <_fact+0x24> mov 0x8(%ebp),%eax dec %eax mov %eax,(%esp) call 0 <_fact> mov %eax,-0x4(%ebp) mov -0x4(%ebp),%eax leave ret nop nop nop

  • NASMでソースプログラムのアセンブルが出来ないです。

    nasm2.08.01.win32.zipをダウンロードしコマンドプロンプトのpathを指定しメモ帳でソースプログラムを ; myfile.asm  org 100H section .text start: mov ah, 02Hmov dl, 41H int 21H mov ah, 4CH int 21H と記述し拡張子asmで保存したものを コマンプロンプトでnasm -f bin myfile.asm -o myfile.com で開始しようするとunable to open input myfile.asmで出てしまい アセンブル出来ません、OSはXPです、アセンブリ言語の勉強をしたいのですがNASMが機能しないと始まらないので非常に困っています、 詳しい方にお力添え頂けたら幸いです、どうぞよろしくお願いします。

  • インラインアセンブラの関数について質問です。

    C言語で書かれたプログラムの中に、アセンブラで書かれた関数を使うため、インラインアセンブラで関数を作っていたのですが、私の能力の限界を感じたので、是非、ご教授願います。以下に示します。 元のアセンブラの関数write_mem82(int addr, int data) MOV EAX, [ESP+4] MOV AL, [ESP+8] MOV [EAX], AL RET です。これは、OS○作○門という本に載っていたものですが、プログラムをインラインアセンブラにすると、成功するのかふと疑問に思ったのです。よって、アセンブラの種類は、nasmを基にしたnaskです。 こういうことは、その本のサポートページか何かで質問すればよい的なことをおっしゃる方もおられると思います。残念ながら、サポートページは、ほぼ凍結状態で、何年待てば回答が返ってくるのか?という状態です。 そういう経歴で、ここの質問させていただくに至りました。 肝心の、私が書いてコンパイルエラーになるプログラムを書きます。 static __inline__ void write_mem82(int addr, int data){ __asm__ ( "MOV EAX,[ESP+4]": "MOV AL,[ESP+8]" "MOV [EAX],AL" "RET" ); } です。"MOV [EAX],AL"でエラーが出ます内容は構文が間違っているという内容のものです。なお、関数の名前は、意図的に変えてあります。オリジナルとは違います。 大した関数ではないのかもしれないのですが、わからないのでよろしくおねがいいたします。

  • コンパイラ、ELF形式のアセンブリ言語

    コンパイラの授業で、課題がでたのですが、全然分からなくて、困っています。どうか、解答、解説をよろしくお願いします。問題は以下です。 オブジェクト・プログラムを出力するコンパイラで、以下のプログラムをコンパイルしてみて、その入り口処理、出口処理の内容と、スタック・フレームの構成され方を調べなさい。 int fact(int p) { if(p<=1) return 1; else return fact(p-1); } 自分で一応、以下のようにオブジェクト・プログラムを出力してみました。 $ objdump -d a.o a.o: file format pe-i386 Disassembly of section .text: 00000000 <_fact>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 08 sub $0x8,%esp 6: 83 7d 08 01 cmpl $0x1,0x8(%ebp) a: 7f 09 jg 15 <_fact+0x15> c: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%ebp) 13: eb 0f jmp 24 <_fact+0x24> 15: 8b 45 08 mov 0x8(%ebp),%eax 18: 48 dec %eax 19: 89 04 24 mov %eax,(%esp) 1c: e8 df ff ff ff call 0 <_fact> 21: 89 45 fc mov %eax,-0x4(%ebp) 24: 8b 45 fc mov -0x4(%ebp),%eax 27: c9 leave 28: c3 ret 29: 90 nop 2a: 90 nop 2b: 90 nop アセンブリの知識は、少しはあるのですが、入り口処理、出口処理の内容と、スタック・フレームの構成され方が全然分からないです。どうか、解答、解説をよろしくお願いします。

  • アセンブラ(二度目)

    先ほど質問させていただいたのですが、NASMでobjファイルを出力して、 ALINKをつかってexeファイルを出力したのですが、その際結果を確認するのに邪魔なものが一緒に出力されました。 ソースはこれです。 segment code ..start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, stacktop mov dx, hello mov ah, 0x09 int 0x21 mov ax, 0x4c00 int 0x21 segment data hello: db 'Hello World',13,10,'$' segment stack stack resb 64 stacktop:

  • アセンブリ言語で。

    下のようなソースをアセンブルすると 6:error: parser: instruction expected という、エラーが出ます。 mov ah,2 mov dl,DATA int 21h mov ax,4c00h int 21h DATA byte 'A' 6行目に問題があるようなので下のように書き直したらきちんと動作しました。どうして、上のような記述ではうまくいかないのでしょうか?? mov ah,2 mov dl,'A' int 21h mov ax,4c00h int 21h 環境はwindowsXPでnasmとalinkを使っています。 nasmw test.asm -fobj alink test.obj -oEXEとしてアセンブルしました。 わかる方お願いいたします。

専門家に質問してみよう