0

文字列が数字かどうかをチェックする基本的な asm プログラムがあります。コマンドライン引数から読み取るコードを追加していたので、セグフォルトが発生し続けます。

私が読んだものが正しければ、これはプログラムに渡された引数の量を取得し、0(%ebp) に格納する必要があります。私は何を間違っていますか?

コード全体は、 http ://pastebin.com/kGV2Mxx4 にあります 。問題は、_start の最初の 3 ~ 5 行です。

lscpu の出力を見ると、i868 CPU があります。ただし、32ビットと64ビットで動作できると書かれています。32 ビット Linux (Arch Linux x86) を実行しています

問題を修正しました。1 つはプログラム名をバイパスするため、もう 1 つは最初の引数を取得するためです。更新されたコードは次の場所にあります: http://pastebin.com/xewyeHYf

誰かが私に次のことができなかった理由を教えてください:

pushl 8(%ebp)

また

movl 8(%ebp), %eax
4

3 に答える 3

2

これは、私がこのテーマについて書いた小さなチュートリアルです: NASM - Linux コマンドラインパラメータの取得

于 2013-02-24T04:50:55.520 に答える
1

あなたはこれを書くことができます:

_start:
b1: movl    0(%ebp), %eax
    cmpl    $1, %eax
    je      load_msg
b2:    pushl    8(%ebp)
b4:    call    check

以前の試みがうまくいかなかった理由を理解するには、スタック図を描いてください。

于 2013-02-23T23:10:14.527 に答える
0

やりたいことのようなことをする小さなCプログラムをコンパイルし、それをアセンブリ言語にコンパイルして、引数にアクセスする方法を正確に見つけます。x86_32コードは、上記のいずれにも似ていません。ところで、次のようになります。

int main(int argc, char *argv[])
{
  return argv[1][0];
}

与える(はい、いくつかは余分なスタック簿記ですが、とにかく):

    .file   "tst.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    12(%ebp), %eax
    addl    $4, %eax
    movl    (%eax), %eax
    movzbl  (%eax), %eax
    movsbl  %al, %eax
    popl    %ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.7.2 20121109 (Red Hat 4.7.2-8)"
    .section    .note.GNU-stack,"",@progbits
于 2013-02-24T04:17:57.420 に答える