Menu English Ukrainian russian Home

Free technical library for hobbyists and professionals Free technical library


Lecture notes, cheat sheets
Free library / Directory / Lecture notes, cheat sheets

Computer science and information technology. Command structures in Assembly language (lecture notes)

Lecture notes, cheat sheets

Directory / Lecture notes, cheat sheets

Comments on the article Comments on the article

Table of contents (expand)

LECTURE No. 16. Assembler Programs

1. The structure of the program in assembler

An assembly language program is a collection of blocks of memory called memory segments. A program may consist of one or more of these block-segments. Each segment contains a collection of language sentences, each of which occupies a separate line of program code.

Assembly statements are of four types:

1) commands or instructions, which are symbolic analogues of machine commands. During the translation process, assembly instructions are converted into the corresponding commands of the microprocessor instruction set;

2) macros. These are sentences of the text of the program that are formalized in a certain way and are replaced by other sentences during the broadcast;

3) directives, which are an indication to the assembler translator to perform certain actions. Directives have no counterparts in machine representation;

4) comment lines containing any characters, including letters of the Russian alphabet. Comments are ignored by the translator.

2. Assembly Syntax

The sentences that make up a program can be a syntactic construct corresponding to a command, macro, directive, or comment. In order for the assembler translator to recognize them, they must be formed according to certain syntactic rules. To do this, it is best to use a formal description of the syntax of the language, like the rules of grammar. The most common ways to describe a programming language in this way are syntax diagrams and extended Backus-Naur forms. For practical use, syntax diagrams are more convenient. For example, the syntax of assembly language statements can be described using the syntax diagrams shown in the following figures.

Rice. 4. Assembler sentence format

Rice. 5. Directive Format

Rice. 6. Format of commands and macros

On these drawings:

1) label name - an identifier, the value of which is the address of the first byte of the sentence of the source code of the program that it denotes;

2) name - an identifier that distinguishes this directive from other directives of the same name. As a result of processing by the assembler of a certain directive, certain characteristics can be assigned to this name;

3) an operation code (COP) and a directive are mnemonic designations of the corresponding machine instruction, macroinstruction or translator directive;

4) operands - parts of the command, macro or assembler directives, denoting objects on which operations are performed. Assembler operands are described by expressions with numeric and text constants, variable labels and identifiers using operator signs and some reserved words.

How to use syntax diagrams? It's very simple: all you need to do is find and then follow the path from the diagram's input (left) to its output (right). If such a path exists, then the sentence or construction is syntactically correct. If there is no such path, then the compiler will not accept this construction. When working with syntax diagrams, pay attention to the direction of the traversal indicated by the arrows, as among the paths there may be those that can be followed from right to left. In fact, syntactic diagrams reflect the logic of the translator when parsing the input sentences of the program.

Allowed characters when writing the text of programs are:

1) all Latin letters: A - Z, a - z. In this case, uppercase and lowercase letters are considered equivalent;

2) numbers from 0 to 9;

3) signs ?, @, S, _, &;

4) separators.

Assembler sentences are formed from lexemes, which are syntactically inseparable sequences of valid language symbols that make sense for the translator.

The tokens are as follows.

1. Identifiers are sequences of valid characters used to designate program objects such as operation codes, variable names, and label names. The rule for writing identifiers is as follows: an identifier can consist of one or more characters. As characters, you can use letters of the Latin alphabet, numbers and some special characters - _, ?, $, @. An identifier cannot start with a digit character. The length of the identifier can be up to 255 characters, although the translator accepts only the first 32 and ignores the rest. You can adjust the length of possible identifiers using the mv command line option. In addition, it is possible to tell the translator to distinguish between uppercase and lowercase letters or ignore their difference (which is done by default). The /mu, /ml, /mx command line options are used for this.

2. Chains of characters - sequences of characters enclosed in single or double quotes.

3. Integers in one of the following number systems: binary, decimal, hexadecimal. Identification of numbers when writing them in assembler programs is carried out according to certain rules:

1) decimal numbers do not require any additional characters to be identified, for example, 25 or 139;

2) to identify binary numbers in the source text of the program, it is necessary to put the Latin "b" after writing the zeros and ones that make up them, for example, 10010101 b;

3) Hexadecimal numbers have more conventions when writing:

a) firstly, they consist of the numbers 0...9, lowercase and uppercase letters of the Latin alphabet a, b, c, d, e, Gili D B, C, D, E, E

