This commit is contained in:
Kartik Agaram 2018-12-28 21:26:42 -08:00
parent c2532c2d10
commit 431627b242
13 changed files with 28 additions and 27 deletions

View File

@ -134,7 +134,7 @@ case 0xf7: {
}
// End Op f7 Subops
default:
cerr << "unrecognized sub-opcode after f7: " << NUM(subop) << '\n';
cerr << "unrecognized subop for opcode f7: " << NUM(subop) << '\n';
exit(1);
}
break;
@ -250,7 +250,7 @@ case 0xd3: {
}
// End Op d3 Subops
default:
cerr << "unrecognized sub-opcode after d3: " << NUM(subop) << '\n';
cerr << "unrecognized subop for opcode d3: " << NUM(subop) << '\n';
exit(1);
}
break;

View File

@ -30,7 +30,7 @@ case 0x81: { // combine imm32 with r/m32
break;
// End Op 81 Subops
default:
cerr << "unrecognized sub-opcode after 81: " << NUM(subop) << '\n';
cerr << "unrecognized subop for opcode 81: " << NUM(subop) << '\n';
exit(1);
}
break;
@ -150,7 +150,7 @@ case 0xc1: {
}
// End Op c1 Subops
default:
cerr << "unrecognized sub-opcode after c1: " << NUM(subop) << '\n';
cerr << "unrecognized subop for opcode c1: " << NUM(subop) << '\n';
exit(1);
}
break;
@ -614,6 +614,11 @@ put_new(Name, "c7", "copy imm32 to rm32 (mov)");
case 0xc7: { // copy imm32 to r32
const uint8_t modrm = next();
trace(90, "run") << "copy imm32 to r/m32" << end();
const uint8_t subop = (modrm>>3)&0x7; // middle 3 'reg opcode' bits
if (subop != 0) {
cerr << "unrecognized subop for opcode c7: " << NUM(subop) << " (only 0/copy currently implemented)\n";
exit(1);
}
int32_t* dest = effective_address(modrm);
const int32_t src = next32();
trace(90, "run") << "imm32 is 0x" << HEXWORD << src << end();

View File

@ -229,15 +229,11 @@ void init_permitted_operands() {
// 0 1 0 |0 0 1 1
put(Permitted_operands, "c1", 0x23); // combine
//// Class P: op, ModR/M and imm32
// imm32 imm8 disp32 |disp16 disp8 subop modrm
// 1 0 0 |0 0 0 1
put(Permitted_operands, "c7", 0x41); // copy
//// Class Q: op, ModR/M, subop (not r32) and imm32
//// Class P: op, ModR/M, subop (not r32) and imm32
// imm32 imm8 disp32 |disp16 disp8 subop modrm
// 1 0 0 |0 0 1 1
put(Permitted_operands, "81", 0x43); // combine
put(Permitted_operands, "c7", 0x43); // copy
// End Init Permitted Operands
}

View File

@ -15,7 +15,7 @@
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP
# write to *EAX to check that we have access to the newly-allocated segment
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0x34/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0x34/imm32 # copy to *EAX
# syscall(exit, EAX)
89/copy 3/mod/direct 3/rm32/EBX . . . 0/r32/EAX . . # copy EAX to EBX

View File

@ -63,7 +63,7 @@ initialize-trace-stream:
# copy EAX to *Trace-stream
89/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Trace-stream/disp32 # copy EAX to *Trace-stream
# Trace-stream->length = 0x1000/N - 12
c7 0/copy 1/mod/*+disp8 0/rm32/EAX . . . . 8/disp8 0xff4/imm32 # copy 0xff4 to *(EAX+8)
c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX . . . . 8/disp8 0xff4/imm32 # copy 0xff4 to *(EAX+8)
c3/return
# Append a string to the given trace stream.
@ -149,9 +149,9 @@ clear-trace-stream: # t : (address trace-stream)
# ECX = &t->data[t->length]
8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 0xc/disp8 . # copy EAX+ECX+12 to ECX
# t->write = 0
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# t->read = 0
c7/copy 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 0/imm32 # copy to *(EAX+4)
c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 0/imm32 # copy to *(EAX+4)
# EAX = t->data
81 0/subop/add 3/mod/direct 0/rm32/EAX . . . . . 0xc/imm32 # add to EAX
# while (true)
@ -160,7 +160,7 @@ $clear-trace-stream:loop:
39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX
7d/jump-if-greater-or-equal $clear-trace-stream:end/disp8
# *EAX = 0
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# EAX += 4
81 0/subop/add 3/mod/direct 0/rm32/EAX . . . . . 4/imm32 # add to EAX
eb/jump $clear-trace-stream:loop/disp8

View File

@ -96,9 +96,9 @@ clear-stream: # f : (address stream) -> <void>
# ECX = &f->data[f->length]
8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 0xc/disp8 . # copy EAX+ECX+12 to ECX
# f->write = 0
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# f->read = 0
c7/copy 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 0/imm32 # copy to *(EAX+4)
c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 0/imm32 # copy to *(EAX+4)
# EAX = f->data
81 0/subop/add 3/mod/direct 0/rm32/EAX . . . . . 0xc/imm32 # add to EAX
# while (true)
@ -107,7 +107,7 @@ $clear-stream:loop:
39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX
7d/jump-if-greater-or-equal $clear-stream:end/disp8
# *EAX = 0
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# EAX += 4
81 0/subop/add 3/mod/direct 0/rm32/EAX . . . . . 4/imm32 # add to EAX
eb/jump $clear-stream:loop/disp8

View File

@ -86,7 +86,7 @@ tailor-exit-descriptor: # ed : (address exit-descriptor), nbytes : int -> <void
8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX
89/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . . # copy EAX to *ECX
# initialize ed->value
c7/copy 1/mod/*+disp8 1/rm32/ECX . . . . 4/disp8 0/imm32 # copy to *(ECX+4)
c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX . . . . 4/disp8 0/imm32 # copy to *(ECX+4)
$tailor-exit-descriptor:end:
# . restore registers
59/pop-to-ECX

View File

@ -264,7 +264,7 @@ test-read-byte-refills-buffer:
# pretend buffer is full
# . _test-buffered-file->read = 6 # >= _test-buffered-file->length
b8/copy-to-EAX _test-buffered-file/imm32
c7/copy 1/mod/*+disp8 0/rm32/EAX . . . . 8/disp8 6/imm32 # copy to *(EAX+8)
c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX . . . . 8/disp8 6/imm32 # copy to *(EAX+8)
# read-byte(_test-buffered-file)
# . . push args
68/push _test-buffered-file/imm32

View File

@ -12,7 +12,7 @@
#? 89/copy 3/mod/direct 0/rm32/EAX . . . 4/r32/ESP . . # copy ESP to EAX
#? # . configure ed to really exit()
#? # . . ed->target = 0
#? c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
#? c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
#? # . error-byte(ed, Stdout, msg, 34)
#? 68/push 0x34/imm32
#? 68/push "abc"/imm32

View File

@ -63,7 +63,7 @@ $run-main:
89/copy 3/mod/direct 0/rm32/EAX . . . 4/r32/ESP . . # copy ESP to EAX
# configure ed to really exit()
# . ed->target = 0
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# return compile(Stdin, 1/stdout, 2/stderr, ed)
# . . push args
50/push-EAX/ed
@ -105,7 +105,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd
89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX
# initialize the stream
# . num->length = 7
c7/copy 1/mod/*+disp8 1/rm32/ECX . . . . 8/disp8 7/imm32 # copy to *(ECX+8)
c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX . . . . 8/disp8 7/imm32 # copy to *(ECX+8)
# . clear-stream(num)
# . . push args
51/push-ECX

View File

@ -63,7 +63,7 @@ $run-main:
89/copy 3/mod/direct 0/rm32/EAX . . . 4/r32/ESP . . # copy ESP to EAX
# configure ed to really exit()
# . ed->target = 0
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# return compile(Stdin, 1/stdout, 2/stderr, ed)
# . . push args
50/push-EAX/ed
@ -105,7 +105,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd
89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX
# initialize the stream
# . num->length = 7
c7/copy 1/mod/*+disp8 1/rm32/ECX . . . . 8/disp8 7/imm32 # copy to *(ECX+8)
c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX . . . . 8/disp8 7/imm32 # copy to *(ECX+8)
# . clear-stream(num)
# . . push args
51/push-ECX

View File

@ -57,7 +57,7 @@ $run-main:
89/copy 3/mod/direct 0/rm32/EAX . . . 4/r32/ESP . . # copy ESP to EAX
# configure ed to really exit()
# . ed->target = 0
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# return convert(Stdin, 1/stdout, 2/stderr, ed)
# . . push args
50/push-EAX/ed

View File

@ -17,7 +17,7 @@
cd/syscall 0x80/imm8
# write to *EAX to check that we have access to the newly-allocated segment
c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0x34/imm32 # copy to *EAX
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0x34/imm32 # copy to *EAX
# syscall(exit, EAX)
89/copy 3/mod/direct 3/rm32/EBX . . . 0/r32/EAX . . # copy EAX to EBX