Vous êtes sur la page 1sur 48

Assembly Language Programming

CPU

CPU

The CPU contains a Control Unit, Arithmetic Logic Unit (ALU) and a small number of memory locations called Registers. Different registers perform different tasks such:
as manipulating data, keeping track of the results of decision making operations, and pointing to the next instruction to be executed.

CPU Registers

The Instruction Register (IR) contains the actual instruction which is currently being executed by the CPU. The Status Register records the result of comparing the contents of register A with the contents of register B. The Program Counter (PC) contains the address of the next instruction to be executed by the program.

CPU Registers

Registers A & B hold the operands for each arithmetic operation (ie. the values on which the operation will be performed). After the operation has been carried out, the result is always stored in Register B. Therefore, after an arithmetic operation has been performed, the second operand is no longer stored in Register B, because it has been overwritten by the result of the operation.

CPU Registers

The computer also has a Compare instruction that can be used to compare the contents of register A with those of register B. The comparison can have three possible outcomes:
the contents of register A < B; the contents of the register A = B; the contents of the register A > B.

CPU Registers

After a comparison has been done, the Status Register will hold a code that stores the results of the comparison. The results are coded as follows:
-1 0 1 if (A < B); if (A = B); if (A > B).

Assembly language.

Assembly language allows us to use convenient abbreviations (called mnemonics) for machine language operations and memory locations. Each assembly language is specific to a particular hardware architecture, and can only be used on a machine of that architecture. An assembly language program must be translated into machine code before it can be executed. The program that tells the computer how to perform the translation is called an assembler.

Assembly language.

When a processor chip is designed, it is designed to understand and execute a set of machine code instructions (OpCodes) unique to that chip. One step up from machine code is assembly code. Each machine code instruction is given a mnemonic (name), so that it is easier for human beings to write code. There is a one-to-one correspondence between the assembly languages mnemonic instructions and the machine language numeric instructions. A list of assembly code instructions that will perform a task is called an assembly program.

Assembly language.
Operation What it means to the CPU

STP Stop the program LDA Load register A with contents of a specified
memory location

LDB

Load register B with contents of a specified memory location

STR
INP

Store register B contents to a specified memory location


Store data input by user to a specified memory location

PNT

Print the contents of a specified memory location to the screen

Assembly language.
Operation JLT JGT What it means to the CPU
Jump if less than (Status register = -1) to a specified memory location Jump if greater than (Status register = 1) to a specified memory location Jump if equal (Status register = 0) to a specified memory location Unconditional jump to a specified memory location Register value

JEQ
JMP

CMP Compare register A to register B and set Status

Assembly language.
Operation What it means to the CPU

ADD Add (register A + register B) and


store sum in register B

SUB Subtract (register A - register B) and


store difference in register B

MUL Multiply (register A * register B) and


store product in register B

DIV

Divide for quotient (register A / register B) and store quotient in register B and store remainder in register B

MOD Divide for remainder (register A / register B)

Steps to write Assembly Programs


Create Pascal Program translate each Pascal statement to the equivalent assembly statement(s) Number the assembly language program starting from 0 Replace Memory names by number of empty memory cell Resolve jumps ( replace with number of memory cell jumping to)

Pascal to Assembly language.


Statement program const var readln writeln assignment (:=) val3 = val1 + val2 Assembly equivalent none put value in memory cell put address of memory cell INP PNT

End.

LDA Val1 LDB Val2 ADD STR Val3 STP

Assembly language.
Program #1. Write an assembly language program that will get a number as input from the user, and output its square to the user.

Assembly language.
step 1: algorithm to describe the steps needed to solve our problem.

Assembly language.
step 1: algorithm to describe the steps needed to solve our problem. 1. Input a number and store it in memory. 2. Compute the square by multiplying the number times itself. 3. Output the results.

Assembly language.
Step 2: write Pascal code

Assembly language.
Step 2: write Pascal code Var number , square: integer; begin readln ( number); square := number * number ; writeln (square); end.

Assembly Language
begin readln ( number); square := number*number; INP number LDA number LDB number MUL STR square PNT square

writeln (square); end.

STP

Assembly language.
Step 4: Number assembly code lines starting from 0 0 1 2 3 4 5 6 INP number LDA number LDB number MUL STR square PNT square STP

Assembly language.
Step 5: Replace memory names by cell numbers after STP 0 1 2 3 4 5 6 INP number LDA number LDB number MUL STR square PNT square STP 7 7 7 8 8

Assembly language.
Step 6: Final Assembly code INP 07 LDA 07 LDB 07 MUL STR 08 PNT 08 STP

Pascal to Assembly language.


Statement if ( N < 10 ) then writeln (N) Assembly equivalent LDA N (condition expression) LDB Ten CMP JOP (operation) (Then Block) JMP to statement after then block PNT N ( then block)

Pascal to Assembly language.


Statement if ( N < 10 ) then writeln (N) else writeln (0); Assembly equivalent LDA N (condition expression) LDB Ten CMP JOP (operation) (Then Block) PNT Zero ( else Block) JMP to statement after then block PNT N ( then block)

Assembly language.
Program #2. Write an assembly program that will get a number from the user, and determine if the number is evenly divisible by 5. Output zero (false) if the number is NOT evenly divisible by 5 or one (true) if the number IS evenly divisible.

Assembly language.
step 1: algorithm to describe the steps needed to solve our problem.

