質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.25%

  • C

    2710questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • アセンブリ言語

    67questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

アセンブリ言語の読み方

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 331

carnage0216

score 17

C言語プログラム
main(int ac,char *av[])
{
ImageData *img,*outimg;
int res;
int cx,cy,cr;
int x,y,mx,my;

if(ac<2) {
printf("パラメータが足りません");
return;
}
は下のアセンブリに

main(int ac,char *av[])
{
ImageData *img,*outimg;
int res;
int cx,cy,cr;
int x,y,mx,my;

pushl    %ebp     #
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl    %esp, %ebp     #,
.cfi_def_cfa_register 5
andl    $-16, %esp     #,
subl    $48, %esp     #,
call    ___main     #

if(ac<2) {
printf("パラメータが足りません");
return;
}
cmpl    $1, 8(%ebp)     #, ac
jg    L2     #,
movl    $LC0, (%esp)     #,
call    _printf     #
jmp    L6     #

と対応していると思うのですが、アセンブリプログラムの$やjg L2、$LCO、$48が何を意味しているのかわかりません。どうか説明していただけないでしょうか?

個人的にはC言語のプログラムが読めないときにアセンブラに変換するとわかりやすかったのですが、今回のようなjg L2、$LCO、$48などは初めて見るプログラムなので質問をいたしました。わかりにくい文章で申し訳ありません。どうかよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2017/12/26 23:32

    単純なギモンなのですが「アセンブラに変換するとわかりやすかった」とおっしゃっている以上、何かしらのアセンブリプログラムは読めるということですよね?こちらの質問意図はGAS記法がわからないという解釈でよろしいでしょうか?

    キャンセル

  • yumetodo

    2017/12/26 23:37

    jgがわからないのに「アセンブラに変換するとわかりやすかった」というのは・・・なんだろう、私の知っているアセンブリじゃないなぁという感

    キャンセル

回答 2

checkベストアンサー

+1

Visual Studioで逆アセンブリした結果です。こちらのほうが理解しやすいのではないでしょうか。

struct ImageData {};

void main(int ac, char *av[])
{
00271850  push        ebp  
00271851  mov         ebp,esp  
00271853  sub         esp,138h  
00271859  push        ebx  
0027185A  push        esi  
0027185B  push        edi  
0027185C  lea         edi,[ebp-138h]  
00271862  mov         ecx,4Eh  
00271867  mov         eax,0CCCCCCCCh  
0027186C  rep stos    dword ptr es:[edi]  
    ImageData *img, *outimg;
    int res;
    int cx, cy, cr;
    int x, y, mx, my;

    if (ac < 2) {
0027186E  cmp         dword ptr [ac],2  
00271872  jge         main+31h (0271881h)  
        printf("パラメータが足りません");
00271874  push        offset string "\x83p\x83\x89\x83\x81\x81[\x83^\x82\xaa\x91\xab\x82\xe8\x82\xdc\x82\xb9\x82\xf1" (0277B30h)  
00271879  call        _printf (027133Eh)  
0027187E  add         esp,4  
        return;
    }
}
00271881  xor         eax,eax  
00271883  pop         edi  
00271884  pop         esi  
00271885  pop         ebx  
00271886  add         esp,138h  
0027188C  cmp         ebp,esp  
0027188E  call        __RTC_CheckEsp (0271127h)  
00271893  mov         esp,ebp  
00271895  pop         ebp  
00271896  ret   

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/27 16:21

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

    void main(int ac, char *av[])

    00271850 push ebp
    00271851 mov ebp,esp
    00271853 sub esp,138h
    00271859 push ebx
    0027185A push esi
    0027185B push edi
    に関してなのですが、
    push ebx
    push esi
    push edi は
    void main(int ac, char *av[])のどこを表しているかわかりますでしょうか?

    キャンセル

0

ググれば出てきますがjgはより大きい時にジャンプするなのでif(ac<2) {を示しているんだと思います。$LC0はprintfで表示するテキストのアドレスみたいなの示してます。Visual Studioに逆アセンブリ機能ついてるんでそれ見るとわかりやすいですよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.25%

関連した質問

同じタグがついた質問を見る

  • C

    2710questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • アセンブリ言語

    67questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。