sha0coder/libscemu

bsf calculating wrong value

Closed this issue · 2 comments

{
    "i": 83,
    "x64dbgLine": {
      "rawLine": {
        "Index": "00053",
        "Address": "0000000144FF961A",
        "Bytes": "66:0FBCC4",
        "Disassembly": "bsf ax,sp",
        "Registers": "rax: B5CF-> 4",
        "Memory": "",
        "Comments": ""
      },
      "rip": "144ff961a",
      "registerChanges": [
        {
          "registerName": "rax",
          "previousValue": "b5cf",
          "newValue": "4"
        }
      ],
      "memoryChanges": []
    },
    "scemuLine": {
      "rawLine": "diff_reg: rip = 144ff961a rax b5cf -> 3;",
      "rip": "144ff961a",
      "registerChanges": [
        {
          "registerName": "rax",
          "previousValue": "b5cf",
          "newValue": "3"
        }
      ],
      "memoryChanges": []
    },
    "instructionErrors": [
      {
        "index": 0,
        "message": "newValue mismatch",
        "x64dbg": "4",
        "scemu": "3"
      }
    ]
  },
84 0x144ff961a: bsf   ax,sp
	bsf: src = f290 sz = 16 dest = 3 bitpos = 4
	diff_flags: rip = 144ff961a f_zf 1 -> 0; 
	diff_reg: rip = 144ff961a rax b5cf -> 3; 
	rax: 0x3 rbx: 0x0 rcx: 0x140000000 rdx: 0x100000000 rsi: 0x14f410 rdi: 0x144e4725a rbp: 0x144ff960c rsp: 0x14f290

ok 4 instead 3,

while bitpos < sz && get_bit!(src, bitpos) == 0 {
                        dest += 1;
                        bitpos += 1;
                    }     
                    if dest > 0 {
                        dest -= 1;        // CASUALLY THIS
                    }

                    if dest == sz as u64 {
                        self.flags.f_cf = true;
                    } else {
                        self.flags.f_cf = false;
                    }

                    if dest == 0 {
                        self.flags.f_zf = true;
                    } else {
                        self.flags.f_zf = false;
                    }

fixed.