Browse Source

Bug fixes

* [#6] Fix the figure `far_jmp_ex.svg` in chapter 4, where the segment and the offset in memory are reversed.
* [#7] Fix example 5.3.1: change NULL section to .interp section.
* [#8] Fix command output to reflect the source code.
* [#9] abort(), not .abort(). A function call, not a section.
* [#10] Use `__FUNCTION__` for consistency.
* [#11] Fix incorrect filename.
* [#12] Fix confusing sentence.
tags/0.0.1
Tu Do 3 years ago
parent
commit
d6e9cca5e6

+ 9
- 0
CHANGELOG.md View File

@@ -0,0 +1,9 @@
## 0.0.1 (2017-02-15)

* [#6] Fix the figure `far_jmp_ex.svg` in chapter 4, where the segment and the offset in memory are reversed.
* [#7] Fix example 5.3.1: change NULL section to .interp section.
* [#8] Fix command output to reflect the source code.
* [#9] abort(), not .abort(). A function call, not a section.
* [#10] Use `__FUNCTION__` for consistency.
* [#11] Fix incorrect filename.
* [#12] Fix confusing sentence.

+ 120
- 124
Operating_System_From_0_to_1.pdf View File

@@ -2946,17 +2946,15 @@ location that eax points to, and CPU starts fetching code from the
new address in cs and eip. To make it more concrete, here is an
example:

eax 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
eax 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

0x1000 1000 78 56 00 00 34 12

cs jmp far [eax]

0x1234
0x00001000 1000 00 00 34 12 78 56

cs
0x00005678
jmp far [eax]
eip

0x5678
0x00001234

The far address consumes total of 6 bytes in size for a 16-bit segment Figure 4.7.1: far jmp example,
and 32-bit address, which is encoded as m16:32 from the table 4.7.1. with the destination memory
@@ -5251,30 +5249,30 @@ Link and Info are numbers that references the indexes of sections,
symbol table entries, hash table entries. Link field holds the index
122 operating system: from 0 to 1

of a section, while Info field holds an index of a section, a symbol
table entry or a hash table entry, depends on the type of a section.
of a section, while Info field holds an index of a section, a symbol
table entry or a hash table entry, depends on the type of a section.

Later when writing our OS, we will handcraft the kernel image
by explicitly linking the object files (produced by gcc) through
a linker script. We will specify the memory layout of sections by
specifying at what addresses they will appear in the final image.
But we will not assign any section flag and let the linker take care
of it. Nevertheless, knowing which flag does what is useful.
Later when writing our OS, we will handcraft the kernel image
by explicitly linking the object files (produced by gcc) through
a linker script. We will specify the memory layout of sections by
specifying at what addresses they will appear in the final image.
But we will not assign any section flag and let the linker take care
of it. Nevertheless, knowing which flag does what is useful.

Align is a value that enforces the offset of a section should be di-
visible by the value. Only 0 and positive integral powers of two
are allowed. Values 0 and 1 mean the section has no alignment
constraint.

Example 5.3.1. Output of NULL section:
Example 5.3.1. Output of .interp section:

Output [Nr] Name Type Address Offset
Output [Nr] Name Type Address Offset

Size EntSize Flags Link Info Align
Size EntSize Flags Link Info Align

[ 1] .interp PROGBITS 0000000000400238 00000238
[ 1] .interp PROGBITS 0000000000400238 00000238

000000000000001c 0000000000000000 A 001
000000000000001c 0000000000000000 A 001

Nr is 1.
Type is PROGBITS, which means this section is part of the program.
@@ -6004,7 +6002,8 @@ invoking it:

$ gcc -m32 hello.c -o hello
$ ./hello
constructor
init1
init2
hello world

Example 5.4.13. Optionally, a constructor can be assigned with a
@@ -6017,9 +6016,9 @@ priority:
#include <stdio.h>

__attribute__((constructor(102))) static void init1(){
printf("%s\n", __FUNCTION__);
the anatomy of a program 139

printf("%s\n", __FUNCTION__);
}

__attribute__((constructor(101))) static void init2(){
@@ -6061,49 +6060,48 @@ void init2() {
}
140 operating system: from 0 to 1

/* Without typedef, init is a definition of a function
pointer.
/* Without typedef, init is a definition of a function
pointer.

With typedef, init is a declaration of a type.*/
typedef void (*init)();
With typedef, init is a declaration of a type.*/
typedef void (*init)();

__attribute__((section(".init_array"))) init init_arr[2]
= {init1, init2};
__attribute__((section(".init_array"))) init init_arr[2]
= {init1, init2};

int main(int argc, char *argv[])
{
int main(int argc, char *argv[])
{

printf("hello␣world!\n");
printf("hello␣world!\n");

return 0;
}
return 0;
}

The attribute section(“...”) put a function into a particu-
lar section rather then the default .text. In this example, it is
.init_arary. Again, the program automatically calls the construc-
tors without explicitly invoking it:
The attribute section(“...”) put a function into a particu-
lar section rather then the default .text. In this example, it is
.init_arary. Again, the program automatically calls the construc-
tors without explicitly invoking it:

$ gcc -m32 hello.c -o hello
$ ./hello
init1
init2
hello world!
$ gcc -m32 hello.c -o hello
$ ./hello
init1
init2
hello world!

FINI_ARRAY is an array of function pointers for program termination,
called after exiting main(). If the application terminate abnormally,
such as through .abort() call or a crash, the .finit_array is
such as through abort() call or a crash, the .finit_array is
ignored.

Example 5.4.15. A destructor is automatically called after exiting
main(), if one or more available:

hello.c
hello.c
the anatomy of a program 141

#include <stdio.h>
the anatomy of a program 141

__attribute__((destructor)) static void destructor(){
printf("destructor\n");
printf("%s\n", __FUNCTION__);

}

@@ -6139,11 +6137,11 @@ void preinit2() {
printf("%s\n", __FUNCTION__);

}

void init1() {
142 operating system: from 0 to 1

void init1() {
printf("%s\n", __FUNCTION__);

}

void init2() {
@@ -6177,12 +6175,12 @@ void init1() {
hello world!

GROUP defines a section group, which is the same section that appears
in different object files but when merged into the final executable
binary file, only one copy is kept and the rest in other object files
the anatomy of a program 143

are discarded. This section is only relevant in C++ object files, so
we will not examine further.
in different object files but when merged into the final executable
binary file, only one copy is kept and the rest in other object files
are discarded. This section is only relevant in C++ object files, so
we will not examine further.

SYMTAB_SHNDX is a section containing extended section indexes, that
are associated with a symbol table. This section only appears
@@ -6208,21 +6206,20 @@ SYMTAB_SHNDX the specified symbol ta
The section header index of the provides a signature for the section
associated symbol table. group.

Exercise 5.4.1. Verify that the value of the Link field of a SYMTAB Table 5.4.3: The meannings
section is the index of a STRTAB section. of Link and Info depend on
section types. interpretation
Exercise 5.4.1. Verify that the value of the Link field of a SYMTAB Table 5.4.3: The meannings
section is the index of a STRTAB section. of Link and Info depend on
section types. interpretation
Exercise 5.4.2. Verify that the value of the Info field of a SYMTAB
section is the index of last local symbol + 1. It means, in the symbol
table, from the index listed by Info field onward, no local symbol
appears.
144 operating system: from 0 to 1

Exercise 5.4.3. Verify that the value of the Info field of a REL section
is the index of the SYMTAB section.
144 operating system: from 0 to 1

Exercise 5.4.4. Verify that the value of the Link field of a REL section
is the index of the section where relocation is applied. For example. if
the section is .rel.text, then the relocating section should be .text.
Exercise 5.4.3. Verify that the value of the Info field of a REL section
is the index of the SYMTAB section.
Exercise 5.4.4. Verify that the value of the Link field of a REL section
is the index of the section where relocation is applied. For example. if
the section is .rel.text, then the relocating section should be .text.

5.5 Program header table

@@ -6235,36 +6232,35 @@ the section is .rel.text, then the relocating section should be .text.
program, only use segments, not sections. To see the information of a
program header table, we use the -l option with readelf:

$ readelf -l <binary file>
$ readelf -l <binary file>

Similar to a section, a program header also has types: Table 5.5.1: Segment Permission
Permission Description
PHDR specifies the location and size of the program header table itself,
both in the file and in the memory image of the program R Readable
W Writable
INTERP specifies the location and size of a null-terminated path name E Executable
to invoke as an interpreter for linking runtime libraries.
Similar to a section, a program header also has types:

LOAD specifies a loadable segment. That is, this segment is loaded into
main memory.
PHDR specifies the location and size of the program header table itself,
both in the file and in the memory image of the program

DYNAMIC specifies dynamic linking information.
INTERP specifies the location and size of a null-terminated path name
to invoke as an interpreter for linking runtime libraries.

NOTE specifies the location and size of auxiliary information.
TLS specifies the Thread-Local Storage template, which is formed from
LOAD specifies a loadable segment. That is, this segment is loaded into
main memory.

the combination of all sections with the flag TLS.
DYNAMIC specifies dynamic linking information.
NOTE specifies the location and size of auxiliary information.
TLS specifies the Thread-Local Storage template, which is formed from

GNU_STACK indicates whether the program’s stack should be made
executable or not. Linux kernel uses this type.
the combination of all sections with the flag TLS.
GNU_STACK indicates whether the program’s stack should be made

A segment also has permission, which is a combination of these 3
values:
executable or not. Linux kernel uses this type.
the anatomy of a program 145

£ Read (R)
£ Write (W)
£ Execute (E)
A segment also has permission, which is a combination of these 3 Table 5.5.1: Segment Permission
values: Permission Description

£ Read (R) R Readable
£ Write (W) W Writable
£ Execute (E) E Executable

Example 5.5.1. The command to get the program header table:

@@ -6311,13 +6307,13 @@ Output Elf file type is EXEC (Executable file)
0x0000000000000044 0x0000000000000044 R 4

GNU_EH_FRAME 0x00000000000005e4 0x00000000004005e4 0x00000000004005e4
146 operating system: from 0 to 1

0x0000000000000034 0x0000000000000034 R 4
0x0000000000000034 0x0000000000000034 R 4

GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000

0x0000000000000000 0x0000000000000000 RW 10
146 operating system: from 0 to 1
0x0000000000000000 0x0000000000000000 RW 10

GNU_RELRO 0x0000000000000e10 0x0000000000600e10 0x0000000000600e10

@@ -6369,10 +6365,10 @@ Output LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
segment. It means that this segment can be read and written
to, but is not allowed to be used as executable code, for security
reason.

Then, LOAD contains the following sections:
the anatomy of a program 147

Then, LOAD contains the following sections:

Output 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr
.gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini
.rodata .eh_frame_hdr .eh_frame
@@ -6407,9 +6403,10 @@ Output 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynst

£ By grouping sections into a segment, it is easier for an operating
system to batch load sections just once by loading the start and end
of a segment, instead of loading section by section.
148 operating system: from 0 to 1

of a segment, instead of loading section by section.

£ Since a segment is for loading a program and a section is for linking
a program, all the sections in a segment is within its start and end
virtual memory addresses of a segment.
@@ -6428,7 +6425,9 @@ Output 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynst
return 0;
}

and: math.c
and:

math.c

int add(int a, int b) {
return a + b;
@@ -6437,23 +6436,23 @@ Output 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynst

Now, compile the two source files as object files:

$ gcc -m32 -c lib.c
$ gcc -m32 -c math.c
$ gcc -m32 -c hello.c

Then, we check the sections of both files:
Then, we check the sections of math.o:

$ readelf -S math.o

Output There are 11 section headers, starting at offset 0x1a8:
Output There are 11 section headers, starting at offset 0x1a8:

Section Headers:
Section Headers:

[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
the anatomy of a program 149

[ 0] NULL 00000000 000000 000000 00 0 00
[ 0] NULL 00000000 000000 000000 00 0 00

[ 1] .text PROGBITS 00000000 000034 00000d 00 AX 0 0 1
the anatomy of a program 149
[ 1] .text PROGBITS 00000000 000034 00000d 00 AX 0 0 1

[ 2] .data PROGBITS 00000000 000041 000000 00 WA 0 0 1

@@ -6483,9 +6482,11 @@ Output There are 11 section headers, starting at offset 0x1a8:

As shown in the output, all the section virtual memory addresses
of every section are set to 0. At this stage, each object file is simply a
block of binary that contains code and data. Its existence is to server
block of binary that contains code and data. Its existence is to serve
as a material container for the final product, which is the executable
binary. No segment exists at this stage:
binary. As such, the virtual addresses in hello.o are all zeroes.

No segment exists at this stage:

$ readelf -l math.o
There are no program headers in this file.
@@ -6505,13 +6506,13 @@ Output There are 13 section headers, starting at offset 0x224:
[ 2] .rel.text REL 00000000 0001ac 000010 08 I 11 1 4

[ 3] .data PROGBITS 00000000 000062 000000 00 WA 0 0 1
150 operating system: from 0 to 1

[ 4] .bss NOBITS 00000000 000062 000000 00 WA 0 0 1
[ 4] .bss NOBITS 00000000 000062 000000 00 WA 0 0 1

[ 5] .rodata PROGBITS 00000000 000062 00000c 00 A 0 0 1
[ 5] .rodata PROGBITS 00000000 000062 00000c 00 A 0 0 1

[ 6] .comment PROGBITS 00000000 00006e 000035 01 MS 0 0 1
150 operating system: from 0 to 1
[ 6] .comment PROGBITS 00000000 00006e 000035 01 MS 0 0 1

[ 7] .note.GNU-stack PROGBITS 00000000 0000a3 000000 00 0 01

@@ -6561,13 +6562,13 @@ Output There are 31 section headers, starting at offset 0x1804:
[ 5] .dynsym DYNSYM 080481cc 0001cc 000050 10 A 6 1 4

[ 6] .dynstr STRTAB 0804821c 00021c 00004a 00 A 0 0 1
the anatomy of a program 151

[ 7] .gnu.version VERSYM 08048266 000266 00000a 02 A 5 0 2
[ 7] .gnu.version VERSYM 08048266 000266 00000a 02 A 5 0 2

[ 8] .gnu.version_r VERNEED 08048270 000270 000020 00 A 6 1 4
[ 8] .gnu.version_r VERNEED 08048270 000270 000020 00 A 6 1 4

[ 9] .rel.dyn REL 08048290 000290 000008 08 A 5 0 4
the anatomy of a program 151
[ 9] .rel.dyn REL 08048290 000290 000008 08 A 5 0 4

[10] .rel.plt REL 08048298 000298 000010 08 AI 5 24 4

@@ -6605,11 +6606,11 @@ Output There are 31 section headers, starting at offset 0x1804:

[27] .comment PROGBITS 00000000 00101c 000034 01 MS 0 0 1

[28] .shstrtab STRTAB 00000000 0016f8 00010a 00 0 01
[28] .shstrtab STRTAB 00000000 0016f8 00010a 00 0 01

[29] .symtab SYMTAB 00000000 001050 000470 10 30 48 4
[29] .symtab SYMTAB 00000000 001050 000470 10 30 48 4

[30] .strtab STRTAB 00000000 0014c0 000238 00 0 01
[30] .strtab STRTAB 00000000 0014c0 000238 00 0 01

Key to Flags:

@@ -6619,18 +6620,16 @@ I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)

O (extra OS processing required) o (OS specific), p (processor specific)

Every loadable section is assigned an address, highlighted in green.
Every loadable section is assigned an address, highlighted in green.
The reason each section got its own address is that in reality, gcc
does not combine an object by itself, but invokes the linker ld. The
linker ld uses the default script that it can find in the system to build
the executable binary. In the default script, a segment is assigned a
starting address 0x8048000 and sections belong to it. Then:
152 operating system: from 0 to 1

£ 1st section address = starting segment address + section offset = 0x8048000 + 0x154 = 0x08048154

£ 2nd section address = starting segment address + section offset = 0x8048000 + 0x168 = 0x08048168
152 operating system: from 0 to 1

£ .... and so on until the last loadable section...

Indeed, the end address of a segment is also the end address of the
@@ -6686,14 +6685,11 @@ Output Elf file type is EXEC (Executable file)
.rodata .eh_frame_hdr .eh_frame

03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss

04 .dynamic

05 .note.ABI-tag .note.gnu.build-id

06 .eh_frame_hdr
the anatomy of a program 153

04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dynamic .got


+ 27
- 9
book_src/Operating System From 0 to 1.lyx View File

@@ -44636,7 +44636,7 @@ Align
\begin_layout Example
Output of
\family typewriter
NULL
.interp
\family default
section:
\end_layout
@@ -49863,7 +49863,13 @@ $ ./hello
\begin_layout Standard
\family typewriter
constructor
init1
\end_layout
\begin_layout Standard
\family typewriter
init2
\end_layout
\begin_layout Standard
@@ -50323,7 +50329,7 @@ main()
.
If the application terminate abnormally, such as through
\family typewriter
.abort()
abort()
\family default
call or a crash, the
\family typewriter
@@ -50360,9 +50366,9 @@ __attribute__((destructor)) static void destructor(){
\begin_layout Plain Layout
printf("destructor
printf("%s
\backslash
n");
n", __FUNCTION__);
\end_layout
\begin_layout Plain Layout
@@ -52166,7 +52172,7 @@ begin{shellcommand}
\begin_layout Standard
\family typewriter
$ gcc -m32 -c lib.c
$ gcc -m32 -c math.c
\end_layout
\begin_layout Standard
@@ -52192,7 +52198,11 @@ end{shellcommand}
\end_layout
\begin_layout Standard
Then, we check the sections of both files:
Then, we check the sections of
\family typewriter
math.o
\family default
:
\end_layout
\begin_layout Standard
@@ -52390,9 +52400,17 @@ As shown in the output, all the section virtual memory addresses of every
block of binary
\emph default
that contains code and data.
Its existence is to server as a material container for the final product,
Its existence is to serve as a material container for the final product,
which is the executable binary.
No segment exists at this stage:
As such, the virtual addresses in
\family typewriter
hello.o
\family default
are all zeroes.
\end_layout
\begin_layout Standard
No segment exists at this stage:
\end_layout
\begin_layout Standard

+ 6
- 8
book_src/images/04/far_jmp_ex.pdf View File

@@ -1,12 +1,10 @@
eax 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
eax 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

0x1000 1000 78 56 00 00 34 12

cs jmp far [eax]

0x1234
0x00001000 1000 00 00 34 12 78 56

cs
0x00005678
jmp far [eax]
eip

0x5678
0x00001234

+ 112
- 106
book_src/images/04/far_jmp_ex.svg View File

@@ -24,9 +24,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568543"
inkscape:cx="9.040639"
inkscape:cy="56.376056"
inkscape:zoom="2"
inkscape:cx="17.22184"
inkscape:cy="181.37481"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
@@ -230,7 +230,7 @@
x2="159.55289"
y2="423.08725"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-16.374068,-16.317886)" />
gradientTransform="translate(15.348026,-16.317874)" />
</defs>
<metadata
id="metadata7">
@@ -258,34 +258,19 @@
inkscape:original-d="m 214.68137,403.01388 c 8.3334,-31.53021 0,-22.99848 0,-22.99848 21.37694,27.44982 29.89148,0 29.89148,0"
sodipodi:nodetypes="ccc" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.53989846"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.67187518"
id="rect4480"
width="58.110481"
width="89.992737"
height="15.138025"
x="77.952278"
y="385.72256" />
<rect
style="opacity:1;fill:#80a7ff;fill-opacity:1;stroke:#000000;stroke-width:0.53800422"
style="opacity:1;fill:#87aade;fill-opacity:1;stroke:#000000;stroke-width:0.6702975"
id="rect4480-7"
width="57.71764"
width="89.592636"
height="15.134299"
x="78.352379"
y="407.5437" />
<path
style="opacity:1;fill:#80a7ff;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
d="M 214.86297,391.50181 V 380.1525 h 14.75735 14.75735 v 11.34931 11.34926 h -14.75735 -14.75735 z"
id="path4597"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
d="m 274.61863,391.50182 v -11.39928 h 14.82519 14.8252 v 11.39928 11.39929 h -14.8252 -14.82519 z"
id="path4609"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
d="m 304.53207,391.50182 v -11.34929 h 14.79045 14.79042 v 11.34929 11.34925 h -14.79042 -14.79045 z"
id="path4611"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
@@ -298,9 +283,9 @@
y="423.04196"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.5px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start" /></text>
<rect
style="opacity:1;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.53862983"
style="opacity:1;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.67080182"
id="rect4480-7-2"
width="57.850925"
width="89.725922"
height="15.134568"
x="78.219093"
y="431.12891" />
@@ -325,7 +310,7 @@
id="tspan5326-1"
x="80.639374"
y="398.14691"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.6730547px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.6836527px">0x1000</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.6730547px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.6836527px">0x00001000</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
@@ -513,65 +498,6 @@
x="179.47687"
y="393.30194"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.59378147px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.85105956px">1000</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="281.32483"
y="395.31732"
id="text5646-8-7-9-2"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4"
x="281.32483"
y="395.31732"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">00</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="311.05692"
y="395.31732"
id="text5646-8-7-9-2-8"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4-9"
x="311.05692"
y="395.31732"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">00</tspan></text>
<path
style="opacity:1;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
d="M 334.37709,391.45707 V 380.1078 h 14.82353 14.82354 v 11.34927 11.34927 h -14.82354 -14.82353 z"
id="path4597-0"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#80a7ff;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
d="m 244.81543,391.51532 v -11.34929 h 14.72165 14.72168 v 11.34929 11.34927 h -14.72168 -14.72165 z"
id="path4597-08"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
d="m 364.25873,391.5153 v -11.34927 h 14.82352 14.82353 v 11.34927 11.34927 h -14.82353 -14.82352 z"
id="path4597-0-0"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="251.90729"
y="395.31732"
id="text5646-8-7-9-2-8-4"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4-9-4"
x="251.90729"
y="395.31732"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">56</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="222.4897"
y="395.31732"
id="text5646-8-7-9-2-8-4-9"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4-9-4-8"
x="222.4897"
y="395.31732"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">78</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:27.34610939px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.6836527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
@@ -614,7 +540,7 @@
id="tspan5326-1-5"
x="79.396935"
y="443.50067"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.6730547px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.6836527px">0x5678</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.6730547px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.6836527px">0x00001234</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:27.34610939px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.6836527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
@@ -625,58 +551,138 @@
id="tspan5326-1-5-6"
x="79.569611"
y="420.19315"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.6730547px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.6836527px">0x1234</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.6730547px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.6836527px">0x00005678</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient6530);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="203.78798"
y="425.70972"
x="235.51006"
y="425.70975"
id="text6480"><tspan
sodipodi:role="line"
id="tspan6482"
x="203.78798"
y="425.70972"
x="235.51006"
y="425.70975"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6530);fill-opacity:1"><tspan
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:12.5px;line-height:139.99999762%;font-family:'CMU Typewriter Text';-inkscape-font-specification:'CMU Typewriter Text, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6530);fill-opacity:1"
id="tspan6484">jmp far [eax]</tspan></tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.42766061;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4881)"
d="m 204.50752,421.18107 -67.5,-6.32701"
d="m 236.22962,421.18107 -67.5,-6.32701"
id="path6542"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.49980664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6758)"
d="m 204.66042,421.41656 -67.6529,17.8125"
d="m 236.38252,421.41656 -67.6529,17.8125"
id="path6544"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.40713471;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5554)"
d="m 172.63252,397.97906 h 40.3125"
id="path5550"
inkscape:connector-curvature="0" />
<path
style="fill:#87aade;fill-opacity:1;stroke:#000000;stroke-width:0.18897638;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 305.91146,25.318042 v -12 h 15.625 15.625 v 12 12 h -15.625 -15.625 z"
id="path5048"
inkscape:connector-curvature="0"
transform="matrix(0.9375,0,0,0.9375,77.62216,367.72312)" />
<path
style="fill:#87aade;fill-opacity:1;stroke:#000000;stroke-width:0.18897638;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 273.91146,25.318042 v -12 h 15.75 15.75 v 12 12 h -15.75 -15.75 z"
id="path5050"
inkscape:connector-curvature="0"
transform="matrix(0.9375,0,0,0.9375,77.62216,367.72312)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="372.31696"
y="395.27432"
id="text5646-8-7-9-2-8-4"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4-9-4"
x="372.31696"
y="395.27432"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">56</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="371.25537"
y="395.39154"
x="342.43671"
y="395.27432"
id="text5646-8-7-9-2-8-4-9"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4-9-4-8"
x="342.43671"
y="395.27432"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">78</tspan></text>
<path
style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.18897638;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 242.16146,25.318042 v -12 h 15.625 15.625 v 12 12 h -15.625 -15.625 z"
id="path5052"
inkscape:connector-curvature="0"
transform="matrix(0.9375,0,0,0.9375,77.62216,367.72312)" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.18897638;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 210.16146,25.318042 v -12 h 15.75 15.75 v 12 12 h -15.75 -15.75 z"
id="path5054"
inkscape:connector-curvature="0"
transform="matrix(0.9375,0,0,0.9375,77.62216,367.72312)" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.18897638;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 178.41146,25.318042 v -12 h 15.625 15.625 v 12 12 h -15.625 -15.625 z"
id="path5056"
inkscape:connector-curvature="0"
transform="matrix(0.9375,0,0,0.9375,77.62216,367.72312)" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.18897638;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 146.41146,25.318042 v -12 h 15.75 15.75 v 12 12 h -15.75 -15.75 z"
id="path5058"
inkscape:connector-curvature="0"
transform="matrix(0.9375,0,0,0.9375,77.62216,367.72312)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="222.97968"
y="395.27432"
id="text5646-8-7-9-2"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4"
x="222.97968"
y="395.27432"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">00</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="252.86249"
y="395.27432"
id="text5646-8-7-9-2-8"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9-4-9"
x="252.86249"
y="395.27432"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">00</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="312.57437"
y="395.34851"
id="text5646-8-7-9"><tspan
sodipodi:role="line"
id="tspan5648-3-2-9"
x="371.25537"
y="395.39154"
x="312.57437"
y="395.34851"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">12</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:83.85453796px;line-height:139.99999762%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.5406388px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="340.99881"
y="395.31732"
x="282.63782"
y="395.27432"
id="text5646-8-7"><tspan
sodipodi:role="line"
id="tspan5648-3-2"
x="340.99881"
y="395.31732"
x="282.63782"
y="395.27432"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.48181725px;line-height:139.99999762%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:1.5406388px">34</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.56222588;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5554)"
d="m 136.07002,397.97906 h 76.875"
id="path5550"
inkscape:connector-curvature="0" />
</g>
</svg>

Loading…
Cancel
Save