8051
AVR
EZLab
PIC
80C196KC
DSP
ARM
VHDL
¸¶ÀÌÅ©·Î¸¶¿ì½º
·Îº¿Ã౸
Battle ·Îº¿
·Îº¿´ëȸ
È޸շκ¿
Embeded Linux
HW/SW °­ÁÂ
RTOS
 
 


2. 196À» ¹è¿öº¸ÀÚ

 

II. 196 Assember

II-II. º»°ÝÀûÀÎ 196 ¾î¼Àºí¸®¾î

II-II-3. ºñ±³(compare) ¸í·É°ú Branch ¸í·É

¿©±â¿¡¼­´Â programÀÇ ½ÇÇà ¼ø¼­¸¦ ¹Ù²Ù´Â branch ¸í·É°ú loop ¸í·É¿¡ ´ëÇØ ¾Ë¾Æº¸°Ú´Ù. ¶Ç branch ¸í·É(Á¶°Ç branch)À» È¿°úÀûÀ¸·Î ÀÌÇØÇϱâ À§Çؼ­ ºñ±³¸í·Éµµ ÇÔ²² ¾Ë¾Æº¼ °ÍÀÌ´Ù. 196KCÀÇ branch ¸í·ÉÀº Å©°Ô ´ÙÀ½°ú °°ÀÌ ³ª´­ ¼ö ÀÖ´Ù.

¨ç ¹«Á¶°Ç branch

¨è Á¶°Ç branch

¨é °£Á¢ branch

¨ê ƯÁ¤ bit test branch

¨ë ƯÀÌÇÑ Á¶°Ç branch

´ÙÀ½ÀÇ Ç¥´Â 196KCÀÇ ºñ±³ ¸í·É°ú branch ¸í·ÉÀ» ¸ðµÎ Á¤¸®ÇÑ °ÍÀÌ´Ù.

<¾Æ·¡ Ç¥¿¡ ÀÖ´Â operand ¾à¾îÀÇ ÀǹÌ>

disp : º¯À§(displacement) byte(-128~+127)

ival : immediate value

A/B : "A"´Â Á¶°ÇÀÌ ¸ÂÁö ¾ÊÀ» °æ¿ì(jump was not taken), "B"Àº Á¶°ÇÀÌ ¸ÂÀ» °æ¿ì(jump was taken)ÀÇ branch state

xxx : ¸í·É¾î¿¡ ÀÇÇؼ­ ä¿öÁö´Â address bbb : bit

<ºñ±³ ¸í·É>

mnemonic

byte

state

operands

flags

1st

2nd

Z

N

C

V

VT

ST

CMP

2+BEA

4+CEA

wreg

waop

¡î

¡î

¡î

¡î

¡è


CMPB

2+BEA

4+CEA

breg

baop

¡î

¡î

¡î

¡î

¡è


CMPL

3

7

lreg

lreg

¡î

¡î

¡î

¡î

¡è


 

<branch ¸í·É>

mnemonic

byte

state

±â°è¾î

flags

76543210

1st

2nd

3rd

Z

N

C

V

VT

ST

LJMP

3

8

11100111

disp-high

disp-low








SJMP

2

8

00100xxx

disp-low









BR

2

8

11100011

wreg









JC

2

4/8

11011011

disp









JNC

2

4/8

11010011

disp









JH

2

4/8

11011001

disp









JNH

2

4/8

11010001

disp









JE

2

4/8

11011111

disp









JNE

2

4/8

11010111

disp









JV

2

4/8

11011101

disp









JNV

2

4/8

11010101

disp









JGE

2

4/8

11010110

disp









JLT

2

4/8

11011110

disp









JVT

2

4/8

11011100

disp









JNVT

2

4/8

11010100

disp









JGT

2

4/8

11010010

disp









JLE

2

4/8

11011010

disp









JST

2

4/8

11011000

disp









JNST

2

4/8

11010000

disp









JBC

3

5/9

00110bbb

disp

breg








JBS

3

5/9

00111bbb

disp

breg








DJNZ

3

5/9

11100000

disp

breg








DJNZW

3

5/10

11100001

disp

wreg








NOP

1

4

11111101










SKIP

2

4

00000000

breg









TIJMP

4

13+5

11100010

wreg1

wreg2

ival








II-II-3-1. ºñ±³ ¸í·É

CMP/CMPB (Compare in word/byte)

ºñ±³ ¸í·ÉÀº ¿ø·¡ »ê¼ú ¿¬»ê¿¡ ¼ÓÇÏ°ÚÁö¸¸, branch ¸í·ÉÀÇ ÀÌÇظ¦ µ½±â À§ÇØ ¿©±â¿¡¼­ °°ÀÌ ¼³¸íÇÑ´Ù. ºñ±³ ¸í·ÉÀº µÎ operand¸¦ ºñ±³ÇÏ°í flag¸¦ º¯È­½ÃÅ°´Â ¿ªÇÒÀ» ÇÑ´Ù. Áï, ÀÌ ¸í·ÉµéÀº 1st operand¿¡¼­ 2nd operand¸¦ »©¼­ flag¿¡ ¿µÇâÀ» ÁְԵǸç, ¸í·É ÈÄ¿¡ µÎ operandÀÇ ³»¿ëÀº º¯ÇÏÁö ¾Ê´Â´Ù.

