1 """
2 Home for the i386 emulation code.
3 """
4 import struct
5
6 import envi
7 import envi.bits as e_bits
8 import envi.memory as e_mem
9
10 from envi.archs.i386.regs import *
11 from envi.archs.i386.disasm import *
12 from envi.archs.i386 import i386Module
13
15 if size == 1:
16 return (val & 0x1f) % 9
17 elif size == 2:
18 return (val & 0x1f) % 17
19 elif size == 4:
20 return val & 0x1f
21 elif size == 8:
22 return val & 0x3f
23 else:
24 raise Exception("shiftMask is broke in envi/intel.py")
25
26
27 SEG_CS = 0
28 SEG_DS = 1
29 SEG_ES = 2
30 SEG_FS = 3
31 SEG_GS = 4
32 SEG_SS = 5
33
34
35
36
37 GPR_A = 0
38 GPR_C = 1
39 GPR_D = 2
40 GPR_B = 3
41 GPR_SP = 4
42 GPR_BP = 5
43 GPR_SI = 6
44 GPR_DI = 7
45
68
70
84
99
101
103 self.reglist = reglist
104
120
133
137
141
142 stdcall = StdCall()
143 thiscall = ThisCall()
144 cdecl = Cdecl()
145 msfastcall = MsFastCall()
146 bfastcall = BFastCall()
147
149
167
185
193
197
199 bytes = self.readMemory(addr, size)
200 if bytes == None:
201 return None
202
203 if len(bytes) != size:
204 raise Exception("Read Gave Wrong Length At 0x%.8x (va: 0x%.8x wanted %d got %d)" % (self.getProgramCounter(),addr, size, len(bytes)))
205 if size == 1:
206 return struct.unpack("B", bytes)[0]
207 elif size == 2:
208 return struct.unpack("<H", bytes)[0]
209 elif size == 4:
210 return struct.unpack("<I", bytes)[0]
211 elif size == 8:
212 return struct.unpack("<Q", bytes)[0]
213
215
216 if size == 1:
217 bytes = struct.pack("B",value & 0xff)
218 elif size == 2:
219 bytes = struct.pack("<H",value & 0xffff)
220 elif size == 4:
221 bytes = struct.pack("<I", value & 0xffffffff)
222 elif size == 8:
223 bytes = struct.pack("<Q", value & 0xffffffffffffffff)
224 self.writeMemory(addr, bytes)
225
227 bytes = self.readMemory(addr, size)
228 if bytes == None:
229 return None
230 if size == 1:
231 return struct.unpack("b", bytes)[0]
232 elif size == 2:
233 return struct.unpack("<h", bytes)[0]
234 elif size == 4:
235 return struct.unpack("<l", bytes)[0]
236
254
255
256
257
258
259
260
263
266
269
272
275
278
281
284
287
290
294
295
296 cond_na = cond_be
297 cond_nae = cond_b
298 cond_nb = cond_ae
299 cond_nbe = cond_a
300 cond_nc = cond_ae
301
304
305
306 cond_ng = cond_le
307 cond_nge = cond_l
308 cond_nl = cond_ge
309 cond_nle = cond_g
310
313
316
319
320 cond_nz = cond_ne
321
324
327
328 cond_pe = cond_p
329 cond_po = cond_np
330
333
334 cond_z = cond_e
335
336
337 cond_nc = cond_ae
338 cond_nl = cond_ge
339
340
341
347
353
355 """
356 Do the core of integer subtraction but only *return* the
357 resulting value rather than assigning it.
358 (allows cmp and sub to use the same code)
359 """
360
361 dst = self.getOperValue(op, 0)
362 src = self.getOperValue(op, 1)
363
364
365
366
367 dsize = op.opers[0].tsize
368 ssize = op.opers[1].tsize
369
370 if dsize != ssize:
371 src = e_bits.sign_extend(src, ssize, dsize)
372 ssize = dsize
373 return self.intSubBase(src, dst, ssize, dsize)
374
376
377 usrc = e_bits.unsigned(src, ssize)
378 udst = e_bits.unsigned(dst, dsize)
379
380 ssrc = e_bits.signed(src, ssize)
381 sdst = e_bits.signed(dst, dsize)
382
383 ures = udst - usrc
384 sres = sdst - ssrc
385
386
387
388
389
390 self.setFlag(EFLAGS_OF, e_bits.is_signed_overflow(sres, dsize))
391 self.setFlag(EFLAGS_AF, e_bits.is_aux_carry(usrc, udst))
392 self.setFlag(EFLAGS_CF, e_bits.is_unsigned_carry(ures, dsize))
393 self.setFlag(EFLAGS_SF, e_bits.is_signed(ures, dsize))
394 self.setFlag(EFLAGS_ZF, not sres)
395 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(ures))
396
397 return ures
398
400 dst = self.getOperValue(op, 0)
401 src = self.getOperValue(op, 1)
402
403 dsize = op.opers[0].tsize
404 ssize = op.opers[1].tsize
405
406
407 if dsize != ssize:
408 src = e_bits.sign_extend(src, ssize, dsize)
409 ssize = dsize
410
411
412 dst = e_bits.unsigned(dst, dsize)
413 src = e_bits.unsigned(src, ssize)
414
415 res = src & dst
416
417 self.setFlag(EFLAGS_AF, 0)
418 self.setFlag(EFLAGS_OF, 0)
419 self.setFlag(EFLAGS_CF, 0)
420 self.setFlag(EFLAGS_SF, e_bits.is_signed(res, dsize))
421 self.setFlag(EFLAGS_ZF, not res)
422 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(res))
423 return res
424
434
437
438
439
441 dst = self.getOperValue(op, 0)
442 src = self.getOperValue(op, 1)
443
444 cf = 0
445 if self.getFlag(EFLAGS_CF):
446 cf = 1
447
448 dstsize = op.opers[0].tsize
449 srcsize = op.opers[1].tsize
450
451 if (isinstance(op.opers[1], i386ImmOper) and
452 srcsize < dstsize):
453 src = e_bits.sign_extend(src, srcsize, dstsize)
454 srcsize = dstsize
455
456
457 res = dst + src + cf
458
459 tsize = op.opers[0].tsize
460
461 self.setFlag(EFLAGS_CF, e_bits.is_unsigned_carry(res, tsize))
462 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(res))
463 self.setFlag(EFLAGS_AF, e_bits.is_aux_carry(src, dst))
464 self.setFlag(EFLAGS_ZF, not res)
465 self.setFlag(EFLAGS_SF, e_bits.is_signed(res, tsize))
466 self.setFlag(EFLAGS_OF, e_bits.is_signed_overflow(res, tsize))
467
468 self.setOperValue(op, 0, res)
469
471 dst = self.getOperValue(op, 0)
472 src = self.getOperValue(op, 1)
473
474 dsize = op.opers[0].tsize
475 ssize = op.opers[1].tsize
476
477 if dsize > ssize:
478 src = e_bits.sign_extend(src, ssize, dsize)
479 ssize = dsize
480
481 udst = e_bits.unsigned(dst, dsize)
482 usrc = e_bits.unsigned(src, ssize)
483 sdst = e_bits.signed(dst, dsize)
484 ssrc = e_bits.signed(src, ssize)
485
486 ures = udst + usrc
487 sres = sdst + ssrc
488
489 self.setFlag(EFLAGS_CF, e_bits.is_unsigned_carry(ures, dsize))
490 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(ures))
491 self.setFlag(EFLAGS_AF, e_bits.is_aux_carry(src, dst))
492 self.setFlag(EFLAGS_ZF, not ures)
493 self.setFlag(EFLAGS_SF, e_bits.is_signed(ures, dsize))
494 self.setFlag(EFLAGS_OF, e_bits.is_signed_overflow(sres, dsize))
495
496 self.setOperValue(op, 0, ures)
497
502
517
522
524 val = self.getOperValue(op, 0)
525
526 if val == 0:
527
528 self.setFlag(EFLAGS_ZF, True)
529 return
530
531 self.setFlag(EFLAGS_ZF, False)
532
533 tsize = op.opers[0].tsize
534 rmax = (tsize*8) - 1
535 while rmax >= 0:
536 if val & (1<<rmax):
537 self.setOperValue(op, 1, rmax)
538 return
539 rmax -= 1
540
548
549 - def i_bt(self, op):
551
556
562
567
574
577
580
583
584
585
608 i_cmovna = i_cmovbe
609 i_cmovnae = i_cmovb
610 i_cmovnb = i_cmovae
611 i_cmovnbe = i_cmova
612 i_cmovnc = i_cmovae
615 i_cmovng = i_cmovle
616 i_cmovnge = i_cmovl
617 i_cmovnl = i_cmovge
618 i_cmovnle = i_cmovg
625 i_cmovnz = i_cmovne
630 i_cmovpe = i_cmovp
631 i_cmovpo = i_cmovnp
634 i_cmovz = i_cmove
635
638
659
662
664 """
665 Compare the dword pointed at by ds:esi to ds:edi.
666 (if equal, update esi/edi by one acording to DF)
667 """
668 width = 4
669 if op.prefixes & PREFIX_OP_SIZE:
670 width = 2
671
672 self.doCmps(width)
673
694
696 """
697 Build a compound value where the value of the top reg is shifted and
698 or'd with the value of the bot reg ( assuming they are size
699 bytes in length). The return is size * 2 wide (and unsigned).
700 """
701 top = e_bits.unsigned(self.getRegister(topreg), size)
702 bot = e_bits.unsigned(self.getRegister(botreg), size)
703
704 return ((top << (size *8)) | bot)
705
707 top = e_bits.unsigned(val >> (size * 8), size)
708 bot = e_bits.unsigned(val, size)
709 return (top, bot)
710
712 size = 4
713 dsize = 8
714 if op.prefixes & PREFIX_OP_SIZE:
715 size = 2
716 dsize = 4
717
718 bignum = self.twoRegCompound(REG_EDX, REG_EAX, size)
719 testnum = self.getOperValue(op, 0)
720 if bignum == testnum:
721 self.setFlag(EFLAGS_ZF, 1)
722 resval = self.twoRegCompound(REG_ECX, REG_EBX, size)
723 self.setOperValue(op, 0, resval)
724 else:
725 self.setFlag(EFLAGS_ZF, 0)
726 edx,eax = self.regsFromCompound(testnum, dsize)
727 self.setRegister(REG_EDX, edx)
728 self.setRegister(REG_EAX, eax)
729
731 return self.i_cwd(op)
732
740
749
764
797
813
814
815
818
821
824
826
827 tsize = op.opers[0].tsize
828 if tsize == 1:
829 ax = self.getRegister(REG_AX)
830 ax = e_bits.signed(ax, 2)
831 d = self.getOperValue(op, 0)
832 d = e_bits.signed(d, 1)
833 if d == 0: raise envi.DivideByZero(self)
834 q = ax / d
835 r = ax % d
836 res = ((r & 0xff) << 8) | (q & 0xff)
837 self.setRegister(REG_AX, res)
838
839 elif tsize == 2:
840 val = self.twoRegCompound(REG_DX, REG_AX, 2)
841 val = e_bits.signed(val, 4)
842 d = self.getOperValue(op, 0)
843 d = e_bits.signed(d, 2)
844 if d == 0: raise envi.DivideByZero(self)
845 q = val / d
846 r = val % d
847
848 self.setRegister(REG_AX, q)
849 self.setRegister(REG_DX, r)
850
851 elif tsize == 4:
852 val = self.twoRegCompound(REG_EDX, REG_EAX, 4)
853 val = e_bits.signed(val, 8)
854 d = self.getOperValue(op, 0)
855 d = e_bits.signed(d, 4)
856 if d == 0: raise envi.DivideByZero(self)
857 q = val / d
858 r = val % d
859
860 self.setRegister(REG_EAX, q)
861 self.setRegister(REG_EDX, r)
862
863 else:
864 raise envi.UnsupportedInstruction(self, op)
865
867
868
869 ocount = len(op.opers)
870 if ocount == 2:
871 dst = self.getOperValue(op, 0)
872 src = self.getOperValue(op, 1)
873 dsize = op.opers[0].tsize
874 ssize = op.opers[1].tsize
875
876
877 if dsize > ssize:
878 src = e_bits.sign_extend(src, ssize, dsize)
879 ssize = dsize
880
881 res = dst * src
882
883 sof = e_bits.is_unsigned_carry(res, dsize)
884 self.setFlag(EFLAGS_CF, sof)
885 self.setFlag(EFLAGS_OF, sof)
886
887 self.setOperValue(op, 0, res)
888
889 elif ocount == 3:
890 dst = self.getOperValue(op, 0)
891 src1 = self.getOperValue(op, 1)
892 src2 = self.getOperValue(op, 2)
893
894 dsize = op.opers[0].tsize
895 ssize1 = op.opers[1].tsize
896 ssize2 = op.opers[2].tsize
897
898 if dsize > ssize2:
899 src2 = e_bits.sign_extend(src2, ssize2, dsize)
900 ssize2 = dsize
901
902 res = src1 * src2
903
904 sof = e_bits.is_unsigned_carry(res, dsize)
905 self.setFlag(EFLAGS_CF, sof)
906 self.setFlag(EFLAGS_OF, sof)
907
908 self.setOperValue(op, 0, res)
909
910 else:
911 raise envi.UnsupportedInstruction(self, op)
912
913 - def i_in(self, op):
915
917 size = op.opers[0].tsize
918 val = self.getOperValue(op, 0)
919
920 sval = e_bits.signed(val, size)
921 sval += 1
922
923 self.setOperValue(op, 0, sval)
924
925
926
927 self.setFlag(EFLAGS_OF, e_bits.is_signed_overflow(sval, size))
928 self.setFlag(EFLAGS_SF, e_bits.is_signed(sval, size))
929 self.setFlag(EFLAGS_ZF, not sval)
930 self.setFlag(EFLAGS_AF, (sval & 0xf == 0))
931 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(sval))
932
935
938
942
951
961
972
976
980
984
985 i_loope = i_loopz
986 i_loopne = i_loopnz
987
992
996
1000
1012
1024
1026 osize = op.opers[1].tsize
1027 nsize = op.opers[0].tsize
1028 val = self.getOperValue(op, 1)
1029 val = e_bits.sign_extend(val, osize, nsize)
1030 self.setOperValue(op, 0, val)
1031
1035
1037
1038 tsize = op.opers[0].tsize
1039
1040 val = self.getOperValue(op, 0)
1041
1042
1043 a = self._emu_getGpReg(GPR_A, tsize)
1044
1045 res = a * val
1046
1047 if tsize == 1:
1048 self.setRegister(REG_AX, res)
1049
1050 elif tsize == 2:
1051 d,a = self.regsFromCompound(res, tsize)
1052 self._emu_setGpReg(GPR_A, a, tsize)
1053 self._emu_setGpReg(GPR_D, d, tsize)
1054
1055
1056 if res >> (tsize * 8):
1057 self.setFlag(EFLAGS_CF, True)
1058 self.setFlag(EFLAGS_OF, True)
1059 else:
1060 self.setFlag(EFLAGS_CF, False)
1061 self.setFlag(EFLAGS_OF, False)
1062
1064 """
1065 Automagically map all general purpose register accesses
1066 to their tsize equiv. Helps clean up a lot of code
1067 (and makes a nice place for AMD64 to hook ;) )
1068 """
1069 if tsize == 1:
1070 reg += 0x00080000
1071 elif tsize == 2:
1072 reg += 0x00100000
1073 self.setRegister(reg, value)
1074
1076 """
1077 Automagically map all general purpose register accesses
1078 to their tsize equiv. Helps clean up a lot of code
1079 (and makes a nice place for AMD64 to hook ;) )
1080 """
1081 if tsize == 1:
1082 reg += 0x00080000
1083 elif tsize == 2:
1084 reg += 0x00100000
1085 return self.getRegister(reg)
1086
1098
1101
1106
1107 - def i_or(self, op):
1108 dst = self.getOperValue(op, 0)
1109 dsize = op.opers[0].tsize
1110 src = self.getOperValue(op, 1)
1111 ssize = op.opers[1].tsize
1112
1113 if dsize != ssize:
1114 src = e_bits.sign_extend(src, ssize, dsize)
1115 ssize = dsize
1116
1117 res = dst | src
1118
1119 self.setOperValue(op, 0, res)
1120
1121 self.setFlag(EFLAGS_OF, 0)
1122 self.setFlag(EFLAGS_CF, 0)
1123 self.setFlag(EFLAGS_SF, e_bits.is_signed(res, dsize))
1124 self.setFlag(EFLAGS_ZF, not res)
1125 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(res))
1126
1130
1141
1145
1151
1162
1166
1169
1170
1171
1172 - def i_ja(self, op):
1176 - def i_jb(self, op):
1180 - def i_jc(self, op):
1184 - def i_je(self, op):
1186 - def i_jg(self, op):
1190 - def i_jl(self, op):
1194 i_jna = i_jbe
1195 i_jnae = i_jb
1196 i_jnb = i_jae
1197 i_jnbe = i_ja
1198 i_jnc = i_jae
1201 i_jng = i_jle
1202 i_jnge = i_jl
1203 i_jnl = i_jge
1204 i_jnle = i_jg
1211 i_jnz = i_jne
1212 - def i_jo(self, op):
1214 - def i_jp(self, op):
1216 i_jpe = i_jp
1217 i_jpo = i_jnp
1218 - def i_js(self, op):
1220 i_jz = i_je
1221
1223 dsize = op.opers[0].tsize
1224 dst = self.getOperValue(op, 0)
1225 src = self.getOperValue(op, 1)
1226
1227 src = src & 0x1f
1228
1229
1230 if self.getFlag(EFLAGS_CF):
1231 dst = dst | (1 << (8 * dsize))
1232
1233
1234 x = ((8*dsize) - src) + 1
1235
1236
1237 res = (dst << src) | (dst >> x)
1238 cf = (res >> (8*dsize)) & 1
1239 res = e_bits.unsigned(res, dsize)
1240
1241 self.setFlag(EFLAGS_CF, cf)
1242 if src == 1:
1243 m1 = e_bits.msb(res, dsize)
1244 m2 = e_bits.msb(res << 1, dsize)
1245 self.setFlag(EFLAGS_OF, m1 ^ m2)
1246
1247 self.setOperValue(op, 0, res)
1248
1250 dsize = op.opers[0].tsize
1251 dst = self.getOperValue(op, 0)
1252 src = self.getOperValue(op, 1)
1253
1254 src = src & 0x1f
1255
1256 if self.getFlag(EFLAGS_CF):
1257 dst = dst | (1 << (8 * dsize))
1258
1259
1260 x = ((8*dsize) - src) + 1
1261
1262 res = (dst >> src) | (dst << x)
1263 cf = (res >> (8*dsize)) & 1
1264 res = e_bits.unsigned(res, dsize)
1265
1266 self.setFlag(EFLAGS_CF, cf)
1267 if src == 1:
1268 m1 = e_bits.msb(res, dsize)
1269 m2 = e_bits.msb(res << 1, dsize)
1270 self.setFlag(EFLAGS_OF, m1 ^ m2)
1271
1272 self.setOperValue(op, 0, res)
1273
1280
1282 dstSize = op.opers[0].tsize
1283 count = self.getOperValue(op, 1)
1284 tempCount = shiftMask(count, dstSize)
1285
1286 if tempCount > 0:
1287 while tempCount:
1288 val = self.getOperValue(op, 0)
1289 tempCf = e_bits.msb(val, dstSize)
1290 self.setOperValue(op, 0, (val * 2) + tempCf)
1291 tempCount -= 1
1292 val = self.getOperValue(op, 0)
1293 self.setFlag(EFLAGS_CF, e_bits.lsb(val))
1294 if count == 1:
1295 val = self.getOperValue(op, 0)
1296 cf = self.getFlag(EFLAGS_CF)
1297 self.setFlag(EFLAGS_OF, e_bits.msb(val, dstSize) ^ cf)
1298 else:
1299 self.setFlag(EFLAGS_OF, False)
1300
1302 dstSize = op.opers[0].tsize
1303 count = self.getOperValue(op, 1)
1304 tempCount = shiftMask(count, dstSize)
1305
1306 if tempCount > 0:
1307 while tempCount:
1308 val = self.getOperValue(op, 0)
1309 tempCf = e_bits.lsb(val)
1310 self.setOperValue(op, 0, (val / 2) + (tempCf * (2 ** dstSize)))
1311 tempCount -= 1
1312 val = self.getOperValue(op, 0)
1313 self.setFlag(EFLAGS_CF, e_bits.msb(val, dstSize))
1314 if count == 1:
1315 val = self.getOperValue(op, 0)
1316 cf = self.getFlag(EFLAGS_CF)
1317
1318 self.setFlag(EFLAGS_OF, e_bits.msb(val, dstSize) ^ (e_bits.msb(val, dstSize) - 1))
1319 else:
1320 self.setFlag(EFLAGS_OF, False)
1321
1329
1331 dsize = op.opers[0].tsize
1332 dst = self.getOperValue(op, 0)
1333 src = self.getOperValue(op, 1)
1334
1335 src = src & 0x1f
1336
1337
1338 if src == 0:
1339 return
1340
1341 res = dst << src
1342 cf = (res >> 8*dsize) & 1
1343
1344 res = e_bits.unsigned(res, dsize)
1345
1346 self.setFlag(EFLAGS_CF, cf)
1347 self.setFlag(EFLAGS_SF, e_bits.is_signed(res, dsize))
1348 self.setFlag(EFLAGS_ZF, not res)
1349 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(res))
1350 if src == 1:
1351 self.setFlag(EFLAGS_OF, not e_bits.msb(res, dsize) == cf)
1352 else:
1353 self.setFlag(EFLAGS_OF, 0)
1354
1355 self.setOperValue(op, 0, res)
1356
1358 dsize = op.opers[0].tsize
1359 dst = self.getOperValue(op, 0)
1360 src = self.getOperValue(op, 1)
1361
1362 src = src & 0x1f
1363
1364
1365 if src == 0:
1366 return
1367
1368 signed = e_bits.msb(dst, dsize)
1369
1370 res = dst >> src
1371 cf = (dst >> (src-1)) & 1
1372
1373
1374
1375 if signed:
1376 x = (8*dsize) - src
1377 umax = e_bits.u_maxes[dsize]
1378 res |= (umax >> x) << x
1379
1380 res = e_bits.unsigned(res, dsize)
1381
1382 self.setFlag(EFLAGS_CF, cf)
1383 self.setFlag(EFLAGS_SF, e_bits.is_signed(res, dsize))
1384 self.setFlag(EFLAGS_ZF, not res)
1385 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(res))
1386 if src == 1:
1387 self.setFlag(EFLAGS_OF, False)
1388 else:
1389 self.setFlag(EFLAGS_OF, 0)
1390
1391 self.setOperValue(op, 0, res)
1392
1394 return self.i_sal(op)
1395
1397 dsize = op.opers[0].tsize
1398 dst = self.getOperValue(op, 0)
1399 src = self.getOperValue(op, 1)
1400
1401 src = src & 0x1f
1402
1403
1404 if src == 0:
1405 return
1406
1407 res = dst >> src
1408 cf = (dst >> (src-1)) & 1
1409
1410 res = e_bits.unsigned(res, dsize)
1411
1412 self.setFlag(EFLAGS_CF, cf)
1413 self.setFlag(EFLAGS_SF, e_bits.is_signed(res, dsize))
1414 self.setFlag(EFLAGS_ZF, not res)
1415 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(res))
1416 if src == 1:
1417 self.setFlag(EFLAGS_OF, False)
1418 else:
1419 self.setFlag(EFLAGS_OF, 0)
1420
1421 self.setOperValue(op, 0, res)
1422
1424 dsize = op.opers[0].tsize
1425 bsize = dsize * 8
1426 dst = self.getOperValue(op, 0)
1427 src = self.getOperValue(op, 1)
1428 cnt = self.getOperValue(op, 2)
1429
1430 cnt &= 0x1f
1431
1432 if cnt == 0:
1433 return
1434
1435 if cnt > bsize:
1436
1437 return
1438
1439 res = dst >> cnt
1440 res |= src << (bsize - cnt)
1441
1442
1443
1444
1445
1446 ret = e_bits.unsigned(res, dsize)
1447
1448 if cnt == 1:
1449 dsign = e_bits.is_signed(dst, dsize)
1450 rsign = e_bits.is_signed(ret, dsize)
1451 self.setFlag(EFLAGS_OF, dsign != rsign)
1452
1453
1454 self.setFlag(EFLAGS_CF, (res << bsize) & 1)
1455 self.setFlag(EFLAGS_SF, e_bits.is_signed(ret, dsize))
1456 self.setFlag(EFLAGS_ZF, not ret)
1457 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(ret))
1458
1459 self.setOperValue(op, 0, ret)
1460
1462 dsize = op.opers[0].tsize
1463 bsize = dsize * 8
1464 dst = self.getOperValue(op, 0)
1465 src = self.getOperValue(op, 1)
1466 cnt = self.getOperValue(op, 2)
1467
1468 cnt &= 0x1f
1469
1470 if cnt == 0:
1471 return
1472
1473 if cnt > bsize:
1474 return
1475
1476 res = dst << cnt
1477 res |= src >> (bsize - cnt)
1478 ret = e_bits.unsigned(res, dsize)
1479
1480 if cnt == 1:
1481 dsign = e_bits.is_signed(dst, dsize)
1482 rsign = e_bits.is_signed(ret, dsize)
1483 self.setFlag(EFLAGS_OF, dsign != rsign)
1484
1485
1486 self.setFlag(EFLAGS_CF, (dst << (cnt-1)) & 1)
1487 self.setFlag(EFLAGS_SF, e_bits.is_signed(ret, dsize))
1488 self.setFlag(EFLAGS_ZF, not ret)
1489 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(ret))
1490
1491 self.setOperValue(op, 0, ret)
1492
1504
1517
1528
1539
1540
1541
1553 i_setna = i_setbe
1554 i_setnae = i_setb
1555 i_setnb = i_setae
1556 i_setnbe = i_seta
1557 i_setnc = i_setae
1559 i_setng = i_setle
1560 i_setnge = i_setl
1561 i_setnl = i_setge
1562 i_setnle = i_setg
1566 i_setnz = i_setne
1569 i_setpe = i_setp
1570 i_setpo = i_setnp
1572 i_setz = i_sete
1573
1575 dst = self.getOperValue(op, 0)
1576 src = self.getOperValue(op, 1)
1577
1578
1579
1580 if src == None or dst == None:
1581 self.undefFlags()
1582 return None
1583
1584 dsize = op.opers[0].tsize
1585 ssize = op.opers[1].tsize
1586
1587 if dsize != ssize:
1588 src = e_bits.sign_extend(src, ssize, dsize)
1589 ssize = dsize
1590 src += self.getFlag(EFLAGS_CF)
1591 res = self.intSubBase(src, dst, ssize, dsize)
1592 self.setOperValue(op, 0, res)
1593
1594
1595
1598
1601
1604
1605
1615
1620
1623
1625 print "i_wait() is a stub..."
1626
1633
1638
1640 dsize = op.opers[0].tsize
1641 ssize = op.opers[1].tsize
1642 dst = self.getOperValue(op, 0)
1643 src = self.getOperValue(op, 1)
1644
1645 ret = src ^ dst
1646
1647 self.setOperValue(op, 0, ret)
1648
1649 self.setFlag(EFLAGS_CF, 0)
1650 self.setFlag(EFLAGS_OF, 0)
1651 self.setFlag(EFLAGS_SF, e_bits.is_signed(ret, dsize))
1652 self.setFlag(EFLAGS_ZF, not ret)
1653 self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(ret))
1654 self.setFlag(EFLAGS_AF, False)
1655
1657 return self.i_xor(op)
1658