thangthuytn158 MOD
Tổng số bài gửi : 118 Points : 344 Reputation : 2 Join date : 03/11/2011 Age : 32 Đến từ : Thái nguyên
| Tiêu đề: bai tap vi xu ly hop ngu----chuong trinh con stack Thu Nov 17, 2011 9:29 pm | |
| CHƯƠNG 2: CHƯƠNG TRÌNH CON & STACK I> Tóm tắt lý thuyết: I.1> Stack: Stack là một phần bộ nhớ, tổ chức lưu trữ dữ liệu theo cơ chế vào sau ra trước(LIFO: last in first out). Phần tử được đưa vào stack cuối cùng được gọi là đỉnh stack, 8088 dùng SS để lưu địa chỉ đoạn của stack và dùng địa chỉ con trỏ SP để trỏ về đỉnh stack. Trong hợp ngữ người thường dùng thanh ghi con trỏ BP để truy xuất đến các phần tử trong stack mà không làm thay đổi stack, bằng cách: + Trỏ BP về đỉnh stack: MOV BP, SP. + Thay đổi giá trị BP để truy xuất đến các phần tử trong stack. Ví dụ: A, B, C, D là các word stack Mov BP, SP D Mov AX, [BP] Mov AX, [BP+2] Mov AX,[BP+6] Ứng dụng của stack: + khắc phục các hạn chế của lện mov. Ví dụ: mov CS, DS : sai Push DS : đúng Pop CS + Truyền tham số cho các chương trình + Lưu tạm thời giá trị một số thanh ghi hay biến Ví dụ: Sử dụng hai vòng lặp LOOP lồng nhau: Mov CX,8 lặp_1: Push CX lặp_2: Loop Lap_2 Pop CX Loop Lap_1
I.2> Xem lại các lệnh: Push, Push F, Push a Pop, Pop F, Pop a I.3> Ch ương trình con: Ch ương trình con trong Hợp ngữ có vai trò giống như chương t ình con trong các ngôn ngữ bậc cao khác. Chương trình con trong Hợp ngữ không có danh sách tham số, tuy nhiên ta có thể truyền tham số cho chương trình con thông qua thanh ghi, stack, địa chỉ biến,... Cấu trúc chương trình con: <Tên> proc Type ; các lệnh RET <Tên> Endp
Type: Near (ngầm định) Far Chương trình con có thể gọi một chương trình con khác hoặc gọi chính nó. Khi sử dụng chương trình con ta đặc biệt quan tâm đến giá trị các thanh ghi vào (tham số vào) và kết quả trả về thanh ghi nào. V í d ụ: Xuat_xau PROC ; Vào: DS:DX+ địa chỉ xâu cần xuất ; Ra : không có Mov ah,09h Int 21h Ret Xuat_xau endp T_tong proc ; Vào: AX: chứa số thứ nhất BX: chứa số thứ hai ; Ra: AX: chứa tổng Add AX,BX Ret T_Tong endp Ve_dos Proc ; Vao: không có ; Ra: không có Mov ah, 4ch Int 21h Ve_doS endp
Cách gọi: *CALL <Tên chương trình con > *CALL <Biêủ thức địa chỉ > BT địa chỉ: - có thể là thanh ghi - Ô nhớ chứa địa chỉ của thủ tục Ví dụ1: Mov AX, 5 Mov BX, 7 Call T_Tong Ví dụ2: In ra tổng của hai số cho trước trong chương trình Model small Stack 100h Data TB DB ‘Tong cua 5 va 4 la:$’ D_Chi DB ‘xuat_xau, T_Tong, Xuat_ktu’ Code Main Proc Mov AX,@data Mov DX, AX Lea DX,TB Call D_Chi[1] Add AX, 30h Call D_Chi[2] Mov AH, 4ch Int 21h Main endp Xuat_xau proc : Xuat_xau endp T_tong Proc : T_tong endp Xuat_ktu Proc Mov AH,02h Mov DX, AX Int 21h Xuat_ktu endp End
I.4> Cách truyền tham số cho các ch ương trình con: + Truy ền qua thanh ghi : đã biết ở các ví dụ trước. + Truyền qua stack, đây là cách mà các ngôn ngữ bậc cao truyền tham số cho các chương trình con viết bằng hợp ngữ. Ví dụ: Ch ương trình tính tổng 2 số cho trước. Model small Code Org 100h st art: JMP Main
So_TNDW 3 So_THDW 4 TBX DB ‘tong hai so:$’ Main PROC P ush So_TN P ush So_TH Call T_t ong Lea dx, TBX Mov ah, 09h Int 21h
Add bx, 30h Mov ah, 02h Mov dl, bl Int 21h
Int 20h Main Endp
T_ Tong PROC p ush bp mov bp, sp mov bx,[bp\4] add bx, [bp+6] pop bp RET 4 T_ Tong Endp END Start + Truyền qua ô biến + Truyền qua ô nhớ có địa chỉ cho bởi thanh ghi Nếu trong chương trình chính có sử dụng các lời gọi chương trình con thì: - Chương trình con phải nằm trong văn bản chương trình gọi - Hoặc ở một file văn bản khác( V í d ụ: C:\ ASM\Tvien. ASM) Trong tr ường hợp này, ở cuối chương trình gọi phải có dòng lệnh Include C:\ ASM\Tviên. ASM I.5> Xem lại các lệnh SHL, SHR, ROL, ROR,.. II> Câu hỏi tự kiểm tra: 1) Gỉa sử đoạn Stask được khai báo như sau: Stack 100h a) SP bằng bao nhiêu khi bắt đầu chương trình( dạng số hex) b) Stack chứa đ ược nhiều nhất bao nhiêu từ? 2) giả thiết chương trình chứa các dòng lệnh sau đây: Call procl Mov AX,BX Biết rằng lệnh Mov nằm ở địa chỉ 08FD:0203 và Procl là thủ tục Near bắt đầu tại địa chỉ 08FD:0300, SP=0110Ah. Cho biết nội dung của IP v à FP sau mổi lệnh. Giá trị đỉnh Stack là bao nhiêu? 3) viết các lệnh thực hiện: a) Đưa giá trị của đỉnh stack vào AX, không làm thay đổi Stack. b) Đưa từ nằm sau đỉnh Stack v ào AX, không làm thay đổi Stack. c) Đổi chỗ hai từ ở đỉnh Stack. Bạn có thể sử dụng AX v à BX III> Bài tập có lời giải: 1) Viết chương trình nhập vào hai số thập phân và in ra tích của chúng. 2) Viết chương trình nhập vào ba số nhị phân và in ra tổng của chúng 3) Viết 2 thủ tục: Xuất số dạng thập phân v à Nhập sô dạng thập l ục ph ân. 4) Vi ết ch ư ơng tr ình nh ập v ào m ột x âu v à in ra x âu theo chiều đảo ngươc các kí tự. 5) Viết chương trình nhập vào một xâu sau do in ra xâu theo dạng đảo ngược kí tự trong từng từ. Ví dụ: Nhập: Trung tâm Tin học Xuất: gnut mat nit coh 6) Viết chương trình nhập vào 1 xâu sau đó in ra xâu theo dạng đảo ngược thứ tự các từ. Ví dụ: Nhập: Đại học đại cương Xuất: Cuong Dai hoc Dai 7) Viết chương trình kiểm tra tính hợp lệ của một biểu thức đại số đơn giản. Sau đây là 8 byte của ma trận kí tự N khi xuất hiện trên màn hình: 000h, 0Ceh, o64h, 054h,044h, 044h, 0Ceh, 000h Hãy viết chương trình in ra dạng phóng đại của nó( mổi byte là một dòng trên MH). 9) a) Viết thủ tục RANDOM nhận 1 số vào AX và trả về một số ngẫu nhiên trong AX. Dựa vào thuật toán sau: - Bắt đầu bằng một số bất kỳ trong miền giới hạn - Dịch trái 1 bít - Thay bít 0 bằng kết quả của phép XOR bít 14 và bit 15 - Xoá bit 15 b) Viết chương trình để nhập vào một số nhị phân sau đó hiển thị ra màn hình 50 cửa sổ có kích thước và màu khác nhay. 10)Viết chương trình nhập vào 3 số thập phân, mỗi số có số kí tự khác nhau. Sau đó in ra 3 số đó ở 3 dòng theo dạng chỉnh lề phải. Ví dụ: Nhập: số1: 1234 số2: 567 số 3: 89123 Xuất: 1234 567 89123 Phần bài giải: Bài III.1) Trong chương I chúng ta đã biết cách nhập 1 kí tự(hàm 01) xuất 1 kí tự(hàm 02), nhập một xâu( hàm 0Ah) và xuất một xâu(ham09). Trong các bài 1,2 và 3 của chương này chúng ta muốn giới thiệu với các bạn các thủ tuc Xuất nhập số, vì DOS cũng như BIOS không cung cấp cho chúng ta các hàm xuất nhập số, để các bạn sử dụng cho các bài tập chương sau, đó là các thủ tục xuất nhập số hệ nhị phân, số hệ thập phân, số hệ thập lục phân. Trong các thủ tục này các bạn chú ý các thanh ghi vào và ra Ví dụ: Thủ tục NHap_NP nhập số vào BX Nhap_TP nhập số vào AX,... Xuat_tp xuất số trong AX ra màn hình Do đó trước khi xuất một số ta phải đưa số đó vào thanh ghi mà thhủ tuc xuất yêu cầu
Ví dụ: Xuất số 23 ra màn hình ở dạng thập phân và nhị phân Mov ax, 23 ; chuẩn bị xuất Call Xuat_TP Mov bx, 223 ; chuẩn bị xuất Call Xuat_NP Sau đây là nội dung chương trình .Model Small .Stack 100h .Data TB1 DB ‘ vào số thứ nhất:$’ TB2 DB 0Dh, 0Ah,’Vào số thứ hai:$’ TB3 DB 0Dh, 0Ah,’ Vào số thứ ba:$’ TB4 DB 0Dh, 0Ah,’ Tong của 3 số là:$’ Tong DW 0
.Code Main proc Mov ax, @data ; khởi tạo DS Mov ds, ax
Xor cx, cx ; xoá CX Lea dx, TB1 Call X_xau Call Nhap_NP Add Tong, bx
Lea dx, TB2 Call X_xau Call Nhap_NP Add Tong, bx Lea dx, TB3 Call X_xau Call Nhap_NP Add Tong, bx
Lea dx, TB4 Call X_xau Mov bx, Tong Call Xuat_NP
Mov AH, aCh Int 21h, Main endp
Nhap_NP proc ;Vào: Không có ; Ra: Số nhập chứa trong BX Push ax Push bx Xor bx, bx Mov ah, 1 Int 21h Lap: Cmp al, 0Dh Je KT Cmp al,’0’ ; Jnge KT ; Cmp al,’1’ ; Jnle KT ;
And al, 0Fh ; đổi kí tự sang số Shl bx, 1 Or bl,al Int 21h Jmp Lap KT: Pop bx Pop ax Rel Nhap_NP endp ; Vào: BX= Số cần xuất ; không có Push ax Push bx Push cx Push dx Mov cx, 16 Dich: Sh1 bx,1 Jc Bang_1 Mov ah, 02 Mov dl,’0’ Int 21h Loop Dich Jmp K_thuc Bang_1 Mov ah,02 Mov dl,’1’ Int 21h Loop Dich K_thuc Pop dx Pop cx Pop bx Pop ax Ret Xuat_NT endp
X_xau Proc ; Vào: DS:DX= địa chỉ xâu cần xuất ; Ra: không có Push ax Mov ah, 09h Int 21h Pop ax Ret X_xau endp End Main ******** Bài III.2 .Mode Small .Stack 100h_ .Data TB1 DB ‘Nhập vào số thứ nhất:$’ TB2 DB 0Ah,0Dh,’Nhập vao so thu hai:$’ TB3 DB 0Ah,0Dh,’Tich cua chung la:$’ Code Main proc mov ax,@dât mov ds, ã
mov ah,09h lea dx,TB1 int 21h call Nhap_TP push ax ; lưu số thứ nhất
mov ah,09h lea dx,TB2 int 21h call Nhap_TP pop bx ; lấy lại số thứ nhất imul bx ; nhân với số thứ hai push ax ; lưu tích số
mov ah,09h lea dx,TB3 int 21h pop ax ; chuẩn bị xuất tích số call xuất_TP mov ah,4Ch int 21h
Xuat_TP proc ;vào : AX=số cần xuất ;Ra:không có Push ax Push bx Push cx Push dx
or ax, ax jge end_if push ax;
mov dl,’_’ mov ah,2 int 21h
pop ax; neg ax End_if: xor cx,cx mov bx,10 Lap: xor dx,dx div bx push dx inc cx or ax, ax ige lap mov ah,2 in_lap: pop dx or dl,30h int 21h loop in_lap
pop dx pop cx pop bx pop ax ret Xuat_TP endp
Nhap_TP proc ;Vào:Không có ;Ra:Số nhập chứa trong AX push bx push cx push dx Begin: xor bx,bx xor cx,cx
mov ah,1 int 21h
cmp a1,’-‘ je minus cmp a1,’+’ je plus jmp Repeat minus: mov cx,1 plus: int 21h Repeat: Cmp a1,’0’ Jnge Not_So
And ax,000Fh ; Push ax;
Mov ax,10 ; Mul bx ; Pop bx ; Add bx, ax ;
Mov ah,1 Int 21h Cmp a1,0Dh Jne repeat Mov ax,bx Or cx,cx Je Exit Neg ax Exit: Pop dx Pop cx Pop bx Ret
Not_So:
Mov ah,2 Mov dl,0Dh Int 21h Mov dl,0Ah Int 21h
Jmp Begin Nhap_TP endp Main endp ************** Bài III.3 Bài này chỉ trình bày hai thu tục:Nhập số thập lục phân và số thập lục phân để bạn đọc tham khảo và áp dụng cho các bài tập sau: Sau đây là nội dung các thủ tục
Nhap_TL proc Xor bx,bx Mov cl,4 Mov ah,1 Int 21h Lap: Cmp a1,0Dh Je KT Cmp a1,39h Jg chucai
And a1,0Fh Jmp Dich Chucai: Sub a1,37h Dich: shl bx,cl Or bl,bl Int 21h Jmp lap KT: ret Nhap_TL endp Xuat_TL proc Mov cx,4 Lap_Xuat: Mov dl,bh Shr dl,cl Cmp dl,9 Jg chu_cai Or dl,30h Jmp in_ra Chu_cai: ADD.DL,37h In_ra: Mov ah,2 Int 21h Shl bx,cl Lôp lap_xuat Ret Xuat_tl endp *********** Bài III.4 thực hiện chương trình: +Nhập bằng hàm A0h của ngắt 21 +kiểm tra kí tự trong AL .Nếu AL<>’’ thì lưu AX vào STACK và tăng CX để làm biến đếm cho vòng lặp xuất,và tiếp tục nhập Cmp al,odh ;co phai ENTER? Je KT_Xuat ; đúng,kết thúc nhập và chuẩn bị xuất Push ax ;sai tiếp tục lưu vào Stack Inc cx ;tăng số kí tự trong Stack .nếu Al =’’thi lấy nội dung trong đỉnh STAK ra để xuất Mov ah,2 Pop dx ;xuất phần tử trong Stack Int 21h Sau đây là nội dung chương trình: .model small .stack 100h .data TB_Nhập _db ‘Hay nhap vao 1 dong VB:$’
TB_Xuat db 0dh,0ah,’Dong van ban sau khi dao:$’ Code Main proc Mov ax,@data Mov ds, ax
Mov ah,9 Len dx,TB_Nhap Int 21h Xor cx,cx ;Cx đếm số kí tự đã lưu vào Stack Mov ah,1 ; đọc kí tự Int 21h nhập: cmp al,0dh ;có phải ENTER? JE KT_Xuat ; đúng,kết thúc nhập và chuẩn bị xuất Push ax ;sai tiếp tục lưu vào stack Inc cx ;tăng số kí tự trong Stack Int 21h ;nhập tiếp
Jmp Nhap KT_Xuat: Mov ah,9 Lea dx,TB_xuat Int 21h
Xuat: Mov ah,9 Pop dx ;xuất phần tử trong Stack Int 21h Loop Xuat
K_thuc: Mov ah,0 ; đợi ấn một phím Int 16h
Mov ah,4ch Int 21h Main end End main *********** Bài III.5 thực hiện chương trình: +NHập bằng hàm 0Ah +Sau khi nhập lưu số kí tự vừa nhập vào CX để chuẩn bị cho vòng lặp DUYỆT Mov ch,0 ;lấy biến đếm CX Mov cl,D _Nhap[1];cho vòng lặp DUYỆT +Lấy kí tự đầu tiên trong vùng lưu kí tự của đếm nhập lưu vào Al sau đó tăng BX để chỉ đến kí tự tiếp theo(dùng chế độ gián tiếp bộ nhớ) Mov bx,2 ;bắt đầu vùng chứa kí tự vừa gõ duyệt: mov al,D_NHAp[bx] inc bx +kiểm tra kí tự trong AL: .nếu Al<>’’ thí lưu AL vàoSTACK VÀ TĂNG spt để chuẩn bị cho vòng lặp xuât_D,và tiếp tục Cmp al,’’ ;có phải kí tự trắng? Je Xuât_D ; đúng,chuẩn bị xuất
Push ax; chưa ,lưu kí tự vào Stack Inc sô_PT ;tăng so_PT
Loop Duyêt Nêu Al=’’ thi,nếu SPT<>0 thì lấy phần tử trong đỉnh Stack để xuất cho đến khi SPT bằng 0(sau mỗi lần xuất thì giảm SPT),tức là đã đảo được một từ Pop dx Mov ah,02h Int 21h Dec so_PT Cmp so_PT,0 ;còn phần tử nào trongn stack không? Jne Xuat_D ;còn,xuất Sau khi xuất xong một từ ta kiểm tra CX để xem đã hết xâu hay chưa,nếu (CX<>0) Chưa thì tiếp tục đểtiếp tục đảo từ thứ tiếp theo,nếu hết(CX=0) thì kết thúc. Cmp cx,0 ;hết xâu chưa? Je thoai ;hết,kết thúc Loop Duyệt ;chưa,tiếp tục Sau đây là nội dung chương trình: Model small Code Org 100h Start: JMP begin TBN ĐB ‘Nhap vao một xâu:$’ TBX DB 0ah,0Dh,’Xau sau khi dao:$’ D_Nhap DB 80,0,80 DUP(0) So_PT DW 0 ;ghi nhận số phần tử đã lưu vào stack Begin: Mov ah,09h Lea dx,TBN Int 21h
Lea dx,D_Nhap Mov ah,oAh Int 21h
Mov ah,09h Lea dx,TBX Int 21h
Mov ch,0 ;lấy biến đếm CX Mov cl,D_nhap[1] ;cho vong lặp duyet
Mov bx,2; Duyêt: Mov al,D_nhap[bx] Inc bx
Cmp al,’’ ;có phải kí tự trắng? Je xuât_D ; đúng,chuẩn bị xuất
Push ax ;chưa,lưu kí tự vào stack Inc so_PT ;tăng so_PT
Loop duyệt
Xuat_D: Pop dx Mov ah,02h Int 21h dec So_PT cmp So_PT,0 ; còn phần tử nào trong stack không? jne Xuat_D ; còn,xuất
mov dl,’’ ; in khoảng trắng sau mỗi từ mov ah,02h int 21h
cmp cx,0 ; hết xâu chưa? je Thoát ; hết, kết thúc
Loop Duyet ; chưa,tiếp tục Thoát: int 20h End start
Bài III.6 Bài này thực hiện tương tự bài 5 nhưng ở đây ta duyệt từ xâu cuối và dùng con trỏ SI để duyệt xâu do đó trước hết ta phải trỏ SI về ký tự cuối cùng trong xâu đã nhập xâu, sau đó giảm SI trỏ đến ký tự trước đó mov cx,bx ; chuẩn bị cho vòng Duyet lea si,D_Nhap[bx+1] ` ; trỏ SI về ký tự cuối cùng trong D_Nhap sau đây là nội dung chương trình .Model Small .Code Org 100h Start: Jmp Quadata TBN -db ‘ Nhap vao 1 xau:$’ TBX db 0dh,0ah,’Xau dao tu :$’ D_Nha db 40,0,40 dup (0) STP dw 0
Quadata mov ah,09 lea dx,TBN int 21h mov ạh,0Ah lea dx,D_Nhap int 21h mov ah,09 lea dx,TBX int 21h
mov b1,D_Nhap[1] ; lưu các ký tự trong xâu mov bh,0 ; đã nhập vào bx mov cx,bx ; chuẩn bị cho vòng lặp Duyet lea si,D_Nhap[bx+1] ; trỏ SI về ký tự cuối cùng trong D_Nhap
Duyet: mov al, [si] ; lấy ký tự đầu cmp al,’’ ; kiểm tra có ký tự trắng je Xuat ; đúng,xuất push ax ; sai, lưu vào stack inc SPT sub si,1 ; trỏ về phần tử trước nó loop Duyet Xuat: cmp SPT,0 je D_Tiep
pop ‘dx mov ah,02h int 21h dec SPT
jmp Xuat D_Tiep: cmp cx,0 je K_Thuc
mov dl,’’ mov ah,02 int 21h sub si,1 loop Duyet K_Thuc int 20h End start
Bài III.7
.Model Small .Code ORG 100h Start: JMP Begin TBN DB ‘Nhap vao bieu thuc:$’ TBS DB 0Ah,0Dh,’Bieu thuc khong hop le $’ TBD DB 0Ah.0Dh,’Bieu thuc hop le$’ D_Nhap DB 80,0,80 DUP(0) So_PT DW 0 Begin: mov ah,09h lea dx,TBN int 21h
lea dx,D_Nhap mov ah,0Ah int 21h
mov c1,D_Nhap[1] mov ch,0
xor dx,dx xor ax,ax xor bx,bx mov bx,2 Duyet: mov al,D_Nhap[dx] inc bx cmp al.’(‘ je LUU cmp al,’[’ je LUU cmp al,’[’ je LUU
cmp al,’)’ je K_Tra cmp al,’]’ je K_Tra cmp al,’]’ je K_Tra
Loop Duyet jmp K_Thuc LUU: push ax inc So_PT Loop Duyet jmp K_Thuc K_Tra: cmp So_PT je TB_Sai cmp al,’)’ je KTra_1 cmp al,’]’ je KTra_2 cmp al,’]’ je Ktra_3
Ktra_1: pop dx dec So_PT cmp dl,’(‘ je Duyet_T jmp TB_Sai Ktra_2: pop dx dec So_PT cmp dl,’[‘ je Duyet_T jmp TB_Sai Ktra_3: pop dx dec So_PT cmp dl,’[’ je Duyet_T jmp TB_Sai
Duyet_T: Loop Duyet jmp K_Thuc TB_Sai: mov ah,09h lea dx,TBS int 21h jmp Thoat
K_Thuc: cmp So_PT,0 jnz TB_Sai
TB_Dung: mov ah,09 lea dx,TBD int 21h
Thoat: Int 20h END Start
Bài III.8 Thực hiện chương trình: +Trỏ SI về byte đầu của biến Chu_n Lea SI,Chu_n +Lưu byte được trỏ bởi SI vào BL mov bl,[SI] +Kiểm tra từng bit trong BL( bằng lệnh dịc và kiểm tra cờ CF), kể từ bit bên trái nhất, nếu gặp bit 0 thì in ra ký tự trắng và tiếp tục, nếu gặp bit 1 thì in ra ký tự có giá trị ASCII 219 và tiếp tục cho đến hết 8 bit thì xuống dòng và thực hiện tương tự cho byte tiếp theo cho đến hết 8 byte,trong chương trình ta dùng biến So_dong để ghi nhận số byte đã thực hiện ( thực hiện cho đến khi số dòng bằng mov bl,[si] ;lưu byte vào bl add si,1 ;trỏ đến byte tiếp theo inc So_dong ……… cmp So_dong,8 ;hết byte 8 chưa? Jl lap1 ;chưa, tiếp tục + Trong chưeơng trình này ta dùng hai vòng lặp: 1 cho duyệt bit trong BL(dùng CX) một cho 8 byte của Chu_n ( dùng biến )So_dong ,chúng ta chú ý cách sử dụng này để áp dụng cho bài toán co hai vòng lặp lồng nhau Sau đây nội dung chương trình .Model Small .Code Org 100h Start: Jmp BEGIN Chu_n DB 000h DB 0CEh DB 064h DB 054h DB 04Ch DB 044h DB 0CEh DB 000h So_dong DB 0 Begin: Lea si,Chu_n ;trỏ SI về byte đầu tiên của biến Chu_n Lap1: mov bl,[si] ;lưu biến đầu vào bl add si,1 ; trỏ đến byte tiếp inc So_dong
mov cx,8 ; so bit trong bl Lap2: shl bl,1 jc Bang_1 mov ah,02h mov dl,’’ int 21h
loop Lap2 jmp X_dong Bang_1: mov ah,02h mov dl,’’ int 21h loop lap2 X_dong: mov ah,02h mov dl,oah int 21h mov dl,0dh int 21h Cmp So_dong,8 ;hết 8 byte chưa? Jl lap1 ; chưa ,tiếp tục K_Thuc Int 20h ;hết ,kết thúc END Start
Bài III.8 + Thủ tục RAMDOM đã được ghép chung chương trình,chú ý thủ tục này vào trong AX và ra cũng trong AX, nhờ vậy mà ta tạo được nhiều số ngẫu nhiên bằng cách thực hiện một vòng lặp trong đó gọi nhiều lần thủ tục RAMDOM. + Thao tác vẻ hình trên màng hình đồ hoạ. .Vẻ các điểm trên một dònh để được một đường thẳng .Vẻ nhiều đường thẳng liền nhau,xuất phát và kết thúc tại các cột bằng nhau để tạo thành hình chữ nhật hoặc hình vuông mov al,0 VE1: int 10h ;vẻ điểm int cx ;tang cot cmp cx,cot2 je Tangdong jmp VE1 ;đến cot2 chưa? Tangdong: inc dx mov cx,cot1 ;vẽ lại từ cot1 cmp dx,dong2 jl VE1 Trong bài này ta dùng hàm IC của 10H, chức năng vẽ điểm có amù và dùng hàm RAMDOM để tạo COT,DONG và màu cho mỗi hình Sau đây là nội dung chương trình .Model Small .Code Org 100h Start: jmp Begin TB db ‘Nhap so nhi phan khoi tao:$’ TBS db 0dh,0ah,’Chi nhap 0 hoac 1,Nhap lai:$’ NHO dw 0 Cot1 dw 0 Dong1 dw 0 Cot2 dw 0 Dong2 dw 0 Sk dw 0 ;số khung Dem dw 0 Begin proc lea dx,TB move ah,09h int 21h
call READ push bx mov cx,180 mov SK,cx
mov ah,0fh ;xoa mang hinh int 10h mov ah,00 int 10h
mov ah,0 mov ah,12h int 10h mov ah,0ch mov al,0 ; vẽ điểm với màu trong al Lap: pop bx Lai1: call Ramdom cmp bx,0 ja Tiep1 jmp Lai1 Tiep1: cmp bx,639 ja Lai1 mov cot1,bx Lai2: call ramdom cmp bx,0 ja Tiep2 jmp Lai2 Tiep2: cmp bx,479 ja Lai2 mov Dong1,bx Lai3 call Ramdom cmp bx,0 ja Tiep3 jmp Lai3 Tiep3: cmp bx,639 ja Lai3 mov Cot2,bx Lai4: call Ramdom cmp bx,0 ja Tiep4 jmp Lai4 Tiep4: cmp bx,479 ja Lai4 mov Dong2,bx
; Nhập số liệu cho khung ;Chỉnh lại theo cột và dòng mov cx,Cot1 cmp cx,Cot2 ja Trao1 Lai5: mov dx,dong1 cmp dx,dong2 ja Trao2 jmp VE Trao1: push dx mov dx,cx mov cx,cot2 mov cot1,cx mov cot2,dx pop dx jmp Lai5 Trao2: Push cx mov cx,dx mov dx,dong2 mov Dong2,cx mov Dong1,dx pop cx VE: push bx ;luu bx inc al mov bh,0 ;trang ve cmp al,16 jne VE1 mov al,0
VE1: int 10h ;vẽ điểm inc cx ;tang cot cmp cx,Cot2 je Tangdong jmp VE1 ;đến cột2 chưa? Tangdong inc dx mov cx,cot1 ;vẽ lại từ cột1 cmp dx,dong2 jl VE1
dec SK ;giảm số khung cmp sk,0 ;hết chưa? je Thoat ;hết jmp Lap Thoat: mov ah,0 int 16h mov ax,3 int 10h ;trả về chế độ văn bản
int 20h ret Begin endp ;************ ; thủ tục tạo số cho bx ;************ Read proc xor bx,bx mov Diem,bx Tro: mov ah.01h int 21h While_: inc Dem cmp Dem,16 je End_while cmp al,0dh je Ènd_while cmp al,’0’ je Tieptuc cmp al,’1’ jne Thongbao Tieptuc: and al,0fh shl bx,1 or bl,al int 21h jmp while Thongbao: lea dx,tbs mov ah,09h int 21h xor bx,bx mov Dem,bx jmp TRO End_while: Ret Read endp
;************** ;Tạo số ngẫu nhiên Ramdom proc push ax push dx shl bx,1 mov ax,bx mov dx,bx shl ax,1 xor ax,dx shl ax,1 jc next and bx,0fffeh and bx,7fffh jmp het Next xor bx,1h and bx,7fffh Het: mov dx,0h shl dx,1 pop dx pop ax ret Random endp END start
Bài 10 .Model small .Stack 100h .Data cr equ 0ah if equ 0dh so1 db 8 dup(0) so2 db 8 dup(0) so3 dp 8 dup(0) cau1 dp cr,1f,’Nhap vao so thu 1:$’ cau2 dp cr,1f,’Nhap vao so thu2:$’ cau3 dp cr,,1f,’Nhap vao so thu3:$’ .Code Main proc mov ax,@data mov ds,ax mov ah,0fh
int 10h mov ah,0 int 10h
lea dx,cau1 call xuatxau
lea bx,so1+7 call nhapthapphan lea dx,cau2 call xuatxau
lea bx,so2+7 call nhapthapphan
lea bx,cau3 call xuatxau
lea bx,so3+7 call nhapthapphan inkq: mov ah,0fh int 10 mov ah,00 int 10h
lea bx,so3 mov dh,9 mov dl,30 call xuat ket qua lea bx,so2 mov dh,8 mov dl,30 call xuat ket qua
lea bx,so1 mov dh,7 mov dh,30 mov dl,90 int 10h mov ah,07 int 21h Thoat: mov ah,4ch int 21h Main endp
Nhapthapphan proc xor cx,cx mov ah,1 nhap: int 21h cmp al,0dh jne ttuc cmp cx,0 je thoatnh jmp luunh ttuc: cmp al,’0’ jb nhap cmp al,’9’ ja nhap sub all,48 push ax inc cx cmp cx,7 je luunh jmp nhap luunh: xor ax,ax pop ax aaa mov byte ptr[bx],al dec bx loop luunh thoatnh: ret Nhapthapphan endp Xuatxau proc near Xuatxau endp
Xuatketqua proc push ax push cx push dx push dx
mov cx,8 llap: cmp byte ptr[bx],0 jne rr dec cx inc bx cmp cx,1 je rr jmp llap rr: pop bx add bx,7 rra: mov ah,02 push bx mov bh,0 int 10h pop bx push dx mov dl,[bx] call xuatso pop dx dec dl dec dx loop rra pop dx pop cx pop ax ret Xuatketqua endp Xuatso proc near push dx push ax mov ah,02 add dl,30h int 21h
pop ax pop dx ret Xuatso endp End main
| |
|