2.
196À» ¹è¿öº¸ÀÚ
II. 196 Assember
II-II. º»°ÝÀûÀÎ 196 ¾î¼Àºí¸®¾î
II-II-5. Stack°ú subroutine ¹× system Á¦¾î ¸í·É
´ÙÀ½Àº
196KCÀÇ stack/subroutine
call/system ¸í·ÉÀ» ¸ðµÎ Á¤¸®ÇÑ °ÍÀÌ´Ù.
mnemonic |
byte |
state |
operand |
flags |
1st |
2nd |
Z |
N |
C |
V |
VT |
ST |
I |
PSE |
PUSH |
1 |
6/8+CEA |
waop |
|
|
|
|
|
|
|
|
|
POP |
1 |
8/11+CEA |
|
waop |
|
|
|
|
|
|
|
|
PUSHF |
1 |
6/8 |
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
POPF |
1 |
7/10 |
|
|
|
|
|
|
|
|
|
|
PUSHA |
1 |
12/18 |
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
POPA |
1 |
12/18 |
|
|
|
|
|
|
|
|
|
|
LCALL |
3 |
11/13 |
disp-high |
disp-low |
|
|
|
|
|
|
|
|
SCALL |
2 |
11/13 |
disp |
|
|
|
|
|
|
|
|
|
RET |
1 |
11/14 |
|
|
|
|
|
|
|
|
|
|
EI |
1 |
2 |
enable interrupt (I=1) |
|
|
|
|
|
|
1 |
|
DI |
1 |
2 |
disable interrupt (I=0) |
|
|
|
|
|
|
0 |
|
EPTS |
|
2 |
enable PTS (PSE=1) |
|
|
|
|
|
|
|
1 |
DPTS |
|
2 |
disable PTS (PSE=0) |
|
|
|
|
|
|
|
0 |
TRAP |
1 |
16/18 |
(SP)¡çIP, IP¡ç2010H |
|
|
|
|
|
|
|
|
IDLPD |
2 |
8/25 |
baop |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
RST |
1 |
15 |
IP¡ç2080H |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
<À§ÀÇ Ç¥¿¡ ÀÖ´Â operand ¾à¾îÀÇ ÀǹÌ>
a/b : 'a'´Â stackÀÌ ³»ºÎ
memory¿¡ ÀÖ´Â °æ¿ì, 'b'´Â stackÀÌ ¿ÜºÎ
memory¿¡ ÀÖ´Â °æ¿ìÀÌ´Ù.
II-II-5-1. Stack Á¦¾î ¸í·É
ÇÁ·Î±×·¥¿¡ ÀÖ¾î¼
stackÀº data¸¦ Àá½Ã ÀúÀåÇÏ´Â
Àå¼Ò¶ó°í ÇÒ ¼ö ÀÖ´Ù.
ÀÌ¹Ì ¾Ë°í ÀÖ´Â °Íó·³
stack¿¡¼´Â °¡Àå ³ªÁß¿¡ µé¾î°£
data°¡ ¸Ç óÀ½ ³ª¿À°Ô
µÇ¾îÀÖ´Ù.(LIFO - Last In First
Out, or FILO) ÀÌ ¹Ý´ëÀÇ °³³äÀ¸·Î Queue°¡
ÀÖÀ» °ÍÀÌ´Ù.(FIFO - First In First Out)
StackÀº ÇöÀç stackÀÇ ²À´ë±â(TOP)¸¦
°¡¸®Å°´Â pointer (SP - Stack
Pointer)¿Í ½ÇÁ¦ data°¡ ÀÖ´Â Stack
¿µ¿ªÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
Stack¿¡ data¸¦
³Ö´Â °úÁ¤À» push¶ó°í Çϸç, data¸¦
²¨³»´Â °úÁ¤À» popÀ̶ó°í ÇÑ´Ù. 196¿¡¼´Â
16bit (word)´ÜÀ§·Î
data¸¦ ³Ö°í »©³¾ ¼ö
ÀÖ´Ù. data¸¦ ³ÖÀ¸¸é, SP´Â
°¨¼ÒÇÏ°Ô µÇ°í, data¸¦ »©³»¸é
SP´Â Áõ°¡ÇÏ°Ô µÈ´Ù. ¶Ç
196ÀÇ SP´Â »ç¿ëÀÚ°¡ ¸¶À½´ë·Î
°ªÀ» ¼³Á¤ÇÏ¿© stackÀÇ À§Ä¡¸¦ °áÁ¤ÇÒ
¼ö ÀÖ°Ô ÇØ ÁØ´Ù.
³»ºÎ memory¿¡ ȤÀº ¿ÜºÎ
memory¿¡µµ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
¿ÜºÎ memory¿¡ stackÀ» ¼³Á¤Çϸé
push¿Í popÀ» ÇÏ´Â ½Ã°£ÀÌ
´õ °É¸®°Ô µÈ´Ù.