b) secondly, the translator may have difficulty recognizing hexadecimal numbers due to the fact that they can consist of only digits 0...9 (for example, 190845) or begin with a letter of the Latin alphabet (for example, efl5 ). In order to “explain” to the translator that a given token is not a decimal number or an identifier, the programmer must highlight the hexadecimal number in a special way. To do this, write the Latin letter “h” at the end of the sequence of hexadecimal digits that make up a hexadecimal number. This is a must. If a hexadecimal number begins with a letter, then a leading zero is written before it: 0 efl5 h.

Thus, we figured out how the sentences of an assembler program are constructed. But this is only the most superficial view.

Almost every sentence contains a description of the object on which or with the help of which some action is performed. These objects are called operands. They can be defined as follows: operands are objects (some values, registers or memory cells) that are affected by instructions or directives, or they are objects that define or refine the action of instructions or directives.

Operands can be combined with arithmetic, logical, bitwise, and attribute operators to calculate some value or determine a memory location that will be affected by a given command or directive.

Let us consider in more detail the characteristics of the operands in the following classification:

1) constant or immediate operands - a number, string, name or expression that has some fixed value. The name must not be relocatable, that is, it must not depend on the address of the program to be loaded into memory. For example, it can be defined with the equal or = operators;

2) address operands, set the physical location of the operand in memory by specifying two components of the address: segment and offset (Fig. 7);

Rice. 7. Syntax of description of address operands

3) relocatable operands - any symbolic names representing some memory addresses. These addresses may indicate the memory location of some instructions (if the operand is a label) or data (if the operand is the name of a memory location in the data segment).

Relocatable operands differ from address operands in that they are not tied to a specific physical memory address. The segment component of the address of the operand being moved is unknown and will be determined after the program is loaded into memory for execution.

The address counter is a specific kind of operand. It is denoted by the sign S. The specificity of this operand is that when the assembler translator encounters this symbol in the source program, it substitutes the current value of the address counter instead. The value of the address counter, or placement counter as it is sometimes called, is the offset of the current machine instruction from the beginning of the code segment. In the listing format, the second or third column corresponds to the address counter (depending on whether the column with the nesting level is present or not in the listing). If we take any listing as an example, then it is clear that when the translator processes the next assembler instruction, the address counter increases by the length of the generated machine instruction. It is important to understand this point correctly. For example, processing assembler directives does not change the counter. Directives, unlike assembler commands, are only instructions to the compiler to perform certain actions to form the machine representation of the program, and for them the compiler does not generate any constructs in memory.

When using such an expression to jump, be aware of the length of the instruction itself in which this expression is used, since the value of the address counter corresponds to the offset in the instruction segment of this instruction, and not of the instruction following it. In our example, the jmp command takes 2 bytes. But be careful, the length of an instruction depends on what operands it uses. An instruction with register operands will be shorter than an instruction with one of its operands located in memory. In most cases, this information can be obtained by knowing the format of the machine instruction and by analyzing the listing column with the instruction's object code;

4) register operand is just a register name. In an assembler program, you can use the names of all general purpose registers and most system registers;

5) base and index operands. This operand type is used to implement indirect base, indirect index addressing, or combinations and extensions thereof;

6) Structural operands are used to access a specific element of a complex data type called a structure.

Records (similar to a struct type) are used to access a bit field of some record.

Operands are elementary components that form part of a machine instruction, denoting the objects on which the operation is performed. In a more general case, operands can be included as components in more complex formations called expressions. Expressions are combinations of operands and operators considered as a whole. The result of expression evaluation can be the address of some memory cell or some constant (absolute) value.

We have already considered the possible types of operands. We now list the possible types of assembler operators and the syntactic rules for the formation of assembler expressions, and give a brief description of the operators.

1. Arithmetic operators. These include:

1) unary "+" and "-";

2) binary "+" and "-";

3) multiplication "*";

4) integer division "/";

5) getting the remainder from the division "mod".

These operators are located at precedence levels 6,7,8 in Table 4.

Rice. 8. Syntax of arithmetic operations

2. Shift operators shift the expression by the specified number of bits (Fig. 9).

Rice. 9. Syntax of shift operators

3. Comparison operators (return the value "true" or "false") are intended for the formation of logical expressions (Fig. 10 and Table 3). The logical value "true" corresponds to a digital unit, and "false" - to zero.

Rice. 10. Syntax of comparison operators

Table 3. Comparison operators

