RT-11 ( Real-time 11 ) is a discontinued small, low-end, single-user real-time operating system for the full line of Digital Equipment Corporation PDP-11 16-bit computers. RT-11 was first implemented in 1970. It was widely used for real-time computing systems, process control , and data acquisition across all PDP-11s. It was also used for low-cost general-use computing.
87-465: RT-11 was written in assembly language . Heavy use of the conditional assembly and macro programming features of the MACRO-11 assembler allowed a significant degree of configurability and allowed programmers to specify high-level instructions otherwise unprovided for in machine code. RT-11 distributions included the source code of the operating system and its device drivers with all the comments removed and
174-424: A CalComp plotter , typically involved copying files, and did not require a SYSGEN. Fuzzball , routing software for Internet Protocols , was capable of running RT-11 programs. HAMMONDsoftware distributed a number of RT-11 compatible operating systems including STAReleven, an early multi-computer system and SHAREplus, a multi-process/multi-user implementation of RT-11 which borrowed some architectural concepts from
261-601: A real-time clock , printing terminal, VT11 vector graphic unit, 16 channel 100 kHz A/D converter with 2 channel D/A, 9600 baud serial port, 16 bit bidirectional boards, etc. RT-11 implemented a simple and fast file system employing six-character filenames with three-character extensions (6.3) encoded in RADIX-50 , which packed those nine characters into only three 16-bit words (six bytes). This resulted in allowable filename characters being 'A'-'Z', 'a'-'z' forced to upper case, '0'-'9', '$ ', '%', '*'. Filenames could be prefixed by
348-474: A register . The binary code for this instruction is 10110 followed by a 3-bit identifier for which register to use. The identifier for the AL register is 000, so the following machine code loads the AL register with the data 01100001. This binary computer code can be made more human-readable by expressing it in hexadecimal as follows. Here, B0 means "Move a copy of the following value into AL ", and 61
435-463: A device name to specify a device different to the default DK: device, also encoded in RADIX-50. All files were contiguous, meaning that each file occupied consecutive blocks (the minimally addressable unit of disk storage, 512 bytes) on the disk. This meant that an entire file could be read (or written) very quickly. A side effect of this file system structure was that, as files were created and deleted on
522-511: A full form and a short one to which they could be contracted. For example, the RENAME command could be contracted to REN . Batch files and the batch processor could be used to issue a series of commands with some rudimentary control flow . Batch files had the extension .BAT. In later releases of RT-11, it was possible to invoke a series of commands using a .COM command file, but they would be executed in sequence with no flow control. Even later, it
609-512: A higher-level language, for performance reasons or to interact directly with hardware in ways unsupported by the higher-level language. For instance, just under 2% of version 4.9 of the Linux kernel source code is written in assembly; more than 97% is written in C . Assembly language uses a mnemonic to represent, e.g., each low-level machine instruction or opcode , each directive , typically also each architectural register , flag , etc. Some of
696-489: A language is used to represent machine code instructions is found in Kathleen and Andrew Donald Booth 's 1947 work, Coding for A.R.C. . Assembly code is converted into executable machine code by a utility program referred to as an assembler . The term "assembler" is generally attributed to Wilkes , Wheeler and Gill in their 1951 book The Preparation of Programs for an Electronic Digital Computer , who, however, used
783-478: A list of data, arguments or parameters. Some instructions may be "implied", which means the data upon which the instruction operates is implicitly defined by the instruction itself—such an instruction does not take an operand. The resulting statement is translated by an assembler into machine language instructions that can be loaded into memory and executed. For example, the instruction below tells an x86 / IA-32 processor to move an immediate 8-bit value into
870-705: A macro definition, e.g., MEXIT in HLASM , while others may be permitted within open code (outside macro definitions), e.g., AIF and COPY in HLASM. In assembly language, the term "macro" represents a more comprehensive concept than it does in some other contexts, such as the pre-processor in the C programming language , where its #define directive typically is used to create short single line macros. Assembler macro instructions, like macros in PL/I and some other languages, can be lengthy "programs" by themselves, executed by interpretation by
957-481: A mask of 0. Extended mnemonics are often used to support specialized uses of instructions, often for purposes not obvious from the instruction name. For example, many CPU's do not have an explicit NOP instruction, but do have instructions that can be used for the purpose. In 8086 CPUs the instruction xchg ax , ax is used for nop , with nop being a pseudo-opcode to encode the instruction xchg ax , ax . Some disassemblers recognize this and will decode
SECTION 10
#17328510458241044-438: A mnemonic is a symbolic name for a single executable machine language instruction (an opcode ), and there is at least one opcode mnemonic defined for each machine language instruction. Each instruction typically consists of an operation or opcode plus zero or more operands . Most instructions refer to a single value or a pair of values. Operands can be immediate (value coded in the instruction itself), registers specified in
1131-410: A move between a byte-sized register and either another register or memory, and the second byte, E0h, is encoded (with three bit-fields) to specify that both operands are registers, the source is AH , and the destination is AL . In a case like this where the same mnemonic can represent more than one binary instruction, the assembler determines which instruction to generate by examining the operands. In
1218-447: A program named "SYSGEN" which would build the operating system and drivers according to a user-specified configuration. Developer's documentation included a kernel listing that included comments. In RT-11, device drivers were loadable, except that prior to V4.0 the device driver for the system device (boot device) was built into the kernel at configuration time. Because RT-11 was commonly used for device control and data acquisition, it
1305-522: A programmer, so that one program can be assembled in different ways, perhaps for different applications. Or, a pseudo-op can be used to manipulate presentation of a program to make it easier to read and maintain. Another common use of pseudo-ops is to reserve storage areas for run-time data and optionally initialize their contents to known values. Symbolic assemblers let programmers associate arbitrary names ( labels or symbols ) with memory locations and various constants. Usually, every constant and variable
1392-400: A pseudoinstruction that expands to the machine's "set if less than" and "branch if zero (on the result of the set instruction)". Most full-featured assemblers also provide a rich macro language (discussed below) which is used by vendors and programmers to generate more complex code and data sequences. Since the information about pseudoinstructions and macros defined in the assembler environment
1479-400: A second pass would require storing the symbol table in memory (to handle forward references ), rewinding and rereading the program source on tape , or rereading a deck of cards or punched paper tape . Later computers with much larger memories (especially disc storage), had the space to perform all necessary processing without such re-reading. The advantage of the multi-pass assembler is that
1566-535: A single background job (the SB, XB and ZB variants). The terms foreground and background are counterintuitive; the background job was typically the user's command-line interpreter ; a foreground job might be doing something like non-interactive data collection. Users generally operated RT-11 via a printing terminal or a video terminal , originally via a strap-selectable current-loop (for conventional teletypes) or via an RS-232 (later RS-422 as well) interface on one of
1653-405: A single real-time user could run on a single floppy disk and in 8K 16-bit words (16KB) of RAM, including user programs. This was facilitated by support for swapping and overlaying. To realize operation on such small memory system, the keyboard command user interface would be swapped out during the execution of a user's program and then swapped into memory upon program termination. The system supported
1740-437: A volume over time, the unused disk blocks would likely not remain contiguous , which could become the limiting factor in creating large files; the remedy was to periodically “squeeze” (or "squish") a disk to consolidate the unused portions. Each volume has only one directory which was preallocated at the beginning of the volume. The directory consists of an array of entries, one per file or unallocated space. Each directory entry
1827-549: Is 8 (or more) 16-bit words, though a sysgen option allowed extra application-specific storage. Many RT-11 programs (those that did not need specialized peripherals or direct access to the hardware) could be directly executed using the RT=11 RTS ( Run-time system ) of the RSTS/E timesharing system or under RTEM (RT Emulator) on various releases of both RSX-11 and VMS . The implementation of DCL for RT-11 increased its compatibility with
SECTION 20
#17328510458241914-458: Is a command of the IBM OS/2 , Microsoft Windows and ReactOS command-line interpreter cmd.exe (and some versions of COMMAND.COM ) to start programs or batch files or to open files or directories using the default program. start is not available as a standalone program. The underlying Win32 API is ShellExecute . The command is also one of the basic commands implemented in
2001-403: Is a one-to-one correspondence between many simple assembly statements and machine language instructions. However, in some cases, an assembler may provide pseudoinstructions (essentially macros) which expand into several machine language instructions to provide commonly needed functionality. For example, for a machine that lacks a "branch if greater or equal" instruction, an assembler may provide
2088-447: Is a hexadecimal representation of the value 01100001, which is 97 in decimal . Assembly language for the 8086 family provides the mnemonic MOV (an abbreviation of move ) for instructions such as this, so the machine code above can be written as follows in assembly language, complete with an explanatory comment if required, after the semicolon. This is much easier to read and to remember. In some assembly languages (including this one)
2175-453: Is a key feature of assemblers, saving tedious calculations and manual address updates after program modifications. Most assemblers also include macro facilities for performing textual substitution – e.g., to generate common short sequences of instructions as inline , instead of called subroutines . Some assemblers may also be able to perform some simple types of instruction set -specific optimizations . One concrete example of this may be
2262-404: Is always completely unable to recover source comments. Each computer architecture has its own machine language. Computers differ in the number and type of operations they support, in the different sizes and numbers of registers, and in the representations of data in storage. While most general-purpose computers are able to carry out essentially the same functionality, the ways they do so differ;
2349-508: Is essential in assembly language programs, as the meaning and purpose of a sequence of binary machine instructions can be difficult to determine. The "raw" (uncommented) assembly language generated by compilers or disassemblers is quite difficult to read when changes must be made. Many assemblers support predefined macros , and others support programmer-defined (and repeatedly re-definable) macros involving sequences of text lines in which variables and constants are embedded. The macro definition
2436-658: Is even possible to network RT-11 machines using DECNET , the Internet and protocols developed by other, third-party sources. The RT-11 operating system could be booted from, and perform useful work on, a machine consisting of two 8-inch 250KB floppy disks and 56KB of memory, and could support 8 terminals. Other boot options include the RK05 2.5MB removable hard disk platter, or magnetic tape . Distributions were available pre-installed or on punched tape , magnetic tape, cartridge tape , or floppy disk. A minimal but complete system supporting
2523-401: Is given a name so instructions can reference those locations by name, thus promoting self-documenting code . In executable code, the name of each subroutine is associated with its entry point, so any calls to a subroutine can use its name. Inside subroutines, GOTO destinations are given labels. Some assemblers support local symbols which are often lexically distinct from normal symbols (e.g.,
2610-679: Is more than one assembler for the same architecture, and sometimes an assembler is specific to an operating system or to particular operating systems. Most assembly languages do not provide specific syntax for operating system calls, and most assembly languages can be used universally with any operating system, as the language provides access to all the real capabilities of the processor , upon which all system call mechanisms ultimately rest. In contrast to assembly languages, most high-level programming languages are generally portable across multiple architectures but require interpreting or compiling , much more complicated tasks than assembling. In
2697-442: Is most commonly a mixture of assembler statements, e.g., directives, symbolic machine instructions, and templates for assembler statements. This sequence of text lines may include opcodes or directives. Once a macro has been defined its name may be used in place of a mnemonic. When the assembler processes such a statement, it replaces the statement with the text lines associated with that macro, then processes them as if they existed in
RT-11 - Misplaced Pages Continue
2784-407: Is not present in the object program, a disassembler cannot reconstruct the macro and pseudoinstruction invocations but can only disassemble the actual machine instructions that the assembler generated from those abstract assembly-language entities. Likewise, since comments in the assembly language source file are ignored by the assembler and have no effect on the object code it generates, a disassembler
2871-520: Is universally enforced by their syntax. For example, in the Intel x86 assembly language, a hexadecimal constant must start with a numeral digit, so that the hexadecimal number 'A' (equal to decimal ten) would be written as 0Ah or 0AH , not AH , specifically so that it cannot appear to be the name of register AH . (The same rule also prevents ambiguity with the names of registers BH , CH , and DH , as well as with any user-defined symbol that ends with
2958-472: The xchg ax , ax instruction as nop . Similarly, IBM assemblers for System/360 and System/370 use the extended mnemonics NOP and NOPR for BC and BCR with zero masks. For the SPARC architecture, these are known as synthetic instructions . Some assemblers also support simple built-in macro-instructions that generate two or more machine instructions. For instance, with some Z80 assemblers
3045-468: The CPU pipeline as efficiently as possible. Assemblers have been available since the 1950s, as the first step above machine language and before high-level programming languages such as Fortran , Algol , COBOL and Lisp . There have also been several classes of translators and semi-automatic code generators with properties similar to both assembly and high-level languages, with Speedcode as perhaps one of
3132-504: The Digital Equipment Computer Users Society (DECUS) including an implementation of C . Although the tools to develop and debug assembly-language programs were provided, other languages including C, Fortran , Pascal , and several versions of BASIC were available from DEC as "layered products" at extra cost. Versions of these and other programming languages were also available from other, third-party, sources. It
3219-516: The VAX/VMS operating system. RT-11 device drivers were required for operation. Transparent device access to other PDP-11s and VAX/VMS were supported with a network option. Limited RSX-11 application compatibility was also available. SHAREplus had its strongest user base in Europe. TSX-11 , developed by S&H Computing, was a multi-user, multi-processing implementation of RT-11. The only thing it didn't do
3306-756: The 1950s and early 1960s. Some assemblers have free-form syntax, with fields separated by delimiters, e.g., punctuation, white space . Some assemblers are hybrid, with, e.g., labels, in a specific column and other fields separated by delimiters; this became more common than column-oriented syntax in the 1960s. An assembler program creates object code by translating combinations of mnemonics and syntax for operations and addressing modes into their numerical equivalents. This representation typically includes an operation code (" opcode ") as well as other control bits and data. The assembler also calculates constant expressions and resolves symbolic names for memory locations and other entities. The use of symbolic references
3393-555: The CPU cards; DEC also supported the VT11 and VS60 graphics display devices ( vector graphics terminals with a graphic character generator for displaying text, and a light pen for graphical input). A third-party favorite was the Tektronix 4010 family. The Keyboard Monitor (KMON) interpreted commands issued by the user and would invoke various utilities with Command String Interpreter (CSI) forms of
3480-540: The Intel 8080 family and the Intel 8086/8088. Because Intel claimed copyright on its assembly language mnemonics (on each page of their documentation published in the 1970s and early 1980s, at least), some companies that independently produced CPUs compatible with Intel instruction sets invented their own mnemonics. The Zilog Z80 CPU, an enhancement of the Intel 8080A , supports all the 8080A instructions plus many more; Zilog invented an entirely new assembly language, not only for
3567-631: The KMON. Some commands and utilities were later borrowed in the DOS line of operating systems. These commands include DIR , COPY , RENAME , ASSIGN , CLS , DELETE , TYPE , HELP and others. The FORMAT command was used for physical disk formatting, although it was not capable of creating file system, for which purpose the INIT command was used (analogue of DOS command FORMAT /Q). Most commands supported using wildcards in file names. Physical device names were specified in
RT-11 - Misplaced Pages Continue
3654-531: The Keyboard Monitor (KMON) of the DEC RT-11 operating system. The TOPS-10 and TOPS-20 operating systems also provide a start command. It is used to start a program in memory at a specified address. "title" Title of the window. Path Specifies the startup directory. I Use the original environment given to cmd.exe, instead of the current environment. B Starts
3741-570: The LD device, and 'nn' was 00–77(octal). RT-11 was distributed with utilities for performing many actions. The utilities DIR , DUP , PIP and FORMAT were for managing disk volumes. TECO , EDIT , and the visual editors KED (for the DEC VT100 ) and K52 (for the DEC VT52 ) were used to create and edit source and data files. MACRO , LINK , and LIBR were for building executables. ODT , VDT and
3828-705: The Professional Series and the PDT-11 "Programmed Data Terminal" systems, also from DEC. Since the PDP-11 architecture was implemented in replacement products by other companies (E.g., the M100 and family from Mentec ), or as reverse-engineered clones in other countries (E.g., the DVK from the Soviet Union), RT-11 runs on these machines as well. Adding driver support for peripherals such as
3915-601: The SD device were used to debug programs. DEC's version of Runoff was for producing documents. Finally, VTCOM was used to connect with and use (or transfer files to and from) another computer system over the phone via a modem. The system was complete enough to handle many modern personal computing tasks. Productivity software such as LEX-11, a word processing package, and a spreadsheet from Saturn Software, used under other PDP-11 operating systems, also ran on RT-11. Large amounts of free, user-contributed software for RT-11 were available from
4002-742: The USSR: Assembly language In computer programming , assembly language (alternatively assembler language or symbolic machine code ), often referred to simply as assembly and commonly abbreviated as ASM or asm , is any low-level programming language with a very strong correspondence between the instructions in the language and the architecture's machine code instructions . Assembly language usually has one statement per machine instruction (1:1), but constants, comments , assembler directives , symbolic labels of, e.g., memory locations , registers , and macros are generally also supported. The first assembly code in which
4089-521: The V20 and V30 actually wrote in NEC's assembly language rather than Intel's; since any two assembly languages for the same instruction set architecture are isomorphic (somewhat like English and Pig Latin ), there is no requirement to use a manufacturer's own published assembly language with that manufacturer's products. There is a large degree of diversity in the way the authors of assemblers categorize statements and in
4176-460: The Z80, NEC invented new mnemonics for all of the 8086 and 8088 instructions, to avoid accusations of infringement of Intel's copyright. (It is questionable whether such copyrights can be valid, and later CPU companies such as AMD and Cyrix republished Intel's x86/IA-32 instruction mnemonics exactly with neither permission nor legal penalty.) It is doubtful whether in practice many people who programmed
4263-402: The absence of errata makes the linking process (or the program load if the assembler directly produces executable code) faster. Example: in the following code snippet, a one-pass assembler would be able to determine the address of the backward reference BKWD when assembling statement S2 , but would not be able to determine the address of the forward reference FWD when assembling
4350-436: The amount of memory, the system could support a minimum of 12 users (14-18 users on a 2Mb 11/73, depending on workload). The last version of TSX-Plus had TCP/IP support. Users could choose from variants with differing levels of support for multitasking , memory size, and separate I & D (Instruction and Data) address space: Several specialized PDP-11 systems were sold based on RT-11: Several clones of RT-11 were made in
4437-424: The architecture, these elements may also be combined for specific instructions or addressing modes using offsets or other data as well as fixed addresses. Many assemblers offer additional mechanisms to facilitate program development, to control the assembly process, and to aid debugging . Some are column oriented, with specific fields in specific columns; this was very common for machines using punched cards in
SECTION 50
#17328510458244524-487: The assembler during assembly. Since macros can have 'short' names but expand to several or indeed many lines of code, they can be used to make assembly language programs appear to be far shorter, requiring fewer lines of source code, as with higher level languages. They can also be used to add higher levels of structure to assembly programs, optionally introduce embedded debugging code via parameters and other similar features. Start (command) In computing , start
4611-443: The assembler operates and "may affect the object code, the symbol table, the listing file, and the values of internal assembler parameters". Sometimes the term pseudo-opcode is reserved for directives that generate object code, such as those that generate data. The names of pseudo-ops often start with a dot to distinguish them from machine instructions. Pseudo-ops can make the assembly of the program dependent on parameters input by
4698-575: The better-known examples. There may be several assemblers with different syntax for a particular CPU or instruction set architecture . For instance, an instruction to add memory data to a register in a x86 -family processor might be add eax,[ebx] , in original Intel syntax , whereas this would be written addl (%ebx),%eax in the AT&T syntax used by the GNU Assembler . Despite different appearances, different syntactic forms generally generate
4785-674: The branch statement S1 ; indeed, FWD may be undefined. A two-pass assembler would determine both addresses in pass 1, so they would be known when generating code in pass 2. More sophisticated high-level assemblers provide language abstractions such as: See Language design below for more details. A program written in assembly language consists of a series of mnemonic processor instructions and meta-statements (known variously as declarative operations, directives, pseudo-instructions, pseudo-operations and pseudo-ops), comments and data. Assembly language instructions usually consist of an opcode mnemonic followed by an operand , which might be
4872-503: The commands. RT-11 command language had many features (such as commands and device names) that can be found later in the DOS line of operating systems which heavily borrowed from RT-11. The CSI form expected input and output filenames and options ('switches' on RT-11) in a precise order and syntax. The command-line switches were separated by a slash ( / ) rather than the dash ( - ) used in Unix-like operating systems. All commands had
4959-404: The corresponding assembly languages reflect these differences. Multiple sets of mnemonics or assembly-language syntax may exist for a single instruction set, typically instantiated in different assembler programs. In these cases, the most popular one is usually that supplied by the CPU manufacturer and used in its documentation. Two examples of CPUs that have two different sets of mnemonics are
5046-425: The first decades of computing, it was commonplace for both systems programming and application programming to take place entirely in assembly language. While still irreplaceable for some purposes, the majority of programming is now conducted in higher-level interpreted and compiled languages. In " No Silver Bullet ", Fred Brooks summarised the effects of the switch away from assembly language programming: "Surely
5133-477: The first example, the operand 61h is a valid hexadecimal numeric constant and is not a valid register name, so only the B0 instruction can be applicable. In the second example, the operand AH is a valid register name and not a valid numeric constant (hexadecimal, decimal, octal, or binary), so only the 88 instruction can be applicable. Assembly languages are always designed so that this sort of lack of ambiguity
5220-464: The following examples show. In each case, the MOV mnemonic is translated directly into one of the opcodes 88-8C, 8E, A0-A3, B0-BF, C6 or C7 by an assembler, and the programmer normally does not have to know or remember which. Transforming assembly language into machine code is the job of an assembler, and the reverse can at least partially be achieved by a disassembler . Unlike high-level languages , there
5307-465: The form 'dd{n}:' where 'dd' was a two-character alphabetic device name and the optional 'n' was the unit number (0–7). When the unit number was omitted, unit 0 was assumed. For example, TT: referred to the console terminal, LP: (or LP0:) referred to the parallel line printer, and DX0:, DY1:, DL4: referred to disk volumes (RX01 unit 0, RX02 unit 1, RL01 or RL02 unit 4, respectively). Logical device names consisted of 1–3 alphanumeric characters and were used in
SECTION 60
#17328510458245394-455: The instruction ld hl,bc is recognized to generate ld l,c followed by ld h,b . These are sometimes known as pseudo-opcodes . Mnemonics are arbitrary symbols; in 1985 the IEEE published Standard 694 for a uniform set of mnemonics to be used by all assemblers. The standard has since been withdrawn. There are instructions used to define data elements to hold data and variables. They define
5481-520: The instruction or implied, or the addresses of data located elsewhere in storage. This is determined by the underlying processor architecture: the assembler merely reflects how this architecture works. Extended mnemonics are often used to specify a combination of an opcode with a specific operand, e.g., the System/360 assemblers use B as an extended mnemonic for BC with a mask of 15 and NOP ("NO OPeration" – do nothing for one step) for BC with
5568-403: The letter H and otherwise contains only characters that are hexadecimal digits, such as the word "BEACH".) Returning to the original example, while the x86 opcode 10110000 ( B0 ) copies an 8-bit value into the AL register, 10110001 ( B1 ) moves it into CL and 10110010 ( B2 ) does so into DL . Assembly language examples for these follow. The syntax of MOV can also be more complex as
5655-427: The mnemonics may be built-in and some user-defined. Many operations require one or more operands in order to form a complete instruction. Most assemblers permit named constants, registers, and labels for program and memory locations, and can calculate expressions for operands. Thus, programmers are freed from tedious repetitive calculations and assembler programs are much more readable than machine code. Depending on
5742-460: The monitors provided a background job . The FB, XM, and ZM monitors also provided a foreground job , and six system jobs if selected via the SYSGEN system generation program. These tasks had fixed priorities , with the background job lowest and the foreground job highest. It was possible to switch between jobs from the system console user interface, and SYSGEN could generate a monitor that provided
5829-423: The most powerful stroke for software productivity, reliability, and simplicity has been the progressive use of high-level languages for programming. Most observers credit that development with at least a factor of five in productivity, and with concomitant gains in reliability, simplicity, and comprehensibility." Today, it is typical to use small amounts of assembly language code within larger systems implemented in
5916-458: The new instructions but also for all of the 8080A instructions. For example, where Intel uses the mnemonics MOV , MVI , LDA , STA , LXI , LDAX , STAX , LHLD , and SHLD for various data transfer instructions, the Z80 assembly language uses the mnemonic LD for all of them. A similar case is the NEC V20 and V30 CPUs, enhanced copies of the Intel 8086 and 8088, respectively. Like Zilog with
6003-400: The nomenclature that they use. In particular, some describe anything other than a machine mnemonic or extended mnemonic as a pseudo-operation (pseudo-op). A typical assembly language consists of 3 types of instruction statements that are used to define program operations: Instructions (statements) in assembly language are generally very simple, unlike those in high-level languages . Generally,
6090-405: The operation, and if necessary, pad it with one or more " no-operation " instructions in a later pass or the errata. In an assembler with peephole optimization , addresses may be recalculated between passes to allow replacing pessimistic code with code tailored to the exact distance from the target. The original reason for the use of one-pass assemblers was memory size and speed of assembly – often
6177-557: The original TSX because "Spending $ 25K on a computer that could only support one user bugged [founder Harry Sanders]"; the outcome was the initial four-user TSX in 1976. TSX-Plus (released in 1980) was the successor to TSX, released in 1976. The system was popular in the 1980s. RT-11 programs generally ran, unmodified, under TSX-Plus and, in fact, most of the RT-11 utilities were used as-is under TSX-Plus. Device drivers generally required only slight modifications. Depending on which PDP-11 model and
6264-475: The other DEC operating systems. Although each operating system had commands and options which were unique to that operating system, there were a number of commands and command options which were common. DEC also sold RSX-11 , a multiuser, multitasking operating system with realtime features, and RSTS/E (originally named RSTS-11) a multiuser time-sharing system, but RT-11 remained the operating system of choice for data acquisition systems where real time response
6351-466: The place of a physical device name. This was accomplished using the ASSIGN command. For example, one might issue ASSIGN DL0 ABC which would cause all future references to 'ABC:' to map to 'DL0:'. Reserved logical name DK: referred to the current default device. If a device was not included in a file specification, DK: was assumed. Reserved logical name SY: referred to the system device (the device from which
6438-499: The same mnemonic is used for different instructions, that means that the mnemonic corresponds to several different binary instruction codes, excluding data (e.g. the 61h in this example), depending on the operands that follow the mnemonic. For example, for the x86/IA-32 CPUs, the Intel assembly language syntax MOV AL, AH represents an instruction that moves the contents of register AH into register AL . The hexadecimal form of this instruction is: The first byte, 88h, identifies
6525-489: The same mnemonic, such as MOV, may be used for a family of related instructions for loading, copying and moving data, whether these are immediate values, values in registers, or memory locations pointed to by values in registers or by immediate (a.k.a. direct) addresses. Other assemblers may use separate opcode mnemonics such as L for "move memory to register", ST for "move register to memory", LR for "move register to register", MVI for "move immediate operand to memory", etc. If
6612-415: The same numeric machine code . A single assembler may also have different modes in order to support variations in syntactic forms as well as their exact semantic interpretations (such as FASM -syntax, TASM -syntax, ideal mode, etc., in the special case of x86 assembly programming). There are two types of assemblers based on how many passes through the source are needed (how many times the assembler reads
6699-433: The source code file (including, in some assemblers, expansion of any macros existing in the replacement text). Macros in this sense date to IBM autocoders of the 1950s. Macro assemblers typically have directives to, e.g., define macros, define variables, set variables to the result of an arithmetic, logical or string expression, iterate, conditionally generate code. Some of those directives may be restricted to use within
6786-407: The source) to produce the object file. In both cases, the assembler must be able to determine the size of each instruction on the initial passes in order to calculate the addresses of subsequent symbols. This means that if the size of an operation referring to an operand defined later depends on the type or distance of the operand, the assembler will make a pessimistic estimate when first encountering
6873-452: The system had been booted). Later versions of RT-11 allowed specification of up to 64 units (0–77 octal) for certain devices, but the device name was still limited to three alphanumeric characters. This feature was enabled through a SYSGEN selection, and only applied to the DU and LD device handlers. In these two cases, the device name form became 'dnn:' where 'd' was 'D' for the DU device and 'L' for
6960-456: The term to mean "a program that assembles another program consisting of several sections into a single program". The conversion process is referred to as assembly , as in assembling the source code . The computational step when an assembler is processing a program is called assembly time . Because assembly depends on the machine code instructions, each assembly language is specific to a particular computer architecture . Sometimes there
7047-496: The type of data, the length and the alignment of data. These instructions can also define whether the data is available to outside programs (programs assembled separately) or only to the program in which the data section is defined. Some assemblers classify these as pseudo-ops. Assembly directives, also called pseudo-opcodes, pseudo-operations or pseudo-ops, are commands given to an assembler "directing it to perform operations other than assembling instructions". Directives affect how
7134-414: The ubiquitous x86 assemblers from various vendors. Called jump-sizing , most of them are able to perform jump-instruction replacements (long jumps replaced by short or relative jumps) in any number of passes, on request. Others may even do simple rearrangement or insertion of instructions, such as some assemblers for RISC architectures that can help optimize a sensible instruction scheduling to exploit
7221-591: The use of "10$ " as a GOTO destination). Some assemblers, such as NASM , provide flexible symbol management, letting programmers manage different namespaces , automatically calculate offsets within data structures , and assign labels that refer to literal values or the result of simple computations performed by the assembler. Labels can also be used to initialize constants and variables with relocatable addresses. Assembly languages, like most other computer languages, allow comments to be added to program source code that will be ignored during assembly. Judicious commenting
7308-500: Was common for developers to write or enhance device drivers. DEC encouraged such driver development by making their hardware subsystems (from bus structure to code) open, documenting the internals of the operating system, encouraging third-party hardware and software vendors, and by fostering the development of the Digital Equipment Computer Users Society . RT-11 systems did not support preemptive multitasking , but most versions could run multiple simultaneous applications. All variants of
7395-487: Was handle the boot process, so any TSX-Plus machine was required to boot RT-11 first before running TSX-Plus as a user program. Once TSX-Plus was running, it would take over complete control of the machine from RT-11. It provided true memory protection for users from other users, provided user accounts and maintained account separation on disk volumes and implemented a superset of the RT-11 EMT programmed requests. S&H wrote
7482-665: Was possible to execute a series of commands with great control through use of the Indirect Command File Processor (IND), which took .CMD control files as input. Files with the extension .SAV were a sort of executable. They were known as "save files" because the RT-11 SAVE command could be used to save the contents of memory to a disk file which could be loaded and executed at a later time, allowing any session to be saved. The SAVE command, along with GET, START , REENTER, EXAMINE and DEPOSIT were basic commands implemented in
7569-529: Was required. The Unix operating system also became popular, but lacked the real-time features and extremely small size of RT-11. RT-11 ran on all members of the DEC PDP-11 family, both Q-Bus - and Unibus -based, from the PDP-11/05 (its first target, in 1970 (note that the PDP-11/05 was released 1972, so this probably was a PDP-11/20)), to the final PDP-11 implementations (PDP-11/93 and /94). In addition, it ran on
#823176