1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
32 File: drd64_intel64_asm.c
33 Function: Intel64 Line Assembler Main Module
35 ----------------------------------------------------------------------*/
37 #include"drd64_intel64.h"
38 #define DRD64_SRC_LIBINTEL64ASM_FUNC
39 #include"../include/libintel64asm.h"
42 /*----------------------------------------------------------------------
43 ----------------------------------------------------------------------*/
45 Drd64_Intel64_CarveStringBlock(
46 Drd64_Intel64_AssemblePacket *p_assemble,
55 if(( '\r' == *p_now ) || ( '\n' == *p_now ))
57 }while( '\0' != *(p_now++ + 1) );
62 /* Carve Instruction String --- */
64 if(( '\t' != *p_now ) && ( ' ' != *p_now)) { break; }
65 }while( '\0' != *(p_now++ + 1) );
69 if(( '\t' == *p_now ) || ( ' ' == *p_now)) { break; }
70 *p_now = tolower( *p_now );
71 }while( '\0' != *(p_now++ + 1) );
73 strncpy( p_assemble->str_instruction, p_temp, (p_now - p_temp));
75 /* Carve Destination String --- */
77 if(( '\t' != *p_now ) && ( ' ' != *p_now)) { break; }
78 }while( '\0' != *(p_now++ + 1) );
80 if( '\0' != *p_now ) {
83 if( ',' == *p_now ) { break; }
84 *p_now = tolower( *p_now );
85 }while( '\0' != *(p_now++ + 1) );
87 if( p_temp == p_now ) { return 0xff; }
91 if(( '\t' != *(p_end - 1)) && ( ' ' != *(p_end - 1))) { break; }
92 }while( p_temp <= --p_end );
93 strncpy( p_assemble->str_destination, p_temp, (p_end - p_temp));
94 if( ',' == *p_now ) { p_now++; }
97 /* Carve Source String --- */
99 if(( '\t' != *p_now ) && ( ' ' != *p_now)) { break; }
100 }while( '\0' != *(p_now++ + 1) );
102 if( '\0' != *p_now ) {
105 if( ',' == *p_now ) { break; }
106 *p_now = tolower( *p_now );
107 }while( '\0' != *(p_now++ + 1) );
109 if( p_temp == p_now ) { return 0xff; }
113 if(( '\t' != *(p_end - 1)) && ( ' ' != *(p_end - 1))) { break; }
114 }while( p_temp <= --p_end );
115 strncpy( p_assemble->str_source, p_temp, (p_end - p_temp));
116 if( ',' == *p_now ) { p_now++; }
119 /* Carve Option String --- */
121 if(( '\t' != *p_now ) && ( ' ' != *p_now)) { break; }
122 }while( '\0' != *(p_now++ + 1) );
124 if( '\0' != *p_now ) {
127 *p_now = tolower( *p_now );
128 }while( '\0' != *(p_now++ + 1) );
132 if(( '\t' != *(p_end - 1)) && ( ' ' != *(p_end - 1))) { break; }
133 }while( p_temp <= --p_end );
134 strncpy( p_assemble->str_option, p_temp, (p_now - p_temp));
141 /*----------------------------------------------------------------------
142 ----------------------------------------------------------------------*/
143 Drd64_Intel64_OperandNode *
144 Drd64_Intel64_ConstructOperand_RPNChain(
148 char str_buffer[MAX_OPERAND];
150 /* i_mode : 0=> Ignore 1=> Calc Mode. 2=>Data Stock. */
154 Drd64_Intel64_OperandNode *p_stack;
155 Drd64_Intel64_OperandNode *p_chain;
156 Drd64_Intel64_OperandNode *p_cnow;
158 Drd64_Intel64_OperandNode *p_data;
159 Drd64_Intel64_OperandNode *p_operator;
160 Drd64_Intel64_OperandNode *p_temp;
162 pstr_now = pstr_operand - 1;
172 pstr_bufpos = str_buffer;
173 memset( str_buffer, 0x00, MAX_OPERAND );
175 while( '\0' != *(++pstr_now) ) {
176 /* Pattern 1 - Ignore Chr. --- */
177 if(( ' ' == *pstr_now ) || ( '\t' == *pstr_now ))
179 /* Pattern 2 - Calc. Chr. --- */
180 else if(( '[' == *pstr_now ) || ( ']' == *pstr_now ) ||
181 ( '+' == *pstr_now ) || ( '*' == *pstr_now ) ||
182 ( '-' == *pstr_now ) || ( ':' == *pstr_now )) {
184 /* if Data Stock Mode => Proc. Data Ending ---*/
185 if( 0x02 == i_mode ) {
186 p_data = Drd64_Intel64_AllocOperandNode();
187 if( NULL == p_data ) { return NULL; }
188 strncpy( p_data->str_data, str_buffer, MAX_OPERAND );
189 pstr_bufpos = str_buffer;
190 memset( str_buffer, 0x00, MAX_OPERAND );
193 if( NULL == p_chain ) {
197 p_cnow->p_next = p_data;
198 p_data->p_before = p_cnow;
199 p_cnow = (void *)p_data;
203 p_operator = Drd64_Intel64_AllocOperandNode();
204 if( NULL == p_operator ) { return NULL; }
205 p_operator->str_data[0] = *pstr_now;
207 /* Check Stack in Primery Operator ---*/
208 if( NULL != p_stack ) {
211 if((( '+' == p_operator->str_data[0] ) ||
212 ( '-' == p_operator->str_data[0] ) ||
213 ( '*' == p_operator->str_data[0] )) &&
214 ( ':' == p_temp->str_data[0])) {
215 p_cnow->p_next = p_temp;
216 p_temp->p_before = p_cnow;
218 p_stack = p_temp->p_next;
220 else if((( '+' == p_operator->str_data[0] ) ||
221 ( '-' == p_operator->str_data[0] )) &&
222 ( '*' == p_temp->str_data[0])) {
223 p_cnow->p_next = p_temp;
224 p_temp->p_before = p_cnow;
226 p_stack = p_temp->p_next;
228 else if(( '+' == p_operator->str_data[0] ) &&
229 ( '-' == p_temp->str_data[0])) {
230 p_cnow->p_next = p_temp;
231 p_temp->p_before = p_cnow;
233 p_stack = p_temp->p_next;
235 else if((( '[' == p_operator->str_data[0] ) ||
236 ( ']' == p_operator->str_data[0] )) &&
237 (( '+' == p_temp->str_data[0]) ||
238 ( '-' == p_temp->str_data[0]) ||
239 ( '*' == p_temp->str_data[0]) ||
240 ( ':' == p_temp->str_data[0]))) {
241 p_cnow->p_next = p_temp;
242 p_temp->p_before = p_cnow;
244 p_stack = p_temp->p_next;
248 p_temp = p_temp->p_next;
249 }while( NULL != p_temp );
252 /* Push Stack Operator --- */
253 if( NULL != p_stack ) { p_stack->p_before = p_operator; }
254 p_operator->p_next = p_stack;
255 p_stack = (void *)p_operator;
257 /* Pattern 3 - Data Chr. --- */
259 *pstr_bufpos++ = *pstr_now;
264 if( 0x02 == i_mode ) {
265 p_data = Drd64_Intel64_AllocOperandNode();
266 if( NULL == p_data ) { return NULL; }
267 strncpy( p_data->str_data, str_buffer, MAX_OPERAND );
268 pstr_bufpos = str_buffer;
269 memset( str_buffer, 0x00, MAX_OPERAND );
272 if( NULL == p_chain ) {
277 p_cnow->p_next = p_data;
279 p_data->p_before = p_cnow;
280 p_cnow = (void *)p_data;
283 /* Flash Stack Operaters --- */
284 if( NULL != p_stack ) {
287 p_cnow->p_next = p_temp;
288 p_temp->p_before = p_cnow;
290 p_stack = p_temp->p_next;
291 p_temp = p_temp->p_next;
292 }while( NULL != p_temp );
295 Drd64_Intel64_Debug_Asm_PrintOperandChain( p_chain );
301 Drd64_Intel64_OperandNode *
302 Drd64_Intel64_CarveOperandSizePrefix(
303 Drd64_Intel64_OperandNode *p_chain)
305 Drd64_Intel64_OperandNode *p_ret;
308 if( !strncmp( p_chain->str_data, "byte", MAX_OPERAND ))
309 { p_chain->i_operandsize = 1; }
310 else if( !strncmp( p_chain->str_data, "word", MAX_OPERAND ))
311 { p_chain->i_operandsize = 2; }
312 else if( !strncmp( p_chain->str_data, "dword", MAX_OPERAND ))
313 { p_chain->i_operandsize = 4; }
314 else if( !strncmp( p_chain->str_data, "qword", MAX_OPERAND ))
315 { p_chain->i_operandsize = 8; }
316 else if( !strncmp( p_chain->str_data, "dqword", MAX_OPERAND ))
317 { p_chain->i_operandsize = 16; }
319 p_chain->w_typeid = OPTYPE_BASE_DATA_IMMEDIATE_MEMSIZE;
321 if( 0 < p_chain->i_operandsize ) {
322 p_ret = p_chain->p_next;
330 Drd64_Intel64_CheckMemoryOperandFormat(
331 Drd64_Intel64_OperandNode *p_chain)
333 Drd64_Intel64_OperandNode *p_now;
334 Drd64_Intel64_OperandNode *p_temp[2];
341 p_temp[0] = p_now->p_next;
343 if( NULL != p_temp[0] ) {
344 if( ']' == p_temp[0]->str_data[0] ) {
345 p_temp[1] = p_temp[0]->p_next;
346 if( NULL == p_temp[1] )
348 if( '[' != p_temp[1]->str_data[0] )
350 if( NULL != p_temp[1]->p_next )
354 p_now->p_next = NULL;
358 p_now = p_now->p_next;
359 }while( NULL != p_now );
364 p_now->b_flag_addr = 0x01;
365 p_now = p_now->p_next;
366 }while( NULL != p_now );
374 Drd64_Intel64_OperandNode *
375 Drd64_Intel64_ConstructOperandTree(
376 Drd64_Intel64_OperandNode *p_chain)
378 Drd64_Intel64_OperandNode *p_root;
379 Drd64_Intel64_OperandNode *p_temp;
380 Drd64_Intel64_OperandNode *p_value[3];
385 if(( '+' == p_temp->str_data[0] ) ||
386 ( '*' == p_temp->str_data[0] ) ||
387 ( ':' == p_temp->str_data[0] ) ||
388 ( '-' == p_temp->str_data[0] )) {
389 p_value[1] = p_temp->p_before;
390 assert( NULL != p_value[1] );
391 p_value[0] = p_value[1]->p_before;
392 assert( NULL != p_value[0] );
394 p_value[0]->p_parent = p_temp;
395 p_value[1]->p_parent = p_temp;
396 p_temp->p_left = p_value[0];
397 p_temp->p_right = p_value[1];
399 p_temp->p_before = p_value[0]->p_before;
400 p_value[2] = p_value[0]->p_before;
401 if( NULL != p_value[2] )
402 { p_value[2]->p_next = p_temp; }
404 p_value[0]->p_before = NULL;
405 p_value[0]->p_next = NULL;
406 p_value[1]->p_before = NULL;
407 p_value[1]->p_next = NULL;
410 if( '-' == p_temp->str_data[0] ) {
411 if( '*' == p_value[1]->str_data[0] ) {
416 pstr_temp = p_value[1]->str_data + MAX_OPERAND;
418 *pstr_temp = *(pstr_temp - 1);
419 }while( p_value[1]->str_data != --pstr_temp );
421 p_temp->str_data[0] = '+';
426 if( NULL == p_temp->p_next ) { p_root = p_temp; }
427 p_temp = p_temp->p_next;
428 }while( NULL != p_temp );
436 Drd64_Intel64_ConvAsciiToValue(
457 pstr_src = pstr_value;
459 /* Check 1 : Check String Length */
460 i_len = strlen( pstr_value );
461 if( 0 == i_len ) { return 0x01; }
463 /* Check 2 : Check Hexical Value? */
464 if( 'h' == *(pstr_value + i_len - 1) ) {
469 /* Check 3 : Check Minus Value? */
470 if( '-' == *(pstr_value + 0) ) {
477 if( isdigit( *pstr_src ) ) {
478 if(( '0' == *pstr_src ) && ( 0x00 == i_flag_zero )) {
484 /* XXX : Ascii Code Only! */
485 qw_temp = (qw_temp * i_base) + (*pstr_src - 0x30);
489 else if( 16 == i_base ) {
490 if( 'a' == *pstr_src ) { i_num = 10; }
491 else if( 'b' == *pstr_src ) { i_num = 11; }
492 else if( 'c' == *pstr_src ) { i_num = 12; }
493 else if( 'd' == *pstr_src ) { i_num = 13; }
494 else if( 'e' == *pstr_src ) { i_num = 14; }
495 else if( 'f' == *pstr_src ) { i_num = 15; }
501 qw_temp = (qw_temp * i_base) + i_num;
510 }while(( '\0' != *pstr_src++ ) && ( --i_len > 0 ));
513 { goto goto_Drd64_Intel64_ConvAsciiToValue_err; }
515 if( 2 >= i_pos ) { *i_size = 1; }
516 else if( 4 >= i_pos ) { *i_size = 2; }
517 else if( 8 >= i_pos ) { *i_size = 4; }
518 else if( 16 >= i_pos ) { *i_size = 8; }
519 else if( 16 < i_pos ) { i_err = 0x03; }
522 { goto goto_Drd64_Intel64_ConvAsciiToValue_err; }
524 if( 0x01 == i_flag_minus ) {
525 if(( *i_size == 1 ) && ( 0x7f < qw_temp ))
527 else if(( *i_size == 2 ) && ( 0x7fff < qw_temp ))
529 else if(( *i_size == 4 ) && ( 0x7fffffff < qw_temp ))
531 else if(( *i_size == 8 ) && ( 0x7fffffffffffffff < qw_temp ))
534 if( 0x00 == i_err ) {
535 qw_temp = (~qw_temp) + 1;
540 { goto goto_Drd64_Intel64_ConvAsciiToValue_err; }
542 *pqw_value = qw_temp;
543 goto_Drd64_Intel64_ConvAsciiToValue_err:
549 Drd64_Intel64_SetOperandNodeInfo(
550 Drd64_Intel64_OperandNode *p_now)
556 if( 0x00 < i_err ) { return i_err; }
558 if( NULL != p_now->p_left ) {
559 i_err = Drd64_Intel64_SetOperandNodeInfo( p_now->p_left );
560 if( 0x00 < i_err ) { return i_err; }
563 if( NULL != p_now->p_right ) {
564 i_err = Drd64_Intel64_SetOperandNodeInfo( p_now->p_right );
565 if( 0x00 < i_err ) { return i_err; }
568 /* Set Info. My Node ---*/
569 if(( '*' != p_now->str_data[0] ) &&
570 ( ':' != p_now->str_data[0] ) &&
571 ( '+' != p_now->str_data[0] )) {
573 /* Check 1 : String Is Register ? --- */
575 = Drd64_Intel64db_GetRegisterCode( p_now->str_data );
576 if( OPTYPE_REG_INVAILD != p_now->w_typeid ) {
577 if( isBitFlag(p_now->w_typeid, OPTYPE_BASE_REG_64BIT))
578 { p_now->i_operandsize = 8; }
579 else if( isBitFlag(p_now->w_typeid, OPTYPE_BASE_REG_32BIT))
580 { p_now->i_operandsize = 4; }
581 else if( isBitFlag(p_now->w_typeid, OPTYPE_BASE_REG_16BIT))
582 { p_now->i_operandsize = 2; }
583 else if( isBitFlag(p_now->w_typeid, OPTYPE_BASE_REG_8BIT))
584 { p_now->i_operandsize = 1; }
585 else if( isBitFlag(p_now->w_typeid, OPTYPE_BASE_REG_8BIT))
586 { p_now->i_operandsize = 1; }
587 else if( isRegType(p_now->w_typeid, OPTYPE_BASE_REG_MMX))
588 { p_now->i_operandsize = 8; }
589 else if( isRegType(p_now->w_typeid, OPTYPE_BASE_REG_SSE))
590 { p_now->i_operandsize = 16; }
591 else if( isRegType(p_now->w_typeid, OPTYPE_BASE_REG_CONTROL))
592 { p_now->i_operandsize = 8; }
593 else if( isRegType(p_now->w_typeid, OPTYPE_BASE_REG_DEBUG))
594 { p_now->i_operandsize = 8; }
595 else if( isRegType(p_now->w_typeid, OPTYPE_BASE_REG_SEGMENT))
596 { p_now->i_operandsize = 2; }
598 { p_now->i_operandsize = -1; }
600 /* Check 2 : String Is Value ? --- */
602 i_err = Drd64_Intel64_ConvAsciiToValue(
603 &(p_now->v_val.val.val64),
604 &(p_now->v_val.i_bytes),
606 if( 0x00 == i_err ) {
607 p_now->w_typeid = OPTYPE_BASE_DATA_IMMEDIATE_IMM;
608 p_now->i_operandsize = p_now->v_val.i_bytes;
613 p_now->w_typeid = OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR;
620 Drd64_Intel64_OperandNode *
621 Drd64_Intel64_CarveSegmentPrefix_Sub(
622 Drd64_Intel64_OperandNode *p_now)
624 Drd64_Intel64_OperandNode *p_ret;
628 if( NULL == p_now ) { return NULL; }
630 p_ret = Drd64_Intel64_CarveSegmentPrefix_Sub( p_now->p_left );
631 if( NULL != p_ret ) { return p_ret; }
633 p_ret = Drd64_Intel64_CarveSegmentPrefix_Sub( p_now->p_right );
634 if( NULL != p_ret ) { return p_ret; }
637 if( ':' == p_now->str_data[0] ) {
638 assert( NULL != p_now->p_left );
639 assert( NULL != p_now->p_right );
642 ((Drd64_Intel64_OperandNode *)(p_now->p_left))->w_typeid,
643 OPTYPE_BASE_REG_SEGMENT)) {
645 p_ret = p_now->p_left;
647 memcpy( p_now, p_now->p_right, sizeof(Drd64_Intel64_OperandNode));
659 Drd64_Intel64_CarveSegmentPrefix(
660 Drd64_Intel64_AssemblePacket *p_assemble,
661 Drd64_Intel64_OperandNode *p_now)
663 Drd64_Intel64_OperandNode *p_ret;
665 p_ret = Drd64_Intel64_CarveSegmentPrefix_Sub( p_now );
667 if( NULL != p_ret ) {
668 if( ':' == p_ret->str_data[0] )
671 { p_assemble->p_segment = p_ret; }
678 Drd64_Intel64_CheckOperandNode_Operator(
679 Drd64_Intel64_OperandNode *p_now,
689 i_err = Drd64_Intel64_CheckOperandNode_Operator(
690 p_now->p_left, pi_plus, pi_accum, pi_imm );
691 if( 0x00 != i_err ) { return i_err; }
693 i_err = Drd64_Intel64_CheckOperandNode_Operator(
694 p_now->p_right, pi_plus, pi_accum, pi_imm );
695 if( 0x00 != i_err ) { return i_err; }
697 if( '+' == p_now->str_data[0] )
699 else if( '*' == p_now->str_data[0] ) {
703 assert( NULL != p_now->p_left );
704 assert( NULL != p_now->p_right );
707 ((Drd64_Intel64_OperandNode *)(p_now->p_left))->w_typeid,
708 OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR)) {
713 ((Drd64_Intel64_OperandNode *)(p_now->p_right))->w_typeid,
714 OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR)) {
718 else if( isBitFlag( p_now->w_typeid, OPTYPE_BASE_DATA_IMMEDIATE_IMM )) {
727 Drd64_Intel64_ExchangeChildOperandNode(
728 Drd64_Intel64_OperandNode *p_root )
730 Drd64_Intel64_OperandNode *p_temp[2];
731 Drd64_Intel64_OperandNode *p_bak;
734 if(( NULL == p_root->p_left ) && ( NULL == p_root->p_right )) {
737 else if(( NULL == p_root->p_left ) || ( NULL == p_root->p_right )) {
741 p_temp[0] = p_root->p_left;
742 w_type[0] = p_temp[0]->w_typeid;
744 p_temp[1] = p_root->p_right;
745 w_type[1] = p_temp[1]->w_typeid;
747 if((( !isBitFlag(w_type[0],OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR)) &&
748 ( isBitFlag(w_type[1],OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR))) ||
749 (( '*' == p_temp[0]->str_data[0] ) &&
750 ( '+' == p_temp[1]->str_data[0] )) ||
751 (( isBitFlag(w_type[0],OPTYPE_BASE_DATA_IMMEDIATE_IMM) ) &&
752 ( !isBitFlag(w_type[1],OPTYPE_BASE_DATA)))) {
753 p_bak = p_root->p_left;
754 p_root->p_left = p_root->p_right;
755 p_root->p_right = p_bak;
763 Drd64_Intel64_SortOperandNode(
764 Drd64_Intel64_OperandNode *p_root )
766 Drd64_Intel64_OperandNode *p_temp;
767 Drd64_Intel64_OperandNode *p_bak;
771 i_err = Drd64_Intel64_ExchangeChildOperandNode( p_root );
772 if( 0x00 != i_err ) { return 0x01; }
774 /* Level 1 - Right */
775 p_temp = p_root->p_right;
776 if( NULL != p_temp ) {
777 w_type = p_temp->w_typeid;
778 if( OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR == w_type ) {
779 i_err = Drd64_Intel64_ExchangeChildOperandNode( p_temp );
780 if( 0x00 != i_err ) { return 0x01; }
785 p_temp = p_root->p_left;
786 if( NULL != p_temp ) {
787 w_type = p_temp->w_typeid;
788 if( OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR == w_type ) {
789 i_err = Drd64_Intel64_ExchangeChildOperandNode( p_temp );
790 if( 0x00 != i_err ) { return 0x01; }
794 p_temp = p_temp->p_left;
795 if( NULL != p_temp ) {
796 w_type = p_temp->w_typeid;
797 if( OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR == w_type) {
798 i_err = Drd64_Intel64_ExchangeChildOperandNode( p_temp );
799 if( 0x00 != i_err ) { return 0x01; }
809 Drd64_Intel64_CalcOperandSize_AddressMode(
810 Drd64_Intel64_OperandNode *p_now )
812 if( NULL == p_now) { return; }
814 Drd64_Intel64_CalcOperandSize_AddressMode( p_now->p_left );
816 Drd64_Intel64_CalcOperandSize_AddressMode( p_now->p_right );
818 if( isBitFlag( p_now->w_typeid, OPTYPE_BASE_DATA_IMMEDIATE_OPERATOR )) {
819 assert( NULL != p_now->p_left );
820 assert( NULL != p_now->p_right );
822 if( ((Drd64_Intel64_OperandNode *)p_now->p_left)->i_operandsize <
823 ((Drd64_Intel64_OperandNode *)p_now->p_right)->i_operandsize ) {
824 p_now->i_operandsize =
825 ((Drd64_Intel64_OperandNode *)p_now->p_right)->i_operandsize;
828 p_now->i_operandsize =
829 ((Drd64_Intel64_OperandNode *)p_now->p_left)->i_operandsize;
838 Drd64_Intel64_CalcAddressSize_AddressMode(
839 Drd64_Intel64_OperandNode *p_now )
841 if( NULL == p_now) { return; }
843 if( NULL != p_now->p_parent ) {
844 p_now->i_addressize =
845 ((Drd64_Intel64_OperandNode *)p_now->p_parent)->i_addressize;
848 Drd64_Intel64_CalcAddressSize_AddressMode( p_now->p_left );
849 Drd64_Intel64_CalcAddressSize_AddressMode( p_now->p_right );
856 Drd64_Intel64_CheckRegister_AddressMode(
857 Drd64_Intel64_OperandNode *p_now )
861 if( NULL == p_now) { return 0x00; }
863 i_err = Drd64_Intel64_CheckRegister_AddressMode( p_now->p_left );
864 if( 0x00 != i_err ) { return i_err; }
866 i_err = Drd64_Intel64_CheckRegister_AddressMode( p_now->p_right );
867 if( 0x00 != i_err ) { return i_err; }
869 if( !isBitFlag( p_now->w_typeid, OPTYPE_BASE_DATA )) {
870 if( (p_now->w_typeid & OPTYPE_BASE_REG_TYPEMASK)
871 != OPTYPE_BASE_REG_GENERIC ) {
873 if( ((Word)p_now->w_typeid) != OPTYPE_REG_RIP ) {
877 if(( !isBitFlag( p_now->w_typeid, OPTYPE_BASE_REG_64BIT )) &&
878 ( !isBitFlag( p_now->w_typeid, OPTYPE_BASE_REG_32BIT ))) {
888 Drd64_Intel64_CheckOperandNode(
889 Drd64_Intel64_OperandNode *p_now)
895 Drd64_Intel64_OperandNode *p_leaf[3];
896 Drd64_Intel64_OperandNode *p_left;
902 i_err = Drd64_Intel64_CheckOperandNode_Operator(
903 p_now, &i_plus_num, &i_accum_num, &i_imm_num );
904 if( 0x00 != i_err ) { return i_err; }
907 if( 0x00 == p_now->b_flag_addr ) {
908 if( 0 < i_plus_num ) { return 0x04; }
909 if( 0 < i_accum_num ) { return 0x05; }
911 assert( NULL == p_now->p_left );
912 assert( NULL == p_now->p_right );
915 /* Address Mode ---*/
917 if( 2 < i_plus_num ) { return 0x02; }
918 if( 1 < i_accum_num ) { return 0x03; }
920 i_err = Drd64_Intel64_SortOperandNode( p_now );
921 if( 0x00 != i_err ) { return i_err; }
923 if( 2 == i_plus_num ) {
924 p_left = p_now->p_left;
925 p_leaf[0] = p_left->p_left;
926 p_leaf[1] = p_left->p_right;
927 p_leaf[2] = p_now->p_right;
929 assert( NULL != p_leaf[0] );
930 assert( NULL != p_leaf[1] );
931 assert( NULL != p_leaf[2] );
934 if( (1 + i_accum_num) < i_imm_num ) { return 0x04; }
936 if( 0 == i_imm_num ) { return 0x05; }
938 if( isBitFlag( p_leaf[1]->w_typeid,
939 OPTYPE_BASE_DATA_IMMEDIATE_IMM )) {
940 p_left->p_right = p_leaf[2];
941 p_now->p_right = p_leaf[1];
943 i_err = Drd64_Intel64_SortOperandNode( p_now );
944 if( 0x00 != i_err ) { return i_err; }
949 /* Check Register is Generic? */
950 i_err = Drd64_Intel64_CheckRegister_AddressMode( p_now );
951 if( 0x00 != i_err ) { return i_err; }
953 /* Check Accumlate Operator */
954 if( 0 < i_accum_num ) {
955 if( 0 == i_plus_num ) {
958 else if( 1 == i_plus_num ) {
959 p_left = p_now->p_left;
960 assert( NULL != p_left );
962 else if( 2 == i_plus_num ) {
963 p_left = p_now->p_left;
964 assert( NULL != p_left );
965 p_left = p_left->p_left;
966 assert( NULL != p_left );
969 assert( '*' == p_left->str_data[0] );
971 p_left = p_left->p_right;
972 assert( NULL != p_left );
973 if( !isBitFlag( p_left->w_typeid, OPTYPE_BASE_DATA_IMMEDIATE_IMM ))
975 if(( '2' != p_left->str_data[0] ) &&
976 ( '4' != p_left->str_data[0] ) &&
977 ( '8' != p_left->str_data[0] )) {
980 /* XXX : '1' is Break Node */
988 Drd64_Intel64_OperandNode *
989 Drd64_Intel64_CheckOperand(
991 Drd64_Intel64_AssemblePacket *p_assemble )
994 int i_operand_pattern;
995 Drd64_Intel64_OperandNode *p_chain;
996 Drd64_Intel64_OperandNode *p_root;
997 Drd64_Intel64_OperandNode *p_temp;
998 Drd64_Intel64_OperandNode *p_opesize_prefix;
1000 /* Phase 1 : Construct Reverse Poland Chain ---*/
1001 p_chain = Drd64_Intel64_ConstructOperand_RPNChain( pstr_operand );
1002 if( NULL == p_chain ) { return NULL; }
1004 /* Phase 2 : Carve Operand Size Prefix --- */
1005 p_opesize_prefix = NULL;
1006 p_temp = Drd64_Intel64_CarveOperandSizePrefix(p_chain);
1007 if( p_temp != p_chain ) {
1008 p_opesize_prefix = p_chain;
1012 /* Phase 3 : Check Memory Format ---*/
1013 i_operand_pattern = Drd64_Intel64_CheckMemoryOperandFormat( p_chain );
1014 if( 0 > i_operand_pattern ) {
1018 /* Phase 4 : Construct Operand Tree from RPN Chain --- */
1019 p_root = Drd64_Intel64_ConstructOperandTree( p_chain );
1020 if( NULL == p_root ) { return NULL; }
1022 i_err = Drd64_Intel64_SetOperandNodeInfo( p_root );
1023 if( 0x00 != i_err ) { return NULL; }
1025 i_err = Drd64_Intel64_CarveSegmentPrefix( p_assemble, p_root );
1026 if( 0x00 != i_err ) { return NULL; }
1028 i_err = Drd64_Intel64_CheckOperandNode( p_root );
1029 if( 0x00 != i_err ) { return NULL; }
1031 /* Calc Operand Size */
1032 Drd64_Intel64_CalcOperandSize_AddressMode( p_root );
1033 p_root->i_addressize = p_root->i_operandsize;
1035 /* Calc Address Size */
1036 Drd64_Intel64_CalcAddressSize_AddressMode( p_root );
1039 if( 0x00 != p_root->b_flag_addr ) {
1040 if( NULL == p_opesize_prefix ) {
1041 p_opesize_prefix = Drd64_Intel64_AllocOperandNode();
1042 if( NULL == p_opesize_prefix ) { return NULL; }
1043 p_opesize_prefix->w_typeid = OPTYPE_BASE_DATA_IMMEDIATE_MEMSIZE;
1044 p_opesize_prefix->i_operandsize = 8;
1047 p_opesize_prefix->i_addressize = p_root->i_addressize;
1048 p_opesize_prefix->p_left = p_root;
1049 p_root = p_opesize_prefix;
1057 Drd64_Intel64_SetAnalyzePacket_OperandMemory(
1058 Drd64_Intel64_AnalyzePacket *p_analyze,
1059 Drd64_Intel64_OperandNode *p_head,
1063 Drd64_Intel64_OperandNode *p_root;
1064 Drd64_Intel64_OperandNode *p_base;
1065 Drd64_Intel64_OperandNode *p_index;
1066 Drd64_Intel64_OperandNode *p_scale;
1067 Drd64_Intel64_OperandNode *p_disp;
1068 Drd64_Intel64_OperandNode *p_temp[4];
1071 p_root = p_head->p_left;
1072 assert( NULL != p_root );
1079 /* Pattern 3 : IndexReg + Scale */
1080 if( '*' == p_root->str_data[0] ) {
1081 p_index = p_root->p_left;
1082 p_scale = p_root->p_right;
1084 p_analyze->i_sib_bytes = 1;
1086 else if( '+' == p_root->str_data[0] ) {
1087 p_temp[0] = p_root->p_left;
1088 p_temp[1] = p_root->p_right;
1091 if( isRegType( p_temp[1]->w_typeid, OPTYPE_BASE_REG_GENERIC ) ) {
1094 else if( OPTYPE_BASE_DATA_IMMEDIATE_IMM
1095 == p_temp[1]->w_typeid ) {
1100 /* Pattern 6 : Index * Scale + Disp */
1101 if( '*' == p_temp[0]->str_data[0] ) {
1102 p_index = p_temp[0]->p_left;
1103 p_scale = p_temp[0]->p_right;
1105 p_analyze->i_sib_bytes = 1;
1107 else if( '+' == p_temp[0]->str_data[0] ) {
1108 p_temp[2] = p_temp[0]->p_left;
1109 p_temp[3] = p_temp[0]->p_right;
1111 assert( NULL == p_base );
1113 assert( NULL != p_disp );
1115 /* Pattern 5 : Index * Scale + Base + Disp */
1116 if( '*' == p_temp[2]->str_data[0] ) {
1117 p_index = p_temp[2]->p_left;
1118 p_scale = p_temp[2]->p_right;
1120 p_analyze->i_sib_bytes = 1;
1122 /* Pattern 4 : Index + Base + Disp */
1123 else if( isRegType( p_temp[2]->w_typeid,
1124 OPTYPE_BASE_REG_GENERIC )) {
1125 p_index = p_temp[2];
1128 p_scale = Drd64_Intel64_AllocOperandNode();
1129 if( NULL == p_scale ) { return 0x01; }
1130 p_scale->str_data[0] = '1';
1131 p_scale->v_val.val.val64 = 1;
1132 p_scale->v_val.i_bytes = 1;
1133 p_scale->w_typeid = OPTYPE_BASE_DATA_IMMEDIATE_IMM;
1134 p_scale->b_flag_addr = 0xff;
1135 p_scale->i_operandsize = 1;
1136 p_scale->i_addressize = 1;
1138 p_analyze->i_sib_bytes = 1;
1141 else if( isRegType( p_temp[0]->w_typeid,
1142 OPTYPE_BASE_REG_GENERIC )) {
1143 /* Pattern 2-1 : Base + Disp */
1144 if( NULL == p_base ) {
1147 /* Pattern 2-2 : Index * 1 + Base */
1149 p_index = p_temp[0];
1152 p_scale = Drd64_Intel64_AllocOperandNode();
1153 if( NULL == p_scale ) { return 0x01; }
1154 p_scale->str_data[0] = '1';
1155 p_scale->v_val.val.val64 = 1;
1156 p_scale->v_val.i_bytes = 1;
1157 p_scale->w_typeid = OPTYPE_BASE_DATA_IMMEDIATE_IMM;
1158 p_scale->b_flag_addr = 0xff;
1159 p_scale->i_operandsize = 1;
1160 p_scale->i_addressize = 1;
1162 p_analyze->i_sib_bytes = 1;
1165 else if( ((Word)p_temp[0]->w_typeid) == OPTYPE_REG_RIP ) {
1166 if( NULL != p_base ) { return 0x02; }
1170 /* Pattern 1-2 : Disp. Only */
1172 else if( (unsigned int)OPTYPE_BASE_DATA_IMMEDIATE_IMM
1173 == p_root->w_typeid ) { */
1174 else if( isBitFlag(p_root->w_typeid, OPTYPE_BASE_DATA_IMMEDIATE_IMM)) {
1177 p_analyze->i_sib_bytes = 1;
1179 /* Pattern 1-1 : Reg. Only */
1180 else if( !isBitFlag( p_root->w_typeid, OPTYPE_BASE_DATA) ) {
1183 /* Support [?BP] => p_disp = 0 */
1185 if( (((Word)p_base->w_typeid) & OPTYPE_BASE_REG_GENERIC_IDMASK )
1186 == OPTYPE_BASE_REG_GENERIC_BP ) { */
1187 if( isRegType( p_base->w_typeid, OPTYPE_BASE_REG_GENERIC )) {
1188 if((isRegGenericID(p_base->w_typeid,
1189 OPTYPE_BASE_REG_GENERIC_BP)) ||
1190 (isRegGenericID(p_base->w_typeid,
1191 OPTYPE_BASE_REG_GENERIC_R13))) {
1193 p_disp = Drd64_Intel64_AllocOperandNode();
1194 if( NULL == p_disp ) { return 0x01; }
1196 p_disp->str_data[0] = '0';
1197 p_disp->v_val.val.val64 = 0;
1198 p_disp->v_val.i_bytes = 1;
1199 p_disp->w_typeid = OPTYPE_BASE_DATA_IMMEDIATE_IMM;
1200 p_disp->b_flag_addr = 0xff;
1201 p_disp->i_operandsize = 1;
1202 p_disp->i_addressize = 1;
1204 p_analyze->i_sib_bytes = 1;
1208 /* Illegal Pattern */
1213 /* Set Displacement */
1214 if( NULL != p_disp ) {
1215 assert( 0 == p_analyze->v_disp.i_bytes );
1217 p_analyze->v_disp.i_bytes = p_disp->v_val.i_bytes;
1218 p_analyze->v_disp.val.val64 = p_disp->v_val.val.val64;
1221 /* [RIP + disp] Support Code */
1222 if( NULL != p_temp[0] ) {
1223 if( ((Word)p_temp[0]->w_typeid) == OPTYPE_REG_RIP ) {
1224 p_analyze->modrm.modrm.mod = 0x00;
1225 p_analyze->modrm.modrm.rm = 0x05;
1227 p_analyze->v_disp.i_bytes = 4;
1229 goto goto_Drd64_Intel64_SetAnalyzePacket_OperandMemory_post;
1232 // 2020/01/31 - Temporary fix. VVVV
1234 /* Support [?SP + disp?] => SiB = 1Bytes */
1235 if( NULL != p_base ) {
1236 if( isRegType( p_base->w_typeid, OPTYPE_BASE_REG_GENERIC )) {
1237 if((isRegGenericID( p_base->w_typeid,
1238 OPTYPE_BASE_REG_GENERIC_SP )) ||
1239 (isRegGenericID( p_base->w_typeid,
1240 OPTYPE_BASE_REG_GENERIC_R12 )))
1241 { p_analyze->i_sib_bytes = 1; }
1246 if( NULL == p_disp )
1247 { p_analyze->modrm.modrm.mod = 0x00; }
1248 else if( 1 == p_disp->i_operandsize )
1249 { p_analyze->modrm.modrm.mod = 0x01; }
1251 { p_analyze->modrm.modrm.mod = 0x02; }
1256 if( 0 < p_analyze->i_sib_bytes ) {
1258 if( NULL != p_index ) {
1259 w_temp = ( p_index->w_typeid & OPTYPE_BASE_REG_IDMASK ) >> 8;
1260 p_analyze->sib.sib.index = w_temp & 0x0007;
1261 p_analyze->rex.rex.x = (w_temp & 0x0008) >> 3;
1264 p_analyze->sib.sib.index = 0x0004;
1268 if( NULL != p_scale ) {
1269 if(( 0x00 != p_analyze->rex.rex.x )
1270 || ( 0x0004 != p_analyze->sib.sib.index )) {
1271 if( 1 == p_scale->v_val.val.val64 )
1272 { p_analyze->sib.sib.scale = 0x00; }
1273 else if( 2 == p_scale->v_val.val.val64 )
1274 { p_analyze->sib.sib.scale = 0x01; }
1275 else if( 4 == p_scale->v_val.val.val64 )
1276 { p_analyze->sib.sib.scale = 0x02; }
1277 else if( 8 == p_scale->v_val.val.val64 )
1278 { p_analyze->sib.sib.scale = 0x03; }
1283 if( NULL != p_base ) {
1284 w_temp = ( p_base->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1285 p_analyze->sib.sib.base = w_temp & 0x0007;
1286 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1290 p_analyze->sib.sib.base = 0x05;
1292 if(( NULL == p_scale ) && ( NULL != p_disp ))
1293 { p_analyze->modrm.modrm.mod = 0x00; }
1296 p_analyze->modrm.modrm.rm = 0x04;
1299 if( NULL != p_base ) {
1300 w_temp = ( p_base->w_typeid & OPTYPE_BASE_REG_IDMASK ) >> 8;
1301 p_analyze->modrm.modrm.rm = w_temp & 0x0007;
1302 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1307 goto_Drd64_Intel64_SetAnalyzePacket_OperandMemory_post:
1309 Drd64_Intel64_Debug_Asm_PrintMemoryOperand(
1310 p_index, p_scale, p_base, p_disp);
1317 Drd64_Intel64_SetAnalyzePacket_Operand(
1318 Drd64_Intel64_AnalyzePacket *p_analyze,
1319 Drd64_Intel64_OperandNode *p_root,
1326 /* T : [ModR/M:reg] Test Reg. ( Reserved ) */
1327 /* C : [ModR/M:reg] Control Reg. */
1328 if( OPTYPE_DATA_METHOD_C == w_typeid ) {
1329 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1330 p_analyze->modrm.modrm.reg = (w_temp & 0x0007);
1331 p_analyze->rex.rex.r = (w_temp & 0x0008) >> 3;
1333 /* D : [ModR/M:reg] Debug Reg. */
1334 else if( OPTYPE_DATA_METHOD_D == w_typeid ) {
1335 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1336 p_analyze->modrm.modrm.reg = (w_temp & 0x0007);
1337 p_analyze->rex.rex.r = (w_temp & 0x0008) >> 3;
1339 /* G : [ModR/M:reg] General Reg. */
1340 else if( OPTYPE_DATA_METHOD_G == w_typeid ) {
1341 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1342 p_analyze->modrm.modrm.reg = (w_temp & 0x0007);
1343 p_analyze->rex.rex.r = (w_temp & 0x0008) >> 3;
1345 /* R : [ModR/M:R/M] refer to General Reg by R/M Field */
1346 else if( OPTYPE_DATA_METHOD_R == w_typeid ) {
1347 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1348 p_analyze->modrm.modrm.rm = (w_temp & 0x0007);
1349 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1350 p_analyze->modrm.modrm.mod = 0x03;
1352 /* P : [ModR/M:reg] Packed-QuadWord MMX Reg. */
1353 else if( OPTYPE_DATA_METHOD_P == w_typeid ) {
1354 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1355 p_analyze->modrm.modrm.reg = (w_temp & 0x0007);
1356 p_analyze->rex.rex.r = (w_temp & 0x0008) >> 3;
1358 /* N : [ModR/M:R/M] Packed-QuadWord MMX Reg. */
1359 else if( OPTYPE_DATA_METHOD_N == w_typeid ) {
1360 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1361 p_analyze->modrm.modrm.rm = (w_temp & 0x0007);
1362 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1363 p_analyze->modrm.modrm.mod = 0x03;
1365 /* V : [ModR/M:reg] 128bit XMM Reg. */
1366 else if( OPTYPE_DATA_METHOD_V == w_typeid ) {
1367 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1368 p_analyze->modrm.modrm.reg = (w_temp & 0x0007);
1369 p_analyze->rex.rex.r = (w_temp & 0x0008) >> 3;
1371 /* U : [ModR/M:R/M] 128bit XMM Reg. */
1372 else if( OPTYPE_DATA_METHOD_U == w_typeid ) {
1373 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1374 p_analyze->modrm.modrm.rm = (w_temp & 0x0007);
1375 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1376 p_analyze->modrm.modrm.mod = 0x03;
1378 /* S : [ModR/M:reg] Segment Reg. */
1379 else if( OPTYPE_DATA_METHOD_S == w_typeid ) {
1380 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1381 p_analyze->modrm.modrm.reg = (w_temp & 0x0007);
1382 p_analyze->rex.rex.r = (w_temp & 0x0008) >> 3;
1384 /* E : [ModR/M] Memory & Reg. */
1385 else if( OPTYPE_DATA_METHOD_E == w_typeid ) {
1387 if( isRegType( p_root->w_typeid, OPTYPE_BASE_REG_GENERIC ) ) {
1388 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1389 p_analyze->modrm.modrm.rm = (w_temp & 0x0007);
1390 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1391 p_analyze->modrm.modrm.mod = 0x03;
1393 /* Memory Address */
1395 Drd64_Intel64_SetAnalyzePacket_OperandMemory(
1396 p_analyze, p_root, w_typeid, w_sizeid);
1399 /* W : [ModR/M] 128bit XMM Reg. or Memory Address
1400 ( Memory Address calculated by Seg.Reg. BaseReg. IndexReg.
1401 ScalingFactor, Displacement */
1402 else if( OPTYPE_DATA_METHOD_W == w_typeid ) {
1404 if( isRegType( p_root->w_typeid, OPTYPE_BASE_REG_SSE ) ) {
1405 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1406 p_analyze->modrm.modrm.rm = (w_temp & 0x0007);
1407 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1408 p_analyze->modrm.modrm.mod = 0x03;
1410 /* Memory Address */
1412 Drd64_Intel64_SetAnalyzePacket_OperandMemory(
1413 p_analyze, p_root, w_typeid, w_sizeid);
1416 /* Q : [ModR/M] MMX reg. or Memory Address
1417 ( Memory Address calced by Seg.Reg, BaseReg. IndexReg.
1418 ScalingFactor, Displacement */
1419 else if( OPTYPE_DATA_METHOD_Q == w_typeid ) {
1421 if( isRegType( p_root->w_typeid, OPTYPE_BASE_REG_MMX ) ) {
1422 w_temp = (p_root->w_typeid & OPTYPE_BASE_REG_IDMASK) >> 8;
1423 p_analyze->modrm.modrm.rm = (w_temp & 0x0007);
1424 p_analyze->rex.rex.b = (w_temp & 0x0008) >> 3;
1425 p_analyze->modrm.modrm.mod = 0x03;
1427 /* Memory Address */
1429 Drd64_Intel64_SetAnalyzePacket_OperandMemory(
1430 p_analyze, p_root, w_typeid, w_sizeid);
1433 /* M : Memory Access (by ModR/M) (NO!!: Reg. Indicate by ModR/M) */
1434 else if( OPTYPE_DATA_METHOD_M == w_typeid ) {
1435 Drd64_Intel64_SetAnalyzePacket_OperandMemory(
1436 p_analyze, p_root, w_typeid, w_sizeid);
1438 /* A : Direct Address (NO!!: ModR/M, BaseReg, IndexReg, ScalingFactor) */
1439 /* else if( OPTYPE_DATA_METHOD_A == w_typeid ) { } */
1440 /* I : Immediate Data (NO!!: ModR/M) */
1441 else if( OPTYPE_DATA_METHOD_I == w_typeid ) {
1442 p_analyze->v_imm.val.val64 = p_root->v_val.val.val64;
1443 p_analyze->v_imm.i_bytes = p_root->i_operandsize;
1446 if(( OPSIZE_W == w_sizeid ) && ( 1 == p_root->i_operandsize )) {
1447 p_root->i_operandsize = 2;
1449 else if(( OPSIZE_D == w_sizeid ) && ( 2 >= p_root->i_operandsize )) {
1450 p_root->i_operandsize = 4;
1452 else if(( OPSIZE_Q == w_sizeid ) && ( 4 >= p_root->i_operandsize )) {
1453 p_root->i_operandsize = 8;
1455 else if( OPSIZE_V == w_sizeid ) {
1456 p_root->i_operandsize = p_analyze->i_operandsize;
1458 else if( OPSIZE_Z == w_sizeid ) {
1459 if(( 2 == p_analyze->i_operandsize)
1460 && ( 1 == p_root->i_operandsize )) {
1461 p_root->i_operandsize = 2;
1464 if( 2 >= p_root->i_operandsize ) {
1465 p_root->i_operandsize = 4;
1470 if( p_root->i_operandsize > p_analyze->v_imm.i_bytes ) {
1471 Drd64_Intel64_Common_ExtendValueBit(
1472 &(p_analyze->v_imm), p_root->i_operandsize,
1473 p_root->b_flag_addr);
1476 /* J : IP relative Address (NO!!: ModR/M) */
1477 else if( OPTYPE_DATA_METHOD_J == w_typeid ) {
1478 p_analyze->v_imm.val.val64 = p_root->v_val.val.val64;
1479 p_analyze->v_imm.i_bytes = p_root->i_operandsize;
1481 /* O : Word of DWord Data
1482 (NO!!: ModR/M, BaseReg. IndexReg, ScalingFactor */
1483 else if( OPTYPE_DATA_METHOD_O == w_typeid ) {
1484 p_analyze->v_imm.val.val64 = p_root->v_val.val.val64;
1485 p_analyze->v_imm.i_bytes = p_root->i_operandsize;
1487 /* F : EFLAGS / RFLAGS Reg. (NO!!: ModR/M) */
1488 /* else if( OPTYPE_DATA_METHOD_F == w_typeid ) { } */
1489 /* X : DS:rSI (Memory Address) */
1490 /* else if( OPTYPE_DATA_METHOD_X == w_typeid ) { } */
1491 /* Y : ES:rDI (Memory Address) */
1492 /* else if( OPTYPE_DATA_METHOD_Y == w_typeid ) { } */
1493 /* 1 : 0x01 Data (Immediate Data) */
1494 /* else if( OPTYPE_DATA_METHOD_1 == w_typeid ) { } */
1495 /* - : Illegal Instruction by DrDeamon64 Assembler System */
1496 else if( OPTYPE_DATA_METHOD_ILLEGAL == w_typeid ) {
1504 Drd64_Intel64_SetAnalyzePacket(
1505 Drd64_Intel64_AnalyzePacket *p_analyze,
1506 Drd64_Intel64_AssemblePacket *p_assemble )
1508 /* Proc. ModR/M Extension */
1510 Drd64_Intel64_SetAnalyzePacket_Operand(
1511 p_analyze, p_assemble->p_desttree,
1512 p_analyze->w_desttype, p_analyze->w_destsize);
1514 Drd64_Intel64_SetAnalyzePacket_Operand(
1515 p_analyze, p_assemble->p_srctree,
1516 p_analyze->w_srctype, p_analyze->w_srcsize);
1518 Drd64_Intel64_SetAnalyzePacket_Operand(
1519 p_analyze, p_assemble->p_optiontree,
1520 p_analyze->w_optiontype, p_analyze->w_optionsize);
1527 Drd64_Intel64_CalcDefaultAddressSize(
1528 Drd64_Intel64_AnalyzePacket *p_analyze,
1529 Drd64_Intel64_AssemblePacket *p_assemble )
1531 Drd64_Intel64_OperandNode *p_node;
1534 p_node = p_assemble->p_desttree;
1535 if( NULL != p_node ) {
1536 if( isBitFlag(p_node->w_typeid,
1537 OPTYPE_BASE_DATA_IMMEDIATE_MEMSIZE)) {
1538 if( 0 == p_analyze->i_addresssize ) {
1539 p_analyze->i_addresssize = p_node->i_addressize;
1544 p_node = p_assemble->p_srctree;
1545 if( NULL != p_node ) {
1546 if( isBitFlag(p_node->w_typeid,
1547 OPTYPE_BASE_DATA_IMMEDIATE_MEMSIZE)) {
1548 if( 0 == p_analyze->i_addresssize ) {
1549 p_analyze->i_addresssize = p_node->i_addressize;
1551 else if( p_node->i_addressize != p_analyze->i_addresssize ) {
1557 p_node = p_assemble->p_optiontree;
1558 if( NULL != p_node ) {
1559 if( isBitFlag(p_node->w_typeid,
1560 OPTYPE_BASE_DATA_IMMEDIATE_MEMSIZE)) {
1561 if( 0 == p_analyze->i_addresssize ) {
1562 p_analyze->i_addresssize = p_node->i_addressize;
1564 else if( p_node->i_addressize != p_analyze->i_addresssize ) {
1575 Drd64_Intel64_ConstructModRM(
1576 Drd64_Intel64_AnalyzePacket *p_analyze )
1579 if( 0x08 > p_analyze->b_regtype ) {
1580 p_analyze->modrm.modrm.reg = (p_analyze->b_regtype & 0x07);
1584 if( 0x08 > p_analyze->b_rmtype ) {
1585 p_analyze->modrm.modrm.rm = (p_analyze->b_rmtype & 0x07);
1589 if( 0x04 > p_analyze->b_modtype ) {
1590 p_analyze->modrm.modrm.mod = (p_analyze->b_modtype & 0x03);
1598 Drd64_Intel64_CalcDefaultOperandSize(
1599 Drd64_Intel64_AnalyzePacket *p_analyze,
1600 Drd64_Intel64_AssemblePacket *p_assemble )
1606 Drd64_Intel64_OperandNode *p_node;
1610 p_node = p_assemble->p_desttree;
1611 if( NULL != p_node ) {
1612 if( OPSIZE_V == p_analyze->w_destsize ) {
1613 /* XXX : MMX/SSE/Debug/Ctrl Reg. */
1614 i_destsize = p_node->i_operandsize;
1616 /* else if( OPSIZE_Z == p_analyze->w_destsize ) { } */
1617 /* else if( OPSIZE_P == p_analyze->w_destsize ) { } */
1618 else if( OPSIZE_ILLEGAL == p_analyze->w_destsize ) {
1619 if( isRegType( p_node->w_typeid,
1620 OPTYPE_BASE_REG_GENERIC )) {
1621 i_destsize = p_node->i_operandsize;
1627 p_node = p_assemble->p_srctree;
1628 if( NULL != p_node ) {
1629 if( OPSIZE_V == p_analyze->w_srcsize ) {
1630 /* XXX : MMX/SSE/Debug/Ctrl Reg. */
1631 i_srcsize = p_node->i_operandsize;
1633 /* else if( OPSIZE_Z == p_analyze->w_srcsize ) { } */
1634 /* else if( OPSIZE_P == p_analyze->w_srcsize ) { } */
1635 else if( OPSIZE_ILLEGAL == p_analyze->w_srcsize ) {
1636 if( isRegType( p_node->w_typeid,
1637 OPTYPE_BASE_REG_GENERIC )) {
1638 i_srcsize = p_node->i_operandsize;
1644 p_node = p_assemble->p_optiontree;
1645 if( NULL != p_node ) {
1646 if( OPSIZE_V == p_analyze->w_optionsize ) {
1647 /* XXX : MMX/SSE/Debug/Ctrl Reg. */
1648 i_optionsize = p_node->i_operandsize;
1650 /* else if( OPSIZE_Z == p_analyze->w_optionsize ) { } */
1651 /* else if( OPSIZE_P == p_analyze->w_optionsize ) { } */
1652 else if( OPSIZE_ILLEGAL == p_analyze->w_optionsize ) {
1653 if( isRegType( p_node->w_typeid,
1654 OPTYPE_BASE_REG_GENERIC )) {
1655 i_optionsize = p_node->i_operandsize;
1660 if( 0 != i_destsize ) {
1661 i_defaultsize = i_destsize;
1664 if( 0 != i_srcsize ) {
1665 if( 0 != i_defaultsize ) {
1666 p_node = p_assemble->p_srctree;
1667 if( isBitFlag( p_node->w_typeid,
1668 OPTYPE_BASE_DATA_IMMEDIATE_IMM )) {
1669 if( i_defaultsize < i_srcsize )
1673 if( i_defaultsize != i_srcsize )
1678 i_defaultsize = i_srcsize;
1682 if( 0 != i_optionsize ) {
1683 if( 0 != i_defaultsize ) {
1684 p_node = p_assemble->p_optiontree;
1685 if( isBitFlag( p_node->w_typeid,
1686 OPTYPE_BASE_DATA_IMMEDIATE_IMM )) {
1687 if( i_defaultsize < i_optionsize )
1691 if( i_defaultsize != i_optionsize )
1696 i_defaultsize = i_optionsize;
1700 if( 0 == i_defaultsize )
1701 { i_defaultsize = 4; }
1703 p_analyze->i_operandsize = i_defaultsize;
1710 Drd64_Intel64_SetPrefixByte(
1711 Drd64_Intel64_AnalyzePacket *p_analyze,
1712 Drd64_Intel64_AssemblePacket *p_assemble )
1714 /* Address Size Prefix */
1715 if( 4 == p_analyze->i_addresssize ) {
1716 p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x67;
1719 /* Operand Size Prefix */
1720 if( 8 == p_analyze->i_operandsize ) {
1721 p_analyze->rex.rex.w = 0x01;
1723 else if( 2 == p_analyze->i_operandsize ) {
1724 p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x66;
1728 if( 0x00 != p_analyze->rex.b_rex ) {
1729 p_analyze->rex.rex.head = 0x04;
1732 /* Segment Prefix Byte */
1733 if( NULL != p_assemble->p_segment ) {
1734 if( (unsigned int)p_assemble->p_segment->w_typeid
1736 { p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x64; }
1737 else if( (unsigned int)p_assemble->p_segment->w_typeid
1739 { p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x65; }
1740 else if( (unsigned int)p_assemble->p_segment->w_typeid
1742 { p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x26; }
1743 else if( (unsigned int)p_assemble->p_segment->w_typeid
1745 { p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x2e; }
1746 else if( (unsigned int)p_assemble->p_segment->w_typeid
1748 { p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x36; }
1749 else if( (unsigned int)p_assemble->p_segment->w_typeid
1751 { p_analyze->b_prefix[p_analyze->i_prefixes++] = 0x3e; }
1759 Drd64_Intel64_ConstructBinary(
1761 Drd64_Intel64_AnalyzePacket *p_analyze,
1765 Drd64_Intel64_OperandNode *p_disp;
1773 for( i_cnt = p_analyze->i_prefixes; i_cnt > 0; i_cnt-- ) {
1774 *pb_now++ = p_analyze->b_prefix[i_cnt - 1];
1779 if( 0x00 != p_analyze->rex.b_rex ) {
1780 *pb_now++ = p_analyze->rex.b_rex;
1785 for( i_cnt = 0; i_cnt < p_analyze->i_opcodes; i_cnt++ ) {
1786 *pb_now++ = p_analyze->b_opcode[i_cnt];
1791 if( 0x00 != p_analyze->modrm.b_modrm ) {
1792 *pb_now++ = p_analyze->modrm.b_modrm;
1797 if( 0x00 != p_analyze->sib.b_sib ) {
1798 *pb_now++ = p_analyze->sib.b_sib;
1803 if( 0 != p_analyze->v_disp.i_bytes ) {
1805 if( 1 == p_analyze->v_disp.i_bytes ) {
1806 *pb_now++ = p_analyze->v_disp.val.val8;
1810 if( 2 == p_analyze->v_disp.i_bytes ) {
1811 Drd64_Intel64_Common_ExtendValueBit(
1812 &(p_analyze->v_disp), 4 , 1);
1815 = (((DWord)(p_analyze->v_disp.val.val32)) & 0x000000ff);
1817 = (((DWord)(p_analyze->v_disp.val.val32)) & 0x0000ff00) >> 8;
1819 = (((DWord)(p_analyze->v_disp.val.val32)) & 0x00ff0000) >> 16;
1821 = (((DWord)(p_analyze->v_disp.val.val32)) & 0xff000000) >> 24;
1828 if( 0 != p_analyze->v_imm.i_bytes ) {
1830 if( 1 == p_analyze->v_imm.i_bytes ) {
1831 *pb_now++ = p_analyze->v_imm.val.val8;
1834 else if( 2 == p_analyze->v_imm.i_bytes ) {
1836 = (((DWord)(p_analyze->v_imm.val.val16)) & 0x00ff);
1838 = (((DWord)(p_analyze->v_imm.val.val16)) & 0xff00) >> 8;
1842 else if( 4 == p_analyze->v_imm.i_bytes ) {
1844 = (((DWord)(p_analyze->v_imm.val.val32)) & 0x000000ff);
1846 = (((DWord)(p_analyze->v_imm.val.val32)) & 0x0000ff00) >> 8;
1848 = (((DWord)(p_analyze->v_imm.val.val32)) & 0x00ff0000) >> 16;
1850 = (((DWord)(p_analyze->v_imm.val.val32)) & 0xff000000) >> 24;
1854 else if( 8 == p_analyze->v_imm.i_bytes ) {
1856 = (((QWord)(p_analyze->v_imm.val.val64))
1857 & 0x00000000000000ff);
1859 = (((QWord)(p_analyze->v_imm.val.val64))
1860 & 0x000000000000ff00) >> 8;
1862 = (((QWord)(p_analyze->v_imm.val.val64))
1863 & 0x0000000000ff0000) >> 16;
1865 = (((QWord)(p_analyze->v_imm.val.val64))
1866 & 0x00000000ff000000) >> 24;
1868 = (((QWord)(p_analyze->v_imm.val.val64))
1869 & 0x000000ff00000000) >> 32;
1871 = (((QWord)(p_analyze->v_imm.val.val64))
1872 & 0x0000ff0000000000) >> 40;
1874 = (((QWord)(p_analyze->v_imm.val.val64))
1875 & 0x00ff000000000000) >> 48;
1877 = (((QWord)(p_analyze->v_imm.val.val64))
1878 & 0xff00000000000000) >> 56;
1888 LIBINTEL64ASM_FUNC int
1889 Drd64_LibIntel64asm_AsmLine(
1894 Drd64_Intel64_AssemblePacket drd64_assemble;
1895 Drd64_Intel64_AnalyzePacket drd64_analyze;
1904 memset( &drd64_assemble, 0x00, sizeof(Drd64_Intel64_AssemblePacket) );
1905 memset( &drd64_analyze, 0x00, sizeof(Drd64_Intel64_AnalyzePacket) );
1907 /* Phase 1 : Carve String to String Block */
1908 i_err = Drd64_Intel64_CarveStringBlock( &drd64_assemble, p_src );
1909 if( 0x00 != i_err ) { return 0xff; }
1911 Drd64_Intel64_Debug_Asm_PrintCarveString( &drd64_assemble, p_src );
1913 /* Phase 2 : Check Operand & Construct Operand Tree */
1914 if( '\0' != drd64_assemble.str_destination[0] ) {
1915 drd64_assemble.p_desttree =
1916 Drd64_Intel64_CheckOperand(
1917 drd64_assemble.str_destination, &drd64_assemble );
1918 if( NULL == drd64_assemble.p_desttree ) { return 0xff; }
1920 Drd64_Intel64_Debug_PrintOperandTree(
1921 drd64_assemble.p_desttree, "Destination" );
1923 if( '\0' != drd64_assemble.str_source[0] ) {
1924 drd64_assemble.p_srctree =
1925 Drd64_Intel64_CheckOperand(
1926 drd64_assemble.str_source, &drd64_assemble );
1927 if( NULL == drd64_assemble.p_srctree ) { return 0xff; }
1929 Drd64_Intel64_Debug_PrintOperandTree(
1930 drd64_assemble.p_srctree, "Source" );
1932 if( '\0' != drd64_assemble.str_option[0] ) {
1933 drd64_assemble.p_optiontree =
1934 Drd64_Intel64_CheckOperand(
1935 drd64_assemble.str_option, &drd64_assemble );
1936 if( NULL == drd64_assemble.p_optiontree ) { return 0xff; }
1938 Drd64_Intel64_Debug_PrintOperandTree(
1939 drd64_assemble.p_optiontree, "Option" );
1941 /* Phase 3 : Search Intel64 Database */
1942 i_err = Drd64_Intel64db_SearchInstruction(
1943 &drd64_analyze, &drd64_assemble );
1944 Drd64_Intel64_Debug_PrintAnalyzePacket( &drd64_analyze, "Search DB", 3 );
1945 if( 0x00 != i_err ) { return 0x00; }
1947 /* Phase 4 : Calc Default Operand Size */
1948 i_err = Drd64_Intel64_CalcDefaultAddressSize(
1949 &drd64_analyze, &drd64_assemble );
1950 if( 0x00 != i_err ) { return 0x01; }
1952 i_err = Drd64_Intel64_CalcDefaultOperandSize(
1953 &drd64_analyze, &drd64_assemble );
1954 if( 0x00 != i_err ) { return 0x01; }
1956 /* Phase 4 : Construct */
1957 /* Phase 4-1 : construct ModR/M Encoding */
1958 Drd64_Intel64_ConstructModRM( &drd64_analyze );
1960 /* Phase 4-2 : Construct ModR/M + SiB */
1961 Drd64_Intel64_SetAnalyzePacket( &drd64_analyze, &drd64_assemble );
1962 Drd64_Intel64_Debug_PrintAnalyzePacket( &drd64_analyze, "Set Analyze", 3 );
1964 /* Phase 4-3 : Construct Prefix & Rex Byte */
1965 Drd64_Intel64_SetPrefixByte(&drd64_analyze, &drd64_assemble );
1967 Drd64_Intel64_Debug_PrintAnalyzePacket( &drd64_analyze, "Final", 2);
1968 Drd64_Intel64_Debug_Asm_PrintCarveString( &drd64_assemble, p_src );
1970 /* Phase 5 : Construct Binary */
1971 i_bytes = Drd64_Intel64_ConstructBinary(
1972 pb_dest, &drd64_analyze, i_maxdest );
1974 Drd64_Intel64_Debug_Asm_PrintAnswer( pb_dest, p_src, i_bytes );
1976 Drd64_Intel64_ResetOperandNode_Memory();
1983 /* EOF of drd64_intel64_asm.c ----------------------------------- */