Çü½Ä> CMP/CPMB/CMPL <1st operand>, <2nd operand>

; 1st opÀÇ word/byte/long registerÀÇ ³»¿ë°ú 2nd opÀÇ operand¸¦ ºñ±³ÇÑ´Ù.

2nd operand´Â direct, indirect, immediate addressingÀÌ °¡´ÉÇϳª, longÀÎ °æ¿ì¿¡´Â register direct¸¸ °¡´ÉÇÏ´Ù.

ex) CMP 40H, 50H ; [40H] - [50H]¸¦ ¿¬»êÇÏ¿© ³»¿ë ºñ±³(word), flagº¯È­

 

address

low byte

high byte

Z

N

C

V

VT

ST

¸í·É ½ÇÇà Àü

50H

34H

12H







40H

78H

56H

¸í·É ½ÇÇà ÈÄ

50H

34H

12H

0

0

0

0

0


40H

78H

56H

 

(5678H - 1234H = 4444H)

CMPB 50H, #'A' ; [50H] - 41H('A'ÀÇ ASCII code)¸¦ ¿¬»êÇÏ¿© ºñ±³(byte)

address


Z

N

C

V

VT

ST

¸í·É ½ÇÇà Àü

50H

34H







¸í·É ½ÇÇà ÈÄ

50H

34H

0

1

0

0

0


 

(34H - 41H = F3(-DH))

II-II-3-2. ¹«Á¶°Ç »ó´ë branch ¸í·É

¹«Á¶°Ç ºÐ±â ¸í·ÉÀº ºñ±³ÈÄÀÇ Á¶°ÇÀ̳ª bit µîÀÇ Á¶°ÇÀ» µûÁöÁö ¾Ê°í ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¼ø¼­¸¦ ¹Ù²Ù´Â ¸í·ÉÀÌ´Ù. 196KC¿¡´Â »ó´ë branch·Î¼­ LJMP¿Í SJMP ¸í·ÉÀÌ ÀÖ´Ù. ±×·¯³ª Àý´ë(absolute) branch´Â ¾ø´Ù. jumpÇÒ °÷ÀÌ »ó´ëÀûÀÎ ÁöÁ¡À̶ó´Â Á¡¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ±×·¯³ª assembler°¡ º¯À§¸¦ ¸¸µé¾î ÁֹǷΠ¿ì¸®°¡ ÇÁ·Î±×·¥À» ¸¸µé ¶§¿¡´Â labelÀ» »ç¿ëÇÏ¸é µÈ´Ù.

(1) LJMP (Long Jump)

Çö À§Ä¡¿¡¼­ -32768~+32767ÀÇ ¹üÀ§±îÁö jumpÇÒ ¼ö ÀÖ´Ù.

Çü½Ä> LJMP <displacement word>

<displacement word>´Â jumpÇÒ °÷±îÁöÀÇ º¯À§(»ó´ëÀûÀÎ À§Ä¡)¸¦ ¸»Çϸç, ÇöÀç IP(instruction pointer)ÀÇ À§Ä¡¿¡¼­ -32768~+32767ÀÇ ¹üÀ§(196KCÀÇ ¸ðµç address space)·Î ºÐ±âÇÒ ¼ö ÀÖ´Ù. ÀÌ º¯À§´Â Àý´ëÀûÀÎ address°¡ ¾Æ´ÔÀ» ÁÖÀÇÇÏÀÚ.

ex) (2) SJMP (Short Jump)

Çö À§Ä¡¿¡¼­ -1024~+1023ÀÇ ¹üÀ§(1K)±îÁö ºÐ±âÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â jumpÇÒ °÷ÀÌ 1K³»¿¡ ÀÖ´Â °æ¿ì »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ·± °æ¿ì LJMPµµ »ç¿ëÇÒ ¼ö ÀÖÀ¸³ª, ±â°è¾î code¿¡¼­ SJMP°¡ LJMPº¸´Ù 1byte ´õ À۱⠶§¹®¿¡ memory¸¦ Àý¾àÇÒ ¼ö ÀÖ´Ù.

Çü½Ä> SJMP <displacement 11bit>

displacement 11bit´Â CPU°¡ address¸¦ °è»êÇÒ ¶§ ºÎÈ£ È®ÀåÇÏ¿© 16bit·Î °è»êÇÑ´Ù.

ex)

address ±â°è¾î code line program source code

8328 2000 263 SJMP EEE

264

832A CC1A 265 EEE: POP AX

832C F5 266 POPA

