アセンブリ メモ
自分用にアセンブリのメモを取っていきます。 あくまで参考程度にしていただければ幸いです。
/* 加算 */ int main(){ int n = 2, x =3; printf("%d\n", n + x); return 0; }
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ずつ加算されていくのもわかると思います。
今回は簡単なアセンブリを読んでみました。 次回は特殊なパターンを見てみたいと思います。
※参考文献
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
自分の環境ではこれでタッチパッドが認識されました。
この方法で動かなかった場合
↑ ここに自分の記述した方法や、様々な方法が上がっていますので、片っ端から行う事をオススメします。