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

pdf10 trang | Chia sẻ: lylyngoc | Lượt xem: 1520 | Lượt tải: 1download
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 h c 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 (nhi‚u 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… T†C) • 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. MŠU 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 :i‚u 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 quy‚n :i‚u 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 hi CX POP BX ; phNc hi 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 hi DX POP CX ; phNc hi CX POP BX ; phNc hi BX POP AX ; phNc hi 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 hi 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
Tài liệu liên quan