(1) PUSH/POP (Push/Pop word)
word operand¸¦ stack¿¡
push/pop ÇÏ´Â ¸í·ÉÀÌ´Ù.
Çü½Ä> PUSH <word operand> ;
SP¡çSP-2, [SP]¡ç<word operand>
POP <word
operand> ; <word operand>¡ç[SP], SP¡çSP+2
ex) LD SP, #0F0H ; ³»ºÎ register ¿µ¿ª¿¡ stack ÁöÁ¤
LD 50H, #1234H
-------- ¨ç
PUSH 50H
CLR 50H -------- ¨è
: : :
POP 50H -------- ¨é
¨ç¸í·É±îÁö ½ÇÇà ÈÄ ¨è¸í·É±îÁö ½ÇÇà ÈÄ ¨é¸í·É±îÁö ½ÇÇà ÈÄ
|
addr |
low byte |
high byte |
|
SP |
F0H |
00H |
|
50H |
34H |
12H |
|
|
|
|
|
|
|
|
¡æ |
00F0H |
|
|
|
addr |
low byte |
high byte |
|
SP |
EEH |
00H |
|
50H |
00H |
00H |
|
: |
: |
: |
¡æ |
00EEH |
34H |
12H |
|
00F0H |
|
|
|
addr |
low byte |
high byte |
|
SP |
F0H |
00H |
|
50H |
34H |
12H |
|
|
|
|
|
00EEH |
34H |
12H |
¡æ |
00F0H |
|
|
¶Ç
StackÀÇ ´Ù¸¥ Ư¡Àº ´ÙÀ½°ú
°°´Ù.
¨ç
stackÀº memoryÀÇ ³ôÀº addressºÎÅÍ
³·Àº address·Î Ä¿Áö°Ô µÈ´Ù. POP
¸í·ÉÀº SP¸¦ 2 Áõ°¡½Ã۰í, PUSH ¸í·ÉÀº
SP¸¦ 2 °¨¼Ò½ÃŲ´Ù.
¨è
PUSH/POP ¿¡´Â Ç×»ó word°¡ ¿òÁ÷À̹ǷÎ, word
operand¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
¨é
PUSH/POP ¸í·ÉÀº data°¡ ÀÖ´Â memory À§Ä¡¸¦
SP°¡ Áö½ÃÇϰí Àֱ⠶§¹®¿¡, LD
50H, 2[SP] µîÀÇ ¸í·ÉÀ» »ç¿ëÇÏ¿©, SP¸¦
ÀÌ¿ëÇÑ °£Á¢ ¹øÁö ÁöÁ¤À¸·Î
stack¿¡ ÀÖ´Â data¸¦ accessÇÒ
¼ö ÀÖ´Ù.
(2) PUSHF/POPF
(Push/Pop Flags)
ÀÌ´Â
PSW(Program Status Word)¸¦
push/pop ÇÏ´Â ¸í·ÉÀÌ´Ù. PSW¸¦ pushÇϸé PSW´Â
0ÀÌ µÇ¾î interrupt´Â disableµÇ°í, PSWÇÏÀ§ÀÇ interrupt mask °ªµµ push µÈ´Ù. »ê¼ú ¿¬»êÀ̳ª
±× ¿ÜÀÇ PSW¿¡ ¿µÇâÀ»
ÁÖ´Â ¸í·É ÈÄ¿¡ subroutineÀ»
callÇÑ °æ¿ì, subroutine¿¡ PSWÀÇ °ª¿¡
¿µÇâÀ» ÁÖ´Â ¸í·ÉµéÀÌ ÀÖ´Ù¸é,
PSWÀÇ °ªÀ» º¸Á¸Çϱâ À§Çؼ routine
óÀ½¿¡ À̰°Àº ¸í·ÉÀ» »ç¿ëÇØ¾ß
ÇÑ´Ù.
Çü½Ä> PUSHF ; SP¡çSP-2, [SP]¡çPSW, PSW¡ç0(¡æinterrupt disable)
POPF ;
PSW¡ç[SP], SP¡çSP+2 (3) PUSHA/POPA
(Push/Pop All)
ÀÌ
¸í·ÉÀº 8096ÀÇ PUSHF/POPF¸¦ º¸°ÇÏ¿©, 80196¿¡¼
º¸°µÈ interrupt
mask1ÀÇ °ª°ú WSRÀÇ °ªµµ
°°ÀÌ push/popÇÏ´Â ¸í·ÉÀÌ´Ù. ÀÌ
¸í·ÉÀº PSW¿Í interrupt1ÀÇ ³»¿ëÀ» push/pop ÇϰÔ
µÇ¸ç, À§¿Í ¸¶Âù°¡Áö·Î push ÈÄÀÇ
PSWÀÇ °ªÀº 0ÀÌ µÈ´Ù.
Çü½Ä> PUSHA ; SP¡çSP-2, [SP]¡çPSW/INT_MASK, PSW¡ç0(¡æinterrupt disable)
; SP¡çSP-2, [SP]¡çINT_MASK1/WSR, INT_MASK1¡ç0
POPA ;
INT_MASK1/WSR¡ç[SP],
SP¡çSP+2
; PSW/INT_MASK¡ç[SP], SP¡çSP+2 II-II-5-2. Subroutine call ¸í·É
SubroutineÀº ÇÁ·Î±×·¡¸Ó°¡
À̸§À» ºÙÀΠƯº°ÇÑ ±â´ÉÀ»
°¡Áø ÇÁ·Î±×·¥ blockÀÌ´Ù. ¿¹¸¦ µé¾î
Ư¼öÇÑ °èÇÑÀ» ÇÑ´Ù´ø°¡, stringÀ»
LCD¿¡ Ãâ·ÂÇÏ´Â blockµîÀÌ µÉ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ subroutineµéÀº ÇÁ·Î±×·¥ÀÇ ¾î´À
ºÎºÐ¿¡¼µçÁö »ç¿ëÇÒ ¼ö ÀÖ¾î¾ß
ÇÑ´Ù. µû¶ó¼ subroutineÀº ºÐ±â¿Í´Â ´Ù¸£´Ù´Â
°ÍÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. ¶Ç
ÀÌ subroutineÀº Çѹø »ç¿ëÇϰí
³ µÚ, ¿ø·¡ÀÇ À§Ä¡·Î
º¹±ÍÇØ¾ß ÇϹǷÎ, ºÐ±â(jump)¿Í´Â
´Ù¸£°Ô »ç¿ëµÈ´Ù. Áï, subroutineÀº call ¸í·É¿¡
ÀÇÇØ ºÒ·¯Áö°í, return ¸í·É¿¡ ÀÇÇØ ¿ø·¡ÀÇ
À§Ä¡·Î º¹±ÍÇÏ°Ô µÈ´Ù. ¶Ç
CALL°ú RET¿¡¼´Â À§Ä¡¸¦ ±â¾ïÇϰí
µÇµ¹¾Æ°¡±â À§Çؼ stackÀ» »ç¿ëÇÑ´Ù.