line 263ÀÇ ±â°è¾î code 2000HÀÇ ÀǹÌ

20H=00100000B¿¡¼­ 00100XXX´Â SJMPÀÇ ±â°è¾î codeÀÌ´Ù.

20H=00100000B¿¡¼­ ÇÏÀ§ 3bit 000B¿Í operand 00H´Â »ó´ëÀû º¯À§(832AH - 832AH)¸¦ ÀǹÌÇÑ´Ù.(00H = 000 00000000B, 11bit - mnemonic¿¡ operand°¡ Æ÷ÇԵǾîÀÖ´Ù.) ÀÌ °æ¿ì´Â 'SJMP EEE' ½ÇÇàÈÄÀÇ IP¿Í jumpÇÒ °÷ÀÇ address°¡ °°À¸¹Ç·Î(832AH) º¯À§´Â 0ÀÌ µÈ´Ù.

address ±â°è¾î code line program source code

8220 124 MAIN1:

125 ; CALL delay400m

126

8220 27FE 127 SJMP MAIN1

line 127ÀÇ ±â°è¾î code 27FEHÀÇ ÀǹÌ

27H=00100111B¿¡¼­ 00100XXX´Â SJMPÀÇ ±â°è¾î code

27H=00100111B¿¡¼­ ÇÏÀ§ÀÇ 111B(=7H)¿Í operand FEH´Â »ó´ëÀû º¯À§(8220H - 8222H = 7FEH (-2H)), 11bit displacement)¸¦ ÀǹÌÇÑ´Ù.

(3) NOP (No Operation)

NOP´Â ¾Æ¹« °Íµµ ÇÏÁö ¾Ê´Â ¸í·ÉÀ̸ç CPUÀÇ ³»ºÎ »óÅ¿¡ ¾î¶² ¿µÇâµµ ÁÖÁö ¾Ê´Â´Ù. NOPÀÇ ¿ëµµ´Â ´ÙÀ½°ú °°´Ù. operands´Â ÇÊ¿ä ¾ø´Ù.

¨ç programÀÇ ¿©À¯¸¦ ÁØ´Ù.

¨è debug¿¡ Æí¸®ÇÏ´Ù.

¨é program ¿µ¿ªÀ» NOP code·Î ä¿ö¼­ program ¿µ¿ªÀ» ¿¹¾àÇÒ ¼ö ÀÖ´Ù.

¨ê ¿ÜºÎ IOÀÇ µ¿±â¿¡ ÇÊ¿äÇÏ´Ù.

Çü½Ä> NOP

address

±â°è¾î code

line

program

source

code

 

 

 

 

79

 

 

 

 

 

800C

 

80

CSEG

AT

800CH

 

; HSO interrupt

800C

E79D02

81

 

 

LJMP

HSO_SERVICE

 

 

:

:

 

:

 

:

:

 

:

:

 

:

 

:

:

82A6

4500010A04

205

 

 

ADD

HSO_TIME, TIMER1, #100H

82AB

F0

206

 

 

RET

 

 

 

 

207

 

 

 

 

 

82AC

F4

208

HSO_SERVICE:

PUSHA

 

; make motor clock

82AD

C81A

209

 

 

PUSH

AX

 

82AF

B0171B

210

 

 

LDB

AH, IOS2

 

À§ ÇÁ·Î±×·¥ÀÇ line 81¿¡¼­ ±â°è¾î code E79D02ÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.

E7 : LJMPÀÇ ±â°è¾î code(¾ÕÀÇ table¿¡¼­ 11100111B)

9D02 : operands·Î, 9DH´Â low byte, 02H´Â high byteÀ̹ǷÎ, ½ÇÁ¦·Î ÀǹÌÇÏ´Â °ªÀº 029DHÀÌ´Ù. ÀÌ´Â HSO_SERVICEÀÇ »ó´ëÀû º¯À§°¡ µÈ´Ù.(82ACH - 800FH)

ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ memory¿¡ ÀúÀåµÇ¾î ÀÖ°Ô µÈ´Ù.

address

data



:

:



82ADH

C8H



82ACH

F4H

¡ç HSO_SERVICEÀÇ ½ÃÀÛ À§Ä¡

 

    º¯À§ (82ABH

     - 800FH)

 

82ABH

F0H


:

:


800FH

?

¡ç LJMP HSO_SERVICE ½ÇÇà ÈÄÀÇ IPÀÇ À§Ä¡

800EH

02H



800DH

9DH



800CH

E7H



:

:

 

(2) SJMP (Short Jump)

Çö À§Ä¡¿¡¼­ -1024~+1023ÀÇ ¹üÀ§(1K)±îÁö ºÐ±âÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â jumpÇÒ °÷ÀÌ 1K³»¿¡ ÀÖ´Â °æ¿ì »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ·± °æ¿ì LJMPµµ »ç¿ëÇÒ ¼ö ÀÖÀ¸³ª, ±â°è¾î code¿¡¼­ SJMP°¡ LJMPº¸´Ù 1byte ´õ À۱⠶§¹®¿¡ memory¸¦ Àý¾àÇÒ ¼ö ÀÖ´Ù.

