アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 と表示されます。

どうぞよろしくお願いいたします。

A 回答 (4件)

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

    • good
    • 0
この回答へのお礼

どうもありがとうございました。

専門的な知識がなく、もっと勉強しなければ…。

本当に感謝、目からウロコです。

お礼日時:2014/08/13 17:27

あと、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
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
納得できました。

なんだか、魔法のようです。
プログラムは、面白いです。

お礼日時:2014/08/13 17:23

#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
    • good
    • 0

_start: push ebpがありますからスタックは



ebp        ←esp
return address
argc
argv[0]
argv[1]

になりますからargcは[ebp+8]ではなく[ebp+16]

では?
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/10 18:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!