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]
 |