350 likes | 1.11k Vues
Chapter 2: HCS12 Assembly Programming. The HCS12 Microcontroller. Han-Way Huang. Minnesota State University, Mankato. September 2009. Three Sections of a HCS12/MC9S12 Assembly Program 1. Assembler Directives - Define data and symbol - Reserve and initialize memory locations
E N D
Chapter 2: HCS12 Assembly Programming The HCS12 Microcontroller Han-Way Huang MinnesotaState University, Mankato September 2009
Three Sections of a HCS12/MC9S12 Assembly Program 1. Assembler Directives - Define data and symbol - Reserve and initialize memory locations - Set assembler and linking condition - Specify output format - Specifies the end of a program. 2. Assembly Language Instructions - HCS12/MC9S12 instructions 3. Comments - Explain the function of a single or a group of instructions
Fields of a HCS12 Instruction 1. Label field - Optional - Starts with a letter and followed by letters, digits, or special symbols (_ or .) - Can start from any column if ended with “:” - Must start from column 1 if not ended with “:” 2. Operation field - Contains the mnemonic of a machine instruction or an assembler directive - Separated from the label by at least one space 3. Operand field - Follows the operation field and is separated from the operation field by at least one space - Contains operands for instructions or arguments for assembler directives 4. Comment field - Any line starts with an * or ; is a comment - Separated from the operand and operation field for at least one space - Optional
Identify the Four Fields of an Instruction Example loop adda #$40 ; add 40 to accumulator A (1) “loop” is a label (2) “adda” is an instruction mnemonic (3) “#$40” is the operand (4) “add #$40 to accumulator A” is a comment movb 0,X,0,Y ; memory to memory copy (1) no label field (b) “movb” is an instruction mnemonic (c) “0,X,0,Y” is the operand field (d) “; memory to memory copy” is a comment
Assembler Directives 1. end - ends a program to be processed by an assembler - any statement following the end directive is ignored 2. org - The assembler uses a location counter to keep track of the memory location where the next machine code byte should be placed. - This directive sets a new value for the location counter of the assembler. The sequence org $1000 ldab #$FF places the opcode byte for the instruction ldab #$FF at location $1000.
dc.b (define constant byte) db (define byte) fcb (form constant byte) - These three directives define the value of a byte or bytes that will be placed at a given location. - These directives are often preceded by the org directive. - For example, org $800 array dc.b $11,$22,$33,$44 dc.w (define constant word) dw (define word) fdb (form double bytes) - Define the value of a word or words that will be placed at a given location. - The value can be specified by an expression. - For example, vec_tabdc.w $1234, abc-20
fcc (form constant character) - Used to define a string of characters (a message). - The first character (and the last character) is used as the delimiter. - The last character must be the same as the first character. - The delimiter must not appear in the string. - The space character cannot be used as the delimiter. - Each character is represented by its ASCII code. - For example, msgfcc “Please enter 1, 2 or 3:”
fill (fill memory) • - This directive allows the user to fill a certain number of memory locations with a given • value. • - The syntax is fill value,count • - For example, • space_linefill $20,40 • ds (define storage) • rmb (reserve memory byte) • ds.b (define storage bytes) • Each of these directives reserves a number of bytes given as the arguments to the • directive. • - For example, • buffer ds 100 • reserves 100 bytes
ds.w (define storage word) rmw (reserve memory word) - Each of these directives increments the location counter by the value indicated in the number-of-words argument multiplied by two. - For example, dbufds.w 20 reserves 40 bytes starting from the current location counter. equ (equate) - This directive assigns a value to a label. - Using this directive makes one’s program more readable. - Examples arr_cntequ 100 oc_cntequ 50
loc - This directive increments and produces an internal counter used in conjunction with the backward tick mark (`). By using the loc directive and the ` mark one can write program segments like the following example, without thinking up new labels: loc loc ldaa #2 ldaa #2 loop` decasame as loop001 deca bne loop` bne loop001 loc loc loop` brclr 0,x,$55,loop` loop002 brclr 0,x,$55,loop002
Macro • A name assigned to a group of instructions • Use macro and endm to define a macro. • Example of macro • sumOf3 macro arg1,arg2,arg3 • ldaa arg1 • adda arg2 • adda arg3 • endm • Invoke a defined macro: write down the name and the arguments of the macro • sumOf3 $1000,$1001,$1002 • is replaced by • ldaa $1000 • adda $1001 • adda $1002
Software Development Process 1Problem definition: Identify what should be done 2Develop the algorithm. Algorithm is the overall plan for solving the problem at hand. - An algorithm is often expressed in the following format: Step 1 … Step 2 … - Another way to express the overall plan is to use flowchart. 3Programming. Convert the algorithm or flowchart into programs. 4Program Testing. 5 Program maintenance.
Programs to do simple arithmetic Example 2.4 Write a program to add the values of memory locations at $1000, $1001, and $1002, and save the result at $1100. Solution: Step 1 A m[$1000] Step 2 A A + m[$1001] Step 3 A A + m[$1002] Step 4 $802 A org $1500 ldaa $1000 adda $1501 adda $1002 staa $1100 end
Example 2.4 Write a program to subtract the contents of the memory location at $1005 from the sum of the memory locations at $1000 and $1002, and store the difference at $1100. Solution: org $1500 ldaa $1000 adda $1002 suba $1005 staa $1100 end
Example 2.6 Write a program to add two 16-bit numbers that are stored at $1000-$1001 and $1002-$1003 and store the sum at $1100-$1101. Solution: org $1500 ldd $1000 addd $1002 std $1100 end The Carry Flag - bit 0 of the CCR register - set to 1 when the addition operation produces a carry 1 - set to 1 when the subtraction operation produces a borrow 1 - enables the user to implement multi-precision arithmetic
Example 2.7 Write a program to add two 4-byte numbers that are stored at $1000-$1003 and $1004-$1007, and store the sum at $1010-$1013. Solution: Addition starts from the LSB and proceeds toward MSB. org $1500 ldd $1002 ; add and save the least significant two bytes addd $1006 ; “ std $1012 ; “ ldaa $1001 ; add and save the second most significant bytes adca $1005 ; “ staa $1011 ; “ ldaa $1000 ; add and save the most significant bytes adca $1004 ; “ staa $1010 ; “ end
Example 2.8 Write a program to subtract the hex number stored at $1004-$1007 from the • the hex number stored at $1000-$1003 and save the result at $1100-$1103. • Solution: The subtraction starts from the LSBs and proceeds toward the MSBs. • org $1500 • ldd $1002 ; subtract and save the least significant two bytes • subd $1006 ; “ • std $1102 ; “ • ldaa $1001 ; subtract and save the difference of the second to most • sbca $1005 ; significant bytes • staa $1001 ; “ • ldaa $1000 ; subtract and save the difference of the most significant • sbca $1004 ; bytes • staa $1100 ; “ • end
BCD numbers and addition - Each digit is encoded by 4 bits - Two digits are packed into one byte - The addition of two BCD numbers is performed by a binary addition and an adjust operation using the daa instruction - The instruction daa can be applied after the instructions adda,adca, and aba - Simplifies I/O conversion For example, the instruction sequence ldaa $1000 adda $1001 daa staa $1002 adds the BCD numbers stored at $1000 and $1001 and saves the sum at $1002.
Example 2.10 Write an instruction sequence to multiply the 16-bit numbers stored at $1000-$1001 and $1002-$1003 and store the product at $1100-$1103. Solution: ldd $1000 ldy $1002 emul sty $1100 std $1102 Example 2.11 Write an instruction sequence to divide the signed 16-bit number stored at $1020-$1021 into the 16-bit signed number stored at $1005-$1006 and store the quotient and remainder at $1100 and $1102, respectively. Solution: ldd $1005 ldx $1020 idivs stx $1100 ; store the quotient std $1102 ; store the remainder
Illustration of 32-bit by 32-bit Multiplication - Two 32-bit numbers M and N are divided into two 16-bit halves M = MHML N = NHNL
Example 2.12 Write a program to multiply two unsigned 32-bit numbers stored at M~M+3 and N~N+3, respectively and store the product at P~P+7. Solution: org $1000 M ds.b 4 N ds.b 4 P ds.b 8 org $1500 ldd M+2 ldy N+2 emul ; compute MLNL sty P+4 std P+6 ldd M ldy N emul ; compute MHNH sty P std P+2 ldd M ldy N+2 emul ; compute MHNL
; add MHNL to memory locations P+2~P+5 addd P+4 std P+4 tfr Y,D adcb P+3 stab P+3 adca P+2 staa P+2 ; propagate carry to the most significant byte ldaa P+1 adca #0 ; add carry to the location at P+1 staa P+1 ; “ ldaa P ; add carry to the location at P adca #0 ; “ staa P ; “ ; compute MLNH ldd M+2 ldy N emul
; add MLNH to memory locations P+2 ~ P+5 addd P+4 std P+4 tfr Y,D adcb P+3 stab P+3 adca P+2 staa P+2 ; propagate carry to the most significant byte clra adca P+1 staa P+1 ldaa P adca #0 staa P end
Example 2.13 Write a program to convert the 16-bit number stored at $1000-$1001 to BCD format and store the result at $1010-$1014. Convert each BCD digit into its ASCII code and store it in one byte. Solution: - A binary number can be converted to BCD format by using repeated division by 10. - The largest 16-bit binary number is 65535 which has five decimal digits. - The first division by 10 generates the least significant digit, the second division by 10 obtains the second least significant digit, and so on. org $1000 data dc.w 12345 ; data to be tested org $1010 result ds.b 5 ; reserve bytes to store the result org $1500 ldd data ldy #result ldx #10 idiv addb #$30 ; convert the digit into ASCII code stab 4,Y ; save the least significant digit xgdx ldx #10
idiv adcb #$30 stab 3,Y ; save the second to least significant digit xgdx ldx #10 idiv addb #$30 stab 2,Y ; save the middle digit xgdx ldx #10 idiv addb #$30 stab 1,Y ; save the second most significant digit xgdx addb #$30 stab 0,Y ; save the most significant digit end