4. Logical operators perform bitwise operations on expressions (Fig. 11). Expressions must be absolute, i.e., such, the numerical value of which can be calculated by the translator.

Rice. 11. Syntax of logical operators

5. Index operator []. Parentheses are also an operator, and the translator perceives their presence as an instruction to add the value of expression_1 behind these brackets with expression_2 enclosed in brackets (Fig. 12).

Rice. 12. Index operator syntax

Note that the following designation is adopted in the literature on assembler: when the text refers to the contents of a register, its name is taken in parentheses. We will also adhere to this notation.

6. The ptr type redefinition operator is used to redefine or qualify the type of a label or variable defined by an expression (Fig. 13).

The type can take one of the following values: byte, word, dword, qword, tbyte, near, far.

Rice. 13. Syntax of type redefinition operator

7. The segment redefinition operator ":" (colon) forces the calculation of a physical address relative to a specifically specified segment component: "segment register name", "segment name" from the corresponding SEGMENT directive, or "group name" (Fig. 14). When discussing segmentation, we talked about the fact that the microprocessor at the hardware level supports three types of segments - code, stack and data. What is this hardware support? For example, to select the execution of the next command, the microprocessor must necessarily look at the contents of the segment register cs and only it. And this register, as we know, contains the (not yet shifted) physical address of the beginning of the instruction segment. To get the address of a particular instruction, the microprocessor needs to multiply the contents of cs by 16 (which means a shift by four bits) and add the resulting 20-bit value to the 16-bit contents of the ip register. Approximately the same thing happens when the microprocessor processes the operands in the machine instruction. If it sees that the operand is an address (an effective address that is only part of the physical address), then it knows which segment to look for it in - by default, it is the segment whose start address is stored in segment register ds.

But what about the stack segment? In the context of our consideration, we are interested in the sp and bp registers. If the microprocessor sees one of these registers as an operand (or part of it, if the operand is an expression), then by default it forms the physical address of the operand, using the contents of the ss register as its segment component. This is a set of microprograms in the microprogram control unit, each of which executes one of the instructions in the microprocessor machine instruction system. Each microprogram works according to its own algorithm. Of course, you cannot change it, but you can slightly correct it. This is done using the optional machine command prefix field. If we agree on how the command works, then this field is missing. If we want to make an amendment (if, of course, it is permissible for a particular command) to the algorithm of the command, then it is necessary to form the appropriate prefix.

A prefix is ​​a one-byte value whose numerical value determines its purpose. The microprocessor recognizes by the specified value that this byte is a prefix, and further work of the microprogram is performed taking into account the received instruction to correct its work. Now we are interested in one of them - the segment replacement (redefinition) prefix. Its purpose is to indicate to the microprocessor (and in fact, the firmware) that we do not want to use the default segment. The possibilities for such a redefinition are, of course, limited. The command segment cannot be redefined, the address of the next executable command is uniquely determined by the cs: ip pair. And here segments of a stack and data - it is possible. That's what the ":" operator is for. The assembler translator, processing this statement, generates the corresponding one-byte segment replacement prefix.

Rice. 14. Syntax of the segment redefinition operator

8. The structure type naming operator "."(dot) also forces the compiler to perform certain calculations if it occurs in an expression.

9. The operator for obtaining the segment component of the address of the expression seg returns the physical address of the segment for the expression (Fig. 15), which can be a label, variable, segment name, group name, or some symbolic name.

Rice. 15. Syntax of the segment component receiving operator

10. The operator for obtaining the offset of the expression offset allows you to get the value of the offset of the expression (Fig. 16) in bytes relative to the beginning of the segment in which the expression is defined.

Rice. 16. Syntax of the offset get operator

As in high-level languages, the execution of assembler operators when evaluating expressions is carried out in accordance with their priorities (Table 4). Operations with the same priority are executed sequentially from left to right. Changing the order of execution is possible by placing parentheses that have the highest precedence.

Table 4. Operators and their precedence

3. Segmentation Directives

In the course of the previous discussion, we found out all the basic rules for writing instructions and operands in an assembly language program. The question of how to properly format the sequence of commands so that the translator can process them and the microprocessor can execute them remains open.

When considering the architecture of the microprocessor, we learned that it has six segment registers, through which it can work simultaneously:

1) with one code segment;

2) with one stack segment;

3) with one data segment;

4) with three additional data segments.

Recall again that a segment is physically a memory area occupied by commands and (or) data whose addresses are calculated relative to the value in the corresponding segment register.

