From ee0e67b9d7c275480827d856b926d2c403057bb8 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Fri, 6 Mar 2020 18:39:16 -0800 Subject: 6091 --- html/015immediate_addressing.cc.html | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'html/015immediate_addressing.cc.html') diff --git a/html/015immediate_addressing.cc.html b/html/015immediate_addressing.cc.html index 34f08f0c..0ca822f8 100644 --- a/html/015immediate_addressing.cc.html +++ b/html/015immediate_addressing.cc.html @@ -1331,6 +1331,45 @@ if ('onhashchange' in window) { 1270 trace(Callstack_depth+1, "run") << "contents at ESP: 0x" << HEXWORD << read_mem_u32(Reg[ESP].u) << end(); 1271 break; 1272 } +1273 +1274 //:: multiply +1275 +1276 :(before "End Initialize Op Names") +1277 put_new(Name, "69", "multiply rm32 by imm32 and store result in r32"); +1278 +1279 :(code) +1280 void test_multiply_imm32() { +1281 Reg[EAX].i = 2; +1282 Reg[EBX].i = 3; +1283 run( +1284 "== code 0x1\n" +1285 // op ModR/M SIB displacement immediate +1286 " 69 c3 04 00 00 00 \n" // EAX = EBX * 4 +1287 // ModR/M in binary: 11 (direct) 000 (dest EAX) 011 (src EBX) +1288 ); +1289 CHECK_TRACE_CONTENTS( +1290 "run: multiply r/m32 by 0x00000004 and store result in EAX\n" +1291 "run: r/m32 is EBX\n" +1292 "run: storing 0x0000000c\n" +1293 ); +1294 } +1295 +1296 :(before "End Single-Byte Opcodes") +1297 case 0x69: { +1298 const uint8_t modrm = next(); +1299 const uint8_t rdest = (modrm>>3)&0x7; +1300 const int32_t val = next32(); +1301 trace(Callstack_depth+1, "run") << "multiply r/m32 by 0x" << HEXWORD << val << " and store result in " << rname(rdest) << end(); +1302 const int32_t* signed_arg1 = effective_address(modrm); +1303 int32_t result = *signed_arg1 * val; +1304 int64_t full_result = static_cast<int64_t>(*signed_arg1) * val; +1305 OF = (result != full_result); +1306 CF = OF; +1307 trace(Callstack_depth+1, "run") << "SF=" << SF << "; ZF=" << ZF << "; CF=" << CF << "; OF=" << OF << end(); +1308 Reg[rdest].i = result; +1309 trace(Callstack_depth+1, "run") << "storing 0x" << HEXWORD << Reg[rdest].i << end(); +1310 break; +1311 } -- cgit 1.4.1-2-gfad0