mirror of
https://github.com/herumi/xbyak
synced 2024-11-20 16:06:14 -07:00
change code of readme.txt
This commit is contained in:
parent
db894d130e
commit
6c6c44207b
1 changed files with 241 additions and 241 deletions
482
readme.txt
482
readme.txt
|
@ -1,241 +1,241 @@
|
|||
|
||||
C++眙帹x86(IA-32), x64(AMD64, x86-64) JIT邂帰邂幓邈幊邈体Λ Xbyak version 2.24
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖艰帵り帵<EFBFBD>
|
||||
|
||||
遽棋l遽幆x86, x64(AMD64, x86-64)遽幃邈苠す邈幊瓞茜驴杞帳邂拈取腓厘※邂丹++遽幃邂幆邈帺邂幑邈帺邂帳邈体Λ邈帾遽帶遽荫幖<E88DAB>
|
||||
邈五Ο邂幇邈帺邈帬臧揸帯歌砚遽帿殡书愉遽帿邂帰邂幓邈幊邈体Ν遽义k遽棋ⅹ遽哥颈镢幗遽帶遽荫幖<EFBFBD>
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖奸不昀幋
|
||||
|
||||
邈幓邈绣ャ邈€邈叔ぃ邂帳邈帿邂帾邈幊邈帾邈幖
|
||||
xbyak.h邂腻う邈幊邂幆邈帿邈幖邈插※邂跺ⅱ遽洛ⅸ遽义○殍帺眙帹遽义k遽棋ⅹ遽稿ⅸ遽哄⒗遽荫幖<EFBFBD>
|
||||
C++遽幃膻帬罘ㄥ⒘殒<EFBFBD>ⅸ聆插▲遽帵遽ㄥk遽掊a<EFBFBD>哥帳屉Κ邂帰邂幓邈幊邈体Λ遽幆韬宏帵㈠ⅸ遽荫幖<EFBFBD>
|
||||
32bit/64bit韬帯瓯幘炅劐ⅸ遽荫幖<EFBFBD>
|
||||
瓯幘炅劐ル邈幖邈帰邈跺ャ邂幆:黹幑飒帺轳幗杞帳聩帳遽劫86, MMX/MMX2/SSE/SSE2/SSE3/SSSE3/SSE4/FPU(韬€胥帹)
|
||||
|
||||
邈幓Windows Xp(32bit, 64bit), Vista/Linux(32bit, 64bit)/Intel Mac瓯幘炅<E5B998>
|
||||
Windows Xp韬村ⅸ遽幆VC2005 Express Ed., VC2008
|
||||
Windows Vista
|
||||
Linux (kernel 2.4.32)韬村ⅸ遽幆gcc 4.3.0, CentOS 5.1韬村ⅸ遽幆gcc 4.1.2
|
||||
Intel Mac
|
||||
遽帾遽帺遽帶殡舒幗亻帰幒瓞哄r遽五ⅷ遽ㄥ⒗遽荫幖<EFBFBD>
|
||||
|
||||
汔幓 gcc遽帶遽幆and, or, xor遽帾遽帺邂蔫幖乳幃午幁厘ⅹ遽五ⅷ皓帲耒板△遽帵遽五⒗遽<E29297>ⅰ邂Ⅰ幖<E285A0>
|
||||
-fno-operator-names邂帾邈五す邈帶邈幊邂年幙幗殛帬遽五ⅷ邂幊邈幊邈洛う邈帿遽五ⅷ遽惧ⅱ遽叔′<EFBFBD><EFBFBD>
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖艰幒嚏y
|
||||
xbyak.h
|
||||
xbyak_bin2hex.h
|
||||
xbyak_mnemonic.h
|
||||
遽棋l邂插r轲告幐€遽幃邈洛せ遽帿殄帴邂稿ⅷ邂帳邈幊邂幆邈帿邈幖邈插ヱ邂幑遽帿鹆幗殛帬遽五ⅷ遽惧ⅱ遽叔′<EFBFBD><EFBFBD>
|
||||
|
||||
Linux遽帶遽幆make install遽帶/usr/local/include/xbyak遽帿邂幊邈儒<E98288>遽叔l遽幘遽荫幖<E88DAB>
|
||||
-----------------------------------------------------------------------------
|
||||
泖艰绥斓<EFBFBD>
|
||||
|
||||
Xbyak::CodeGenerator 邂幆邈帺邂幑邂拈幎诣擦遽务幖稿↓遽幃邂幆邈帺邂幑邈帯邂幗邈﹀ラ殒<EFBFBD>ⅸx86, x64邂帰邂幓邈幊邈体Λ邂<CE9B>
|
||||
皙嘘幙幇遽五⒗遽荫幖煎↓遽幃邈帯邂幗邈﹀ラ邂溺戮遽幊殓幒遽五ⅰ昀格幖啡etCode()邈帯邂幗邈﹀ラ邂溺戮遽幊殓幒遽务幖稿↓遽幃腓幓
|
||||
邂寸€帳邂年<EFBFBD>殍<EFBFBD>§杩幙遽ㄥⅰ遽<EFBFBD>踏膈幇邈阱う邈幊邂幙遽帿軎茶禁遽五ⅷ殍帺眙帹遽五⒗遽荫幖煎い邂幓邈幊邈体Ν邂帹邈帺邈幖遽幆枥剁帳<EFBFBD>
|
||||
遽帿邂板j襦蚤蕨遽叔l遽幘遽<EFBFBD>(cf. main.cpp)<29><>
|
||||
|
||||
邈幓辍幒朦幀睑ㄥ<EFBFBD>nasm遽幃轳幗杞帳遽帶腚幀昃帶邂腻ⅵ遽洛l遽幇邂板′遽帶遽荫幖<EFBFBD>
|
||||
|
||||
mov eax, ebx --> mov(eax, ebx);
|
||||
inc ecx inc(ecx);
|
||||
ret --> ret();
|
||||
|
||||
邈幓邂帰邈插Ξ邈﹀す邈幊邂幇
|
||||
|
||||
(ptr|dword|word|byte) [base + index * (1|2|4|8) + displacement]
|
||||
遽帹遽ㄥ℃昕帰遽帶腱<EFBFBD>幃藻△遽幘遽荫幖煎し邂帳邂幒邂蔫风臧藻※邂剁幙<EFBFBD>帵㈠§遽帾遽<EFBFBD>佯邂逞tr邂逆幗幙遽板⒉邂板′遽帶遽荫幖<EFBFBD>
|
||||
邂幓邈幀邂幆邂幙遽幆邂幍邈阱<EFBFBD>邈板△遽帵遽ㄥ⒗遽皱s<EFBFBD><EFBFBD>
|
||||
|
||||
mov eax, [ebx+ecx] --> mov (eax, ptr[ebx+ecx]);
|
||||
test byte [esp], 4 --> test (byte [esp], 4);
|
||||
|
||||
(斓帹脘<EFBFBD>) dword, word, byte遽幆邂幆邈帺邂幑軎茶什遽帶遽荫幖肩幘棋ⅴ遽帵遽掊ⅹ遽板⒉unsigned int遽幃
|
||||
遽帳邂ゅj遽帶dword邂谜ypedef遽五<EFBFBD>遽ㄥⅸ遽惧ⅱ遽叔′<EFBFBD><EFBFBD>
|
||||
|
||||
邈幓邈帺邈义Ν
|
||||
|
||||
L(膂<EFBFBD>幁午<EFBFBD>);
|
||||
遽帶臧蚤幘帺遽五⒗遽荫幖煎ず邈帲邈幊邈五※邂跺ⅹ遽哄⒈遽阱<EFBFBD>膂<EFBFBD>幁午<EFBFBD>邂蔫风臧藻△遽幘遽荫幖肩幘歌袒轱ら<EFBFBD>邂ょ颈镢幗遽帶遽义§<EFBFBD><EFBFBD>
|
||||
睇幐瓯幘邂帰邈插Ξ邂幑遽<EFBFBD>8邈棋ャ邈板<EFBFBD>轱煎⒗邂插<EFBFBD>遽ㄧ帬幋轲板⒈T_NEAR邂腻ⅵ遽洛<EFBFBD>遽ㄥⅹ臧揸帯歌砚遽帿枥剁帳体§睐幒眙<EFBFBD>
|
||||
遽五⒗遽荫幖<EFBFBD>
|
||||
|
||||
邈幓hasUndefinedLabel()邂溺戮遽幊殓幒遽五ⅷ睃掊<E79D83>邂插ず邈帲邈幊邈午╄遽哥幁戌鬲遽五<E981BD>遽ㄥ◇遽帹邂拈帳幒遽五⒗遽荫幖<E88DAB>
|
||||
邂幊邈幖邈插r皎堕侄遽五ⅷ遽惧ⅱ遽叔′<EFBFBD><EFBFBD>
|
||||
|
||||
L("L1");
|
||||
jmp ("L1");
|
||||
|
||||
jmp ("L2");
|
||||
...
|
||||
瓴洛△遽幃轳幗杞帳遽幃辎幋轲榜幖<EFBFBD>
|
||||
...
|
||||
L("L2");
|
||||
|
||||
jmp ("L3", T_NEAR);
|
||||
...
|
||||
齑帰瓿幈遽幃轳幗杞帳遽稿♀邂剁帬幋轲<EFBFBD>
|
||||
...
|
||||
L("L3");
|
||||
|
||||
<炅亻泉罟帹>
|
||||
|
||||
1. MASM邈帺邂帳邂幆遽帾@@, @f, @b邂腻し邈阱<E98288>邈<EFBFBD>
|
||||
|
||||
L("@@"); // <A>
|
||||
jmp("@b"); // jmp to <A>
|
||||
jmp("@f"); // jmp to <B>
|
||||
L("@@"); // <B>
|
||||
jmp("@b"); // jmp to <B>
|
||||
|
||||
2. 邈帺邈义Ν遽幃瓿€腴€殪<EFBFBD>
|
||||
|
||||
邈儒Μ邂帾邈插ⅸ戛跺⒗邂跺Λ邈义Ν邂檬nLocalLabel(), outLocalLabel()遽帶腱掊`遽棋ⅹ遽帶瓿€腴€殪体ⅸ遽哄⒗遽荫幖<E88DAB>
|
||||
|
||||
void func1()
|
||||
{
|
||||
inLocalLabel();
|
||||
L(".lp"); // <A>
|
||||
...
|
||||
jmp(".lp"); // jmpt to <A>
|
||||
outLocalLabel();
|
||||
}
|
||||
|
||||
void func2()
|
||||
{
|
||||
L(".lp"); // <B>
|
||||
func1();
|
||||
jmp(".lp"); // jmp to <B>
|
||||
}
|
||||
|
||||
韬搓帹绣し邈幊邈五Ν遽帶遽幆inLocalLabel(), outLocalLabel()遽搁ǎ遽ㄥⅹ<E384A5><E285B9>
|
||||
".lp"邈帺邈义Ν遽幃杓鸽<EFBFBD>臧蚤幘帺邂帹邈帺邈幖遽帿遽帾邂村⒗遽荫幖<EFBFBD>
|
||||
|
||||
邈幓Xbyak::CodeGenerator()邂幊邈幊邂幑邈板Λ邂幆邂幙邂帳邈幊邂幙邈叔ぉ邈幖邂幑
|
||||
|
||||
@param maxSize [in] 邂幊邈幖邈查取腓黎奏軎帶邂幍邂帳邂幒(邈<>ヵ邂帺邈帿邈<E5B8BF>2048byte)
|
||||
@param userPtr [in] 邈帵邈幖邂幎腱<EFBFBD>幃藻Γ邈帰邈帾
|
||||
|
||||
CodeGenerator(size_t maxSize = DEFAULT_MAX_CODE_SIZE, void *userPtr = 0);
|
||||
|
||||
邈<EFBFBD>ヵ邂帺邈帿邈板さ邈幖邈插し邂帳邂幒遽幆2048(=DEFAULT_MAX_CODE_SIZE)邈厘う邈板ⅸ遽荫幖<E88DAB>
|
||||
遽阱l邂板j軎帶遽哄<EFBFBD>邂幊邈幖邈插r眙掼<EFBFBD>遽义k辎幋轲板⒈CodeGenerator()遽幃邂幊邈幊邂幑邈板Λ邂幆邂幙遽帿腱<E5B8BF>幃藻△遽帵遽惧ⅱ遽叔′<E58F94><E280B2>
|
||||
|
||||
class Quantize : public Xbyak::CodeGenerator {
|
||||
public:
|
||||
Quantize()
|
||||
: CodeGenerator(8192)
|
||||
{
|
||||
}
|
||||
...
|
||||
};
|
||||
|
||||
# 殡书愉遽帿遽五ⅰ遽幓遽<EFBFBD>§邂板′遽幃遽帬遽哥幃揸帯哥幈荑€帶遽幃畎帯眇<EFBFBD>§颀帰猷腻ⅸ邂ㄥⅴ遽帵遽幘遽皱s汔帵<EFBFBD><EFBFBD>
|
||||
|
||||
遽幘遽掊Θ邈幖邂幎腱<EFBFBD>幃藻Γ邈帰邈帾邂腻さ邈幖邈查取腓黎奏軎帶邂幍邂帳邂幒遽帹殄幈遽帿腱<EFBFBD>幃藻※邂跺ⅹ<EFBFBD>筏odeGenerator遽幆
|
||||
腱<EFBFBD>幃藻□邂稿ⅰ邈帯邈帰邈帾韬村<EFBFBD>邈厘う邈扮<EFBFBD>邂拈取腓厘△遽幘遽荫幖<EFBFBD>
|
||||
|
||||
邂幍邈阱<EFBFBD>邈半踏膈幇遽帹遽五ⅷ腱<EFBFBD>幃藻□邂稿ⅰ邂帰邈插Ξ邂幑遽幃臧揸帯哥幈荑€帶邂溺帳茶侄遽义kCodeArray::protect()遽帹
|
||||
韬煎¤邂插l遽掊<EFBFBD>邂帳邈幊邂幙遽跺i邂帰邈帺邂帳邈帯邈幊邈板□邂稿ⅰ邈阱う邈幊邂幙邂溺仅昀五※邂丹odeArray::getAlignedAddress()
|
||||
邂ら泉脘惧△遽幘遽五ⅰ<EFBFBD>缄帺幊疃幇遽幆sample/test0.cpp遽幃use memory allocated by user邂溺解镟﹀<E9959F>
|
||||
遽五ⅷ遽惧ⅱ遽叔′<EFBFBD><EFBFBD>
|
||||
|
||||
/**
|
||||
change exec permission of memory
|
||||
@param addr [in] buffer address
|
||||
@param size [in] buffer size
|
||||
@param canExec [in] true(enable to exec), false(disable to exec)
|
||||
@return true(success), false(failure)
|
||||
*/
|
||||
bool CodeArray::protect(const void *addr, size_t size, bool canExec);
|
||||
|
||||
/**
|
||||
get aligned memory pointer
|
||||
*/
|
||||
uint8 *CodeArray::getAlignedAddress(uint8 *addr, size_t alignedSize = ALIGN_SIZE);
|
||||
|
||||
遽阱<EFBFBD>杞剃帺幊疃幇遽幆轲ㄩ帹幃邂幍邈幊邈五Ν邂溺解礤帶遽五ⅷ遽惧ⅱ遽叔′<EFBFBD><EFBFBD>
|
||||
-----------------------------------------------------------------------------
|
||||
泖煎<EFBFBD>邂幆邈幁
|
||||
|
||||
32bit眚幇辘︽幐村ⅸ邂幊邈幊邈洛う邈帿遽义k遽帹XBYAK32遽格幖<EFBFBD>64bit眚幇辘︽幐村ⅸ邂幊邈幊邈洛う邈帿遽义k遽帹XBYAK64遽<EFBFBD>
|
||||
臧蚤幘帺遽叔l遽幘遽荫幖煎□邂插<EFBFBD>64bit眚幇辘︽幐村ⅸ遽幆Windows遽帾邂惫BYAK64_WIN<EFBFBD>啡cc韬村ⅸ遽幆XBYAK64_GCC
|
||||
邂ょ幃蚤幘帺遽叔l遽幘遽荫幖<EFBFBD>
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖兼幗幙眙帹枥<EFBFBD>
|
||||
|
||||
test0.cpp ; 畈帯轫绣<EFBFBD>枥<EFBFBD>(x86, x64)
|
||||
quantize.cpp ; 殚幉邂撮幃五<EFBFBD>JIT邂帰邂幓邈幊邈体Ν遽帿邂板k耒剧幁犁扶遽幃颦须€掮扶(x86)
|
||||
calc.cpp ; 韬煎¤邂插l遽掮帳噪帬<EFBFBD>幖惧r邂帰邂幓邈幊邈体Ν遽五ⅷ臧揸帯<EFBFBD>(x86, x64)
|
||||
boost(http://www.boost.org/)遽哥幙<EFBFBD>帵<EFBFBD>
|
||||
bf.cpp ; JIT Brainfuck(x86, x64)
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖艰幊帹脘<EFBFBD>
|
||||
|
||||
MMX/SSE轳幗杞帳遽幆遽幓遽幖殄帹遽帵臧揸帲<EFBFBD>□邂稿ⅷ遽ㄥ⒗遽义§<EFBFBD><EFBFBD>3D Now!轳幗杞帳邂<E5B8B3>幖告幐€胥帹遽幃黹幑彀村<E5BD80>
|
||||
轳幗杞帳遽幆盹幘膣らせ遽帶遽幆臧揸帲<EFBFBD>□邂稿ⅷ遽ㄥ⒗遽皱s<EFBFBD>户PU遽幃80bit旆幃殡淑幇捐什遽幆邂幍邈阱<EFBFBD>邈板△遽帵遽ㄥ⒗遽皱s<EFBFBD><EFBFBD>
|
||||
|
||||
杩叔‰遽汝帵㈣<EFBFBD>遽稿♀邂稿⒉遽入€帲罘帯遽惧ⅱ遽叔′<EFBFBD><EFBFBD>
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖煎Λ邂帳邂幓邈幊邂幑
|
||||
|
||||
枇幃殳帲遽叔l遽掼滩遽五′BSD邈帺邂帳邂幓邈幊邂幑遽帿昀棋′遽幘遽荫幖<EFBFBD>
|
||||
http://www.opensource.jp/licenses/bsd-license.html
|
||||
|
||||
sample/{echo,hello}.bf遽幆 http://www.kmonos.net/alang/etc/brainfuck.php 遽跺i
|
||||
遽ㄥⅰ遽帬遽哄⒗遽五ⅰ<EFBFBD><EFBFBD>
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖肩幈帴殳幋
|
||||
|
||||
2010/04/16 ver 2.24 change the prototype of rewrite() method
|
||||
2010/04/15 ver 2.23 fix align() and xbyak_util.h for Mac
|
||||
2010/02/16 ver 2.22 fix inLocalLabel()/outLocalLabel()
|
||||
2009/12/09 ver 2.21 support cygwin(gcc 4.3.2)
|
||||
2009/11/28 ver 2.20 FPU遽幃韬€胥帹轳幗杞帳邂幍邈阱<EFBFBD>邈<EFBFBD>
|
||||
2009/06/25 ver 2.11 64bit邈帰邈幖邈插ⅸ遽幃 mov(qword[rax], imm); 枇幃殳帲(thanks to Martin遽叔s)
|
||||
2009/03/10 ver 2.10 jmp/call reg64遽幃殒坞使遽帾REG.W殚措姚
|
||||
2009/02/24 ver 2.09 movq reg64, mmx/xmm; movq mmx/xmm, reg64鹆幗殛帬
|
||||
2009/02/13 ver 2.08 movd(xmm7, dword[eax])遽<EFBFBD>0x66邂年揽遽帹遽义ヰ邂幇枇幃殳帲(thanks to Gabest遽叔s)
|
||||
2008/12/30 ver 2.07 call()遽幃睇幐瓯幘邂帰邈插Ξ邂幑遽<EFBFBD>8bit杞帴韬跺<EFBFBD>遽帹遽哄<EFBFBD>邈厘げ枇幃殳帲(thanks to kato遽叔s)
|
||||
2008/09/18 ver 2.06 @@, @f, @b遽帹邈帺邈义Ν遽幃瓿€腴€殪惕帺揸<EFBFBD>鹆幗殛帬(thanks to nobu-q遽叔s)
|
||||
2008/09/18 ver 2.05 ptr [rip + 32bit offset]邂幍邈阱<EFBFBD>邈<EFBFBD>(thanks to 辂帲戬犁吉(Dango-Chu)遽叔s)
|
||||
2008/06/03 ver 2.04 align()遽幃邈阱き邈掊せ枇幃殳帲<EFBFBD>晃ov(ptr[eax],1);遽帾遽帺邂腻お邈帺邈幖遽帿
|
||||
2008/06/02 ver 2.03 邈帵邈幖邂幎臧蚤幘帺邈帯邈帰邈帾邂帳邈幊邂幙邈叔ぉ邈幖邂幑邂幍邈阱<EFBFBD>邈<EFBFBD>
|
||||
2008/05/26 ver 2.02 protect()(on Linux)遽帶韬鸿幁帲遽帾皙幁臧藻<EFBFBD>遽帾邂跺◇遽帹遽稿♀邂跺<EFBFBD>邂逆幙幃殳帲(thanks to sinichiro_h遽叔s)
|
||||
2008/04/30 ver 2.01 cmpxchg16b, cdqe鹆幗殛帬
|
||||
2008/04/29 ver 2.00 x86/x64-64黹扮<EFBFBD>聆<EFBFBD>
|
||||
2008/04/25 ver 1.90 x86黹靶幉殄幀聆<EFBFBD>
|
||||
2008/04/18 ver 1.12 邂幊邈幖邈茶识眇<EFBFBD>
|
||||
2008/04/14 ver 1.11 邂幊邈幖邈茶识眇<EFBFBD>
|
||||
2008/03/12 ver 1.10 bsf/bsr鹆幗殛帬(炅绣l遽帵遽ㄥⅰ)
|
||||
2008/02/14 ver 1.09 sub eax, 1234遽<EFBFBD>16bit邈帰邈幖邈插ⅸ殓幒殛皱□邂稿ⅷ遽ㄥⅰ遽幃邂逆幙幃殳帲(thanks to Robert遽叔s)
|
||||
2007/11/05 ver 1.08 lock, xadd, xchg鹆幗殛帬
|
||||
2007/11/02 ver 1.07 SSSE3/SSE4瓯幘炅<EFBFBD>(thanks to 辂帲戬犁吉(Dango-Chu)遽叔s)
|
||||
2007/09/25 ver 1.06 call((int)聆帰膈幇邈阱う邈幊邂幙); jmp((int)聆帰膈幇邈阱う邈幊邂幙);遽幃邂幍邈阱<E98288>邈<EFBFBD>
|
||||
2007/08/04 ver 1.05 疃幇遽跺′枇幃殳帲
|
||||
2007/02/04 昀歌袒遽幐遽幃邂幐邈帲邈幊邈五ⅸT_NEAR邂腻ⅵ遽洛<EFBFBD>遽ㄥⅹ遽哄<EFBFBD>8bit睇幐瓯幘邂帰邈插Ξ邂幑遽帿殄帴邂插<EFBFBD>遽<EFBFBD>
|
||||
辎幋轲板<EFBFBD>枥剁帳体§睐幒眙掊△遽帾遽ㄥヰ邂幇遽幃枇幃殳帲
|
||||
2007/01/21 [disp]遽幃昕帰遽幃邂帰邈插Ξ邂幑眙掼<EFBFBD>遽幃邈厘げ枇幃殳帲
|
||||
mov (eax|ax|al, [disp]); mov([disp], eax|ax|al);遽幃睢幁遽<EFBFBD>帯帹盹幘襻幐腙<EFBFBD>
|
||||
2007/01/17 web邈藻<EFBFBD>邂幐杩罔<EFBFBD>
|
||||
2007/01/04 殄幀聆峨穗戛<EFBFBD>
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
泖缄流杩罔帹帺镟<EFBFBD>
|
||||
|
||||
殄茶<EFBFBD>旖堕取(MITSUNARI Shigeo, herumi at nifty dot com)
|
||||
|
||||
---
|
||||
$Revision: 1.56 $
|
||||
$Date: 2010/04/16 11:58:22 $
|
||||
|
||||
C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak version 2.24
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎概要
|
||||
|
||||
これはx86, x64(AMD64, x86-64)のマシン語命令を生成するC++のクラスライブラリです.
|
||||
プログラム実行時に動的にアセンブルすることが可能です.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎特徴
|
||||
|
||||
・ヘッダファイルオンリー
|
||||
xbyak.hをインクルードするだけですぐ利用することができます.
|
||||
C++の枠組み内で閉じているため,外部アセンブラは不要です.
|
||||
32bit/64bit両対応です.
|
||||
対応ニーモニック:特権命令除くx86, MMX/MMX2/SSE/SSE2/SSE3/SSSE3/SSE4/FPU(一部)
|
||||
|
||||
・Windows Xp(32bit, 64bit), Vista/Linux(32bit, 64bit)/Intel Mac対応
|
||||
Windows Xp上ではVC2005 Express Ed., VC2008
|
||||
Windows Vista
|
||||
Linux (kernel 2.4.32)上ではgcc 4.3.0, CentOS 5.1上ではgcc 4.1.2
|
||||
Intel Mac
|
||||
などで動作確認をしています.
|
||||
|
||||
※ gccではand, or, xorなどを演算子として解釈してしまうため,
|
||||
-fno-operator-namesオプションを追加してコンパイルしてください.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎準備
|
||||
xbyak.h
|
||||
xbyak_bin2hex.h
|
||||
xbyak_mnemonic.h
|
||||
これらを同一のパスに入れてインクルードパスに追加してください.
|
||||
|
||||
Linuxではmake installで/usr/local/include/xbyakにコピーされます.
|
||||
-----------------------------------------------------------------------------
|
||||
◎文法
|
||||
|
||||
Xbyak::CodeGenerator クラスを継承し,そのクラスメソッド内でx86, x64アセンブラを
|
||||
記述します.そのメソッドを呼び出した後,getCode()メソッドを呼び出し,その戻
|
||||
り値を自分が使いたい関数ポインタに変換して利用します.アセンブルエラーは例外
|
||||
により通知されます(cf. main.cpp).
|
||||
|
||||
・基本的にnasmの命令で括弧をつければよいです.
|
||||
|
||||
mov eax, ebx --> mov(eax, ebx);
|
||||
inc ecx inc(ecx);
|
||||
ret --> ret();
|
||||
|
||||
・アドレッシング
|
||||
|
||||
(ptr|dword|word|byte) [base + index * (1|2|4|8) + displacement]
|
||||
という形で指定します.サイズを指定する必要がない限りptrを使えばよいです.
|
||||
セレクタはサポートしていません.
|
||||
|
||||
mov eax, [ebx+ecx] --> mov (eax, ptr[ebx+ecx]);
|
||||
test byte [esp], 4 --> test (byte [esp], 4);
|
||||
|
||||
(注意) dword, word, byteはクラス変数です.従ってたとえばunsigned intの
|
||||
つもりでdwordをtypedefしないでください.
|
||||
|
||||
・ラベル
|
||||
|
||||
L(文字列);
|
||||
で定義します.ジャンプするときはその文字列を指定します.後方参照も可能ですが,
|
||||
相対アドレスが8ビットに収まらない場合はT_NEARをつけないと実行時に例外が発生
|
||||
します.
|
||||
|
||||
・hasUndefinedLabel()を呼び出して真ならジャンプ先が存在しないことを示します.
|
||||
コードを見直してください.
|
||||
|
||||
L("L1");
|
||||
jmp ("L1");
|
||||
|
||||
jmp ("L2");
|
||||
...
|
||||
少しの命令の場合.
|
||||
...
|
||||
L("L2");
|
||||
|
||||
jmp ("L3", T_NEAR);
|
||||
...
|
||||
沢山の命令がある場合
|
||||
...
|
||||
L("L3");
|
||||
|
||||
<応用編>
|
||||
|
||||
1. MASMライクな@@, @f, @bをサポート
|
||||
|
||||
L("@@"); // <A>
|
||||
jmp("@b"); // jmp to <A>
|
||||
jmp("@f"); // jmp to <B>
|
||||
L("@@"); // <B>
|
||||
jmp("@b"); // jmp to <B>
|
||||
|
||||
2. ラベルの局所化
|
||||
|
||||
ピリオドで始まるラベルをinLocalLabel(), outLocalLabel()で挟むことで局所化できます.
|
||||
|
||||
void func1()
|
||||
{
|
||||
inLocalLabel();
|
||||
L(".lp"); // <A>
|
||||
...
|
||||
jmp(".lp"); // jmpt to <A>
|
||||
outLocalLabel();
|
||||
}
|
||||
|
||||
void func2()
|
||||
{
|
||||
L(".lp"); // <B>
|
||||
func1();
|
||||
jmp(".lp"); // jmp to <B>
|
||||
}
|
||||
|
||||
上記サンプルではinLocalLabel(), outLocalLabel()が無いと,
|
||||
".lp"ラベルの二重定義エラーになります.
|
||||
|
||||
・Xbyak::CodeGenerator()コンストラクタインタフェース
|
||||
|
||||
@param maxSize [in] コード生成最大サイズ(デフォルト2048byte)
|
||||
@param userPtr [in] ユーザ指定メモリ
|
||||
|
||||
CodeGenerator(size_t maxSize = DEFAULT_MAX_CODE_SIZE, void *userPtr = 0);
|
||||
|
||||
デフォルトコードサイズは2048(=DEFAULT_MAX_CODE_SIZE)バイトです.
|
||||
それより大きなコードを生成する場合はCodeGenerator()のコンストラクタに指定してください.
|
||||
|
||||
class Quantize : public Xbyak::CodeGenerator {
|
||||
public:
|
||||
Quantize()
|
||||
: CodeGenerator(8192)
|
||||
{
|
||||
}
|
||||
...
|
||||
};
|
||||
|
||||
# 動的にしたほうがよいのだが実行属性の管理が面倒でやってません….
|
||||
|
||||
またユーザ指定メモリをコード生成最大サイズと共に指定すると,CodeGeneratorは
|
||||
指定されたメモリ上にバイト列を生成します.
|
||||
|
||||
サポート関数として指定されたアドレスの実行属性を変更するCodeArray::protect()と
|
||||
与えられたポインタからアライメントされたポインタを取得するCodeArray::getAlignedAddress()
|
||||
も用意しました.詳細はsample/test0.cppのuse memory allocated by userを参考に
|
||||
してください.
|
||||
|
||||
/**
|
||||
change exec permission of memory
|
||||
@param addr [in] buffer address
|
||||
@param size [in] buffer size
|
||||
@param canExec [in] true(enable to exec), false(disable to exec)
|
||||
@return true(success), false(failure)
|
||||
*/
|
||||
bool CodeArray::protect(const void *addr, size_t size, bool canExec);
|
||||
|
||||
/**
|
||||
get aligned memory pointer
|
||||
*/
|
||||
uint8 *CodeArray::getAlignedAddress(uint8 *addr, size_t alignedSize = ALIGN_SIZE);
|
||||
|
||||
その他詳細は各種サンプルを参照してください.
|
||||
-----------------------------------------------------------------------------
|
||||
◎マクロ
|
||||
|
||||
32bit環境上でコンパイルするとXBYAK32が,64bit環境上でコンパイルするとXBYAK64が
|
||||
定義されます.さらに64bit環境上ではWindowsならXBYAK64_WIN,gcc上ではXBYAK64_GCC
|
||||
も定義されます.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎使用例
|
||||
|
||||
test0.cpp ; 簡単な例(x86, x64)
|
||||
quantize.cpp ; 割り算のJITアセンブルによる量子化の高速化(x86)
|
||||
calc.cpp ; 与えられた多項式をアセンブルして実行(x86, x64)
|
||||
boost(http://www.boost.org/)が必要
|
||||
bf.cpp ; JIT Brainfuck(x86, x64)
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎注意
|
||||
|
||||
MMX/SSE命令はほぼ全て実装されていますが,3D Now!命令や,一部の特殊な
|
||||
命令は現時点では実装されていません.FPUの80bit浮動小数はサポートしていません.
|
||||
|
||||
何かご要望があればご連絡ください.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎ライセンス
|
||||
|
||||
修正された新しいBSDライセンスに従います.
|
||||
http://www.opensource.jp/licenses/bsd-license.html
|
||||
|
||||
sample/{echo,hello}.bfは http://www.kmonos.net/alang/etc/brainfuck.php から
|
||||
いただきました.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎履歴
|
||||
|
||||
2010/04/16 ver 2.24 change the prototype of rewrite() method
|
||||
2010/04/15 ver 2.23 fix align() and xbyak_util.h for Mac
|
||||
2010/02/16 ver 2.22 fix inLocalLabel()/outLocalLabel()
|
||||
2009/12/09 ver 2.21 support cygwin(gcc 4.3.2)
|
||||
2009/11/28 ver 2.20 FPUの一部命令サポート
|
||||
2009/06/25 ver 2.11 64bitモードでの mov(qword[rax], imm); 修正(thanks to Martinさん)
|
||||
2009/03/10 ver 2.10 jmp/call reg64の冗長なREG.W削除
|
||||
2009/02/24 ver 2.09 movq reg64, mmx/xmm; movq mmx/xmm, reg64追加
|
||||
2009/02/13 ver 2.08 movd(xmm7, dword[eax])が0x66を落とすバグ修正(thanks to Gabestさん)
|
||||
2008/12/30 ver 2.07 call()の相対アドレスが8bit以下のときのバグ修正(thanks to katoさん)
|
||||
2008/09/18 ver 2.06 @@, @f, @bとラベルの局所化機能追加(thanks to nobu-qさん)
|
||||
2008/09/18 ver 2.05 ptr [rip + 32bit offset]サポート(thanks to 団子厨(Dango-Chu)さん)
|
||||
2008/06/03 ver 2.04 align()のポカミス修正.mov(ptr[eax],1);などをエラーに
|
||||
2008/06/02 ver 2.03 ユーザ定義メモリインタフェースサポート
|
||||
2008/05/26 ver 2.02 protect()(on Linux)で不正な設定になることがあるのを修正(thanks to sinichiro_hさん)
|
||||
2008/04/30 ver 2.01 cmpxchg16b, cdqe追加
|
||||
2008/04/29 ver 2.00 x86/x64-64版公開
|
||||
2008/04/25 ver 1.90 x86版β公開
|
||||
2008/04/18 ver 1.12 コード整理
|
||||
2008/04/14 ver 1.11 コード整理
|
||||
2008/03/12 ver 1.10 bsf/bsr追加(忘れていた)
|
||||
2008/02/14 ver 1.09 sub eax, 1234が16bitモードで出力されていたのを修正(thanks to Robertさん)
|
||||
2007/11/05 ver 1.08 lock, xadd, xchg追加
|
||||
2007/11/02 ver 1.07 SSSE3/SSE4対応(thanks to 団子厨(Dango-Chu)さん)
|
||||
2007/09/25 ver 1.06 call((int)関数ポインタ); jmp((int)関数ポインタ);のサポート
|
||||
2007/08/04 ver 1.05 細かい修正
|
||||
2007/02/04 後方へのジャンプでT_NEARをつけないときに8bit相対アドレスに入らない
|
||||
場合に例外が発生しないバグの修正
|
||||
2007/01/21 [disp]の形のアドレス生成のバグ修正
|
||||
mov (eax|ax|al, [disp]); mov([disp], eax|ax|al);の短い表現選択
|
||||
2007/01/17 webページ作成
|
||||
2007/01/04 公開開始
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
◎著作権者
|
||||
|
||||
光成滋生(MITSUNARI Shigeo, herumi at nifty dot com)
|
||||
|
||||
---
|
||||
$Revision: 1.56 $
|
||||
$Date: 2010/04/16 11:58:22 $
|
||||
|
|
Loading…
Reference in a new issue