現実逃避

現実逃避するブログ

アセンブリ メモ

自分用にアセンブリのメモを取っていきます。 あくまで参考程度にしていただければ幸いです。

/*  加算 */

int main(){
    int n = 2, x =3;
    printf("%d\n", n + x);

    return 0;
}

今回はgdb を使用して アセンブリコードを見ていきます。

   0x0000000000400526 <+0>:     push   rbp
   0x0000000000400527 <+1>:     mov    rbp,rsp
   0x000000000040052a <+4>:     sub    rsp,0x10
   0x000000000040052e <+8>:     mov    DWORD PTR [rbp-0x8],0x2
   0x0000000000400535 <+15>:    mov    DWORD PTR [rbp-0x4],0x3
   0x000000000040053c <+22>:    mov    edx,DWORD PTR [rbp-0x8]
   0x000000000040053f <+25>:    mov    eax,DWORD PTR [rbp-0x4]
   0x0000000000400542 <+28>:    add    eax,edx
   0x0000000000400544 <+30>:    mov    esi,eax
   0x0000000000400546 <+32>:    mov    edi,0x4005e4
   0x000000000040054b <+37>:    mov    eax,0x0
   0x0000000000400550 <+42>:    call   0x400400 <printf@plt>
   0x0000000000400555 <+47>:    mov    eax,0x0
   0x000000000040055a <+52>:    leave
   0x000000000040055b <+53>:    ret

 注目すべきはaddぐらいでしょうか?
 この場合はeaxとedxにそれぞれ3、2が代入されています。
 それを単純にadd eax,edx と 3+2 しているだけですね。
 今回はprintfを使用しているので、printfがcallされているのが分かります。
 次に、if文を見てみます。

/*  条件分岐  */

int main()
{
    int n = 1;
    if (n >= 1) {
        printf("true");
    } else {
        printf("false");
    }
    return 0;
}


   0x0000000000400526 <+0>:     push   rbp
   0x0000000000400527 <+1>:     mov    rbp,rsp
   0x000000000040052a <+4>:     sub    rsp,0x10
   0x000000000040052e <+8>:     mov    DWORD PTR [rbp-0x4],0x1
   0x0000000000400535 <+15>:    cmp    DWORD PTR [rbp-0x4],0x0
   0x0000000000400539 <+19>:    jle    0x40054c <main+38>
   0x000000000040053b <+21>:    mov    edi,0x4005f4
   0x0000000000400540 <+26>:    mov    eax,0x0
   0x0000000000400545 <+31>:    call   0x400400 <printf@plt>
   0x000000000040054a <+36>:    jmp    0x40055b <main+53>
   0x000000000040054c <+38>:    mov    edi,0x4005f9
   0x0000000000400551 <+43>:    mov    eax,0x0
   0x0000000000400556 <+48>:    call   0x400400 <printf@plt>
   0x000000000040055b <+53>:    mov    eax,0x0
   0x0000000000400560 <+58>:    leave
   0x0000000000400561 <+59>:    ret

 jmp命令とcmp命令が出てきましたね。
 cmpでは比較を行っており、jmpは条件分岐に位置します。
 cmpで値の比較をし、それに従ってジャンプしている感じです。
※jle = jump if less or equal (より小さいか等しい場合)

最後にforループを見てみたいと思います。

/* for文 */

int main(){
   int i;
   for(i=0;i<10;i++){
       printf("%d\n",i);
   }
   return 0;
}


   0x0000000000400526 <+0>:     push   rbp
   0x0000000000400527 <+1>:     mov    rbp,rsp
   0x000000000040052a <+4>:     sub    rsp,0x10
   0x000000000040052e <+8>:     mov    DWORD PTR [rbp-0x4],0x0
   0x0000000000400535 <+15>:    jmp    0x40054f <main+41>
   0x0000000000400537 <+17>:    mov    eax,DWORD PTR [rbp-0x4]
   0x000000000040053a <+20>:    mov    esi,eax
   0x000000000040053c <+22>:    mov    edi,0x4005e4
   0x0000000000400541 <+27>:    mov    eax,0x0
   0x0000000000400546 <+32>:    call   0x400400 <printf@plt>
   0x000000000040054b <+37>:    add    DWORD PTR [rbp-0x4],0x1
   0x000000000040054f <+41>:    cmp    DWORD PTR [rbp-0x4],0x9
   0x0000000000400553 <+45>:    jle    0x400537 <main+17>
   0x0000000000400555 <+47>:    mov    eax,0x0
   0x000000000040055a <+52>:    leave
   0x000000000040055b <+53>:    ret


 先ほど出てきたaddとcmpとjmp命令がありますね。
 cmpで比較し、[rbp-0x4]の値が9になるとループを抜けるようになっています。
 9未満の場合ループは続行され、addで1ずつ加算されていくのもわかると思います。

 今回は簡単なアセンブリを読んでみました。 次回は特殊なパターンを見てみたいと思います。

※参考文献 

en.wikibooks.org

Ubuntu18.04 でタッチパッドが認識されない問題について

最近Ubuntu18.04をインストールした時にラップトップPCのタッチパッドが認識されない状態に陥ったので、自分が解決するにあたった方法を記述しておきます。

 

 

 

grubを編集します。

$ sudo nano /etc/default/grub

その中にある

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"を 

GRUB_CMDLINE_LINUX_DEFAULT="i8042.reset i8042.nomux=1 i8042.nopnp i8042.noloop"に置き換えます。

grubを更新

$ sudo update-grub

再起動

$ sudo reboot

 

自分の環境ではこれでタッチパッドが認識されました。

この方法で動かなかった場合

askubuntu.com

 ↑ ここに自分の記述した方法や、様々な方法が上がっていますので、片っ端から行う事をオススメします。