ÇÁ·Î±×·¥¿¡¼ CALLÀ»
ÇÏ°Ô µÇ¸é º¯À§ ¸¸ÅÀÇ
À§Ä¡·Î JumpÇÏ°Ô µÈ´Ù. ±×·¯³ª
¿©±â¼´Â º¸ÅëÀÇ jump¿Í´Â ´Þ¸® jump¿Í
ÇÔ²², CALL ´ÙÀ½ ¸í·ÉÀÇ address¸¦
(Áï, ÇöÀçÀÇ IP) stack¿¡ ÀúÀåÇÑ´Ù. jump ÈÄ
subroutineÀ» ½ÇÇàÀÌ ¸ðµÎ ³¡³ª¸é
returnÀ¸·Î mainÀ¸·Î º¹±ÍÇÏ°Ô µÇ´Âµ¥,
À̶§ return ¸í·ÉÀº stack¿¡¼ ÀÌÀüÀÇ IP¸¦
popÇÏ¿© ÇöÀçÀÇ IP¿¡ ³Ö°Ô
µÈ´Ù. ÀÌ·¸°Ô Çϸé, call ÀÌÈÄÀÇ
¸í·ÉÀ¸·Î ¹Ù·Î º¹±ÍÇÒ ¼ö
ÀÖ´Ù. Áï, CALL°ú RETÀÇ
½ÇÇà°úÁ¤À» ¿ä¾àÇÏ¸é ´ÙÀ½°ú °°´Ù.(½ÇÁ¦·Î
ÀϾ´Â ÀÏ)
CALL XXX ; SP¡çSP-2,
[SP]¡çIP, IP¡çIP+displacement(jump)
RET ; IP¡ç[SP], SP¡çSP+2
196KC¿¡´Â JUMP¿Í
¸¶Âù°¡Áö·Î LCALL°ú SCALLÀÌ ÀÖ´Ù.
(1) LCALL (Long
Call)
ÀÌ
¸í·ÉÀº ÇöÀç À§Ä¡¿¡¼ -32768~32767ÀÇ À§Ä¡(196KCÀÇ
¸ðµç address space)¿¡ ÀÖ´Â subroutineÀ»
call ÇÒ ¶§ »ç¿ëÇÑ´Ù.
Çü½Ä> LCALL <displacement word> ;
ÇöÀç À§Ä¡¿¡¼ -32768~+32767ÀÇ À§Ä¡·Î branch
(2) SCALL (Short
Call)
ÀÌ
¸í·ÉÀº ÇöÀç À§Ä¡¿¡¼ -1024~+1024(1K)ÀÇ À§Ä¡¿¡
ÀÖ´Â subroutineÀ» call ÇÒ ¶§
»ç¿ëÇÑ´Ù. SJMP¿¡¼¿Í ¸¶Âù°¡Áö·Î, ÀÌ
¸í·ÉÀº LCALLº¸´Ù ±â°è¾î code°¡ 1byte
À۱⠶§¹®¿¡ 1K À̳»ÀÇ subroutineÀ» callÇÒ ¶§
»ç¿ëÇϸé memory¸¦ Àý¾àÇÒ ¼ö
ÀÖ´Ù.
Çü½Ä> SCALL <displacement 11bit>
note> ASM96¿¡¼´Â CALL ¸í·ÉÀ» »ç¿ëÇϸé, assembler°¡ ÀÚµ¿À¸·Î SCALL/LCALLÀ¸·Î º¯È¯ÇØÁØ´Ù. ¶Ç
JMP¿¡¼¿Í ¸¶Âù°¡Áö·Î º¯À§´Â labelÀ» »ç¿ëÇÏ¸é µÈ´Ù.
subroutine¿¡¼ stackÀ» »ç¿ëÇÒ
°æ¿ì RET Àü¿¡ ¹Ýµå½Ã pushÇÑ data´Â ¸ðµÎ popÇØ¾ß ÇÑ´Ù.
±×·¸Áö ¾ÊÀ¸¸é ¿¹»óÄ¡ ¸øÇÑ ¿À·ù°¡ »ý±æ °ÍÀÌ´Ù.
II-II-5-3. System Á¦¾î ¸í·É
(1) EI/DI
(Enable/Disable Interrupts)
maskable interrupt¸¦ ¸ðµÎ
enable/disable ÇÑ´Ù.
Çü½Ä> EI ; I flag=1
DI ; I
flag=0
(2) EPTS/DPTS
(Enable/Disble PTSs)
PTS(Peripheral Transaction Server)¸¦ ¸ðµÎ enable/disable ÇÑ´Ù.
Çü½Ä> EPTS ; PSE flag=1
DPTS ; PSE
flag=0
(3) TRAP
interrupt callÀÇ ÀÏÁ¾À¸·Î,
memory address 2010H·Î
jumpÇÑ´Ù. µ¿ÀÛÀº ´ÙÀ½°ú °°´Ù.
SP¡çSP-2, (SP)¡çIP, IP¡ç(2010H)
ÀÌ
¸í·ÉÀº programÀ» debugging ÇÒ ¶§ »ç¿ëÇϸé
µÈ´Ù.
(4) RST (software
Reset)
systemÀ» resetÇÏ´Â
¸í·ÉÀÌ´Ù. Áï, PSW=0, IP´Â 2080H·Î ÃʱâȵǸç,
SFRµµ ÃʱⰪÀ¸·Î settingµÈ´Ù. hardware reset°ú °°Àº È¿°ú°¡
ÀÖ´Ù.
(5) IDLPD
ÀÌ
¸í·ÉÀº CPU¸¦ idle/power down mode·Î µé¾î°¡°Ô Çϰųª
reset½ÃŲ´Ù.
Çü½Ä> IDLPD #key(byte)
key |
±â´É |
1 |
idle mode |
2 |
power down mode |
´Ù¸¥°ª |
reset |
Âü°í : http://www.postech.ac.kr/group/poweron/ -
lectures/Micro processor, controller, µ¿¾Æ¸® °ÀÇ
Âü°í ¼Àû : Micro controller
80196 ±âÃʺÎÅÍ ÀÀ¿ë±îÁö - Â÷¿µ¹è Àú
<Programming Exercise>
1. ´ÙÀ½ ÇÁ·Î±×·¥À»
ÀÛ¼ºÇ϶ó.
(1) byte register 20H¿¡ ÀÖ´Â 2°³ÀÇ
16Áø¼ö¸¦ ASCII code·Î ¹Ù²Ù¾î¼ byte register 30H, 31H¿¡ ÀúÀåÇÏ´Â
ÇÁ·Î±×·¥.
Âü°í)
ASCII |
Hex |
ASCII |
Hex |
2FH |
/ |
39H |
9 |
30H |
0 |
3AH |
: |
31H |
1 |
40H |
@ |
32H |
2 |
41H |
A |
33H |
3 |
42H |
B |
34H |
4 |
43H |
C |
35H |
5 |
44H |
D |
36H |
6 |
45H |
E |
37H |
7 |
46H |
F |
38H |
8 |
47H |
G |
2. ´ÙÀ½ ºó
ÄÀ» ä¿öº¸ÀÚ.
¸í·É |
SP |
20H |
21H |
22H |
23H |
24H |
25H |
stack ³»¿ë([SP]) |
low |
high |
low |
high |
LD SP,
#7EE0H |
|
|
|
|
|
|
|
|
|
|
LD 50H,
#0 |
|
|
|
|
|
|
|
|
|
|
ST 50H,
[SP] |
|
|
|
|
|
|
|
|
|
|
LD 20H,
#1234H |
|
|
|
|
|
|
|
|
|
|
LD 22H,
#5678H |
|
|
|
|
|
|
|
|
|
|
LD 24H,
#0A0BH |
|
|
|
|
|
|
|
|
|
|
PUSH 20H |
|
|
|
|
|
|
|
|
|
|
PUSH 22H |
|
|
|
|
|
|
|
|
|
|
PUSH 24H |
|
|
|
|
|
|
|
|
|
|
XCH 20H,
22H |
|
|
|
|
|
|
|
|
|
|
XCH 20H,
24H |
|
|
|
|
|
|
|
|
|
|
POP 24H |
|
|
|
|
|
|
|
|
|
|
POP 22H |
|
|
|
|
|
|
|
|
|
|
POP 20H |
|
|
|
|
|
|
|
|
|
|

|