flag tests for opcode 2d

This commit is contained in:
Kartik Agaram 2019-05-13 12:36:00 -07:00
parent e6f8c7f64a
commit cb7b44647e
1 changed files with 46 additions and 1 deletions

View File

@ -244,9 +244,54 @@ case 0x2d: { // subtract imm32 from EAX
break;
}
:(code)
void test_subtract_imm32_from_EAX_signed_overflow() {
Reg[EAX].i = 0x80000000; // smallest negative signed integer
run(
"== 0x1\n" // code segment
// op ModR/M SIB displacement immediate
" 2d ff ff ff 7f \n" // subtract largest positive signed integer from EAX
// ModR/M in binary: 00 (indirect mode) 101 (subop subtract) 011 (dest EBX)
);
CHECK_TRACE_CONTENTS(
"run: subtract imm32 0x7fffffff from EAX\n"
"run: SF=0; ZF=0; CF=0; OF=1\n"
"run: storing 0x00000001\n"
);
}
void test_subtract_imm32_from_EAX_unsigned_overflow() {
Reg[EAX].i = 0;
run(
"== 0x1\n" // code segment
// op ModR/M SIB displacement immediate
" 2d 01 00 00 00 \n" // subtract 1 from EAX
// ModR/M in binary: 00 (indirect mode) 101 (subop subtract) 011 (dest EBX)
);
CHECK_TRACE_CONTENTS(
"run: subtract imm32 0x00000001 from EAX\n"
"run: SF=1; ZF=0; CF=1; OF=0\n"
"run: storing 0xffffffff\n"
);
}
void test_subtract_imm32_from_EAX_signed_and_unsigned_overflow() {
Reg[EAX].i = 0;
run(
"== 0x1\n" // code segment
// op ModR/M SIB displacement immediate
" 2d 00 00 00 80 \n" // subtract smallest negative signed integer from EAX
// ModR/M in binary: 00 (indirect mode) 101 (subop subtract) 011 (dest EBX)
);
CHECK_TRACE_CONTENTS(
"run: subtract imm32 0x80000000 from EAX\n"
"run: SF=1; ZF=0; CF=1; OF=1\n"
"run: storing 0x80000000\n"
);
}
//:
:(code)
void test_subtract_imm32_from_mem_at_r32() {
Reg[EBX].i = 0x2000;
run(