@@ -398,8 +398,8 @@ static void seg_override( struct code_info *CodeInfo, int seg_reg, const struct
398
398
//if ( InstrTable[optable_idx[CodeInfo->token]].allowed_prefix == AP_REP ||
399
399
// InstrTable[optable_idx[CodeInfo->token]].allowed_prefix == AP_REPxx )
400
400
if ( CodeInfo -> pinstr -> allowed_prefix == AP_REP ||
401
- CodeInfo -> pinstr -> allowed_prefix == AP_REPxx )
402
- return ;
401
+ CodeInfo -> pinstr -> allowed_prefix == AP_REPxx )
402
+ return ;
403
403
404
404
if ( CodeInfo -> token == T_LEA ) {
405
405
CodeInfo -> prefix .RegOverride = ASSUME_NOTHING ; /* skip segment override */
@@ -2154,7 +2154,7 @@ static void HandleStringInstructions( struct code_info *CodeInfo, const struct e
2154
2154
case T_CMPSQ :
2155
2155
#endif
2156
2156
/* cmps allows prefix for the first operand (=source) only */
2157
- if ( CodeInfo -> prefix .RegOverride != EMPTY ) {
2157
+ if ( CodeInfo -> prefix .RegOverride != ASSUME_NOTHING ) {
2158
2158
if ( opndx [OPND2 ].override != NULL ) {
2159
2159
if ( CodeInfo -> prefix .RegOverride == ASSUME_ES ) {
2160
2160
/* content of LastRegOverride is valid if
@@ -2168,10 +2168,14 @@ static void HandleStringInstructions( struct code_info *CodeInfo, const struct e
2168
2168
DebugMsg1 (("HandleStringInstructions: CMPS: CodeInfo->RegOverride=%X, opndx->override=%s\n" , CodeInfo -> prefix .RegOverride , opndx [OPND2 ].override -> string_ptr ));
2169
2169
EmitError ( INVALID_INSTRUCTION_OPERANDS );
2170
2170
}
2171
- } else if ( CodeInfo -> prefix .RegOverride == ASSUME_DS ) {
2172
- /* prefix for first operand? */
2173
- CodeInfo -> prefix .RegOverride = ASSUME_NOTHING ;/* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
2174
2171
}
2172
+ } else { /* v2.14 */
2173
+ if ( opndx [OPND1 ].override == NULL && opndx [OPND1 ].sym ) {
2174
+ check_assume ( CodeInfo , opndx [OPND1 ].sym , ASSUME_DS );
2175
+ }
2176
+ }
2177
+ if ( CodeInfo -> prefix .RegOverride == ASSUME_DS ) {
2178
+ CodeInfo -> prefix .RegOverride = ASSUME_NOTHING ;/* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
2175
2179
}
2176
2180
break ;
2177
2181
#if AVXSUPP
@@ -2198,10 +2202,10 @@ static void HandleStringInstructions( struct code_info *CodeInfo, const struct e
2198
2202
* there's only one place to store the register override in CodeInfo,
2199
2203
* so it's a problem if both operands have an override; to be improved.
2200
2204
*/
2201
- if ( CodeInfo -> prefix .RegOverride != ASSUME_NOTHING )/* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
2202
- #if 1 /* v2.14*/
2205
+ if ( CodeInfo -> prefix .RegOverride != ASSUME_NOTHING ) { /* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
2206
+ #if 1 /* v2.14: destination must be ES: */
2203
2207
if ( opndx [OPND1 ].override && opndx [OPND1 ].override -> token == T_REG && opndx [OPND1 ].override -> tokval != T_ES ) {
2204
- DebugMsg1 (("HandleStringInstructions: CMPS : CodeInfo->RegOverride=%X, opndx->override=%s\n" , CodeInfo -> prefix .RegOverride , opndx [OPND1 ].override -> string_ptr ));
2208
+ DebugMsg1 (("HandleStringInstructions: MOVS : CodeInfo->RegOverride=%X, opndx->override=%s\n" , CodeInfo -> prefix .RegOverride , opndx [OPND1 ].override -> string_ptr ));
2205
2209
EmitError ( INVALID_INSTRUCTION_OPERANDS );
2206
2210
} else
2207
2211
#endif
@@ -2213,8 +2217,16 @@ static void HandleStringInstructions( struct code_info *CodeInfo, const struct e
2213
2217
DebugMsg (("HandleStringInstructions: MOVS: override==NULL for second operand\n" ));
2214
2218
EmitError ( INVALID_INSTRUCTION_OPERANDS );
2215
2219
}
2216
- } else if ( CodeInfo -> prefix .RegOverride == ASSUME_DS )
2217
- CodeInfo -> prefix .RegOverride = ASSUME_NOTHING ;/* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
2220
+ } //else if ( CodeInfo->prefix.RegOverride == ASSUME_DS )
2221
+ // CodeInfo->prefix.RegOverride = ASSUME_NOTHING;/* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
2222
+ }
2223
+ else { /* v2.14 */
2224
+ if ( opndx [OPND2 ].override == NULL && opndx [OPND2 ].sym ) {
2225
+ check_assume ( CodeInfo , opndx [OPND2 ].sym , ASSUME_DS );
2226
+ }
2227
+ }
2228
+ if ( CodeInfo -> prefix .RegOverride == ASSUME_DS )
2229
+ CodeInfo -> prefix .RegOverride = ASSUME_NOTHING ;/* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
2218
2230
break ;
2219
2231
case T_OUTS :
2220
2232
case T_OUTSB :
@@ -2232,6 +2244,9 @@ static void HandleStringInstructions( struct code_info *CodeInfo, const struct e
2232
2244
#if AMD64_SUPPORT
2233
2245
case T_LODSQ :
2234
2246
#endif
2247
+ /* v2.14 */
2248
+ if ( opndx [OPND1 ].override == NULL && opndx [OPND1 ].sym )
2249
+ check_assume ( CodeInfo , opndx [OPND1 ].sym , ASSUME_DS );
2235
2250
/* v2.10: remove unnecessary DS prefix ( Masm-compatible ) */
2236
2251
if ( CodeInfo -> prefix .RegOverride == ASSUME_DS )
2237
2252
CodeInfo -> prefix .RegOverride = ASSUME_NOTHING ;/* v2.12: EMPTY -> ASSUME_NOTHING to avoid warning */
0 commit comments