in theory, i just need to fill in offsets
This commit is contained in:
parent
447e8e2796
commit
53c8c9939d
2 changed files with 356 additions and 352 deletions
699
02/in01
699
02/in01
|
@ -1,20 +1,24 @@
|
||||||
|| ELF Header
|
|| 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
|
;'i;'n;'0;'2;00 (0x40007d) input filename
|
||||||
;'o;'u;'t;'0;'2;00 (0x400082) output 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
|
;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 (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;00;00;00;00;00 (0x4000a8) used for output
|
;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)
|
unused padding
|
||||||
;00;00;' 'b;'a;'d;' ;'n;'u;'m;'b;'e;'r;\n;00 (0x40009e)
|
;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
|
||||||
|
|
||||||
|
-- code starts here
|
||||||
|
|
||||||
;im;7d;00;40;00;00;00;00;00 pointer to input filename
|
;im;7d;00;40;00;00;00;00;00 pointer to input filename
|
||||||
;JA
|
;JA
|
||||||
;zA O_RDONLY
|
;zA O_RDONLY
|
||||||
;IA
|
;IA
|
||||||
;im;02;00;00;00;00;00;00;00 syscall 2, open
|
;im;02;00;00;00;00;00;00;00 open
|
||||||
;sy
|
;sy
|
||||||
|
|
||||||
;im;82;00;40;00;00;00;00;00 pointer to output filename
|
;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
|
;im;02;00;00;00;00;00;00;00 open
|
||||||
;sy
|
;sy
|
||||||
|
|
||||||
|
|
||||||
begin by writing the elf header.
|
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
|
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
|
;im;04;00;00;00;00;00;00;00 out fd
|
||||||
|
@ -49,48 +54,245 @@ the segment we're loading in includes the ELF header at address 0x400000, so we
|
||||||
|
|
||||||
;BA
|
;BA
|
||||||
;im;02;00;00;00;00;00;00;00
|
;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
|
;im;88;00;40;00;00;00;00;00
|
||||||
;BA
|
;BA
|
||||||
;zA;lb
|
;zA;lb
|
||||||
;<I;07
|
;<I;0a we want the offset, not the index, so we're left shifting by 7+3 = 10
|
||||||
;CA
|
;DA
|
||||||
|
|
||||||
|
look at second byte of command
|
||||||
;im;89;00;40;00;00;00;00;00
|
;im;89;00;40;00;00;00;00;00
|
||||||
;BA
|
;BA
|
||||||
;zA;lb
|
;zA;lb
|
||||||
;BC
|
;<I;03 each entry is 8 bytes, so left shift by 3
|
||||||
;+B
|
;BD
|
||||||
;RA store it away in rbp
|
;|B
|
||||||
|
|
||||||
;BA
|
;BA
|
||||||
|
rbx now contains the command offset
|
||||||
|
;im;d0;e9;00;00;00;00;00;00 ':' << 10 | ':' << 3
|
||||||
|
;cm;jn;cd;cd;cd;cd
|
||||||
|
|
||||||
let's check if it's a label definition
|
it's a label definition
|
||||||
;im;3a;1d;00;00;00;00;00;00
|
read the label name:
|
||||||
;cm
|
;im;03;00;00;00;00;00;00;00 input fd
|
||||||
;jn;cd;cd;cd;cd skip label definition handling code
|
|
||||||
|
|
||||||
it's a label definition. first, let's get the position in the file.
|
|
||||||
we can do this with the lseek syscall.
|
|
||||||
it can be used to move to a different point in the file, but it can also be
|
|
||||||
used to get the current file offset, in bytes
|
|
||||||
;im;04;00;00;00;00;00;00;00 fd
|
|
||||||
;JA
|
;JA
|
||||||
;zA;IA don't move
|
;im;88;00;40;00;00;00;00;00
|
||||||
;im;01;00;00;00;00;00;00;00 SEEK_CUR (use the current position)
|
;IA
|
||||||
|
;im;02;00;00;00;00;00;00;00 2 bytes
|
||||||
|
;DA
|
||||||
|
;zA read
|
||||||
|
;sy
|
||||||
|
|
||||||
|
now call lseek to figure out where in the file we are
|
||||||
|
;im;04;00;00;00;00;00;00;00 fd (of output)
|
||||||
|
;JA
|
||||||
|
;zA;IA offset = 0
|
||||||
|
;im;01;00;00;00;00;00;00;00 1 = SEEK_CUR (stay in current location)
|
||||||
|
;DA
|
||||||
|
;im;08;00;00;00;00;00;00;00 lseek
|
||||||
|
;sy
|
||||||
|
file offset now in rax
|
||||||
|
|
||||||
|
;BA
|
||||||
|
;im;00;00;40;00;00;00;00;00 address of start of file
|
||||||
|
;+B
|
||||||
|
address now in rax
|
||||||
|
;CA store it away in rcx
|
||||||
|
|
||||||
|
look at first byte of label
|
||||||
|
;im;88;00;40;00;00;00;00;00
|
||||||
|
;BA
|
||||||
|
;zA;lb
|
||||||
|
;<I;09 shift left by 9 instead of 7 since each entry takes up 4 bytes
|
||||||
|
;DA
|
||||||
|
|
||||||
|
look at second byte of label
|
||||||
|
;im;89;00;40;00;00;00;00;00
|
||||||
|
;BA
|
||||||
|
;zA;lb
|
||||||
|
;<I;02 each entry takes up 4 bytes
|
||||||
|
;BD
|
||||||
|
;|B
|
||||||
|
|
||||||
|
|
||||||
|
find location in label table
|
||||||
|
;BA
|
||||||
|
;im;cd;cd;cd;cd;cd;cd;cd;cd
|
||||||
|
;+B
|
||||||
|
;BA
|
||||||
|
;AC
|
||||||
|
;sd store the address there
|
||||||
|
|
||||||
|
;jm;cd;cd;cd;cd skip to newline
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
it's not a label definition. let's check if it's a number
|
||||||
|
;im;18;8d;00;00;00;00;00;00 '#' << 10 | '#' << 3
|
||||||
|
;cm;jn;cd;cd;cd;cd
|
||||||
|
|
||||||
|
it's a hex number
|
||||||
|
let's read it one byte at a time, storing the full number in RBP
|
||||||
|
|
||||||
|
;zA;RA
|
||||||
|
|
||||||
|
;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 1 byte
|
||||||
|
;DA
|
||||||
|
;zA read
|
||||||
|
;sy
|
||||||
|
|
||||||
|
;im;88;00;40;00;00;00;00;00
|
||||||
|
;zA;lb
|
||||||
|
;BA
|
||||||
|
;im;30;00;00;00;00;00;00;00
|
||||||
|
;cm;jl;cd;cd;cd;cd not 0-9
|
||||||
|
;im;39;00;00;00;00;00;00;00
|
||||||
|
;cm;jg;cd;cd;cd;cd not 0-9
|
||||||
|
|
||||||
|
okay it's 0-9
|
||||||
|
;im;d0;ff;ff;ff;ff;ff;ff;ff
|
||||||
|
;jm;cd;cd;cd;cd
|
||||||
|
|
||||||
|
;00;00;00;00;00;00;00;00;00;00;00;00 padding
|
||||||
|
|
||||||
|
;im;61;00;00;00;00;00;00;00
|
||||||
|
;cm;jl;cd;cd;cd;cd not a-f--end loop
|
||||||
|
;im;66;00;00;00;00;00;00;00
|
||||||
|
;cm;jg;cd;cd;cd;cd not a-f--end loop
|
||||||
|
|
||||||
|
;im;a9;ff;ff;ff;ff;ff;ff;ff
|
||||||
|
|
||||||
|
;+B
|
||||||
|
okay we now have a digit in RBX
|
||||||
|
;AR
|
||||||
|
;<I;04
|
||||||
|
;+B
|
||||||
|
;RA store away in RBP
|
||||||
|
;jm;cd;cd;cd;cd continue loop
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
okay we have a full number in RBP, time to write it to the file
|
||||||
|
start by putting it at address 0x4000a8
|
||||||
|
;im;a8;00;40;00;00;00;00;00
|
||||||
|
;BA
|
||||||
|
;AR
|
||||||
|
;sq
|
||||||
|
|
||||||
|
now write
|
||||||
|
|
||||||
|
;im;04;00;00;00;00;00;00;00 output file descriptor
|
||||||
|
;JA
|
||||||
|
;im;a8;00;40;00;00;00;00;00 address to write from
|
||||||
|
;IA
|
||||||
|
;im;08;00;00;00;00;00;00;00 write 8 bytes
|
||||||
|
;DA
|
||||||
|
;im;01;00;00;00;00;00;00;00 write
|
||||||
|
;sy
|
||||||
|
|
||||||
|
;jm;cd;cd;cd;cd skip to newline
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
it's not an immediate. let's check if it's a label
|
||||||
|
;im;68;b5;00;00;00;00;00;00 '-' << 10 | '-' << 3
|
||||||
|
;cm;jn;cd;cd;cd;cd
|
||||||
|
|
||||||
|
absolute label
|
||||||
|
|
||||||
|
it's a label
|
||||||
|
read the label name.
|
||||||
|
|
||||||
|
;im;03;00;00;00;00;00;00;00
|
||||||
|
;JA
|
||||||
|
;im;88;00;40;00;00;00;00;00
|
||||||
|
;IA
|
||||||
|
;im;02;00;00;00;00;00;00;00
|
||||||
|
;DA
|
||||||
|
;zA
|
||||||
|
;sy
|
||||||
|
|
||||||
|
convert bytes to an offset
|
||||||
|
;im;88;00;40;00;00;00;00;00
|
||||||
|
;BA
|
||||||
|
;zA;lb
|
||||||
|
;<I;09;CA
|
||||||
|
|
||||||
|
;im;89;00;40;00;00;00;00;00
|
||||||
|
;BA
|
||||||
|
;zA;lb
|
||||||
|
;<I;02
|
||||||
|
;BC
|
||||||
|
;|B
|
||||||
|
;BA
|
||||||
|
offset in rbx
|
||||||
|
|
||||||
|
look in the label table
|
||||||
|
;im;cd;cd;cd;cd;cd;cd;cd;cd
|
||||||
|
;+B
|
||||||
|
;BA
|
||||||
|
;lq
|
||||||
|
rax has the address to write.
|
||||||
|
we can just store it in rbp:
|
||||||
|
;RA
|
||||||
|
then jump to the place where we wrote immediates.
|
||||||
|
;jm;cd;cd;cd;cd
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
;im;68;e9;00;00;00;00;00;00 ':' << 10 | '-' << 3
|
||||||
|
;cm;jn;cd;cd;cd;cd
|
||||||
|
|
||||||
|
relative label
|
||||||
|
|
||||||
|
get current file offset
|
||||||
|
;im;04;00;00;00;00;00;00;00 fd (of output)
|
||||||
|
;JA
|
||||||
|
;zA;IA offset = 0
|
||||||
|
;im;01;00;00;00;00;00;00;00 1 = SEEK_CUR (stay in current location)
|
||||||
;DA
|
;DA
|
||||||
;im;08;00;00;00;00;00;00;00 lseek
|
;im;08;00;00;00;00;00;00;00 lseek
|
||||||
;sy
|
;sy
|
||||||
|
|
||||||
our offset is now in rax. let's add the base address,
|
|
||||||
then store the label address away in rbp
|
|
||||||
;BA
|
;BA
|
||||||
;im;00;00;40;00;00;00;00;00
|
;im;04;00;40;00;00;00;00;00
|
||||||
;+B
|
;+B add 0x400004 to file offset to get address after writing relative address
|
||||||
;RA
|
;RA store away in rbp
|
||||||
|
|
||||||
read 2-byte label name
|
read the label name.
|
||||||
;im;03;00;00;00;00;00;00;00 input fd
|
;im;03;00;00;00;00;00;00;00
|
||||||
;JA
|
;JA
|
||||||
;im;88;00;40;00;00;00;00;00
|
;im;88;00;40;00;00;00;00;00
|
||||||
;IA
|
;IA
|
||||||
|
@ -99,347 +301,168 @@ read 2-byte label name
|
||||||
;zA
|
;zA
|
||||||
;sy
|
;sy
|
||||||
|
|
||||||
get the address of the entry in the label table
|
convert bytes to an offset
|
||||||
;im;88;00;40;00;00;00;00;00
|
;im;88;00;40;00;00;00;00;00
|
||||||
;BA
|
;BA
|
||||||
;zA;lb
|
;zA;lb
|
||||||
;<I;07
|
;<I;09;CA
|
||||||
;CA
|
|
||||||
;im;89;00;40;00;00;00;00;00
|
;im;89;00;40;00;00;00;00;00
|
||||||
;BA
|
;BA
|
||||||
;zA;lb
|
;zA;lb
|
||||||
|
;<I;02
|
||||||
;BC
|
;BC
|
||||||
|
;|B
|
||||||
|
;BA
|
||||||
|
offset in rbx
|
||||||
|
|
||||||
|
look in the label table
|
||||||
|
;im;cd;cd;cd;cd;cd;cd;cd;cd
|
||||||
;+B
|
;+B
|
||||||
;BA
|
;BA
|
||||||
;im;00;00;43;00;00;00;00;00 label table offset = 0x430000
|
|
||||||
;+B
|
|
||||||
|
|
||||||
okay now let's write the current address there
|
|
||||||
;BA
|
|
||||||
;AR
|
|
||||||
;sq
|
|
||||||
|
|
||||||
;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
|
|
||||||
|
|
||||||
;jm;cd;cd;cd;cd skip to newline
|
|
||||||
|
|
||||||
|
|
||||||
okay it's not a label definition. let's look at the command table
|
|
||||||
;AB
|
|
||||||
;<I;03
|
|
||||||
;BA
|
|
||||||
;im;00;00;41;00;00;00;00;00 command table offset = 0x410000
|
|
||||||
;+B
|
|
||||||
;BA
|
|
||||||
;zA;lb
|
|
||||||
check if there's anything there
|
|
||||||
;te
|
|
||||||
;jn;cd;cd;cd;cd
|
|
||||||
|
|
||||||
okay there's nothing there. that's not good. let's print our error message.
|
|
||||||
;im;02;00;00;00;00;00;00;00 stderr
|
|
||||||
;JA
|
|
||||||
;im;88;00;40;00;00;00;00;00 error message
|
|
||||||
;IA
|
|
||||||
;im;12;00;00;00;00;00;00;00 length
|
|
||||||
;DA
|
|
||||||
;im;01;00;00;00;00;00;00;00 write
|
|
||||||
;sy
|
|
||||||
|
|
||||||
|
|
||||||
okay there *is* something here.
|
|
||||||
;DA
|
|
||||||
;im;01;00;00;00;00;00;00;00 add 1 to address to skip over length
|
|
||||||
;+B
|
|
||||||
;IA
|
|
||||||
;im;04;00;00;00;00;00;00;00 fd
|
|
||||||
;JA
|
|
||||||
;im;01;00;00;00;00;00;00;00 write
|
|
||||||
;sy
|
|
||||||
|
|
||||||
now let's check if it's a special instruction, i.e. im or a jump instruction
|
|
||||||
;BR
|
|
||||||
;im;ed;34;00;00;00;00;00;00
|
|
||||||
;cm
|
|
||||||
;jn;cd;cd;cd;cd jump over "im" handling code
|
|
||||||
|
|
||||||
read two bytes:
|
|
||||||
;im;03;00;00;00;00;00;00;00
|
|
||||||
;JA
|
|
||||||
;im;9e;00;40;00;00;00;00;00
|
|
||||||
;IA
|
|
||||||
;im;02;00;00;00;00;00;00;00
|
|
||||||
;DA
|
|
||||||
;zA
|
|
||||||
;sy
|
|
||||||
|
|
||||||
now look at the second byte (the first one should be a space):
|
|
||||||
;im;9f;00;40;00;00;00;00;00
|
|
||||||
;BA
|
|
||||||
;zA
|
|
||||||
;lb
|
|
||||||
;BA
|
|
||||||
;im;3a;00;00;00;00;00;00;00
|
|
||||||
;cm
|
|
||||||
;jn;cd;cd;cd;cd
|
|
||||||
|
|
||||||
It's a :. Let's look at the label.
|
|
||||||
Read 2 bytes.
|
|
||||||
|
|
||||||
;im;03;00;00;00;00;00;00;00
|
|
||||||
;JA
|
|
||||||
;im;90;00;40;00;00;00;00;00
|
|
||||||
;IA
|
|
||||||
;im;02;00;00;00;00;00;00;00
|
|
||||||
;DA
|
|
||||||
;zA
|
|
||||||
;sy
|
|
||||||
|
|
||||||
Now find the entry in the label table.
|
|
||||||
|
|
||||||
;im;90;00;40;00;00;00;00;00
|
|
||||||
;BA
|
|
||||||
;zA;lb
|
|
||||||
;<I;07
|
|
||||||
;CA
|
|
||||||
;im;91;00;40;00;00;00;00;00
|
|
||||||
;BA
|
|
||||||
;zA;lb
|
|
||||||
;BC
|
|
||||||
;+B
|
|
||||||
;<I;03
|
|
||||||
;BA
|
|
||||||
;im;00;00;43;00;00;00;00;00 Offset of label table = 0x430000
|
|
||||||
;+B
|
|
||||||
;BA
|
|
||||||
;zA
|
|
||||||
;lq
|
;lq
|
||||||
;te check if there's anything there
|
|
||||||
;jn;cd;cd;cd;cd
|
|
||||||
|
|
||||||
oh no there's nothing there
|
|
||||||
;im;02;00;00;00;00;00;00;00 stderr
|
|
||||||
;JA
|
|
||||||
;im;90;00;40;00;00;00;00;00 bad label error message
|
|
||||||
;IA
|
|
||||||
;im;0a;00;00;00;00;00;00;00 length
|
|
||||||
;DA
|
|
||||||
;im;01;00;00;00;00;00;00;00 write
|
|
||||||
;sy
|
|
||||||
;im;01;00;00;00;00;00;00;00 exit code
|
|
||||||
;JA
|
|
||||||
;im;3c;00;00;00;00;00;00;00 exit
|
|
||||||
;sy
|
|
||||||
|
|
||||||
|
|
||||||
okay let's output what's at that label
|
|
||||||
;BA
|
;BA
|
||||||
;im;a8;00;40;00;00;00;00;00
|
subtract current address
|
||||||
;xc
|
|
||||||
;sq
|
|
||||||
;IB pointer to data
|
|
||||||
;im;04;00;00;00;00;00;00;00 file descriptor
|
|
||||||
;JA
|
|
||||||
;im;08;00;00;00;00;00;00;00 length
|
|
||||||
;DA
|
|
||||||
;im;01;00;00;00;00;00;00;00 write
|
|
||||||
;sy
|
|
||||||
|
|
||||||
;jm;cd;cd;cd;cd skip to newline
|
|
||||||
|
|
||||||
okay it's not a label
|
|
||||||
let's check if it's hexadecimal
|
|
||||||
;im;78;00;00;00;00;00;00;00 ascii 'x'
|
|
||||||
;cm
|
|
||||||
;jne;cd;cd;cd;cd
|
|
||||||
|
|
||||||
it's hexadecimal. we'll use rcx to store the number
|
|
||||||
;zA;CA
|
|
||||||
;im;03;00;00;00;00;00;00;00 input fd
|
|
||||||
;JA
|
|
||||||
;im;88;00;40;00;00;00;00;00
|
|
||||||
;IA
|
|
||||||
;im;01;00;00;00;00;00;00;00 read 1 byte at a time
|
|
||||||
;DA
|
|
||||||
;zA read
|
|
||||||
;sy
|
|
||||||
|
|
||||||
;im;88;00;40;00;00;00;00;00
|
|
||||||
;BA
|
|
||||||
;zA;lb
|
|
||||||
;BA
|
|
||||||
;im;30;00;00;00;00;00;00;00
|
|
||||||
;jl;cd;cd;cd;cd end of number
|
|
||||||
;im;39;00;00;00;00;00;00;00
|
|
||||||
;jg;cd;cd;cd;cd end of number
|
|
||||||
|
|
||||||
okay it's one of 0-9
|
|
||||||
;im;d0;ff;ff;ff;ff;ff;ff;ff
|
|
||||||
;+B
|
|
||||||
;BA
|
|
||||||
;AC
|
|
||||||
;<I;04
|
|
||||||
;+B
|
|
||||||
;CA
|
|
||||||
;jm;cd;cd;cd;cd jump back to read the next digit
|
|
||||||
|
|
||||||
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding
|
|
||||||
|
|
||||||
check if it's a-f
|
|
||||||
;im;61;00;00;00;00;00;00;00
|
|
||||||
;jl;cd;cd;cd;cd end of number
|
|
||||||
;im;66;00;00;00;00;00;00;00
|
|
||||||
;jg;cd;cd;cd;cd end of number
|
|
||||||
|
|
||||||
okay it is
|
|
||||||
;im;a9;ff;ff;ff;ff;ff;ff;ff
|
|
||||||
;+B
|
|
||||||
;BA
|
|
||||||
;AC
|
|
||||||
;<I;04
|
|
||||||
;+B
|
|
||||||
;CA
|
|
||||||
;jm;cd;cd;cd;cd jump back to read the next digit
|
|
||||||
|
|
||||||
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding
|
|
||||||
|
|
||||||
it's not hexadecimal, let's check if it's decimal
|
|
||||||
;im;64;00;00;00;00;00;00;00
|
|
||||||
;cm
|
|
||||||
;jne;cd;cd;cd;cd bad number
|
|
||||||
|
|
||||||
|
|
||||||
it's decimal. we'll use rcx to store the number
|
|
||||||
;zA;CA
|
|
||||||
;im;03;00;00;00;00;00;00;00 input fd
|
|
||||||
;JA
|
|
||||||
;im;88;00;40;00;00;00;00;00
|
|
||||||
;IA
|
|
||||||
;im;01;00;00;00;00;00;00;00 read 1 byte at a time
|
|
||||||
;DA
|
|
||||||
;zA read
|
|
||||||
;sy
|
|
||||||
|
|
||||||
;im;88;00;40;00;00;00;00;00
|
|
||||||
;BA
|
|
||||||
;zA;lb
|
|
||||||
;BA
|
|
||||||
|
|
||||||
check if it's 0-9
|
|
||||||
;im;30;00;00;00;00;00;00;00
|
|
||||||
;jl;cd;cd;cd;cd end of number
|
|
||||||
;im;39;00;00;00;00;00;00;00
|
|
||||||
;jg;cd;cd;cd;cd end of number
|
|
||||||
|
|
||||||
okay it is
|
|
||||||
;im;d0;ff;ff;ff;ff;ff;ff;ff
|
|
||||||
;+B
|
|
||||||
;DA store digit away in rdx
|
|
||||||
;im;0a;00;00;00;00;00;00;00
|
|
||||||
;BC
|
|
||||||
;+*
|
|
||||||
;BD return digit to rbx
|
|
||||||
;+B
|
|
||||||
;CA
|
|
||||||
;jm;cd;cd;cd;cd next digit
|
|
||||||
|
|
||||||
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding
|
|
||||||
|
|
||||||
|
|
||||||
--- end of number ---
|
|
||||||
the number will be in rcx
|
|
||||||
;im;a8;00;40;00;00;00;00;00 this is where we'll put the number
|
|
||||||
;BA
|
|
||||||
;AC
|
|
||||||
;sq
|
|
||||||
|
|
||||||
now write it to the file
|
|
||||||
;im;04;00;00;00;00;00;00;00
|
|
||||||
;JA
|
|
||||||
;im;a8;00;40;00;00;00;00;00
|
|
||||||
;IA
|
|
||||||
;im;08;00;00;00;00;00;00;00
|
|
||||||
;DA
|
|
||||||
;im;01;00;00;00;00;00;00;00
|
|
||||||
;sy
|
|
||||||
|
|
||||||
;jm;cd;cd;cd;cd skip to newline
|
|
||||||
|
|
||||||
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding
|
|
||||||
|
|
||||||
|
|
||||||
--- bad number ---
|
|
||||||
;im;02;00;00;00;00;00;00;00 stderr
|
|
||||||
;JA
|
|
||||||
;im;9e;00;40;00;00;00;00;00 bad number error message
|
|
||||||
;IA
|
|
||||||
;im;0b;00;00;00;00;00;00;00 length
|
|
||||||
;DA
|
|
||||||
;im;01;00;00;00;00;00;00;00 write
|
|
||||||
;sy
|
|
||||||
;im;01;00;00;00;00;00;00;00 exit code
|
|
||||||
;JA
|
|
||||||
;im;3c;00;00;00;00;00;00;00 exit
|
|
||||||
;sy
|
|
||||||
|
|
||||||
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding
|
|
||||||
|
|
||||||
okay it's not an im instruction. let's check if it's a jump instruction
|
|
||||||
;AR
|
;AR
|
||||||
;>I;07
|
;nA;+B
|
||||||
|
|
||||||
|
now we want to write eax to the output file.
|
||||||
|
start by putting it at address 0x4000a8
|
||||||
|
;im;a8;00;40;00;00;00;00;00
|
||||||
;BA
|
;BA
|
||||||
;im;6a;00;00;00;00;00;00;00
|
;AR
|
||||||
;cm
|
;sd
|
||||||
;jn;cd;cd;cd;cd skip to newline
|
|
||||||
|
|
||||||
it is a jump instruction. let's read in the label and write it to--
|
now write
|
||||||
wait a minute! this is just like our immediate label code. let's just
|
;im;04;00;00;00;00;00;00;00 output file descriptor
|
||||||
read the space between the command and the label, and then jump there
|
|
||||||
|
|
||||||
;im;03;00;00;00;00;00;00;00
|
|
||||||
;JA
|
;JA
|
||||||
;im;88;00;40;00;00;00;00;00
|
;im;a8;00;40;00;00;00;00;00 address to write from
|
||||||
;IA
|
;IA
|
||||||
;im;01;00;00;00;00;00;00;00
|
;im;04;00;00;00;00;00;00;00 4 bytes
|
||||||
;DA
|
;DA
|
||||||
;zA
|
;im;01;00;00;00;00;00;00;00 write
|
||||||
;sy
|
;sy
|
||||||
|
|
||||||
;jm;cd;cd;cd;cd
|
;jm;cd;cd;cd;cd skip to newline
|
||||||
|
|
||||||
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 unused padding
|
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
|
||||||
|
;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
|
||||||
|
;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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
it's not a label or a number. let's look it up in the instruction table.
|
||||||
|
;im;cd;cd;cd;cd;cd;cd;cd;cd start of instruction table
|
||||||
|
;+B
|
||||||
|
;BA
|
||||||
|
;zA;lb
|
||||||
|
;DA number of bytes to write (used for syscall if no error)
|
||||||
|
;BA
|
||||||
|
;zA
|
||||||
|
;cm;jn;cd;cd;cd;cd check if # of bytes is 0, if not, skip outputting error
|
||||||
|
|
||||||
|
bad command!
|
||||||
|
;im;02;00;00;00;00;00;00;00 stderr
|
||||||
|
;JA
|
||||||
|
;im;88;00;40;00;00;00;00;00 address to write from
|
||||||
|
;IA
|
||||||
|
;im;12;00;00;00;00;00;00;00 write 18 bytes
|
||||||
|
;DA
|
||||||
|
;im;01;00;00;00;00;00;00;00 write
|
||||||
|
;sy
|
||||||
|
;cc easy exit (trace trap)
|
||||||
|
|
||||||
|
;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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
-- skip to newline --
|
-- skip to newline --
|
||||||
read 1 byte into 0x400088
|
|
||||||
;im;03;00;00;00;00;00;00;00
|
;im;03;00;00;00;00;00;00;00 in fd
|
||||||
;JA
|
;JA
|
||||||
;im;88;00;40;00;00;00;00;00
|
;im;88;00;40;00;00;00;00;00
|
||||||
;IA
|
;IA
|
||||||
;im;01;00;00;00;00;00;00;00
|
;im;01;00;00;00;00;00;00;00 read 1 byte
|
||||||
;DA
|
;DA
|
||||||
|
;zA
|
||||||
;sy
|
;sy
|
||||||
|
|
||||||
;im;88;00;40;00;00;00;00;00
|
;im;88;00;40;00;00;00;00;00
|
||||||
;BA
|
;BA
|
||||||
;zA;lb;BA
|
;zA;lb
|
||||||
;im;0a;00;00;00;00;00;00;00
|
;BA
|
||||||
;cm
|
;im;0a;00;00;00;00;00;00;00 '\n'
|
||||||
;jn;cd;cd;cd;cd go back to the start of "skip to newline"
|
;cm;jn;cd;cd;cd;cd not a newline--keep looping
|
||||||
;jm;cd;cd;cd;cd go all the way back and read the next two-byte command
|
;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 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 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 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 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
|
||||||
|
|
||||||
-- end of file --
|
-- end of file --
|
||||||
|
|
||||||
|
lseek input fd back to start of file
|
||||||
|
;im;03;00;00;00;00;00;00;00
|
||||||
|
;JA
|
||||||
|
;zA;IA 0 offset
|
||||||
|
;DA 0 = SEEK_SET (start of file)
|
||||||
|
;im;08;00;00;00;00;00;00;00 lseek
|
||||||
|
;sy
|
||||||
|
|
||||||
|
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
|
||||||
|
;DA okay store that in rdx for a sec
|
||||||
|
|
||||||
|
;im;01;00;00;00;00;00;00;00
|
||||||
|
;sb set second pass to 1
|
||||||
|
|
||||||
|
;BD
|
||||||
|
;zA
|
||||||
|
;cm;je;cd;cd;cd;cd not the second pass, jump back to do it
|
||||||
|
|
||||||
|
okay we're done the second pass. let's exit nicely
|
||||||
;zA;JA exit code 0
|
;zA;JA exit code 0
|
||||||
;im;3c;00;00;00;00;00;00;00 exit
|
;im;3c;00;00;00;00;00;00;00 exit
|
||||||
;sy
|
;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
|
||||||
;
|
;
|
||||||
|
|
23
02/in02
23
02/in02
|
@ -1,22 +1,3 @@
|
||||||
im d2
|
|
||||||
JA
|
|
||||||
im :hw
|
|
||||||
IA
|
|
||||||
im d14
|
|
||||||
DA
|
|
||||||
sy
|
|
||||||
::hw
|
::hw
|
||||||
'H
|
jm
|
||||||
'e
|
--hw
|
||||||
'l
|
|
||||||
'l
|
|
||||||
'o
|
|
||||||
'
|
|
||||||
'w
|
|
||||||
'o
|
|
||||||
'r
|
|
||||||
'l
|
|
||||||
'd
|
|
||||||
'!
|
|
||||||
\n
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue