Changeset 36 in dev for BasicCompiler32/op32_main.cpp
- Timestamp:
- Jan 20, 2007, 4:55:26 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/op32_main.cpp
r3 r36 360 360 OpBuffer[obp++]=cValue; 361 361 } 362 void op_sbb_RR( int reg1, int reg2 ){ 363 //sbb reg1,reg2 364 365 //オペコード 366 OpBuffer[obp++]=(char)0x1B; 367 368 //レジスタ 369 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 370 } 371 362 372 363 373 … … 370 380 //and reg,value 371 381 372 //16ビット演算の命令プリフィックス 373 char op_prefix=0; 374 375 //オペコード 376 char opcode=(char)0x81; 377 378 __op_format(op_prefix,opcode,0,0,reg,value,MOD_REG); 382 if(reg==REG_RAX){ 383 //eaxのみ特殊 384 385 // [8bit rex] 0010 0101 [32bit offset] 386 OpBuffer[obp++]=(char)0x25; 387 *((long *)(OpBuffer+obp))=value; 388 obp+=sizeof(long); 389 } 390 else{ 391 //16ビット演算の命令プリフィックス 392 char op_prefix=0; 393 394 //オペコード 395 char opcode=(char)0x81; 396 397 __op_format(op_prefix,opcode,0,0,reg,value,MOD_REG); 398 } 399 } 400 401 void op_or_RR( int op_size, int reg1, int reg2 ){ 402 //16ビット演算のプリフィックス 403 if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66; 404 405 //オペコード 406 if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x0A; 407 else OpBuffer[obp++]=(char)0x0B; 408 409 //レジスタ 410 OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)); 411 } 412 413 414 415 void op_neg( int reg ){ 416 //neg reg 417 418 //オペコード 419 OpBuffer[obp++]=(char)0xF7; 420 421 //レジスタ 422 OpBuffer[obp++]=(char)(0xD8| REGISTER_OPERAND(reg)); 379 423 } 380 424 … … 481 525 OpBuffer[obp++]=(char)num; 482 526 } 527 } 528 529 530 531 ///////////////////// 532 // cmp関連 533 ///////////////////// 534 void op_cmp_value(int op_size,int reg,char byte_data){ 535 //cmp reg,byte_data 536 537 if(op_size==sizeof(char)&®==REG_EAX){ 538 //alレジスタの場合は特殊 539 OpBuffer[obp++]=(char)0x3C; 540 541 //8ビット値 542 OpBuffer[obp++]=byte_data; 543 544 return; 545 } 546 547 //16ビット演算のプリフィックス 548 if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66; 549 550 //オペコード 551 if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x80; 552 else OpBuffer[obp++]=(char)0x83; 553 554 //レジスタ 555 OpBuffer[obp++]=(char)(0xF8| REGISTER_OPERAND(reg)); 556 557 //8ビット値 558 OpBuffer[obp++]=byte_data; 559 } 560 void op_setne( int reg ){ 561 //オペコード 562 OpBuffer[obp++]=(char)0x0F; 563 OpBuffer[obp++]=(char)0x95; 564 565 //レジスタ 566 OpBuffer[obp++]=(char)( 0xC0 | REGISTER_OPERAND(reg) ); 483 567 } 484 568
Note:
See TracChangeset
for help on using the changeset viewer.