FromNandの日記

自分的備忘録

アセンブラ

C言語ではDS, ES, SSを同じ値にしなければならないのはなぜか?

そういう前提を置くことでコンパイラが機械語を生成するときにラクできるから、ということらしいです。 まぁ、DSやES、SSをうまく扱うのは難しそう。 ここで実際の確認コードをある掲示板で見つけたので貼っておく。 #include<stdio.h> int main(void) { int i; int *</stdio.h>…

x86のジャンプ命令とコール命令の詳細

先のこの部分を見ると、色々に勉強できる。 faq/asm - hrb-wiki まず、ジャンプ命令やコール命令について。 これらの命令には大きく分けて「相対short」「相対near」「絶対間接near」「絶対far」「絶対間接far」の5つがあります。 下にx86で使用されているジ…

x86アセンブリのLEA命令って結局何をするの?

x86にはアドレスを取得する命令として「LEA」というものが存在する。 例えば「leal 4(%esp), %eax」とすると、eaxにesp+4の値が入る。 これなら「movl %esp, %eax」「addl $4, %eax」としたらいいじゃないかと思われると思うが、実はLEA命令はフラグに影響を…

【main関数の前の世界】スタートアップ関数を自作してみた!

はじめに main関数の前にはスタートアップ関数という物があり、スタートアップ関数ではアプリケーションの実行のための準備がされている。 かといって、スタートアップ関数は特別なプログラムではなく、実際にアプリケーションプログラマが自作することも可…

【x86アセンブラ】PUSH・POPの動作を少し細かく見てみる

今回考えるのは、PUSH・POPにおいてESPの変化と値を取り出すタイミングがどの順番で行われているかということだ。 実験に使用するコードはこれ。 .code32 .globl push_test, pop_test .text push_test: subl $4, %esp ## here! movl $0x12345678, (%esp) ## …

【x86アセンブラ】レジスタの内容を表示するプログラムを考えてみる

低レイヤの作業をしているとこういった関数が欲しくなる時があるので実装してみた。 まず、これがC言語側から呼び出す際に必要とする構造体と使用する関数のプロトタイプ宣言。 // search_regs.h #ifndef _SEARCH_REGS_H #define _SEARCH_REGS_H typedef str…

【x86アセンブラ】PUSHAL・POPALについて調べてみた【順番・レジスタの種類など】

