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