The syntactic description of a segment in assembler is the construction shown in Figure 17:

Rice. 17. Segment description syntax

It is important to note that the functionality of a segment is somewhat broader than simply breaking the program into blocks of code, data, and stack. Segmentation is part of a more general mechanism related to the concept of modular programming. It involves the unification of the design of object modules created by the compiler, including those from different programming languages. This allows you to combine programs written in different languages. It is for the implementation of various options for such a union that the operands in the SEGMENT directive are intended.

Consider them in more detail.

1. The segment alignment attribute (alignment type) tells the linker to ensure that the beginning of the segment is placed on the specified boundary. This is important because proper alignment makes data access faster on i80x86 processors. Valid values ​​for this attribute are as follows:

1) BYTE - alignment is not performed. A segment can start at any memory address;

2) WORD - the segment starts at an address that is a multiple of two, i.e. the last (least significant) bit of the physical address is 0 (aligned to the word boundary);

3) DWORD - the segment starts at an address that is a multiple of four, i.e. the last two (least significant) bits are 0 (double word boundary alignment);

4) PARA - the segment starts at an address that is a multiple of 16, i.e. the last hexadecimal digit of the address must be Oh (alignment to the paragraph boundary);

5) PAGE - the segment starts at an address that is a multiple of 256, i.e. the last two hexadecimal digits must be 00h (aligned to the boundary of a 256-byte page);

6) MEMPAGE - the segment starts at an address that is a multiple of 4 KB, i.e. the last three hexadecimal digits must be OOOh (the address of the next 4 KB memory page). The default alignment type is PARA.

2. The combine segment attribute (combinatorial type) tells the linker how to combine segments of different modules that have the same name. The segment combination attribute values ​​can be:

1) PRIVATE - the segment will not be merged with other segments with the same name outside of this module;

2) PUBLIC - causes the linker to connect all segments with the same name. The new merged segment will be whole and continuous. All addresses (offsets) of objects, and this may depend on the type of command and data segment, will be calculated relative to the beginning of this new segment;

3) COMMON - places all segments with the same name at the same address. All segments with the given name will overlap and share memory. The size of the resulting segment will be equal to the size of the largest segment;

4) AT xxxx - locates the segment at the absolute address of the paragraph (paragraph is the amount of memory, a multiple of 16; therefore, the last hexadecimal digit of the paragraph address is 0). The absolute address of a paragraph is given by xxx. The linker places the segment at a given memory address (this can be used, for example, to access video memory or a ROM> area), taking into account the combining attribute. Physically, this means that the segment, when loaded into memory, will be located starting from this absolute address of the paragraph, but to access it, the value specified in the attribute must be loaded into the corresponding segment register. All labels and addresses in a segment thus defined are relative to the given absolute address;

5) STACK - definition of a stack segment. Causes the linker to connect all segments with the same name and calculate the addresses in these segments relative to the ss register. The combined type STACK (stack) is similar to the combined type PUBLIC, except that the ss register is the standard segment register for stack segments. The sp register is set to the end of the concatenated stack segment. If no stack segment is specified, the linker will issue a warning that no stack segment was found. If a stack segment is created and the combined STACK type is not used, the programmer must explicitly load the segment address into the ss register (similar to the ds register).

The combination attribute defaults to PRIVATE.

3. A segment class attribute (class type) is a quoted string that helps the linker determine the appropriate segment order when assembling a program from multiple module segments. The linker combines all segments with the same class name together in memory (the class name can generally be anything, but it is better if it reflects the functionality of the segment). A typical use of a class name is to group together all the code segments of a program (usually the "code" class is used for this). Using the class typing mechanism, you can also group initialized and uninitialized data segments.

4. Segment size attribute. For i80386 and higher processors, segments can be 16-bit or 32-bit. This primarily affects the size of the segment and the order in which the physical address is formed within it. The attribute can take the following values:

1) USE16 - this means that the segment allows 16-bit addressing. When forming a physical address, only a 16-bit offset can be used. Accordingly, such a segment can contain up to 64 KB of code or data;

2)USE32 - the segment will be 32-bit. When forming a physical address, a 32-bit offset can be used. Therefore, such a segment can contain up to 4 GB of code or data.