Çü½Ä> SJMP <displacement 11bit>

         displacement 11bit´Â CPU°¡ address¸¦ °è»êÇÒ ¶§ ºÎÈ£ È®ÀåÇÏ¿© 16bit·Î °è»êÇÑ´Ù.

ex)

address

±â°è¾î code

line

program

source

code

 

8328

2000

263

 

 

SJMP

EEE

 

 

264

 

 

 

 

832A

CC1A

265

EEE:

 

POP

AX

832C

F5

266

 

 

POPA

 

line 263ÀÇ ±â°è¾î code 2000HÀÇ ÀǹÌ

20H=00100000B¿¡¼­ 00100XXX´Â SJMPÀÇ ±â°è¾î codeÀÌ´Ù.

20H=00100000B¿¡¼­ ÇÏÀ§ 3bit 000B¿Í operand 00H´Â »ó´ëÀû º¯À§(832AH - 832AH)¸¦ ÀǹÌÇÑ´Ù.(00H = 000 00000000B, 11bit - mnemonic¿¡ operand°¡ Æ÷ÇԵǾîÀÖ´Ù.) ÀÌ °æ¿ì´Â 'SJMP EEE' ½ÇÇàÈÄÀÇ IP¿Í jumpÇÒ °÷ÀÇ address°¡ °°À¸¹Ç·Î(832AH) º¯À§´Â 0ÀÌ µÈ´Ù.

address

±â°è¾î code

line

program

source

code

 

8220

 

124

MAIN1:

 

 

 

 

 

125

;

 

CALL

delay400m

 

 

126

 

 

 

 

8220

27FE

127

 

 

SJMP

MAIN1

line 127ÀÇ ±â°è¾î code 27FEHÀÇ ÀǹÌ

27H=00100111B¿¡¼­ 00100XXX´Â SJMPÀÇ ±â°è¾î code

27H=00100111B¿¡¼­ ÇÏÀ§ÀÇ 111B(=7H)¿Í operand FEH´Â »ó´ëÀû º¯À§(8220H - 8222H = 7FEH (-2H)), 11bit displacement)¸¦ ÀǹÌÇÑ´Ù.

(3) NOP (No Operation)

NOP´Â ¾Æ¹« °Íµµ ÇÏÁö ¾Ê´Â ¸í·ÉÀ̸ç CPUÀÇ ³»ºÎ »óÅ¿¡ ¾î¶² ¿µÇâµµ ÁÖÁö ¾Ê´Â´Ù. NOPÀÇ ¿ëµµ´Â ´ÙÀ½°ú °°´Ù. operands´Â ÇÊ¿ä ¾ø´Ù.

¨ç programÀÇ ¿©À¯¸¦ ÁØ´Ù.

¨è debug¿¡ Æí¸®ÇÏ´Ù.

¨é program ¿µ¿ªÀ» NOP code·Î ä¿ö¼­ program ¿µ¿ªÀ» ¿¹¾àÇÒ ¼ö ÀÖ´Ù.

¨ê ¿ÜºÎ IOÀÇ µ¿±â¿¡ ÇÊ¿äÇÏ´Ù.

Çü½Ä> NOP

(4) SKIP (2 byte NOP)

2 byteÀÇ NOP ¸í·É°ú °°´Ù. byte register°ªÀº ÀÓÀÇÀÇ °ªÀÌ¸ç ½ÇÇà°ú »ó°ü¾ø´Ù.(¹«½Ã) ÀÌ ¸í·É ¿ª½Ã NOP¿Í °°Àº ¿ëµµÀÌ´Ù.

Çü½Ä> SKIP <byte operand>

II-II-3-3. Á¶°Ç branch ¸í·É

¾Õ¿¡¼­´Â ¹«Á¶°Ç branch ¸í·É¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù. Á¶°Ç branch ¸í·ÉÀº ¹«Á¶°Ç ºÐ±â¿Í ´Þ¸® Á¶°Ç¿¡ µû¶ó ºÐ±âÇÏ´Â ¸í·ÉÀÌ´Ù. ÀÌ ¶§ ÀÌ Á¶°ÇÀº °¢ flagµéÀÇ »óŸ¦ ÀÌ¿ëÇÏ¿© ÆľÇÇÑ´Ù. µû¶ó¼­ º¸Åë compare ¸í·É µÚ¿¡ Á¶°Ç ºÐ±â°¡ ¿Ã ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. (°ªÀÇ Å©±â¸¦ ºñ±³Çϱâ À§Çؼ­) ¶Ç ƯÁ¤ flag¸¦ testÇÏ¿© ºÐ±âÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·± ¸í·ÉµéÀ» conditional jump¶ó°í ÇÑ´Ù. ¶Ç conditional jump¸í·ÉÀº º¯À§°¡ 1byte(-128~+127)·Î Á¦ÇѵǾî ÀÖ´Ù.

