PUSH AX MOV AL, {SI}

Một phần của tài liệu Lập Trình Bằng Hợp Ngữ Với 8088 (Trang 42)

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

Một phần của tài liệu Lập Trình Bằng Hợp Ngữ Với 8088 (Trang 42)

w