All segments are equal in themselves, since the SEGMENT and ENDS directives do not contain information about the functional purpose of the segments. In order to use them as code, data, or stack segments, it is necessary to inform the translator about this in advance, for which a special ASSUME directive is used, which has the format shown in Fig. 18. This directive tells the translator which segment is bound to which segment register. In turn, this will allow the translator to correctly bind the symbolic names defined in the segments. Binding of segments to segment registers is carried out using the operands of this directive, in which the segment_name must be the name of the segment, defined in the source text of the program by the SEGMENT directive or the nothing keyword. If only the keyword nothing is used as an operand, then the previous segment register assignments are canceled, and for all six segment registers at once. But the keyword nothing can be used instead of the segment name argument; in this case, the connection between the segment with the name segment name and the corresponding segment register will be selectively broken (see Fig. 18).

Rice. 18. ASSUME Directive

For simple programs containing one segment for code, data, and stack, we would like to simplify its description. To do this, the translators MASM and TASM introduced the ability to use simplified segmentation directives. But here a problem arose related to the fact that it was necessary to somehow compensate for the inability to directly control the placement and combination of segments. To do this, together with simplified segmentation directives, they began to use the directive for specifying the MODEL memory model, which partially began to control the placement of segments and perform the functions of the ASSUME directive (therefore, when using simplified segmentation directives, the ASSUME directive can be omitted). This directive binds segments, which in the case of using simplified segmentation directives, have predefined names, with segment registers (although you still have to explicitly initialize ds).

The syntax of the MODEL directive is shown in Figure 19.

Rice. 19. Syntax of the MODEL directive

The mandatory parameter of the MODEL directive is the memory model. This parameter defines the memory segmentation model for the POU. It is assumed that a program module can have only certain types of segments, which are defined by the simplified segment description directives we mentioned earlier. These directives are shown in Table 5.

Table 5. Simplified segment definition directives

The presence of the [name] parameter in some directives indicates that it is possible to define several segments of this type. On the other hand, the existence of several kinds of data segments is due to the requirement to ensure compatibility with some compilers of high-level languages, which create different data segments for initialized and uninitialized data, as well as constants.

When using the MODEL directive, the translator makes available several identifiers that can be accessed during program operation in order to obtain information about certain characteristics of a given memory model (Table 7). Let's list these identifiers and their values ​​(Table 6).

Table 6. Identifiers created by the MODEL directive

We can now complete our discussion of the MODEL directive. The operands of the MODEL directive are used to specify a memory model that defines the set of program segments, the sizes of data and code segments, and the method of linking segments and segment registers. Table 7 shows some values ​​of the "memory model" parameter of the MODEL directive.

Table 7. Memory Models

The "modifier" parameter of the MODEL directive makes it possible to clarify some features of the use of the selected memory model (Table 8).

Table 8. Memory model modifiers

The optional parameters "language" and "language modifier" define some features of procedure calls. The need to use these parameters arises when writing and linking programs in various programming languages.

The standard and simplified segmentation directives we have described are not mutually exclusive. Standard directives are used when the programmer wishes to have complete control over the placement of segments in memory and their combination with segments from other modules.

Simplified directives are useful for simple programs and programs intended for linking with program modules written in high-level languages. This allows the linker to efficiently link modules from different languages ​​by standardizing linking and management.

Author: Tsvetkova A.V.

<< Back: Assembly programs (Assembler program structure. Assembler syntax. Comparison operators. Operators and their precedence. Simplified segment definition directives. Identifiers created by the MODEL directive. Memory models. Memory model modifiers)

>> Forward: commands (Data transfer commands. Arithmetic commands)

We recommend interesting articles Section Lecture notes, cheat sheets:

Microbiology. Lecture notes

Operative surgery. Lecture notes

History of psychology. Crib

See other articles Section Lecture notes, cheat sheets.

Read and write useful comments on this article.

<< Back

Latest news of science and technology, new electronics:

The existence of an entropy rule for quantum entanglement has been proven 09.05.2024

Quantum mechanics continues to amaze us with its mysterious phenomena and unexpected discoveries. Recently, Bartosz Regula from the RIKEN Center for Quantum Computing and Ludovico Lamy from the University of Amsterdam presented a new discovery that concerns quantum entanglement and its relation to entropy. Quantum entanglement plays an important role in modern quantum information science and technology. However, the complexity of its structure makes understanding and managing it challenging. Regulus and Lamy's discovery shows that quantum entanglement follows an entropy rule similar to that for classical systems. This discovery opens new perspectives in the field of quantum information science and technology, deepening our understanding of quantum entanglement and its connection to thermodynamics. The results of the study indicate the possibility of reversibility of entanglement transformations, which could greatly simplify their use in various quantum technologies. Opening a new rule ... >>

