Skip to content

Commit

Permalink
add: Implement some instructions for io
Browse files Browse the repository at this point in the history
  • Loading branch information
yamatcha committed Jun 9, 2020
1 parent 4cdf652 commit 59b9bfe
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 2 deletions.
5 changes: 3 additions & 2 deletions emulator/emulator.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const (
RegistersCount = 8
MemorySize = 1024 * 1024
AL = 0
EAX = 0
EDX = 2
ESP = 4
EBP = 5
Expand Down Expand Up @@ -128,13 +129,13 @@ func getSignCode32(emu *Emulator, index int) int32 {
return int32(getCode32(emu, index))
}

func setMomory8(emu *Emulator, address uint32, value uint32) {
func setMemory8(emu *Emulator, address uint32, value uint32) {
emu.Memory[address] = byte(value & 0xff)
}

func setMemory32(emu *Emulator, address uint32, value uint32) {
for i := uint32(0); i < 4; i++ {
setMomory8(emu, address+i, value>>(i*8))
setMemory8(emu, address+i, value>>(i*8))
}
}

Expand Down
56 changes: 56 additions & 0 deletions emulator/instruction.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,28 @@ func movR32Rm32(emu *Emulator) {
setR32(emu, &modrm, rm32)
}

func movRm8R8(emu *Emulator) {
emu.Eip++
var modrm ModRM
parseModrm(emu, &modrm)
r8 := getR8(emu, &modrm)
setRm8(emu, &modrm, r8)
}

func movR8Imm8(emu *Emulator) {
reg := GetCode8(emu, 0) - 0xb0
emu.Registers.setRegister8(reg, GetCode8(emu, 1))
emu.Eip += 2
}

func movR8Rm8(emu *Emulator) {
emu.Eip++
var modrm ModRM
parseModrm(emu, &modrm)
rm8 := getRm8(emu, &modrm)
setR8(emu, &modrm, byte(rm8))
}

func addRm32Imm8(emu *Emulator, modrm *ModRM) {
rm32 := getRm32(emu, modrm)
imm8 := int32(getSignCode8(emu, 0))
Expand All @@ -62,6 +84,22 @@ func subRm32Imm8(emu *Emulator, modrm *ModRM) {
updateEflagsSub(emu, rm32, imm8, result)
}

func cmpAlImm8(emu *Emulator) {
value := uint32(GetCode8(emu, 1))
al := uint32(emu.Registers.getRegister8(AL))
result := uint64(al) - uint64(value)
updateEflagsSub(emu, al, value, result)
emu.Eip += 2
}

func cmpEaxImm32(emu *Emulator) {
value := getCode32(emu, 1)
eax := emu.Registers.GetRegister32(EAX)
result := uint64(eax) - uint64(value)
updateEflagsSub(emu, eax, value, result)
emu.Eip++
}

func cmpR32Rm32(emu *Emulator) {
emu.Eip++
var modrm ModRM
Expand All @@ -84,6 +122,12 @@ func incRm32(emu *Emulator, modrm *ModRM) {
setRm32(emu, modrm, value+1)
}

func incR32(emu *Emulator) {
reg := GetCode8(emu, 0) - 0x40
emu.Registers.setRegister32(reg, emu.Registers.GetRegister32(reg)+1)
emu.Eip++
}

func code83(emu *Emulator) {
emu.Eip++
var modrm ModRM
Expand Down Expand Up @@ -269,6 +313,12 @@ func Instructions(index byte) (func(emu *Emulator), error) {
return addRm32R32, nil
case 0x3b == index:
return cmpR32Rm32, nil
case 0x3c == index:
return cmpAlImm8, nil
case 0x3d == index:
return cmpEaxImm32, nil
case 0x40 <= index && index < 0x40+8:
return incR32, nil
case 0x50 <= index && index < 0x50+8:
return pushR32, nil
case 0x58 <= index && index < 0x58+8:
Expand Down Expand Up @@ -301,10 +351,16 @@ func Instructions(index byte) (func(emu *Emulator), error) {

case 0x83 == index:
return code83, nil
case 0x88 == index:
return movRm8R8, nil
case 0x89 == index:
return movRm32R32, nil
case 0x8a == index:
return movR8Rm8, nil
case 0x8b == index:
return movR32Rm32, nil
case 0xb0 <= index && index < 0xb0+8:
return movR8Imm8, nil
case 0xb8 <= index && index < 0xb8+8:
return movR32Imm32, nil
case 0xc3 == index:
Expand Down
26 changes: 26 additions & 0 deletions emulator/modrm.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,29 @@ func getR32(emu *Emulator, modrm *ModRM) uint32 {
return emu.Registers.GetRegister32(modrm.opecode)
// return emu.Registers.GetRegister32(modrm.regIndex)
}

func getRm8(emu *Emulator, modrm *ModRM) byte {
if modrm.mod == 3 {
return emu.Registers.getRegister8(modrm.rm)
} else {
address := calcMemoryAddress(emu, modrm)
return byte(getMemory8(emu, address))
}
}

func setRm8(emu *Emulator, modrm *ModRM, value byte) {
if modrm.mod == 3 {
emu.Registers.setRegister8(modrm.rm, value)
} else {
address := calcMemoryAddress(emu, modrm)
setMemory8(emu, address, uint32(value))
}
}

func getR8(emu *Emulator, modrm *ModRM) byte {
return emu.Registers.getRegister8(modrm.opecode)
}

func setR8(emu *Emulator, modrm *ModRM, value byte) {
emu.Registers.setRegister8(modrm.opecode, value)
}

0 comments on commit 59b9bfe

Please sign in to comment.