Á¶°Ç ºÐ±â¿¡¼­ ºñ±³ ¸í·ÉÀÇ ¿¬»ê °á°ú¸¦ ºÎÈ£ ÀÖ´Â ¼ö(signed)·Î Ãë±ÞÇÒ °ÍÀÎÁö, ¾Æ´Ï¸é ºÎÈ£ ¾ø´Â ¼ö(unsigned)·Î Ãë±ÞÇÒ °ÍÀÎÁö¿¡ µû¶ó ¸í·ÉÀ» ³ª´©¾î º¸¸é ´ÙÀ½°ú °°´Ù.

unsigned

used flags

signed

used flags

N

Z

C

Z

JLT (Less Than)

1

X

JH (Higher)

1

0

JLE (Less or Equal)

1

1

JNH (Not Higher)

0

1

JGE (Great or Equal)

0

X




JGT (Greater Than)

0

0




 

¶Ç, °¢ flagÀÇ À̸§À» »ç¿ëÇÑ branch ¸í·Éµµ ÀÖ´Ù.

flag

1ÀÏ ¶§ branch

0ÀÏ ¶§ branch

Z

JE (Equal)

JNE (Not Equal)

C

JC (Carry is set)

JNC (Carry is Not set(clear))

V

JV (overflow is set)

JNV (V flag is clear)

VT

JVT (VT flag is set)

JNVT (VT flag is clear)

ST

JST (ST flag is set)

JNST (ST flag is clear)

 

À§ÀÇ ¸í·ÉµéÀº ¸ðµÎ Çü½ÄÀÌ °°À¸¹Ç·Î ¿©±â¿¡¼­´Â ¸í·É ¼³¸íÀ» ÇÏÁö ¾Ê±â·Î ÇÑ´Ù. ÀÌ ¸í·ÉµéÀº ¸ðµÎ ´ÙÀ½°ú °°Àº Çü½ÄÀÌ´Ù.

Çü½Ä> JXX <diplacement 8bit>

ex) <program example 1>

L13;

CMPB

SPTEMP, #'a'

; [SPTEMP]°ú aÀÇ ASCII °ª ºñ±³ ([SPTEMP] - #'a')(byte)

 

JNE L

L14

; °°Áö ¾ÊÀ¸¸é(if Z=1, if SPTEMP¡Á#'a') jump to 'L14'

 

LJMP

ABOUT

; Long jump to 'ABOUT'

L14;

CMPB

SPTEMP, #CR

; [SPTEMP]°ú CR(\n)ÀÇ ASCII °ª ºñ±³ (]SPTEMP] - #CR)

 

JE

MAINL

; °°À¸¸é(if Z=0, if [SPTEMP]=#CR) jump to 'MAINL'

L15:

LD

MSG_ADDR, #MNOT_DEF_KEY

; [MSG_ADDR]¡çMNOT_DEF_KEY (word addr)

 

CALL

PUT_STRING

; Call PUT_STRING routine

 

SJMP

MAINL

; Short jump to 'MAINL'

<program example 2> - Let's interpret it....

THAN:

CMP

TARGET_SPD_L, MOTOR_SPEED_L

 

JE

CHECK

 

SJMP

EPOSC

CHECK:

SUBB

AH, SEN_VAL1, SEN_VAL3

 

CMPB

AH, #50

 

JGT

MUST3

 

CMPB

AH, #25

 

JGT

MUST2

 

CMPB

AH, #8

 

JGT

MUST1

 

CMPB

AH, #-50

 

JLT

MUST3

 

CMPB

AH, #-25

 

JLT

MUST2

 

CMPB

AH, #-8

 

JLT

MUST1

 

SJMP

EPOSC

MUST1:

CMPB

SEN_VAL1, SEN_VAL3

 

JH

ILEFT1

 

ADD

TARGET_SPD_R, #20

 

CALL

DELAY25M

 

SUB

TARGET_SPD_R, #20

 

SJMP

EPOSC

II-II-3-4. ƯÁ¤ bit test branch ¸í·É

ƯÁ¤ registerÀÇ bit¸¦ testÇÏ´Â ¸í·ÉÀÌ´Ù.(set or clear?) ÀÌ ¸í·ÉÀÇ º¯À§µµ À§¿Í ¸¶Âù°¡Áö·Î 1byte·Î Á¦ÇѵǾî ÀÖ´Ù. ¶Ç 8bit register¸¦ ´ë»óÀ¸·Î ÇϹǷΠbit ¹øÈ£´Â 0~7±îÁö Á¦ÇѵǾî ÀÖ´Ù.

Çü½Ä> JBS <byte register>, <bit number>, <displacement byte> ; Jump if Bit is Set

         JBC <byte register>, <bit number>, <displacement byte> ; Jump if Bit is Clear

ex)

PUTLED:

 

PUTLED:

CH, IOPORT2

; CH : current PORTX data

 

 

JBS

H, 0, PUL1

; AH : input LED data

 

 

ANDB

CH, #11110111B

 

 

 

SJMP

PUL2

 

 

PUL1:

ORB

CH, #00001000B

 

 

PUL2:

JBS

AH, 1, PUL3

 

 

 

ANDB

CH, #11101111B

 

 

 

SJMP

PUL4

 

II-II-3-5. ƯÀÌÇÑ Á¶°Ç Branch ¸í·É

DJNZ/DJNZW (Decrease and jump if zero in word/byte)

byte³ª word register°ªÀ» -1ÇÏ°í ±× °á°ú°¡ 0ÀÌ ¾Æ´Ï¸é branchÇÏ°í, ±×·¸Áö ¾ÊÀ¸¸é ´ÙÀ½ ¸í·ÉÀ» ½ÇÇàÇÏ´Â ¸í·ÉÀÌ´Ù. ÀÌ ¸í·É ¿ª½Ã º¯À§´Â 1byteÀ̸ç byte/word register´Â counter·Î »ç¿ëÇÑ´Ù. ÀÌ ¸í·ÉÀ» »ç¿ëÇϸé, ºñ±³¸í·É°ú Á¶°Ç branch ¸í·É, counter °¨¼Ò ¸í·ÉÀ» ÇϳªÀÇ ¸í·ÉÀ¸·Î »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌ ¸í·ÉÀº 196°è¿­¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. (96°è¿­¿¡´Â ¾ø´Ù.)

Çü½Ä> DJNZ/DJNZW <byte/word register>, <displacement byte>

         ; [breg]¡ç[breg]-1, if [breg]¡Á0 jump to indicated location(-128~+127 range)

ex)

