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

|