3

私はx86でアセンブリを学んでいて、初期化されていない変数がすべて格納されているbssセクションを実際にゼロにするコードに出くわしました

    ;Zero the bss
     movw    $__bss_start, %di
     movw    $_end+3, %cx
     xorl    %eax, %eax
     subw    %di, %cx
     shrw    $2, %cx
     rep; stosl

しかし、このコードがどのように機能するかはわかりません.誰かがここでどのように進んでいるのか教えてもらえますか?

4

2 に答える 2

1

マジックはrep; stosl次のとおりですstosl。4 バイトをeaxが指すメモリに格納し、4ediずつインクリメントediします。接頭辞により、カウンタがゼロにrepなるまでこの命令が繰り返され、そのたびに 1 ずつ減分されます。ecxecx

したがって、.bss セグメントのアドレスをedi(最初の命令) に入れ、4 バイト ワードの数を に入れるだけecxです。これは(bss_start - bss_end) >> 2、残りの命令によって計算される だけです。

于 2013-07-09T12:51:15.393 に答える