この記事は32bitレジスタを対象に考えておりますのでご了承ください。 参考 : PUSHAD - Push All General-Purpose Registers x86には一括してレジスタを操作する命令PUSHAL・POPALがあるらしい。 それぞれが行う命令を分解して考えると、こうだ。 PUSHAL (PU…

【Eli Bendersky】アセンブラレベルの面白い記事リンク

EliさんのサイトはArchives - Eli Bendersky's website。 32bitコンピュータで64bit命令をどのように実行しているか? 64-bit types and arithmetic on 32-bit CPUs - Eli Bendersky's website x86におけるスタックについて Where the top of the stack is o…

【アセンブラ】GASにおけるljmpとljmplの違いについて

gasって意外にネット上に情報がないので、ここに忘れないうちに示しておく。 ljmp - オペランドのアドレスから続く4byteをeipにいれ、5-6byteをcsにいれる farjmp: #void farjmp(int eip, int cs) ljmp *4(%esp) ret ljmpl - オペランドは二つあり、一つ目を…

【アセンブラ】GASでのマクロ関数の書き方

基本的にはつぎのように書けばいいらしい。 .macro <マクロの名前> <可変の名前> ~処理~ call \<可変の名前> //\<可変の名前>で参照することができる。あとcall以外もOK ~処理~ .endm 実際の例で確認しておきたい。 .globl asm_inthandler21, asm_inthandler…

x86アセンブラのPUSH・POPについての疑問を実験してみた!

まずひとつ目は「espをpushするときにespはpushする前に値が変更されるのか、それともpushした後に変更されるのか」という疑問です。答えを言ってしまうとespがpushされた後に値は変更されます。当然ですけど。つまり、espの値を表示する関数などを作りたい…

【GASアセンブラ】わかりにくい文法や豆知識を自分なりにまとめておく

・バイナリに特定のデータを詰め込む .skip n(, fill) .space n(, fill) ・文字列をバイナリに埋め込む .ascii "abc" (nullターミネートなし) .asciz "abc" (nullターミネートあり) .string "abc" (nullターミネートあり) https://stackoverflow.com/questio…

【x86アセンブラマニュアルの読み方】ModR/Mとかも

「https://code-examples.net/ja/q/e526bb」は日本語訳されていて、「https://wiki.osdev.org/X86-64_Instruction_Encoding#Registers」は割と完成されたガイドみたいな感じ。 「オペコード + ib」「オペコード + iw」「オペコード + id」というのは、オペコ…

【x86アセンブリ】movsx・movzx命令について

movsx命令は符号拡張転送命令、movzx命令はゼロ拡張転送命令です。 movsx・movzx共に、「mov + s | z + b | w | l + b | w | l」と記述します。 例えば、「movsbl %al, %eax」はalを32bitに符号拡張したものをeaxに転送する命令。 「movzwl %si, %eax」はsi…

【x86バイナリ解析】知っておくと役立つ機械語4つ

【関数の始め】 push ebp (55) mov ebp, esp (89 e5) 【関数の最後】 leave (c9) ret (c3)

【EFLAGS】符号あり・なしにおける条件ジャンプについて【CF・OF・SF】

【CF・OF・SFについて】 CF → 符号なし計算で使用され、「足し算で繰り上がりした場合」や「CMP A, B」において「A < B」である場合にセットされます OF → 符号あり計算で使用され、「正 + 正 = 負」「負 + 負 = 正」「正 - 負 = 負」「負 - 正 = 正」という…

【EFLAGS】OF(オーバーフローフラグ)についてまとめてみた

OFは符号あり計算に使われるフラグで、JL・JGといった条件分岐に使用されます。 SFと併用されたりもします。 オーバーフローの起こる条件には以下の4つが存在します。 実際にデバッガを使用して確認したので問題ないはずです。 ・2つの正数を足したら結果が…

【EFLAGS】CF(キャリーフラグ)について考察してみた

CFは主に符号なし計算に使われるフラグで、JA・JBといった条件分岐にしようされます。 CFが立つのは次の3つの場合が存在します。 足し算した結果、繰上りが起こった場合 引き算した結果、繰下がりが起こらなかった場合 SEC命令によって強制的に立てた場合 …

【EFLAGS】サインフラグ(SF)についてまとめてみた

SFは主に符号あり計算に使用されます。 例えば、JL・JG・JLE・JGEなどですね。 内部的にはOFと併用されることが多いようです。 このフラグは計算結果の最上位ビットがそのままコピーされます。 例えば、「1000 0000」+「0010 1010」=「1010 1010」なのでSFは…

【GAS】ENTER・LEAVE命令の使い方と同等コードの紹介

x86のアセンブラ命令にENTER・LEAVEという物がある。 ENTERは2つのオペランドをとり、ENTER $0, $0などと使用する LEAVEはアセンブリ関数の最後に記述することが多い ENTER $0, $5は次のようなコードと同等である(ただし、ENTERは速度が遅い...) push ebp mo…

【GAS】call・jmp命令のいろんな書き方【call *%eaxは?】

カーネルコードを書いていて詰まったのでまとめておきます 個人的によく使う「call・jmp」のうち、戸惑ったものを乗せます レジスタに対して付ける「*」が非常に分かりづらいです(call *%eaxやcall *4(%esp)など) https://stackoverflow.com/questions/21324…

【x86アセンブリ】よく使うアセンブリと機械語の対応表

細かい部分はOnline x86 and x64 Intel Instruction Assemblerで調べると良い 【CALL】 CALL(near) - FF m32CALL(far) - FF m16:32 【LEAVE・RET】 LEAVE - 0xc9 RET(near) - 0xc3 RET(far) - 0xcb 【PUSH系】 PUSH EAX - 0x50 PUSH ECX - 0x51 PUSH EDX - 0…

【アセンブラ】アセンブラによってORG疑似命令の意味が違う!?

これまでにそれなりの種類のアセンブリを見てきたけど、混乱した箇所があったため整理する。 それは、ORG疑似命令についてである。 実はこの命令、アセンブリの種類によって意味が全く違うのである。 例えば、GASではORGは次のような意味になるらしい。 .org…