DELAY: PUSH AX ; 90 ms Delay

LD AX, #0F000H ; [AX]¡ç[AX]-1

DY1: NOP ; no operation

DJNZW AX, DY1 ; AXÀÇ ³»¿ëÀ» 1°¨¼Ò½ÃÅ°°í AX=0ÀÌ¸é ´ÙÀ½À¸·Î, 1À̸é DY1À¸·Î jump

POP AX

RET

DELAY:

 

PUSH

AX

; 90 ms Delay

 

 

LD

AX, #0F000H

; [AX]¡ç[AX]-1

 

DY1:

NOP

 

; no operation

 

 

DJNZW

AX, DY1

; AXÀÇ ³»¿ëÀ» 1°¨¼Ò½ÃÅ°°í AX=0ÀÌ¸é ´ÙÀ½À¸·Î, 1À̸é DY1À¸·Î jump

 

 

POP

AX

 

 

 

RET

 

 

ÀÌ ÇÁ·Î±×·¥Àº DJNZW ¸í·ÉÀ» ÀÌ¿ëÇؼ­ delay¸¦ ¸¸µå´Â ÇÁ·Î±×·¥ÀÌ´Ù. AX registerÀÇ °ªÀÌ F000H=61440À̹ǷÎ, DY1 loop¸¦ 61440¹ø ¹Ýº¹ÇÏ°Ô µÈ´Ù. ±×¸®°í, NOPÀÇ ½ÇÇà½Ã°£Àº 4 state time, DJNZWÀÇ ½ÇÇà½Ã°£Àº(jump was taken) 10 state time À̹ǷÎ, ÇÑ loop¸¦ ½ÇÇàÇÏ´Â ½Ã°£Àº 14 state timeÀÌ µÈ´Ù. µû¶ó¼­ ÃÑ ½ÇÇà½Ã°£Àº 14 state time * 61440 À̹ǷÎ, clock=20M¿¡¼­ 14×2×1/20M×61440 =86.0 ms ÀÇ delay°¡ µÈ´Ù.

II-II-3-6. °£Á¢ branch ¸í·É

À§ÀÇ branch ¸í·ÉµéÀº ¸ðµÎ Á÷Á¢ branch ¸í·ÉÀÌ´Ù. µû¶ó¼­ programÀ» Çѹø ¸¸µé¸é branchÇÒ °÷À» º¯°æÇÒ ¼ö°¡ ¾ø´Ù. °£Á¢ branch ¸í·ÉÀº ÇÁ·Î±×·¥ ½ÇÇà Áß¿¡µµ softwareÀûÀ¸·Î branchÇÒ °÷À» º¯°æÇÒ ¼ö°¡ ÀÖ´Ù. (ƯÁ¤ À§Ä¡¸¦ ½ÇÇàÇÏ°í ½ÍÀ» °æ¿ì »ç¿ëÇÏ¸é µÉ °ÍÀÌ´Ù.)

(1) BR (Branch indirect)

Çü½Ä> BR <word register> ; register³»¿ëÀÌ °¡¸®Å°´Â °÷À¸·Î branch

