4. Moơt sô chương trình cú theơ:
PUSH AX MOV AL, {SI}
MOV AL, {SI} XCHG AL, {DI} MOV {SI}, AL POP AX RET DOICHO Endp END MAIN
Sau khi dịch và cho cháy chương trìnhtređn ta thu được các dòng sau: chuoi da sap xep:
B, D, E, G, T, U, Y, Z, a, y
Ví dú 9
Đĩc vào moơt hàng (max 80) ký tự roăi hieơn thị nó theo thứ tự ngược lái
Giại
Thuađơt toán cho vieơc đĩc và hieơn thị moơt hàng ký tự khođng có gì là phức táp. Đeơ có theơ hieơn thị các ký tự theo thứ tự ngược lái so với khi đĩc moơt cách thuaơn tieơn và tránh được các thao tác rườm rà, ta có theơ nghĩ ngay đên vieơc ứng dúng nguyeđn taĩc làm vieơc "vào trước ra sau" cụa ngaín xêp: khi đĩc được các ký tự ta cât chúng laăn lượt vào ngaín xêp và sau đó lái lây laăn lượt các ký tự tređn ra đeơ hieơn thị.
Sau đađy là chương trình thực hieơn cođng vieơc tređn. . Model Small
. Stack 100 . Data
Tbao1 DB 'gõ vào moơt dãy ký tự: S'
Tbao2 DB 13, 10, 'dãy ký tự xêp ngược lái: S' . Code
MAIN Rroc
MOV AX, @Data MOV DS, AX MOV AH, 9
LEA DX, Tbao1
INT 21H ; hieơn Tbao1
XOR CX, CX ; CX: đêm sô ký tự đĩc được MOV AH, 1
DOCTIEP: INT 21H ; đĩc 1 ký tự
LAP : CMP AL, 13 ; CR ?
JE THOIDOC ; đúng, hieơn thị Tbao2
PUSH AX ; khođng, cât nó vào ngaín xêp INC CX ; caơp nhaơt boơ đêm sô ký tự IMP DOCTIEP
THOIDOC:LEA DX, Tbao2 MOV AH, 9
INT 21H ; cách 1 dòng và hieơn Tbao2 MOV AH, 2 ; chuaơn bị hieơn thị ký tự HIEN:POP DX ; lây ký tự ra từ ngaín xêp
INT 21H
LOOP HIEN ; hieơn dòng ký tự xêp ngược
MOV AH, 4CH ; veă DOS
INT 21H MAIN Endp
END MAIN
Ví dú 10
Ta phại đĩc vào 1 dòng ký tự từ bàn phím, kêt thúc baỉng Enter. Sau đó ta phại đêm sô nguyeđn ađm và sô phú ađm có trong dãy ký tự đó roăi hieơn thị các sô đó.
Giại
Trong bài toán này cođng vieơc đĩc vào moơt dãy ký tự từ bàn phím là rât đơn giạn. Chư còn phại nói qua veă thuaơt toán đeơ tìm các nguyeđn ađm và phú ađm: ta phại toơ chức dữ lieơu thành nhóm các nguyeđn ađm và nhóm các phú ađm và sẽ so sánh các ký tự đĩc được với các thành phaăn cụa moêi nhóm này. Moêi khi tìm được ký tự các phaăn tử người ta thường dùng leơnh kieơu REPNE SCASB.
Sau đađy là chương trình NAMPAMASM thực hieơn cođng vieơc tređn. ; tính sô nguyeđn ađm và phú ađm trong moơt dòng ký tự
.Model Small
.Stack 100 .Data Str DB 80 dup (0) NAM DB 'AaEeIiOoUuYy' Pam' DB 'BCDFGHJKLMNPQRSTVWXZ' DB 'bcdfghjklmnpqrstvwxz'
Tbao1 DB 13, 10, 'so ky tu la nguyen am = s' Tbao2 DB 13, 10, 'so ky tu la phu am = s' Tbao3 DB 'go vao 1 xau ky tu la phu am = '$' SoNAM DW 0
SoPAM DW 0 .Code
MAIN Proc
MOV AX, @Data ; khởi đaău cho DS và ES MOV DS, AX
MOV ES, AX
LEA DI, Str ; DI chư vào chuoêi
CALL DOCXAU ; đĩc chuoêi, sô ký tự tái BX MOV SI, DI ; SI chư vào chuoêi vừa đĩc
CLD ; định hướng tiên
LAMLAI:
LODSB ; lây 1 phaăn tư cụa chuoêi LEA DI, NAM ; DI chư vào chuoêi ng.ađm MOV CX, 12 ; 6 nguyeđn ađm, 2 lối chữ REPNE SCASB ; ký tự là nguyeđn ađm ? JNE PHUAM ; khođng, đó là phú ađm INC SoNAM ; taíng sô nguyeđn ađm JMP TIEP
PHUAM :
LEA DI, PAM ; DI chư vào chuoêi phú ađm MOV CX, 40 ; 20 phú ađm, 2 lối chữ REPNE SCASB ; ký tự là phú ađm ?
JNE TIEP ; khođng
INC SoPAM ; taíng sô phú ađm
TIEP: DEC BA ; sô ký tự phại kieơm tra
JNE LAMLAI ; làm lái
LEA DX, Tbao1 INT 21H
MOV AX, SoNAM ; lây sô nguyeđn ađm CALL OUTSO ; hieơn thị sô phú ađm
MOV AH, 4CH ; veă DOS
INT 21H MAIN Endp DOCXAU Proc
; đĩc và lưu moơt chuoêi ký tự, kêt thúc baỉng Enter ; Vào: DI chứa địa chư leơch cụa chuoêi ; Ra: DI chứa địa chư leơch cụa chuoêi
BX chứa sô ký tự đĩc được
PUSH DI ; cât con trỏ
CLD ; định hướng tiên đeơ cât
XOR BX, BX ; xóa boơ đêm sô ký tự MOV AH, 1 ; chuaơn bị đĩc moơt ký tự DOCTIEP :
INT 21H
CMP AL, 13 ; CR ?
JE THOI ; đúng, kêt thúc
CMP AL, 8 ; BS ? (xóa trái)
JNE LUU ; khođng, cât
DEC DI ; đúng, đoơi lái con trỏ
DEC BX ; bớt đi moơt ký tự
JMP DOCTIEP ; đĩc tiêp
LUU: STOSB ; cât ký tự
INC BX ; caơp nhaơt sô ký tự đã đĩc
JMP DOCTIEP ; đĩc tiêp
THOI:POP DI ; lây lái con trỏ
RET ; veă CTC
DOCXAU Endp OUTSO Proc
; hieơn thị sô trong AX ; Vào: AX
MOV BL, 10 ; dùng BL đeơ chứa sô chia XOR CX, CX ; CX: boơ đêm sô laăn hieơn
LAP: DIV BL ; AL: thượng, AH: dư
PUSH AX ; cât sô dư
INC CX ; caơp nhaơt sô laăn XOR AH, AH ; chuaơn bị chia tiêp OR AL, AL ; thương = 0? JNE LAP ; chưa, laịp
MOV AH, 2 ; roăi, chuaơn bị hieơn thị HIEN: POP DX ; lây lái sô dư
OR DH, 30H ; đoơi sô dư ra mã ASCII MOV DL, DH
INT 21H ; hieơn thị kêt quạ
LOOP HIEN ; lây lái sô laăn phại hieơn
RET ; veă CTC
OUTSO Endp
END MAIN
So với cách làm từ trước đên nay thì trong phaăn chương trình đĩc ký tự (DOCXAU) ta đã đưa vào theđm moơt sô leơnh đeơ làm cho vieơc xử lý các ký tự gõ từ bàn phím được meăm dẹo hơn: ta có theơ lối bỏ ký tự gõ nhaăm baỉng cách dùng phím BS (Back space, xóa trái). Tuy nhieđn, tređn màn hình ta khođng thây được hieơu ứng xóa trái thaơt sự cụa BS vì chương trình mà ta viêt ở đađy văn còn quá đơn giạn đeơ có theơ xử lý được vân đeă khá phức táp này. Muôn làm được đieău vừa neđu ta sẽ phại viêt moơt chương trình phức táp hơn trong đó phại sử dúng đên các hàm khác cụa ngaĩt 21H.
Tái chương trình này ta cũng thây được cách làm ra các cađu chú giại cho phaăn mào đaău cụa các chương trình con. Thođng thường trong các chú giại kieơu này ta phại neđu leđn được moơt cách vaĩn taĩt các vân đeă sau:
+ Nhieơm vú cụa chương trình con
+ Các thanh ghi tham gia vào vieơc truyeăn tham sô cụa chương trình khi vào hoaịc ra chương trình đó.
Nhờ phaăn mào đaău này cụa moêi chương trình con ta có theơ thu được các thođng tin sơ boơ veă bạn thađn chương trình con được sử dúng. Ví dú như trong chương trình con DOCXAU, ta có theơ thây được các thanh ghi nào tham gia vào vieơc truyeăn tham sô giữa chương trình chính và chương trình con. Vân đeă truyeăn tham sô giữa các chương trình cũng là vân đeă mà ta sẽ đeă caơp kỹ hơn ở phaăn sau.
Laơp moơt chương trình treê với thời gian treê 1ms dưới dáng chương trình con đeơ có theơ sử dúng nó trong các trường hợp caăn thiêt.
Giại
Chương trình treê thời gian có rât nhieău ứng dúng trong thực tê: từ vieơc táo ra xung ađm thanh với các thanh đieơu khác nhau cho đên vieơc đieău khieơn các đái lượng vaơt lý trong moơt heơ thông vi xử lý - đieău khieơn ứng dúng trong cođng nghieơp. Đeơ giại quyêt vân đeă này, thođng thường ta laơp ra moơt chương trình trong đó có chứa moơt câu trúc laịp, beđn trong câu trúc laịp đó chứa các leơnh mà thời gian đeơ cháy moêi leơnh đó có theơ xác định được từ các tài lieơu tra cứu. Sô laăn laịp cụa vòng laịp thường được chứa trong moơt thanh ghi đeơ có theơ thay đoơi được. Moơt chương trình như như vaơy thường phú thuoơc rât nhieău vào phaăn cứng cụa heơ thông (chí ít cũng phú thuoơc vào lối CPU và taăn sô cụa đoăng hoă nhịp cho nó).
Trong thí dú sau đađy, đeơ cho cođng vieơc tính toán được đơn giạn, ta giạ thiêt CPU là lối 8088-5 MHz (Tclk = 0.200µs). Moơt chương trình viêt dưới dáng thụ túc đeơ táo thời gian treê 1ms có theơ như sau:
TRE1ms Proc
; chương trình treê 1ms
; CLI ; câm các ngaĩt
PUSHCX ; cât CX
MOV CX, 292 ; xem cách tính '292' ở dưới LAP:;NOP ; có NOP đeơ taíng thời ;gian
trể nếu cần LOOP LAP
POP CX ; lây lái CX
; STI ; cho phép ngaĩt trở lái