From 767e97d1c462180f395d497891b31c8b4e6fb67f Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sat, 22 Feb 2014 12:10:35 -0800 Subject: [PATCH] fix a bug encoding MOV [r/m byte] [immediate byte] --- asm/binary.rb | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/asm/binary.rb b/asm/binary.rb index 834a924..168737a 100644 --- a/asm/binary.rb +++ b/asm/binary.rb @@ -544,9 +544,9 @@ module Assembler # 3a. mov r/m32, reg32 # 3b. mov memoffset32, eax # 4. mov r/m32, immediate32 - # 5. mov r/m8, reg8 + # 5. mov r/m8, imm8 # 6. mov reg8, r/m8 - # 7. mov r/m8, imm8 + # 7. mov r/m8, reg8 def mov(dest, src) # These 2 are used in the same way, just the name differs to make the @@ -592,21 +592,24 @@ module Assembler modrm = [dest, 0] immediate = src - # version 5: mov r/m8, r8 - elsif rm?(dest, :byte) && register?(src, :byte) - opcode = 0x88 - modrm = [dest, src.regnum] + # version 5: mov r/m8, imm8 + # + # It's important that this check is first because src integers can + # pass the register? check in version 7. + elsif rm?(dest, :byte) && immediate?(src, :byte) + opcode = 0xc6 + modrm = [dest, 0] + immediate_byte = src # version 6: mov r8, r/m8 elsif register?(dest, :byte) && rm?(src, :byte) opcode = 0x8a modrm = [src, dest.regnum] - # version 7: mov r/m8, imm8 - elsif rm?(dest, :byte) && immediate?(src, :byte) - opcode = 0xc6 - modrm = [dest, 0] - immediate_byte = src + # version 7: mov r/m8, r8 + elsif rm?(dest, :byte) && register?(src, :byte) + opcode = 0x88 + modrm = [dest, src.regnum] else # puts "rm?(dest): #{rm?(dest)}\t\trm?(src): #{rm?(src)}"