Next Chapter | Previous Chapter | Contents | Index
This chapter tries to cover some of the issues, largely related to unusual forms of addressing and jump instructions, encountered when writing operating system code such as protected-mode initialisation routines, which require code that operates in mixed segment sizes, such as code in a 16-bit segment trying to modify data in a 32-bit one, or jumps between different-size segments.
The most common form of mixed-size instruction is the one used when writing a 32-bit OS: having done your setup in 16-bit mode, such as loading the kernel, you then have to boot it by switching into protected mode and jumping to the 32-bit kernel start address. In a fully 32-bit OS, this tends to be the only mixed-size instruction you need, since everything before it can be done in pure 16-bit code, and everything after it can be pure 32-bit.
This jump must specify a 48-bit far address, since the target segment is a 32-bit one. However, it must be assembled in a 16-bit segment, so just coding, for example,
jmp 0x1234:0x56789ABC ; wrong!
will not work, since the offset part of the address will be truncated to
and the jump will be an ordinary 16-bit
far one.
The Linux kernel setup code gets round the inability of
to generate the required instruction by
coding it manually, using instructions. NASM
can go one better than that, by actually generating the right instruction
itself. Here's how to do it right:
jmp dword 0x1234:0x56789ABC ; right
The