Copyright (C) 2000-2012 |
GNU Info (nasm.info)Section 3.63.6. `SEG' and `WRT' ==================== When writing large 16-bit programs, which must be split into multiple segments, it is often necessary to be able to refer to the segment part of the address of a symbol. NASM supports the `SEG' operator to perform this function. The `SEG' operator returns the _preferred_ segment base of a symbol, defined as the segment base relative to which the offset of the symbol makes sense. So the code mov ax,seg symbol mov es,ax mov bx,symbol will load `ES:BX' with a valid pointer to the symbol `symbol'. Things can be more complex than this: since 16-bit segments and groups may overlap, you might occasionally want to refer to some symbol using a different segment base from the preferred one. NASM lets you do this, by the use of the `WRT' (With Reference To) keyword. So you can do things like mov ax,weird_seg ; weird_seg is a segment base mov es,ax mov bx,symbol wrt weird_seg to load `ES:BX' with a different, but functionally equivalent, pointer to the symbol `symbol'. NASM supports far (inter-segment) calls and jumps by means of the syntax `call segment:offset', where `segment' and `offset' both represent immediate values. So to call a far procedure, you could code either of call (seg procedure):procedure call weird_seg:(procedure wrt weird_seg) (The parentheses are included for clarity, to show the intended parsing of the above instructions. They are not necessary in practice.) NASM supports the syntax `call far procedure' as a synonym for the first of the above usages. `JMP' works identically to `CALL' in these examples. To declare a far pointer to a data item in a data segment, you must code dw symbol, seg symbol NASM supports no convenient synonym for this, though you can always invent one using the macro processor. automatically generated by info2www version 1.2.2.9 |