Mini air conditioner Sony Reon Pocket 5 09.05.2024

Summer is a time for relaxation and travel, but often the heat can turn this time into an unbearable torment. Meet a new product from Sony - the Reon Pocket 5 mini-air conditioner, which promises to make summer more comfortable for its users. Sony has introduced a unique device - the Reon Pocket 5 mini-conditioner, which provides body cooling on hot days. With it, users can enjoy coolness anytime, anywhere by simply wearing it around their neck. This mini air conditioner is equipped with automatic adjustment of operating modes, as well as temperature and humidity sensors. Thanks to innovative technologies, Reon Pocket 5 adjusts its operation depending on the user's activity and environmental conditions. Users can easily adjust the temperature using a dedicated mobile app connected via Bluetooth. Additionally, specially designed T-shirts and shorts are available for convenience, to which a mini air conditioner can be attached. The device can oh ... >>

Energy from space for Starship 08.05.2024

Producing solar energy in space is becoming more feasible with the advent of new technologies and the development of space programs. The head of the startup Virtus Solis shared his vision of using SpaceX's Starship to create orbital power plants capable of powering the Earth. Startup Virtus Solis has unveiled an ambitious project to create orbital power plants using SpaceX's Starship. This idea could significantly change the field of solar energy production, making it more accessible and cheaper. The core of the startup's plan is to reduce the cost of launching satellites into space using Starship. This technological breakthrough is expected to make solar energy production in space more competitive with traditional energy sources. Virtual Solis plans to build large photovoltaic panels in orbit, using Starship to deliver the necessary equipment. However, one of the key challenges ... >>

Random news from the Archive

City of the future from Toyota 12.01.2020

The president of Toyota Motor Corporation announced the company's plans to build a futuristic prototype city. This city, already called Woven City, will be built near Mount Fuji on the territory of the old Toyota manufacturing complex in Higashi-Fuji, an area of ​​​​about 70 hectares, and this area will be filled with futuristic buildings and infrastructure designed to explore the question of how humans and robots can coexist in harmony.

At this stage, the Woven City project is still in its early stages, with the start of the first construction work scheduled for 2021. Once completed, this place will become a fully controlled city where people live, work and play in one "big laboratory", while engineers and scientists are free to develop and test in the real world the latest technologies related to artificial intelligence, autonomous movement, service, robotics and smart home technologies.

Woven City's interconnected infrastructure is set to become the most environmentally friendly and sustainable urban infrastructure to date. It will widely use the technology of hydrogen fuel cells from Toyota, which will invite all interested scientists from all over the world to cooperate in this area. The population of Woven City will consist of permanent residents, who will be technicians and maintenance personnel, and visitors, scientists and engineers, who will reside in the city temporarily to test their own technologies.

The Woven City project is being developed by Danish architect Bjarke Ingels, who is trying to reproduce in this city the typical streets that can be found in any modern city. Each street in Woven City will be divided into three sections, one for automatic vehicles, one for personal mobility systems (bicycles, electric scooters, etc.), and one for pedestrians. Such streets will form a grid, dividing the city into blocks, each of which will be either a park or a block with its own courtyard.

All of the buildings in Woven City will be constructed from wood and will feature traditional Japanese carpentry combined with "new automated manufacturing techniques" in their architecture. Each building in the city will play the role of both a place of residence for people and their place of work. Almost the entire "industrial infrastructure", including automated lines for the delivery of goods, will be hidden underground, and artificial intelligence and robots will take over absolutely all daily routine work, freeing up people more time for creative activities or recreation.

Other interesting news:

▪ Micron phone camera sensor

▪ Computer with GTX Titan and liquid cooling

▪ New models of Sony Reader

▪ From trembling in the hands

▪ Samsung ISOCELL GN2 image sensor

News feed of science and technology, new electronics

 

Interesting materials of the Free Technical Library:

▪ section of the site Signal limiters, compressors. Article selection

▪ article Concrete wells. Tips for the home master

▪ article How much blood is in our body? Detailed answer

▪ article Sister-mistress. Job description

▪ article Instruments for determining wind parameters. Encyclopedia of radio electronics and electrical engineering

▪ Article Toaster. Encyclopedia of radio electronics and electrical engineering

Leave your comment on this article:

Name:


Email (optional):


A comment:





All languages ​​of this page

Home page | Library | Articles | Website map | Site Reviews

www.diagram.com.ua

www.diagram.com.ua
2000-2024