- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
char *r_or_mem() {
if ( get_mod() == 3 )
return regs [ ( size << 3 ) | ( look & 7 ) ] ;
else {
static char buf [ 32 ] ;
char *s = buf ;
*s++ = '[' ;
if ( ! ( look & 4 ) ) {
*s++ = 'B' ;
*s++ = ( look & 2 ) ? 'P' : 'X' ;
*s++ = '+' ;
*s++ = ( look & 1 ) ? 'D' : 'S' ;
*s++ = 'I' ;
if ( mod ) *s++ = '+' ;
} else {
if ( ( look & 7 ) == 6 && ! mod ) mod = 2 ;
else {
if ( look & 2 ) {
*s++ = 'B' ;
*s++ = ( look & 1 ) ? 'X' : 'P' ;
} else {
*s++ = ( look & 1 ) ? 'D' : 'S' ;
*s++ = 'I' ;
}
if ( mod ) *s++ = '+' ;
}
}
if ( mod ) {
read_value ( s , mod == 2 ) ;
s = s + strlen ( s ) ;
}
*s++ = ']' ;
*s = 0 ;
return buf ;
}
}
void checkorder() {
if ( ! dest ) {
char *tmp = op1 ;
op1 = op2 ;
op2 = tmp ;
}
}
void rm ( char *s ) {
sprintf ( decoded , "%s\t" , s ) ;
decoded += strlen ( decoded ) ;
get_ds() ;
read() ;
op1 = get_reg() ;
op2 = r_or_mem() ;
checkorder() ;
sprintf ( decoded , "%s , %s" , op1 , op2 ) ;
}
Чассть моего дизассемблера для 16-анального x86, что читает операндыы.