Last active
December 26, 2015 07:38
-
-
Save satokjp/7116205 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// run.java | |
// Compile: javac run.java | |
// env LC_ALL=en javac run.java mac | |
// javac -J-Dfile.encoding=UTF-8 run.java mac | |
// Run: java run [file name] -> run mode | |
// java run -d [file name] -> disassemble mode | |
// | |
/* | |
usage: 7run [-p] [-d|-v/-s] cmd [args ...] | |
-p: PDP-11 mode | |
-8: 8086/V6 mode | |
-d: disassemble mode (not run) | |
-m: verbose mode with memory dump | |
-v: verbose mode (output syscall and disassemble) | |
-s: syscall mode (output syscall) | |
*/ | |
import java.io.BufferedInputStream; | |
import java.io.File; | |
import java.io.FileInputStream; | |
class gv | |
{ | |
// GlobalVariable | |
// .text + .data = memory area | |
public static byte[] mem = new byte[1024]; | |
// .text area size 4 bytes | |
public static int t_size; | |
// .data area size 4 bytes | |
public static int d_size; | |
} | |
public class run { | |
// main | |
public static void main(String[] argv) { | |
System.out.println("binary file read program for Java"); | |
if (argv.length == 1){ | |
// run mode | |
System.out.println("run mode"); | |
// read binary file | |
fileRead(argv[0]); | |
run_prog(); | |
} else if (argv.length == 2){ | |
String s=argv[0]; | |
if ( s.equals("-d")){ | |
// disassemble mode | |
System.out.println("disassemble mode"); | |
// read binary file | |
fileRead(argv[1]); | |
disassemble(); | |
}else{ | |
System.out.println("no such switch"); | |
System.exit(1); | |
} | |
} else { | |
System.out.println("usage: java run [-d] [file name]"); | |
System.exit(1); | |
} | |
System.exit(0); | |
} | |
// fileRead | |
private static void fileRead( String inFile ) { | |
// 読み込むファイルの名前 | |
//String inputFileName = "a0.out"; | |
String inputFileName = inFile ; | |
// ファイルオブジェクト生成 | |
File inputFile = new File(inputFileName); | |
System.out.println("Read File: " + inFile); | |
try { | |
// 入力ストリームの生成 | |
FileInputStream fis = new FileInputStream(inputFile); | |
BufferedInputStream bis = new BufferedInputStream(fis); | |
// ヘッダー部のバイト配列 | |
byte[] header = new byte[16]; | |
// 2バイト分のデータ | |
short w; | |
// .text & .data area int:4bytes | |
//int t_size, d_size; | |
// 入力ストリームからの読み込み(ファイルの読み込み) | |
int len = bis.read(header); | |
// 読み込んだデータを16進形式で表示 | |
String hex; | |
for ( int i = 0; i < len; i++ ) { | |
hex = String.format("%1$x ", header[i]); | |
hex = hex.length() == 2 ? "0" + hex : hex; | |
System.out.print(hex + " "); | |
} | |
System.out.println(); | |
hex = String.format("%1$x ", header[2]); | |
// .text area size | |
w = (short) ( header[2] | ( header[3] << 8 ) ); | |
gv.t_size = (int) w; | |
// .data area size | |
w = (short) ( header[4] | ( header[5] << 8 ) ); | |
gv.d_size = (int) w; | |
//System.out.println(" t_size: " + gv.t_size + " d_size: " + gv.d_size); | |
System.out.printf(" t_size: 0x%02x d_size: 0x%02x \n", gv.t_size, gv.d_size); | |
//len = bis.read(mem,0,(t_size+d_size)); | |
len = bis.read(gv.mem,0,(gv.t_size + gv.d_size)); | |
if( len != gv.t_size + gv.d_size ) { | |
System.out.println("read size error !"); | |
} | |
// 後始末 | |
bis.close(); | |
// エラーがあった場合は、スタックトレースを出力 | |
} catch(Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
// read 8 bits | |
private static byte read8(int i){ | |
//System.out.println("read8"); | |
return gv.mem[i] ; | |
} | |
// read 16 bits | |
private static short read16(int i){ | |
//System.out.println("read16"); | |
return (short) ( gv.mem[i] | ( gv.mem[i+1] << 8 ) ) ; | |
} | |
// run program | |
private static void run_prog(){ | |
System.out.println("run start"); | |
} | |
// disassemble | |
private static void disassemble(){ | |
// 8 bits variable | |
byte b0,b1,b2; | |
// 16 bits variable | |
short w0,w1,w2; | |
System.out.println("disassemble start"); | |
for (int i = 0; i < gv.t_size; i++) { | |
b0 = read8(i); | |
switch (b0){ | |
case (byte) 0xb8 : | |
// mov ax | |
w0 = read16(i+1) ; | |
System.out.printf("%04x: %02x%02x%02x \t mov ax, %04x \n",i,read8(i),read8(i+1),read8(i+2),w0); | |
i += 2; | |
break; | |
case (byte) 0xbb : | |
// mov bx | |
w0 = read16(i+1) ; | |
System.out.printf("%04x: %02x%02x%02x \t mov bx, %04x \n",i,read8(i),read8(i+1),read8(i+2),w0); | |
i += 2; | |
break; | |
case (byte) 0xc7 : | |
b1 = read8(i+1); | |
switch (b1){ | |
case (byte) 0x07 : | |
// mov (bx) | |
w0 = read16(i+2) ; | |
System.out.printf("%04x: %02x%02x%02x%02x \t mov [bx], %04x \n",i,read8(i),read8(i+1),read8(i+2),read8(i+3),w0); | |
i += 3; | |
break; | |
default : | |
System.out.printf("%02x \t ; undefined %04x \n",b0,b0); | |
break; | |
} | |
break; | |
case (byte) 0xcd : | |
// int | |
b1 = read8(i+1); | |
switch (b1){ | |
case (byte) 0x07 : | |
// int 7 | |
System.out.printf("%04x: %02x%02x \t int %x \n",i,read8(i),read8(i+1),read8(i+1)); | |
i += 2; | |
b2 = read8(i); | |
switch (b2){ | |
case (byte) 0x01 : | |
// sys exit 1 | |
System.out.printf("%04x: %02x \t ; sys exit \n",i,b2); | |
//i += 1; | |
break; | |
case (byte) 0x04 : | |
// sys write 4 | |
System.out.printf("%04x: %02x \t ; sys write \n",i,b2); | |
i += 1; | |
w0 = read16(i) ; | |
System.out.printf("%04x: %02x%02x \t ; arg, %04x \n",i,read8(i),read8(i+1),w0); | |
i += 2; | |
w0 = read16(i) ; | |
System.out.printf("%04x: %02x%02x \t ; arg, %04x \n",i,read8(i),read8(i+1),w0); | |
i += 1; | |
break; | |
default : | |
System.out.printf("%04x: %02x \t ; undefined %04x \n",i,b0,b0); | |
break; | |
} | |
break; | |
default : | |
System.out.printf("%04x: %02x \t ; undefined %04x \n",i,b0,b0); | |
break; | |
} | |
//printf("%04x: %02x%02x \t int %x \n",i,read8(i),read8(i+1),read8(i+1)); | |
//i += 1; | |
break; | |
case (byte) 0x10 : | |
System.out.printf("%04x: %02x%02x \t ; arg \n",i,read8(i),read8(i+1)); | |
i += 1; | |
break; | |
case (byte) 0x06 : | |
System.out.printf("%04x: %02x%02x \t ; arg \n",i,read8(i),read8(i+1)); | |
i += 1; | |
break; | |
case (byte) 0x00 : | |
System.out.printf("%04x: %02x \t (undefined) \n",i,b0); | |
break; | |
default: | |
System.out.printf("%04x: %02x \t ; arg def %04x \n",i,b0,b0); | |
break; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment