Thắng Ỉn-Thái Nguyên City-Giao lưu và kết bạn
Xin chào..!Bạn đang ở diễn đàn anh em thái nguyên....hãy chung tay góp sức để diễn đàn ngày càng phát triển.thank you very much and good luck 4you!!!!!!!!!!!!!!!!Very Happy:D:D
...............Admin....................
Thắng Ỉn-Thái Nguyên City-Giao lưu và kết bạn
Xin chào..!Bạn đang ở diễn đàn anh em thái nguyên....hãy chung tay góp sức để diễn đàn ngày càng phát triển.thank you very much and good luck 4you!!!!!!!!!!!!!!!!Very Happy:D:D
...............Admin....................
Thắng Ỉn-Thái Nguyên City-Giao lưu và kết bạn
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.
Thắng Ỉn-Thái Nguyên City-Giao lưu và kết bạn

Diễn Đàn Anh Em Thái Nguyên
 
Trang ChínhGalleryTìm kiếmLatest imagesĐăng kýĐăng Nhập
Similar topics
Tìm kiếm
 
 

Display results as :
 
Rechercher Advanced Search
Latest topics
Navigation
 Portal
 Diễn Đàn
 Thành viên
 Lý lịch
 Trợ giúp
 Tìm kiếm
Diễn Đàn
Affiliates
free forum


 

 bai tap vi xu ly hop ngu----chuong trinh con stack

Go down 
Tác giảThông điệp
thangthuytn158
MOD
MOD
thangthuytn158


Tổng số bài gửi : 118
Points : 344
Reputation : 2
Join date : 03/11/2011
Age : 31
Đến từ : Thái nguyên

bai tap vi xu ly hop ngu----chuong trinh con stack  Empty
Bài gửiTiêu đề: bai tap vi xu ly hop ngu----chuong trinh con stack    bai tap vi xu ly hop ngu----chuong trinh con stack  Icon_minitimeThu 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.
Cool 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 Cool
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
Về Đầu Trang Go down
http://anhemthainguyen.tk/
 
bai tap vi xu ly hop ngu----chuong trinh con stack
Về Đầu Trang 
Trang 1 trong tổng số 1 trang
 Similar topics
-
» Bộ vi xử lý 8088/8086 và lập trình hợp ngữ x86
» Cách ép đồ + 15 võ lâm 2 tỉ lệ thành công 99% Diễn đàn võ lâm 2 :Bên cạnh đó,các hoạt động phiên bản cập nhật mới Auto Thương Hội đã thu hút đông đảo anh thư, hào kiệt đăng ký tham gia Tương lai chương trình sẽ mở rộng cho tất cả hào kiệt. [url=http://
» CD giáo trình Hacker

Permissions in this forum:Bạn không có quyền trả lời bài viết
Thắng Ỉn-Thái Nguyên City-Giao lưu và kết bạn :: Công nghệ thông tin :: Học Tập-
Chuyển đến