Chapter 1 Information encoding This chapter discusses the elementary knowledge about the information encoding, whose under- staing is essential for anyone wishing to learn programming. What does a particular bit mean, depends of course on the question for which that bit is an answer. The content of that answer we call the value of bit, and in the world of computers it is usually written as a single digit, 1 for positive answer and 0 for negative. If we have more bits, they can give us more information - as if we were asking more and more detailed questions about what interest us. And computers use some common schemmas for interpreting a bunch of bits as a some particular kind of information — a number, text, image or sound.
|Published (Last):||17 November 2018|
|PDF File Size:||5.23 Mb|
|ePub File Size:||1.15 Mb|
|Price:||Free* [*Free Regsitration Required]|
Jemal Musa 1 Assembler Tutorial for Beginners Part 1 This tutorial is intended for those who are not familiar with assembler at all, or have a very distant idea about it. But even if you are familiar with assembler, it is still a good idea to look through this document in order to study emu syntax. What is an assembly language? Assembly language is a low level programming language. You need to get some knowledge about computer structure in order to understand anything.
The simple computer model as I see it: The system bus shown in yellow connects the various components of a computer. RAM is a place to where the programs are loaded in order to be executed. Emerson Giovani Carati, Dr. The main purpose of a register is to keep a number variable.
Therefore, when you modify any of the 8 bit registers 16 bit register is also updated, and vice-versa. The same is for other 3 registers, "H" is for high and "L" is for low part. Because registers are located inside the CPU, they are much faster than memory.
Accessing a memory location requires the use of a system bus, so it takes much longer. Accessing data in a register usually takes no time. Therefore, you should try to keep variables in the registers. Register sets are very small and most registers have special purposes which limit their use as variables, but they are still an excellent place to store temporary data of calculations.
Although it is possible to store any data in the segment registers, this is never a good idea. The segment registers have a very special purpose - pointing at accessible blocks of memory. Segment registers work together with general purpose register to access any memory value. This is good, since this way we can access much more memory than with a single register that is limited to 16 bit values.
Other general purpose registers cannot form an effective address! IP register always works together with CS segment register and it points to currently executing instruction.
Flags Register is modified automatically by CPU after mathematical operations, this allows to determine the type of the result, and to determine conditions to transfer control to other parts of the program. Generally you cannot access these registers directly.
Combining these registers inside [ ] symbols, we can get different memory locations. Displacement can be a immediate value or offset of a variable, or even both. Displacement can be inside or outside of [ ] symbols, compiler generates the same machine code for both ways. Displacement is a signed value, so it can be both positive or negative. Generally the compiler takes care about difference between d8 and d16, and generates the required machine code.
By default DS segment register is used for all modes except those with BP register, for these SS segment register is used. There is an easy way to remember all those possible combinations using this chart: Assembler Tutorial Prof. As you see BX and BP never go together. When DS contains value h and SI contains the value h it can be also recorded as MicroAsm supports shorter prefixes as well: b.
Select the above text using mouse, click before the text and drag it down until everything is selected. As you may guess, ";" is used for comments, anything after ";" symbol is ignored by compiler. You should see something like that when program finishes: this is how it looks in emu microprosessor emulator.
Actually the above program writes directly to video memory, so you may see that MOV is a very powerful instruction. For a programmer it is much easier to have some value be kept in a variable named "var1" then at the address 5AB, especially when you have 10 or more variables.
DW - stays for Define Word. As you probably know from part 2 of this tutorial, MOV instruction is used to copy values from source to destination.
Then open the executable in any disassembler emu or any other. Compiler is not case sensitive, so "VAR1" and "var1" refer to the same variable. It is assumed that low byte is stored at lower address, so 34h is located before 12h.
You can see that there are some other instructions after the RET instruction, this happens because disassembler has no idea about where the data starts, it just processes the values in memory and it understands them as valid instructions we will learn them later. You should get the same disassembled code, and the same functionality!
As you may guess, the compiler just converts the program source to the set of bytes, this set is called machine code, processor understands the machine code and executes it. ORG h is a compiler directive it says to compiler how to handle the source code. This directive is very important when you work with variables. It says to compiler that the executable file will be loaded at the offset of h bytes , so compiler should calculate the correct address for all variables when it replaces the variable names with their offsets.
Directives are never converted to any real machine code. Why executable file is loaded at offset of h? Operating system keeps some data about the program in the first bytes of the CS code segment , such as command line parameters and etc. Though this is true for COM files only, EXE files are loaded at offset of , and generally use special segment for variables.
DW cannot be used to declare strings! The expansion of DUP operand should not be over characters! LEA is more powerful because it also allows you to get the address of an indexed variables. Getting the address of the variable can be very useful in some situations, for example when you need to pass parameters to a procedure. After definition of a constant its value cannot be changed. To view arrays you should click on a variable andset Elements property to array size.
In assembly language there are not strict data types, so any variable can be presented as an array. It is possible to enter numbers in any system, hexadecimal numbers should have "h" suffix, binary "b" suffix, octal "o" suffix, decimal numbers require no suffix. Arrays may be entered this way: 1, 2, 3, 4, 5 the array can be array of bytes or words, it depends whether BYTE or WORD is selected for edited variable.
These functions make the programming much easier, instead of writing a code to print a character you can simply call the interrupt and it will do everything for you. There are also interrupt functions that work with disk drive and other hardware. We call such functions software interrupts. Interrupts are also triggered by different hardware, these are called hardware interrupts. Currently we are interested in software interrupts only. To make a software interrupt there is an INT instruction, it has very simple syntax: INT value where value can be a number between 0 to or 0 to 0FFh , generally we will use hexadecimal numbers.
You may think that there are only functions, but that is not correct. Each interrupt may have sub-functions. To specify a sub-function AH register should be set before calling interrupt. In general AH register is used, but sometimes other registers maybe in use. Generally other registers are used to pass parameters and data to sub-function.
This functions displays a character on the screen, advancing the cursor and scrolling the screen as necessary. ORG h ; The sub-function that we are using ; does not modify the AH register on ; return, so we may set it only once. RET ; returns to operating system. Run it! See list of basic interrupts for information about other interrupts. Compiler automatically searches for the file in the same folder where the source file is located, and if it cannot find the file there - it searches in Inc folder.
Currently you may not be able to fully understand the contents of the emu To use any of the functions in emu To use any of the above macros simply type its name somewhere in your code, and if required parameters, for example: include emu END ; directive to stop the compiler.
Generally macros are relatively small parts of code, frequent use of a macro may make your executable too big procedures are better for size optimization. To use any of the above procedures you should first declare the function in the bottom of your file but before END!!
For example: Assembler Tutorial Prof. RET ; return to operating system. First compiler processes the declarations these are just regular the macros that are expanded to procedures. When compiler gets to CALL instruction it replaces the procedure name with the address of the code where the procedure is declared. When CALL instruction is executed control is transferred to procedure. This is quite useful, since even if you call the same procedure times in your code you will still have relatively small executable size.
When there is no overflow this flag is set to 0. For none zero result this flag is set to 0. When result is positive it is set to 0.
Actually this flag take the value of the most significant bit. Even if result is a word only 8 low bits are analyzed! After operation between operands, result is always stored in first operand. CMP and TEST instructions affect flags only and do not store a result these instruction are used to make decisions during program execution.
The application features an integrated assembler and compiler that can output bit compatible code and bundles a collection of simple examples that can help you view how exactly a program is executed by the microprocessor, with the commands and the code lines that correspond to each step. Double-clicking on a register value opens a new window where you can view the data type, hex and binary values. The emulator provides support for the complete instruction set and allows you to view the generated screen, memory values, symbol tables, ASCII codes, stacks, flags and variables, while detected errors are displayed within a separate window. Editing options are also available, which allows programmers to experiment with new instructions. The code editor features syntax highlighting and line numbering. The advanced search options, along with the bookmarking system allows convenient navigation throughout the code.
Assembly Programming Tutorial
But even if you are familiar with assembler, it is still a good idea to look through this document in order to study Emu syntax. What is an assembly language? Assembly language is a low level programming language. You need to get some knowledge about computer structure in order to understand anything. The simple computer model as I see it: The system bus shown in yellow connects the various components of a computer. RAM is a place to where the programs are loaded in order to be executed. SI - source index register.
You can watch and change them during the executing of your code. Generally operating system sets values of these registers on program start. The current address pointed by SS:SP is called the top of the stack. Compiling Assembly Code Type your code inside the text area, and click [Compile] button. You will be asked for a place where to save the compiled file.