プログラミング言語LanguagePackを建てています。
LPackは、メモリアドレスの初期定義機能により、プログラムの可読性を向上させた。
メモリアドレスの初期定義機能は、Cでも実装でき、フォーマット%dをdefすることであるが、LPackは初期実装である。
state format by C:
typedef int ptr;
typedef *ptr FORMATDEF;
FORMATDEF %num = 1234;
*//"%num" indicate memory address in direct.
*//so *(%num) is pointer to num.
ASM概念語:
binaryfile:
.text:機械語命令ファイル
.data:バイトファイル
.bss:実行時に0初期化するバイトファイル
.rodata:読み込み用バイトファイル
欄:
ldx:セクション番号
Name:セクション名称
Size:セクションサイズ
VMA:実行時のセクションアドレス
LMA:ロード時のセクションアドレス
File off:ファイルオフセット(16進数、バイト)
Algn:セクションのアライメント制約(2**n=2^n)
属性:
CONTENTS:中身がありますよ。
ALLOC:ロード時にこのセクションにメモリを割り当てる。
LOAD:このセクションは実行のためにメモリ上にロードする必要がある。
READONLY:メモリ上で「書込禁止」と設定する必要がある。
CODE:このセクションは実行可能な機械命令語を含んでいる。
RELOC:このセクションは再配置可能情報を含んでいる。
欄:
[Nr]:セクションの通し番号
Name:セクションの名前
Type:セクションのタイプ
Address:セクションのアドレス
Offset:ファイルのオフセット
Size:セクションのサイズ
EntSize:表中の固定長のエントリのサイズ
Flags:セクションのフラグ
Link:関連するセクションの通し番号
Info:関連情報
Align:セクションのアライメント制約
セクションのタイプ:
NULL:このセクションは使われていない
PROGBITS:このセクションはプログラムがフォーマットと意味を決める情報を含む
NOBITS:未初期化の領域を含む
RELA:このセクションは再配置情報を含む
NOTE:言語処理系が定義・使用するメモ書き
SYMTAB:このセクションは記号表
STRTAB:このセクションは文字列表
フラグ:
W:書込可能
A:メモリ割当(alloc)
X:実行
M:マージ
S:文字列
I:付加情報
L:リンクオーダー
O:OS固有の特別なエクストラ処理定義
G:セクショングループのメンバ
T:スレッドローカルストレージ
C:圧縮されている
x:不明
o:OS固有
E:参照と割当がなければ削除
D:特別なメモリ領域に置く
l:2GB以上のlargeコードモデル
p:プロセッサ固有
ELFヘッダ
ELFヘッダ:目次とメタ情報
セクションヘッダ:セクションの目次=リンク処理単位
プログラムヘッダ:セグメントの目次=ロード処理単位
定数:16進、10進数、8進数、2進数、文字、文字列
単項演算子:負数、ビット反転
2項演算子:乗算、除算、剰余、左シフト、右シフト、ビットOR、ビットAND、ビットXOR、ビットORNOT、加算、減算、等しい、等しくない、小さい、大きい、以下、以上、論理AND、論理OR
ロケーションカウンタ:
セクション指定:
データ出力:
出力アドレス調整:
シンボル情報:
その他:
T:.textセクション中のシンボル(関数名)
D:.dataセクション中のシンボル
B:.bssセクション中のシンボル
U:参照されているが未定義のシンボル
データ配置:
.byte 0x11:1バイト出力
.word 0x11:2バイト出力
.long 0x11:4バイト出力
.quad 0x11:8バイト出力
.string "string":文字列出力(ヌル文字付)
.ascii "string":文字列出力(ヌル文字無)
.asciz "string":文字列出力(ヌル文字付)
fill n-piece n-byte value:nバイトのvalueをn個出力
出力アドレス調整:
.align n:アドレスをnバイト境界にする。
p2align n:アドレスを(2^n)バイト境界にする。
.space n:ロケーションカウンタをn増やす。
.zero n:nバイトの0を出力する。
.org n:ロケーションカウンタをnにする。(増加のみ)
シンボル情報:
.globl n:シンボルをグローバルにする。
.type n @func:シンボルn型のfunc
.size symbol size:symbolのsizeをsymbolの計算結果とする。
.local symbol:symbolをlocalにする。
.comm symbol size align: .bssにsymbolを作成する。(size byte and align byte)
データサイズの指定:
b:8ビット
w:16ビット
l:32ビット
q:64ビット
メモリ参照:
ポインタ参照:
convert: 1x->2x, 2x->4x, 2x->2x2x, 4x->4x4x, 4x->8x, 8x->16x, 1x->4x, 1x->8x, 2x->8x,
volatile:
inline:
goto: 自動的にvolatile
プログラムカウンタ:命令ポイント%rip
ステータスカウンタ:フラグレジスタ%flags
論理シフト:右左(空いたところに0を入れる。)出っ張りはCF
算術シフト:右左(空いたところに1を入れる。)出っ張りはCF
左ローテート:ローテート左CF
CF含めて左ローテート:左ローテートCFMSB
右ローテート:CF右ローテート
CF含めて右ローテート:CFローテート右MSB
sub比較comp:op1とop2を比較してフラグflagを変化させる。(フラグ変化のみをする。)
and比較test:op1とop2をand比較してフラグflagを変化させる。(フラグ変化のみをする。)
プログラムカウンタ:メモリアドレスが入る。
絶対ジャンプ:jump 0xabcdddddは、プログラムカウンタにaddressをdirectを入れる。
変数ジャンプ:jump variableは、プログラムカウンタにvariableのアドレス値を入れる。
相対ジャンプ:jump %(pointer)変数からaddressにジャンプする。%(pointer)はメモリ参照
レジスタジャンプ:jump %pointer変数からaddressにジャンプする。%pointerはレジスタ参照
条件付きジャンプ:op1<,>,<=,<=,po2なら、jump. (符号ありなしフラグを見る見ないを選べる。)
関数コール:call var変数, call *%レジスタ, ret関数リターン
スタックを作れる。:enter op1, op2, サイズop1のスタックを作り、op2を入れておく。
func A->func B:
caller: push call pop destroy
callee: call push destroy pop
register: ax, bx, cx, dx(divide), dix(divide), si(stack), sp(stack), bp(base)
32ビット演算は64ビットの上32ビットを0にする。
メモリ参照:r/m=8or16or32or64,r/m8=8bit,r/m16=16bit,r/m=32bit,r/m=64bit,m,
ジャンプ:rel=8or16,rel8=8bit,rel16=16bit,*r/m64
copy A to B:
xchg op1 op2:op1とop2を入れ替える。
lea op1 op2:アドレスop1をop2に入れる。
push op1, pop op1:op1をアドレスop1にpush, pop:
add op1 op2:op1+op2
adc op1 op2:op1+CF+op2
sub op1 op2:op2-op1
sbb op1 op2:(CF+op2)-op1
mul op1:op1*op1(no sign)
imul op1:op1*op1(sign ok)
imul op1 op2:op2 *= op1(sign ok)
imul op1 op2 op3:op3=op1*op2(sign ok)
div:
idiv:
inc:
dic:
neg:
ローテートは、1ビットローテート、2ビットローテート、参照ビットローテートがある。
if(各flag==0,1)then jump:
nop:プログラムカウンタの増加のみ
cmpxchg op1 op2:if(%op1==op2)then op2=op1, %op1!=op2then%op1=op2
int3 continue:int3 set one time stop point and then continue start from point
ud2:"
LPackの予約語及び記号:
任意のvariableについて、%variableはアドレスを、*variableはcontentsを示す。
op1=op2とはop1にop2を代入することである。
<lpstd.h> <environment>
typedef:{.type n @name;} register purpose bit piece:
numdef:{.type num @num;} example: rn8a,rn8b,rn8c,...
boolean:{num = Flag counter kinds:
hex P:current address.
float C:top over 1 or 0.
long O:top and or bottom over 1 or 0:
double Z:0:1->1:0
short S:0=+,1=-.
chardef P:calculated bottom even:odd->1:0.
single A:arithed bit3 changed =1 and nochanged =0.
wchar
byte
vardef
max
constant
VARIABLE
funcdef
name(arg){action return};
structdef
{}NAME:
ptrdef *(name);
devicedef name;
formatdef %%name;
for
if
while
do
switch(%%){
case
default
(void)
global
static
volatile
__LINE__;
goto(__LINE__);
continue(__LINE__);
pass(__LINE__);
main
intend
+
-
x
/
%
=+
=-
=x
=/
=%
==
>=
<=
>
<
!=
&&
||
^^
!!
++
--
=
<<
>>
#macro
予約語仕様:
Pack1:{action.action.}pack1;
Pack2:{action,action.}pack2;