From 53c8c9939d2e870ce5d207b9f0ee3d31d613f285 Mon Sep 17 00:00:00 2001 From: pommicket Date: Sun, 31 Oct 2021 22:32:40 -0400 Subject: in theory, i just need to fill in offsets --- 02/in01 | 557 +++++++++++++++++++++++++++++++++------------------------------- 02/in02 | 23 +-- 2 files changed, 292 insertions(+), 288 deletions(-) diff --git a/02/in01 b/02/in01 index b287f1b..721ff02 100644 --- a/02/in01 +++ b/02/in01 @@ -1,20 +1,24 @@ || ELF Header -;jm;50;00;00;00 jump over data to code +;jm;cd;cd;cd;cd jump to start of first pass ;'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 (0x4000a0) stores which pass we're on (1 for second pass) +;00;00;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 +unused padding +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 + +-- code starts here ;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 +;im;02;00;00;00;00;00;00;00 open ;sy ;im;82;00;40;00;00;00;00;00 pointer to output filename @@ -26,6 +30,7 @@ ;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 @@ -49,397 +54,415 @@ the segment we're loading in includes the ELF header at address 0x400000, so we ;BA ;im;02;00;00;00;00;00;00;00 -;jg;cd;cd;cd;cd end of file +;cm;jn;cd;cd;cd;cd end of file -calculate the index in the command table +look at first byte of command ;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 +this is a real command +;im;01;00;00;00;00;00;00;00 add 1 because we don't want to write the length +;+B +;IA address of data to write +;im;04;00;00;00;00;00;00;00 out file descriptor +;JA +;im;01;00;00;00;00;00;00;00 write +;sy -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 +-- skip to newline -- -;im;03;00;00;00;00;00;00;00 +;im;03;00;00;00;00;00;00;00 in fd ;JA ;im;88;00;40;00;00;00;00;00 ;IA -;im;01;00;00;00;00;00;00;00 +;im;01;00;00;00;00;00;00;00 read 1 byte ;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 +;im;88;00;40;00;00;00;00;00 +;BA +;zA;lb +;BA +;im;0a;00;00;00;00;00;00;00 '\n' +;cm;jn;cd;cd;cd;cd not a newline--keep looping +;jm;cd;cd;cd;cd go back to read next command + +unused padding +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +-- end of file -- --- skip to newline -- -read 1 byte into 0x400088 +lseek input fd back to start of file ;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;IA 0 offset +;DA 0 = SEEK_SET (start of file) +;im;08;00;00;00;00;00;00;00 lseek ;sy -;im;88;00;40;00;00;00;00;00 +lseek output fd back to start of file +;im;04;00;00;00;00;00;00;00 +;JA +;zA;IA 0 offset +;DA SEEK_SET +;im;08;00;00;00;00;00;00;00 lseek +;sy + +check if we're on the second pass +;im;a0;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 +;zA;lb +;DA okay store that in rdx for a sec +;im;01;00;00;00;00;00;00;00 +;sb set second pass to 1 -;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 +;BD +;zA +;cm;je;cd;cd;cd;cd not the second pass, jump back to do it --- end of file -- +okay we're done the second pass. let's exit nicely ;zA;JA exit code 0 ;im;3c;00;00;00;00;00;00;00 exit ;sy -;cc + +unused padding +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 +;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ; diff --git a/02/in02 b/02/in02 index 261279c..8860a95 100644 --- a/02/in02 +++ b/02/in02 @@ -1,22 +1,3 @@ -im d2 -JA -im :hw -IA -im d14 -DA -sy ::hw -'H -'e -'l -'l -'o -' -'w -'o -'r -'l -'d -'! -\n - +jm +--hw -- cgit v1.2.3