Chương 5 Stack & chương trình con
-Là mộ tvùng nhớ trong bộ nhớ -Tổ chức kiểu vào trước-ra sau -Phần tử cuối cùng gọi là đỉnh ngăn xếp
Bạn đang xem nội dung tài liệu Chương 5 Stack & chương trình con, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
DuyTan University Assembly Language Programming
CHNG 5
STACK & CHNG TRÌNH CON
Nguyn V n Th
B môn in t vin thông
Khoa Công ngh thông tin, i hc Duy Tân – 2008
I HC DUY TÂN
KHOA CÔNG NGH THÔNG TIN
Nguyen Van Tho – Duy Tan University.
STACK
- Là mt vùng nh% trong b nh%
- T) ch+c ki.u vào tr0%c-ra sau
- Ph5n t6 cu7i cùng g8i là :;nh ngp
-Do 2 thanh ghi SS và SP quBn lý
- SS ch+a :Da ch; :oEn Stack
- SP ch+a :;nh Stack
- Khai báo :oEn ngp :
.STACK p>
Nguyen Van Tho – Duy Tan University.
Ví dN : .STACK 100H
0100h
00FEh
00FCh
00FAh
00F8h
00F6h
00F4h
00F2h
00F2h
.
.
.
SP
Offset STACK
Ng n x5p r7ng
0100h
SP
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
CÁC LNH THAO TÁC STACK
• PUSH
• POP
• PUSHF
• POPF
Nguyen Van Tho – Duy Tan University.
LNH PUSH
Cú pháp :
- Source là thanh ghi 16bit hoVc 1 tW nh% (2byte)
L[nh PUSH th\c hi[n công vi[c sau
1 - GiBm SP :i 2
2 - L^y ni dung c_a source :0a vào :;nh ngp
Ví dN : PUSH AX ; c^t AX vào stack
PUSH BX ; c^t BX vào stack
PUSH Source
Nguyen Van Tho – Duy Tan University.
LNH POP
Cú pháp :
- Dest là thanh ghi 16bit hoVc 1 word
- L[nh PUSH th\c hi[n công vi[c sau
1 - L^y ni dung :;nh ngp :0a vào dest
2 - T<ng SP lên 2
Ví dN : POP AX ; l^y giá trD trong stack AX
POP BX ; l^y giá trD trong stack BX
POP Dest
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
LNH POP
Cú pháp :
Mô tB :
PUSHF : PUSh thanh ghi cf
POPF : POP thanh ghi cf
PUSHF
POPF
Nguyen Van Tho – Duy Tan University.
Ví dN :
.STACK 100H
.CODE
MOV AX,9876H ; AX=9876h
MOV BX,1234H ; BX=1234h
PUSH AX ; c^t AX vào Stack
PUSH BX ; c^t BX vào stack
POP CX ; l^y ni dung :;nh stack :0a vào CX
POP DX ; l^y ni dung :;nh stack :0a vào DX
END
Nguyen Van Tho – Duy Tan University.
.STACK 100H
0100h
00FEh
00FCh
00FAh
00F8h
00F6h
00F4h
00F2h
0000h
.
.
.
SP
Offset STACK
0100h SP
9876h AX
0100h BX
CX
DX
Ng n x5p r7ng
MOV AX,9876H
MOV BX,1234H
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
PUSP AX
9876H
0100h
00FEh
00FCh
00FAh
00F8h
00F6h
00F4h
00F2h
0000h
.
.
.
SP
Offset STACK
00FEh SP
9876h AX
1234h BX
CX
DX
Ng n x5p có 1 ph@n t
Nguyen Van Tho – Duy Tan University.
PUSP BX
1234h
9876h
0100h
00FEh
00FCh
00FAh
00F8h
00F6h
00F4h
00F2h
0000h
.
.
.
SP
Offset STACK
00FCh SP
9876h AX
1234h BX
CX
DX
Ng n x5p có 2 ph@n t
Nguyen Van Tho – Duy Tan University.
POP CX
1234h
9876h
0100h
00FEh
00FCh
00FAh
00F8h
00F6h
00F4h
00F2h
0000h
.
.
.
SP
Offset STACK
00FEh SP
9876h AX
1234h BX
1234h CX
DX
Ng n x5p có 1 ph@n t
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
POP DX
1234h
9876h
0100h
00FEh
00FCh
00FAh
00F8h
00F6h
00F4h
00F2h
0000h
.
.
.
SP
Offset STACK
00FEh SP
9876h AX
1234h BX
1234h CX
9876h DX
Ng n x5p r7ng
Nguyen Van Tho – Duy Tan University.
Ví dN 5.1 : Vi>t ch0ong trình nhqp vào 1churi các kí t\ .
Hi.n thD lEi churi kí t\ :ó theo th+ t\ ng0tc lEi .
MOV CX,0 ; :>m =0
MOV AH,1 ; chuun bD :8c
INT 21H ; :8c 1 kí t\
While:
CMP AL,13 ; Enter ?
JE EndWhile ; :úng, dWng :8c
PUSH AX ; không :úng, c^t AX vào stack
INC CX ; tm
INT 21H ; :8c 1 kí t\
JMP While ; try lEi vòng lVp
EndWhile:
Nguyen Van Tho – Duy Tan University.
Ví dN 5.1 (tt)
CMP CX,0 ; :>m =0 ?
JE Exit ; :úng, dWng
MOV AH,2 ; Chuun bD hi.n thD
LAP: POP DX ; L^y kí t\ tW stack
INT 21H ; hi.n thD
LOOP LAP ; lVp lEi CX l5n
Exit:
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
Ví dN 5.2 : Vi>t ch0ong trình xu^t giá trD trong thanh ghi
AX ra màn hình dEng thqp phân.
GiB s6 : AX =12345
Chia AX cho 10 th0ong =1234 s7 d0 =5
Chia th0ong(1234) cho 10 th0ong =123 s7 d0 =4
Chia th0ong(123) cho 10 th0ong =12 s7 d0 =3
Chia th0ong(12) cho 10 th0ong =1 s7 d0 =2
Chia th0ong(1) cho 10 th0ong =0 s7 d0 =1
SA ta c@n xuBt chính là các sA dH trong các phép
chia theo thJ tK ngHLc li
Nguyen Van Tho – Duy Tan University.
Thuqt toán :
>m =0
Do
Chia AX cho 10
C^t s7 d0 vào Stack
>m = :>m+1
While AX=0
For (s7 l5n = :>m)
L^y s7 tW ngp
)i thành kí t\
Hi.n thD
EndFor
Nguyen Van Tho – Duy Tan University.
MOV CX,0 ; >m =0
@DoOut:
MOV DX,0 ; ph5n cao =0
MOV BX,10 ; s7 chia=10
DIV BX ; AX:10, th0ongAX, s7 d0DX
PUSH DX ; c^t s7 d0 vào stack
INC CX ; :>m=:>m +1
CMP AX,0 ; th0ong=0?
JNE DoOut ; không :úng, lVp lEi
MOV AH,2 ; chuun bD hi.n thD
@Print:
POP DX ; L^y s7 tW stack DL
ADD DL,30H ; :)i thành kí t\
INT 21H ; hi.n thD
LOOP @Print ; lVp lEi CX l5n
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
CBi ti>n ch0ong trình :. hi.n thD s7 âm ?
Thuqt toán :
If AX<0 then
In ra d^u ‘–’
AX = - AX
EndIf
CMP AX,0 ; AX=?
JGE EndIf ; :úng, dWng
PUSH AX ; c^t AX vào stack
MOV AH,2 ; chuun bD hi.n thD
MOV DL,’-’ ;
INT 21H ; hi.n thD d^u ‘-’
POP AX ; l^y lEi AX
NEG AX ; AX= -AX
EndIf:
Thêm vào Non chHOng trình kiRm tra AX có phSi là sA âm,
n5u AX<0 thì hiRn thU dBu trV sau Nó thay AX=-AX
Nguyen Van Tho – Duy Tan University.
Ví dN 5.3 : Vi>t ch0ong trình nhqp 1 s7 thqp phân (nhiu
ch s7 ) tW bàn phím, giá trD :8c :0tc :0a vào BX
Thuqt toán :
T)ng =0
8c 1 kí t\
Do
)i kí t\ ra giá trD s7
T)ng = t)ng*10 + giá trD vWa tính
:8c 1 kí t\
While kí t\ nhqn :0tc là Enter
Nguyen Van Tho – Duy Tan University.
MOV BX,0 ; t)ng =0
@DoIn:
MOV AH,01H ; Chuun bD :8c
INT 21H ; :8c 1 kí t\
CMP AL,13 ; kí t\ = Enter ?
JE @ExitIn ; :úng, dWng
SUB AL,30H ; ko :úng, :)i thành s7
MOV AH,0 ; xóa ph5n cao
PUSH AX ; C^t s7 m%i nhqp vào stack
MOV AX,BX ; AX = t)ng
MOV CX,10 ; CX=10
MUL CX ; AX=AX*10
POP BX ; l^y s7 tW stack
ADD BX,AX ; t)ng = AX+ s7 vWa nhqp
JMP @DoIn
@ExitIn:
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
CBi ti>n ch0ong trình :. có th. nhqp vào s7 âm
Thuqt toán :
Âm = 0
8c 1 kí t\
If kí t\ = ‘-’ then âm= 1
T)ng =0
8c 1 kí t\
Do
)i kí t\ ra giá trD s7
T)ng = t)ng*10 + giá trD vWa tính
:8c 1 kí t\
While kí t\ nhqn :0tc là Enter
If âm = 1 then t)ng = - t)ng
Nguyen Van Tho – Duy Tan University.
CHNG TRÌNH CON (TH
TC)
• T) ch+c ki.u các ch0ong trình con giúp ch0ong trình
rõ ràng hon, d quBn lý hon
• Khai báo 1 ch0ong trình con
subname PROC
; thân ch0ong trình con
…..
RET
subname ENDP
• G8i 1 ch0ong trình con
CALL subname
Nguyen Van Tho – Duy Tan University.
MU CHNG TRÌNH CÓ CHNG TRÌNH CON
.MODEL
.STACK
.DATA
.CODE
MAIN PROC
… ; các l[nh c_a ch0ong trình chính :Vt y :ây
CALL Subname ; g8i ch0ong trình con
… ; các l[nh c_a ch0ong trình chính :Vt y :ây
MAIN ENDP
Subname PROC
… ; thân ch0ong trình con Subname
RET ; L[nh k>t thúc ch0ong trình con Subname
Subname PROC
END
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.
CALL VÀ RET
• L[nh CALL dùng :. g8i ch0ong trình con
• L[nh CALL th\c hi[n các vi[c sau
• C^t :Da ch; c_a l[nh ti>p sau l[nh CALL vào ngp (:Da ch; trB
v)
• IP :0tc gán cho :Da ch; offset l[nh :5u tiên c_a ch0ong trình
con chuy.n :iu khi.n cho ch0ong trình con
• L[nh RET báo k>t thúc ch0ong trình con
• L[nh RET th\c hi[n vi[c sau
• L^y giá trD tEi :;nh ngp(:Da ch; trB v) :0a vào IP trB
quyn :iu khi.n lEi cho ch0ong trình g8i
Nguyen Van Tho – Duy Tan University.
Ví dN 5.4 : Vi>t ch0ong trình nhqp vào : dài 3 cEnh c_a 1
tam giác. Tính chu vi tam giác và hi.n thD
Thuqt toán
Nhqp : dài cEnh th+ 1 (a)
Nhqp : dài cEnh th+ 2 (b)
Nhqp : dài cEnh th+ 3 (c)
Chu vi = a + b + c
Hi.n thD chu vi
Có thR tX chJc vic nhYp 1 sA thYp phân thành 1 chHOng
trình con chHOng trình sZ sáng s[a và d bSo quSn hOn
Nguyen Van Tho – Duy Tan University.
.STACK 100h
.DATA
a DW ?
b DW ?
c DW ?
.CODE
Main PROC
CALL Indec ; :8c 1 s7
MOV b,AX ; c^t vào a
CALL Indec ; :8c 1 s7
MOV b,BX ; c^t vào b
CALL Indec ; :8c 1 s7
MOV c,BX ; c^t vào c
ADD a,b ; a=a+b
ADD b,c ; a=a+c
MOV BX,a ; chuun bD xu^t
CALL Outdec ; xu^t k>t quB
Main ENDP
Indec PROC
; th_ tNc :8c 1 s7
; s7 :8c :0tc c^t trong AX
RET
Indec ENDP
Outdec PROC
; xu^t BX ra màn hình
RET
Outdec ENDP
END
DuyTan University Assembly Language Programming
Nguyen Van Tho – Duy Tan University.Indec PROC
; Th_ tNc :8c 1 s7 thqp phân tW bàn phím
; Vào : không
; Ra : AX ch+a s7 thqp phân :8c vào
PUSH BX ; c^t BX vào stack
PUSH CX ; c^t CX vào stack
MOV BX,0 ; t)ng =0
@DoIn:
MOV AH,01H ; Chuun bD :8c
INT 21H ; :8c 1 kí t\
CMP AL,13 ; kí t\ = Enter ?
JE @ExitIn ; :úng, dWng
SUB AL,30H ; ko :úng, :)i thành s7
MOV AH,0 ; xóa ph5n cao
PUSH AX ; C^t s7 m%i nhqp vào stack
MOV AX,BX ; AX = t)ng
MOV CX,10 ; CX=10
MUL CX ; AX=AX*10
POP BX ; l^y s7 tW stack
ADD BX,AX ; t)ng = AX+ s7 vWa nhqp
JMP @DoIn
@ExitIn:
POP CX ; phNc hi CX
POP BX ; phNc hi BX
RET
Indec ENDP
Nguyen Van Tho – Duy Tan University.Outdec PROC
; Th_ tNc xu^t mt s7 thqp phân ra màn hình
; Vào : BX ch+a s7 c5n xu^t
; Ra : Không
PUSH AX ; c^t AX vào stack
PUSH BX ; c^t BX vào stack
PUSH CX ; c^t CX vào stack
PUSH DX ; c^t DX vào stack
MOV CX,0 ; >m =0
@DoOut:
MOV DX,0 ; ph5n cao =0
MOV BX,10 ; s7 chia=10
DIV BX ; AX:10, th0ongAX, s7 d0 DX
PUSH DX ; c^t s7 d0 vào stack
INC CX ; :>m=:>m +1
CMP AX,0 ; th0ong=0?
JNE DoOut ; không :úng, lVp lEi
MOV AH,2 ; chuun bD hi.n thD
@Print:
POP DX ; L^y s7 tW stack DL
ADD DL,30H ; :)i thành kí t\
INT 21H ; hi.n thD
LOOP @Print ; lVp lEi CX l5n
POP DX ; phNc hi DX
POP CX ; phNc hi CX
POP BX ; phNc hi BX
POP AX ; phNc hi AX
RET
Outdec ENDP
Nguyen Van Tho – Duy Tan University.
Chú ý :
. tránh làm r7i loEn ch0ong trình, y :5u ch0ong trình
con, ta phBi c^t các thanh ghi có s6 dNng vào stack và
phNc hi lEi giá trD cho nó y cu7i ch0ong trình con.
. ch0ong trình rõ ràng và d bBo quBn, y :5u ch0ong
trình con nên có chú thích sau:
Miêu tB ch0ong trình con này làm gì
5u vào : ch0ong trình con l^y d li[u :. tính toán
5u ra : giá trD ch0ong trình con trB ra