From 447e8e2796d0361aed780ec9a391fde37f4e8422 Mon Sep 17 00:00:00 2001 From: pommicket Date: Thu, 2 Sep 2021 12:12:55 -0400 Subject: in theory all that's left for program 02 is filling in jumps --- 01/README.md | 2 +- 01/in00 | 4 +- 02/Makefile | 2 + 02/in01 | 445 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 02/in02 | 22 +++ 5 files changed, 472 insertions(+), 3 deletions(-) create mode 100644 02/Makefile create mode 100644 02/in01 create mode 100644 02/in02 diff --git a/01/README.md b/01/README.md index 859996f..1fc5f8c 100644 --- a/01/README.md +++ b/01/README.md @@ -41,7 +41,7 @@ So, for example, the `sy` command outputs a syscall instruction. You can see `||` is a very important command. It outputs an ELF header for our executable. Rather than compute the correct size of the file, it just sets the "file size" -and "memory size" members of the program header to `0x40000` (enough for a 256KB +and "memory size" members of the program header to `0x80000` (enough for a 512KB executable). As it turns out, Linux won't mind if the program header lies about how much data is in the file. diff --git a/01/in00 b/01/in00 index 6b99357..2d5488a 100644 --- a/01/in00 +++ b/01/in00 @@ -16289,6 +16289,6 @@ cc cc cc cc cc cc cc cc 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 -00 00 03 00 00 00 00 00 -00 00 03 00 00 00 00 00 +00 00 08 00 00 00 00 00 +00 00 08 00 00 00 00 00 00 10 00 00 00 00 00 00 diff --git a/02/Makefile b/02/Makefile new file mode 100644 index 0000000..90df482 --- /dev/null +++ b/02/Makefile @@ -0,0 +1,2 @@ +out01: in01 + ../01/out00 diff --git a/02/in01 b/02/in01 new file mode 100644 index 0000000..b287f1b --- /dev/null +++ b/02/in01 @@ -0,0 +1,445 @@ +|| ELF Header +;jm;50;00;00;00 jump over data to code +;'i;'n;'0;'2;00 (0x40007d) input filename +;'o;'u;'t;'0;'2;00 (0x400082) output filename +;00;00;' ;'n;'o;'t;' ;'r;'e;'c;'o;'g;'n;'i;'z;'e;'d;\n;00;00;00;00;00;00 (0x400088) error message/where we read to +;48;b8;00 (0x4000a0) load immediate instruction +;00;00;00;00;00 +;00;00;00;00;00;00;00;00 (0x4000a8) used for output +;00;00;' ;'b;'a;'d;' ;'l;'a;'b;'e;'l;\n;00 (0x400090) +;00;00;' 'b;'a;'d;' ;'n;'u;'m;'b;'e;'r;\n;00 (0x40009e) +;00 + +;im;7d;00;40;00;00;00;00;00 pointer to input filename +;JA +;zA O_RDONLY +;IA +;im;02;00;00;00;00;00;00;00 syscall 2, open +;sy + +;im;82;00;40;00;00;00;00;00 pointer to output filename +;JA +;im;41;02;00;00;00;00;00;00 O_WRONLY | O_CREAT | O_TRUNC +;IA +;im;ed;01;00;00;00;00;00;00 0o755 +;DA +;im;02;00;00;00;00;00;00;00 open +;sy + +begin by writing the elf header. +the segment we're loading in includes the ELF header at address 0x400000, so we can just read it from there +;im;04;00;00;00;00;00;00;00 out fd +;JA +;im;00;00;40;00;00;00;00;00 pointer to ELF header +;IA +;im;78;00;00;00;00;00;00;00 length of ELF header +;DA +;im;01;00;00;00;00;00;00;00 write +;sy + +-- read command -- +;im;03;00;00;00;00;00;00;00 input file descriptor +;JA +;im;88;00;40;00;00;00;00;00 where to read to +;IA +;im;02;00;00;00;00;00;00;00 read 2 bytes +;DA +;zA read +;sy + +;BA +;im;02;00;00;00;00;00;00;00 +;jg;cd;cd;cd;cd end of file + +calculate the index in the command table +;im;88;00;40;00;00;00;00;00 +;BA +;zA;lb +;I;07 +;BA +;im;6a;00;00;00;00;00;00;00 +;cm +;jn;cd;cd;cd;cd skip to newline + +it is a jump instruction. let's read in the label and write it to-- +wait a minute! this is just like our immediate label code. let's just +read the space between the command and the label, and then jump there + +;im;03;00;00;00;00;00;00;00 +;JA +;im;88;00;40;00;00;00;00;00 +;IA +;im;01;00;00;00;00;00;00;00 +;DA +;zA +;sy + +;jm;cd;cd;cd;cd + +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding + + +-- skip to newline -- +read 1 byte into 0x400088 +;im;03;00;00;00;00;00;00;00 +;JA +;im;88;00;40;00;00;00;00;00 +;IA +;im;01;00;00;00;00;00;00;00 +;DA +;sy + +;im;88;00;40;00;00;00;00;00 +;BA +;zA;lb;BA +;im;0a;00;00;00;00;00;00;00 +;cm +;jn;cd;cd;cd;cd go back to the start of "skip to newline" +;jm;cd;cd;cd;cd go all the way back and read the next two-byte command + + +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding + +-- end of file -- +;zA;JA exit code 0 +;im;3c;00;00;00;00;00;00;00 exit +;sy + +;cc +; diff --git a/02/in02 b/02/in02 new file mode 100644 index 0000000..261279c --- /dev/null +++ b/02/in02 @@ -0,0 +1,22 @@ +im d2 +JA +im :hw +IA +im d14 +DA +sy +::hw +'H +'e +'l +'l +'o +' +'w +'o +'r +'l +'d +'! +\n + -- cgit v1.2.3