ex)

BR_ADDR

EQ          40H

; BR_ADDR º¯¼ö ¿µ¿ª ÁöÁ¤

 

:

:

 

 

 

LD

BR_ADDR, #5000H

; [BR_ADDR] ¡ç #5000H

 

BR

[BR_ADDR]

 

; 5000H·Î branch

:

:

:

 

 

CSEG

AT

5000H

 

 

WAIT:

SJMP

WAIT

 

 

(2) TIJMP (Table Indirect Jump)

address table Áß¿¡¼­ ¼±ÅÃµÈ address·Î branchÇÏ´Â ¸í·ÉÀÌ´Ù. BR°ú ºñ½ÁÇϳª, branchÇÒ address¸¦ table¿¡¼­ ã´Â´Ù´Â °ÍÀÌ ´Ù¸£´Ù.

Çü½Ä> TIJMP <word register>, [word register], (#mask byte)

¿©±â¼­ 1st operand´Â address tableÀÇ base¸¦ °¡¸®Å°´Â word registerÀÌ´Ù.

2nd operand´Â 8bit index°ªÀÌ ÀúÀåµÇ¾î ÀÖ´Â °÷À» °¡¸®Å°´Â word registerÀÌ´Ù.

3rd operand´Â index°ª°ú AND¿¬»êÀ» Çؼ­ jumpÇÒ address°¡ ÀúÀåµÇ¾î ÀÖ´Â °÷À» °è»êÇϱâ À§ÇÑ ¼ýÀÚ dataÀÌ´Ù.(immediate value)

½ÇÁ¦ destinationÀº ´ÙÀ½°ú °°´Ù.

destination = 2×offset + [base], offset = [index](AND)mask

ex)

WR1 EQU 60H

WR2 EQU 80H

JUMP1 EQU 0F000H

JUMP2 EQU 0B000H

JUMP3 EQU 9000H

: : :

ORG 8200H

LD WR1, #JUMP_TABLE ; [WR1]¡çjumpÇÒ address tableÀÇ base address

LD WR2, #INDEX_DATA ; [WR2]¡çindex data°¡ ÀÖ´Â °÷ÀÇ base address

TIJMP WR1, [WR2], #00000011B ; JUMP3(9000H)À¸·Î branch

: : : :

JUMP_TABLE: DCW JUMP1 ; jump address table(word´ÜÀ§·Î ÀúÀå)

DCW JUMP2

DCW JUMP3

: : : :

INDEX_DATA: DCB 2 ; index data table

DCB 1

DCB 0


WR1

EQU

60H

 

 

WR2

EQU

80H

 

 

JUMP1

EQU

0F000H

 

 

JUMP2

EQU

0B000H

 

 

JUMP3

EQU

9000H

 

 

:

:

:

 

 

ORG

8200H

 

 

 

 

 

LD

WR1, #JUMP_TABLE

; [WR1]¡çjumpÇÒ address tableÀÇ base address

 

 

LD

WR2, #INDEX_DATA

; [WR2]¡çindex data°¡ ÀÖ´Â °÷ÀÇ base address

 

 

TIJMP

WR1, [WR2], #00000011B

; JUMP3(9000H)À¸·Î branch

:

:

:

:

 

JUMP_TABLE:

DCW

JUMP1

; jump address table(word´ÜÀ§·Î ÀúÀå)

 

 

DCW

JUMP2

 

 

 

DCW

JUMP3

 

:

:

:

:

 

INDEX_DATA:

DCB 2

 

; index data table

 

 

DCB 1

 

 

 

 

DCB

 

 

   Âü°í : http://www.postech.ac.kr/group/poweron/ - lectures/Micro processor, controller, µ¿¾Æ¸® °­ÀÇ

   Âü°í ¼­Àû : Micro controller 80196 ±âÃʺÎÅÍ ÀÀ¿ë±îÁö - Â÷¿µ¹è Àú

<Programming Exercise>

1.  ´ÙÀ½ ÇÁ·Î±×·¥À» ºÐ¼®Çغ¸ÀÚ.

('A'ÀÇ ASCII code´Â 41H, 'G'´Â 47H, '0'Àº 30H, '9'´Â 39HÀÌ´Ù. DCB 0F7H´Â TRAP ¸í·ÉÀÇ ±â°è¾î codeÀÌ´Ù. ¿©±â¿¡¼­´Â ¹«½ÃÇÏ°í »ý°¢ÇÏÀÚ.(RETÀ̶ó°í Çصµ µÈ´Ù.))

<¿¬½À 1>

BR1 

 EQU 

 40H

 

:

:

:

:

CSEG

AT

4000H

 

 

 

CMPB

BR1, #'0'

 

 

JNC

NOT_HEX

 

 

CMPB 

 BR1, #'G'

 

 

 JC 

 A_HEX2

A_HEX1:

ANDB