Assembly language.
step 1: algorithm to describe the steps needed to solve our problem. 1. Input a number and store it in memory. 2. Determine if the input number is evenly divisible by 5. 2.1Divide the input number by 5 to get the remainder. 2.2 Compare the remainder to 0. If remainder equals 0, the number is evenly divisible. If the remainder does not equal 0, the number NOT evenly divisible. 3. Output the results 3.1 If evenly divisible, output 1. 3.2 If NOT evenly divisible, output 0.

Assembly language.
Step 2: write Pascal code

Assembly language.
Step 2: write Pascal code
Const Zero = 0; One =1; Five = 5; Var number , rem: integer; begin

readln ( number); rem := number MOD Five ; if (rem = Zero) then writeln (One); else writeln (Zero)
end.

Assembly language.
Step 3: translate Pascal code to assembly
Const Zero = 0; One =1; Five = 5; Var number , rem: integer; begin

readln ( number);
rem := number MOD Five ;

INP number
LDA number LDB Five MOD STR rem

Assembly language.
Step 3: translate Pascal code to assembly
if (rem = Zero) then writeln (One); else writeln (Zero) end. else block then block condition exp LDA Zero LDB rem CMP JEQ then block PNT Zero

JMP after then PNT One STP

Assembly language.
Step 4: Number assembly code lines starting from 0
0 INP number
1 2 3 4 5 6 7 8 LDA number LDB Five MOD STR rem LDA Zero LDB rem CMP JEQ then block

condition exp

else block then block

9 PNT Zero 10 JMP after then 11 PNT One 12 STP

Assembly language.
Step 5: Replace memory names by cell numbers after STP
0 INP number 16
1 2 3 4 5 6 7 8 LDA number 16 LDB Five 13 MOD STR rem 17 LDA Zero 14 LDB rem 17 CMP JEQ then block

condition exp

else block then block

9 PNT Zero 14 10 JMP after then 11 PNT One 15 12 STP 13 5 14 0 15 1

Assembly language.
Step 5: Replace jumps by instruction numbers
0 INP 16
1 2 3 4 5 6 7 8 else block then block LDA 16 LDB 13 MOD STR 17 LDA 14 LDB 17 CMP JEQ then block 11

9 PNT 14 10 JMP after then 12 11 PNT 15 12 STP 13 5 14 0 15 1

Assembly language.
Step 6: Final Assembly code
INP 16 LDA 16 LDB 13 MOD STR 17 LDA 14 LDB 17 CMP JEQ 11 PNT 14 JMP 12 PNT 15 STP 5 0 1

Assembly language.
Statement While (N < 10 ) do begin writeln (N) end; Assembly equivalent LDA N (condition expression) LDB Ten CMP JOP (operation) (While Block) JMP to statement after while block PNT N ( while block statements) JMP Condition

Assembly language.

Program #3. Write an assembly program that will add up a series of positive numbers entered by the user, until the user enters a negative number, then display the total.

Assembly language.
step 1: algorithm to describe the steps needed to solve our problem.

Assembly language.
step 1: algorithm to describe the steps needed to solve our problem. 1. 2. Input a value and store it in memory. While the Input Value is not a negative number:

2.1 Add the Input Value to the Running Total and store the sum back into the Running Total. 2.2 Input another value and store it in memory.

3.

Output the contents of the Running Total.

Assembly language.
Step 2: write Pascal code

Assembly language.
Step 2: write Pascal code
Const Zero = 0; Var sum , number: integer; begin sum := zero; readln ( number); While ( number >= Zero) do begin sum := sum + number; readln (number); end; writeln (sum) end.

Assembly language.
Step 3: translate Pascal code to assembly
begin
sum := zero; readln ( number);
STR sum INP number LDB Zero

condition LDA number LDB Zero While ( number >= Zero) do CMP JGT (While Block) JEQ (While Block) JMP after while block

Assembly language.
Step 3: translate Pascal code to assembly
begin

sum := sum + number;

LDA sum LDB number ADD STR sum INP number

readln (number); end; writeln (sum) end.

JMP Condition
PNT sum STP

Assembly language.
Step 4: Number assembly code lines starting from 0
0 LDB Zero 1 STR sum 2 INP number condition 3 LDA number 4 LDB Zero 5 CMP 6 JGT (While Block) 7 JEQ (While Block) 8 JMP after while block 9 LDA sum 10 LDB number 11 ADD 12 STR sum 13 INP number 14 JMP Condition 15 PNT sum 16 STP

Assembly language.
Step 5: Replace memory names by cell numbers after STP
0 LDB Zero 1 STR sum
2 INP number

17 18
19

while body 9 LDA sum

18 10 LDB number 19 11 ADD 12 STR sum 18


13 INP number 19

condition 3 LDA number 19 4 LDB Zero 17 5 CMP


6 JGT (While Block) 7 JEQ (While Block) 8 JMP after while block

end while 14 JMP Condition

15 PNT sum 16 STP 17 0

18

Assembly language.
Step 5: Replace jumps by cell numbers
0 LDB 17 1 STR 18
2 INP 19 13 INP 19
while body 9 LDA 18

10 LDB 19 11 ADD 12 STR 18

condition 3 LDA 19 4 LDB 17 5 CMP


6 JGT (While Block) 9 7 JEQ (While Block) 9 8 JMP after while block 15

end while 14 JMP Condition 3

15 PNT 18 16 STP 17 0

Assembly language.
Step 6: Final Assembly code
LDB 17 STR 18 INP 19 LDA 19 LDB 17 CMP JGT 9 JEQ 9 JMP 15 LDA 18 LDB 19 ADD STR 18 INP 19 JMP 3 PNT 18 STP 0

Vous aimerez peut-être aussi