2012-04-04 10 views
1

x86プログラムは、3つの引数を読み込み、%ebxの中で最大のものを存在状態として格納することを目的としています(Linux、AT & T、Intel)。引数をレジスタにポップすると、結果の値はバイトのように見えます。 int値を取得するにはどうすればよいですか?コマンドライン引数をx86 AT&Tアセンブリの整数として扱います

[編集 - I以下ハロルドさんのコメントのおかげで、質問はどのように私は引数のint型の値を取得するためにatoiを使用しないことだと思います。]

.section .text 

.globl _start   

_start: 
popl %edi  # Get the number of arguments 
popl %eax  # Get the program name 
popl %ebx  # Get the first actual argument 
movl (%ebx), %ebx # get the actual value into the register (?) 
popl %ecx  # ; 
movl (%ecx), %ecx 
popl %edx  # 
movl (%edx), %edx 

bxcx: 
cmpl %ebx,%ecx 
jle  bxdx 
movl %ecx,%ebx 
bxdx: 
cmpl %ebx,%edx 
jle end 
movl %edx,%ebx 

end: 
movl $1,%eax   
int $0x80   
+0

何のint値ができますか? 'atoi'に相当するものをお探しですか? – harold

+0

プログラムが './a.out 5 6 7'のように実行された後のコマンドライン引数のint値 - この場合、終了ステータスは7でなければなりません。したがって、' atoi'のようなものが必要な場合は、つまり、値5,6などは文字列として読み込まれますか? – jaybee

答えて

3

atoiを呼び出すことができるように、あなたは'LL libcとリンクする必要があります。例えば:

ld -lc foo.o 

実際に電話をかけるには、あなたがcdecl呼び出し規約に従う必要があります:関数へ

  1. 引数は、最後に押され、左端の引数をスタック上に渡されます。
  2. 関数の戻り値は、アキュムレータ(この場合は%eax)に格納されます。
  3. レジスタ%ebp、%esi、%edi、および%ebxは呼び出し間で保持されるため、一時的な格納に使用できます。
  4. その他の必要なレジスタは、呼び出し元コード(上記の呼び出し先保存レジスタ、引数の前のスタック、またはメモリ内の他の場所)に保存する必要があります。

atoiの署名がその最初のコマンドライン引数の整数値を取得するために

int atoi(const char *nptr); 

で、我々は

.section .text 

.globl _start   

_start: 
popl %edi  # Get the number of arguments 
popl %eax  # Get the program name 
call atoi  # Try to read the first argument as an integer and clobber %eax with the value 
+0

ありがとう、最も役立ちます。 – jaybee

+0

これを動かすために、私は動的にリンクする必要がありました: 'ld -dynamic-linker /lib/ld-linux.so.2 -o test -lc test.o' – jaybee

関連する問題