BR1, #0F

 

 

 

CLRC

 

DCB

0F7H

 

 

A_HEX1:

CMPB

BR1, #'A'

 

 

 

JNC

NOT_HEX

 

 

CMPB

BR1, #'G'

 

 

JC

NOT_HEX

 

 

SUBB

BR1, #7

 

 

SJMP 

A_HEX1

NOT_HEX:

 

 SETC

 

DCB

0F7H

 

 

END

 

 

 

<¿¬½À 2>

RSEG      AT

0020H

 

RESULT_LOW: 

DSL

1

RESULT_HIGH:

DSL

1

RESULT_W0 

EQU 

RESULT_LOW

RESULT_W1

EQU 

RESULT_LOW+2

RESULT_W2

EQU 

RESULT_HIGH

RESULT_W3

EQU 

RESULT_HIGH+2

 

TEMP

 

DSL

1

TEMP_L

 

EQU

TEMP

TEMP_H 

 

EQU

TEMP+2

 

OPE_A:

 

DSL

1

OPE_A_L

 

EQU 

 OPE_A

OPE_A_H

 

EQU 

OPE_A+2

 

OPE_B:

 

DSL

1

OPE_B_L

 

EQU 

OPE_B

OPE_B_H 

 

EQU 

OPE_B+2

:             :

:

:            :

CSEG     AT 

8000H

 

 

 

MULU 

RESULT_LOW, OPE_A_L, OPE_B_L

 

 

MULU 

RESULT_HIGH, OPE_A_H, OPE_B_H

 

 

MULU 

TEMP, OPE_A_H, OPE_B_L

 

 

ADD

RESULT_W1, TEMP_L

 

 

ADDC

RESULT_W2, TEMP_H

 

 

ADDC

RESULT_W3, #0

 

 

MULU

TEMP, OPE_A_L, OPE_B_H

 

 

ADD

RESULT_W1, TEMP_L

 

 

ADDC

RESULT_W2, TEMP_H

 

 

ADDC

RESULT_W3, #0

 

 

RET

 

END

 

 

 

2. ´ÙÀ½ ºóÄ­À» ä¿öº¸ÀÚ

<¿¬½À 3>

¸í·É¾î

20H

21H

flags

(low byte)

(high byte)

Z

N

V

VT

C

ST

CLR 20H









ADD 20H, #4789H









ADDC 20H, #6488H









ADDB 20H, #88H









ADDCB 20H, #33H









SUB 20H, #3567H









SUBC 20H, #8000H









SUBB 20H, #45H









SUBCB 20H, #78H









LDB 20H, #0FFH









INCB 20H









DECB 20H









LDB 20H, #0FFH









INCB 20H









DECB 20H









EXTB 20H









NEG 20H









 

<¿¬½À 4>

¸í·É¾î

20H

21H

24H

25H

2CH

2DH

flags

Z

N

V

VT

C

ST

CLR 20H













LD 24H, #0AAAAH













LD 2CH, #5555H













CMP 24H, 2CH













ADD 20H, 24H, 2CH













SUB 20H, 2CH, 24H













CMPB 21H, 2DH













LDB 24H, #0BAH













ADDB 20H, 24H, #39H













SUBB 20H, 24H, #0ABH













MULB 24H, 2CH













LDBSE 20H, 21H













LDBZE 2CH, 25H













CMP 20H, 24H













SETC













 

3. ´ÙÀ½Áß À߸øµÈ ¸í·ÉÀº? Ʋ¸° ÀÌÀ¯¸¦ »ý°¢Çغ¸ÀÚ.

<¿¬½À 5>

LDB 56H, [87H]+

SUBC 40H, 50H, #30H

ADDB [67H], #60H, 50[50H]

LDBZE 45H, 50H

JBS 50H, 8, XX

DJNZ 55H, LOOP

ST 55H, 50H[0]

MUL 52H, 50H, #40

CMP 50H, [60H]




 

»óÈ£ : (ÁÖ) ·Îº¸ºí·° »ç¾÷ÀÚµî·Ï¹øÈ£:214-86-56219 Åë½ÅÆǸž÷½Å°í19-2544 ´ëÇ¥: ½Å´ë¼· ÀüÈ­:(02)2679-8556 Fax :(02)2679-8557 [°³ÀÎÁ¤º¸Ã³¸®¹æħ]
º»»ç : °æ±âµµ ºÎõ½Ã ¿ø¹Ì±¸ ¾à´ëµ¿ ºÎõ Å×Å©³ëÆÄÅ© 401µ¿ 502È£     ¼­¿ï»ç¹«¼Ò : ¼­¿ï½Ã ¿µµîÆ÷±¸ ¹®·¡µ¿ 4°¡ 8-1 4Ãþ
Copyright(C) 2004, (ÁÖ) ·Îº¸ºí·° ½Ã½ºÅÛÁî All Rights Reserved E-Mail : WebMaster