Example Programs

Example Programs

Programming is at once a skill and an art. Just as anyone may learn to play a musical instrument after sufficient instruction and practice. so may anyone learn to program a computer. Some individuals. however. have a gift for programming that sets them apart from their peers with the same level of experience. just as some musicians are more tal­ented than their contemporaries.

Gifted or not. you will not become adept at programming until you have written and rewritten many programs. The emphasis here is on practice; you can read many books on how to ride a bicycle, but you do not know how to ride until you do it.

If some of the examples and problems seem trivial or without any "real-world" appli­cation. remember the playing of scales on a piano by a budding musician. Each example will be done using several methods; the best method depends upon what resource is in short supply. If programming time is valuable. then the best program is the one that uses the fewest lines of code; if either ROM or execution time is limited. then the program that uses the fewest code bytes is best.

¨ EXAMPLE PROBLEM 3.1

Copy the byte in TCON to register R2 using at least four different methods.

· Method1: Use the direct address for TCON (88h) and register R2.

Mnemonic Operation

MOV R2.88h Copy TCON to R2

· Method 2: Use the direct addresses for TCON and R2.

Mnemonic Operation

MOV 02h.88h Copy TCON to direct address 02h (R2)

· Method 3: Use R1 as a pointer to R2 and use the address of TCON.

Mnemonic Operation

MOV R1,#02h Use R1 as a pointer to R2

MOV @R1 .88h Copy TCON byte to address in R1 (02h = R2)

· Method 4: Push the contents of TCON into direct address 02h (R2).

Mnemonic Operation

MOV 81h.#01h Set the SP to address 01 h in RAM

PUSH 88h Push TCON (88h) to address 02h (R2)

¨ EXAMPLE PROBLEM 3.2

Set timer T0 to an initial setting of 1234h.

· Method 1: Use the direct address with an immediate number to set THO and TLO.

Mnemonic Operation

MOV 8Ch,#12h Set TH0 to 12h

MOV 8Ah,#34h Set TL0 to 34h

Totals: 6 bytes, 2 lines

· Method 2: Use indirect addressing with RO for TLO and RI for THO.

Mnemonic Operation

MOV R0,#8Ah Copy 8Ah, the direct address of TL0, to R0

MOV R1,#8Ch Copy 8Ch, the direct address of TH0, to R1

MOV @R0,#34h Copy 34h to TLO

MOV @R1,#12h Copy 12h to THO

Totals: 8 bytes, 4 lines

The first method is also the better method in this example.

¨ EXAMPLE PROBLEM 3.3

Put the number 34h in registers R5, R6, and R7.

· Method 1: Use an immediate number and register addressing.

Mnemonic Operation

MOV R5,#34h Copy 34h to R5

MOV R6,#34h Copy 34h to R6

MOV R7,#34h Copy 34h to R7

Totals: 6 bytes, 3 lines

· Method 2: Since the number is the same for each register, put the number in A and MOV A to each register.

Mnemonic Operation

MOV A,#34h Copy a 34h to A

MOV R5,A Copy A to R5

MOV R6,A Copy A to R6

MOV R7,A Copy A to R7

Totals: 5 bytes, 4 lines

· Method 3: Copy one direct address to another.

Mnemonic Operation

MOV R5,#34h Copy 34h to register R5

MOV 06h,05h Copy R5 (add 05) to R6 (add 06)

MOV 07h,06h Copy R6 to R7

Totals: 8 bytes, 3 lines

¨ EXAMPLE PROBLEM 3.4

Put the number 80h in RAM locations 30h to 34h.

· Method 1: Use the immediate number to a direct address:

Mnemonic Operation

MOV 30h,#8Dh Copy the number 80h to RAM address 30h

MOV 31h,#8Dh Copy the number 80h to RAM address 31 h

MOV 32h,#8Dh Copy the number 8Dh to RAM address 32h

MOV 33h,#8Dh Copy the number 80h to RAM address 33h

MOV 34h,#8Dh Copy the number 80h to RAM address 34h

Totals: 15 bytes,5 lines

· Method 2: Using the immediate number in each instruction uses bytes; use a register to hold the number:

Mnemonic Operation

MOV A,#80h Copy the number 80h to the A register

MOV 30h,A Copy the contents of A to RAM address 30h

MOV 31h,A Copy the contents of A to the remaining addresses

MOV 32h,A

MOV 33h,A

MOV 34h,A Totals: 12 bytes, 6 lines

· Method 3: There must be a way to avoid naming each address; the PUSH opcode can increment to each address:

Mnemonic Operation

MOV 30h,#8Dh Copy the number 8Dh to RAM address 30h

MOV 81h,#3Dh Set the SP to 30h

PUSH 30h Push the contents of 30h (=8Dh) to address 31h

PUSH 30h Continue pushing to address 34h

PUSH 30h

PUSH 30h Totals: 14 bytes, 6 lines

COMMENT

Indirect addressing with the number in A and the indirect address in R 1 could be done; how­ever, R 1 would have to be loaded with each address from 30h to 34h. Loading R 1 would take a total of 17 bytes and 11 lines of code. Indirect addressing is advantageous when we have opcodes that can change the contents of the pointing registers automatically.

Comments

Popular posts from this blog

80386 pins and signals , 80386 modes , 80386 system design and 80386 i/o

Multi-Tasking and Real-Time Operating Systems:Random Number Generator

Advanced PIC18 Projects—SD Card Projects:Using the Card Filing System