|| 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 ;