-
Notifications
You must be signed in to change notification settings - Fork 5
Takym QA
Takym (たかやま) edited this page Jul 5, 2021
·
15 revisions
Takym > QA
このページでは低レイヤに関する質問とその回答をまとめています。 下記に該当する質問が無い場合は Slack の #初心者質問相談 チャンネルに訪れてみてください。
回答: あります。
例えば x86 では下記の様な命令があります。
命令 | 説明 (概略) | 参考 |
---|---|---|
CMPXCHG8B |
レジスタとメモリ上の値を比較し等しければ交換します。 | https://www.felixcloutier.com/x86/cmpxchg8b:cmpxchg16b |
CRC32 |
巡回冗長検査します。 | https://www.felixcloutier.com/x86/crc32 |
INT3 |
デバッグ時に使用されます。 | https://x86.puri.sm/html/file_module_x86_id_142.html |
UD2 |
無効命令例外を発生させます。 | https://mudongliang.github.io/x86/html/file_module_x86_id_318.html |
回答: オペランド制約を意味します。
-
a
は EAX レジスタを表します。 -
d
は EDX レジスタを表します。 -
N
は8ビット即値の命令エンコーディングを優先する事を表します。-
IN
命令とOUT
命令で使用されます。
-
-
Nd
はN
とd
の両方を指定しています。
- https://gcc.gnu.org/onlinedocs/gcc/Constraints.html
- https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html
- https://wocota.hatenadiary.org/entry/20090628/1246188338
- https://msyksphinz.hatenablog.com/entry/2016/03/28/020000
- https://wiki.onakasuita.org/pukiwiki/?%E3%82%AA%E3%83%9A%E3%83%A9%E3%83%B3%E3%83%89%E5%88%B6%E7%B4%84
- https://github.com/torvalds/linux/blob/3dbdb38e286903ec220aaf1fb29a8d94297da246/arch/x86/include/asm/io.h#L275-L287
これは GCC における仕様です。 Microsoft Visual C のインラインアセンブラの仕様とは異なります。
回答: 属性 __attribute__((packed))
を構造体に付与します。
- 下記の様に属性を指定します。
typedef struct _STRUCT_A_ { unsigned int id; unsigned char *name; } __attribute__((packed)) StructA;
-
Microsoft Visual C では下記の様に
#pragma pack
を使って記述できます。#pragma pack(1) typedef struct _STRUCT_A_ { unsigned int id; unsigned char *name; } StructA; #pragma pack()
データ構造アライメントはメモリ上のデータを効率的に配置する為に利用されています。
回答: 環境に依存しますが、デバッガで覗く事ができます。
INT 0xXX
命令にブレークポイントを貼り、デバッガを使ってコードを覗く事ができます。
実機でデバッグを行う場合は専用の機器が必要になる可能性があります。
仮想環境でデバッグを行う場合は QEMU に GDB を接続すれば良いでしょう。
もしくはオープンソースの実装を読む事もできます。
回答: ありますが、難易度は高いです。
BIOS (INT 0x10
命令) を使わずに描画処理を行うには下記の方法が考えられます。
- グラフィックコントローラ、ビデオチップ、GPU等の仕様書を入手する。
- 仕様書は有料である場合や公開されていない場合もあります。
- X Window System 等既存のオープンソースシステムを利用または解析する。
BIOS ROM に保存されているコードの解析は利用規約や著作権に抵触する可能性があります。
回答: UTF-16BE または UTF-32BE 以外の文字コードで保存されている可能性があります。
Unicode では必ずコードポイントと同じ値がファイルに保存される訳では無く、通常は UTF-8、UTF-16、UTF-32 のいずれかに符号化してから保存されます。 「あ」(U+3042)という文字の場合は文字コード毎に下記の様に変換されます。
-
UTF-8:
E3 81 82
-
UTF-16LE:
42 30
-
UTF-16BE:
30 42
-
UTF-32LE:
42 30 00 00
-
UTF-32BE:
00 00 30 42
C言語の型 wchar_t
はワイド文字型であり、どの文字コードを使うかは規定されておらず、環境依存になります。コンパイラやOSなどにより異なります。
上記で挙げた文字コードではない可能性もあります。
どの文字コードが使われるかは適宜確認する必要があります。
回答: こちらのページを参考にしてください。
(書きかけ...)