Skip to content

Instantly share code, notes, and snippets.

@satokjp
Last active December 26, 2015 07:38
Show Gist options
  • Save satokjp/7116205 to your computer and use it in GitHub Desktop.
Save satokjp/7116205 to your computer and use it in GitHub Desktop.
//
// 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