MINH HỌA LỆNH TEST

Một phần của tài liệu Bài giảng assembly chương 7 nhập môn assembly (Trang 91 - 128)

MOV AH, 2 INT 17h

TEST AL , 00100000b ; Test bit 5, nếu bit 5 = 1 máy in hết giấy.

Ex : kiểm tra trạng thái máy in. Interrupt 17H trong BIOS sẽ kiểm tra trạng thái máy in, sau khi kiểm tra AL sẽ chứa trạng thái máy in. Khi bit 5 của AL là 1 thì máy in hết giấy.

Lệnh TEST cho phép test nhiều bit 1 lượt.

MINH HỌA LỆNH TEST(tt)

TEST AL, 1 ; AL chứa số chẳn ? JZ A1 ; nếu đúng nhảy đến A1.

Ex :viết đoạn lệnh thực hiện lệnh nhảy đến nhãn A1 nếu AL chứa số chẵn.

Lệnh CMP

Cú pháp : CMP destination , source

Công dụng : so sánh toán hạng đích với toán hạng nguồn bằng cách lấy toán hạng đích – toán hạng nguồn.

Hoạt động : dùng phép trừ nhưng không có toán hạng đích nào bị thay đổi.

Các toán hạng của lệnh CMP không thể cùng là các ô nhớ.

lệnh CMP giống hệt lệnh SUB trừ việc toán hạng đích không thay đổi.

LỆNH NHẢY CÓ ĐIỀU KIỆN

Cú pháp : Jconditional destination

Công dụng : nhờ các lệnh nhảy có điều kiện, ta mới mô phỏng được các phát biểu có cấu trúc của ngôn ngữ cấp cao bằng Assembly.

Phạm vi

Chỉ nhảy đến nhãn có khoảng cách từ -128 đến +127 byte so với vị trí hiện hành.

Dùng các trạng thái cờ để quyết định có nhảy hay không?

LỆNH NHẢY CÓ ĐIỀU KIỆN

Hoạt động

để thực hiện 1 lệnh nhảy CPU nhìn vào các thanh ghi cờ.

nếu điều kiện của lệnh nhảy thỏa, CPU sẽ điều chỉnh IP trỏ đến nhãn đích các lệnh sau nhãn này sẽ được thực hiện.

………

MOV AH, 2 MOV CX, 26 MOV DL, 41H

PRINT_LOOP : INT 21H

INC DL DEC CX

JNZ PRINT_LOOP MOV AX, 4C00H INT 21H

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁN HẠNG KHÔNG DẤU.

Thường dùng lệnh CMP Opt1 , Opt2 để xét điều kiện nhảy hoặc dựa trên các cờ.

JZ Nhảy nếu kết quả so sánh = 0

JE Nhảy nếu 2 toán hạng bằng nhau

JNZ Nhảy nếu kết quả so sánh là khác nhau.

JNE Nhảy nếu 2 toán hạng khác nhau.

JA Nhảy nếu Opt1 > Opt2 JNBE Nhảy nếu Opt1 <= Opt2 JAE Nhảy nếu Opt1 >= Opt2

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁN HẠNG KHÔNG DẤU (ctn) .

JNC Nhảy nếu không có Carry.

JB Nhảy nếu Opt1 < Opt2

JNAE Nhảy nếu Not(Opt1 >= Opt2) JC Nhảy nếu có Carry

JBE Nhảy nếu Opt1<=Opt2

JNA Nhảy nếu Not (Opt1 > Opt2)

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁN HẠNG CÓ DẤU .

JG Nhảy nếu Opt1>Opt2

JNLE Nhảy nếu Not(Opt1 <= Opt2) JGE Nhảy nếu Opt1>=Opt2

JNL Nhảy nếu Not (Opt1 < Opt2) JL Nhảy nếu Opt1 < Opt2

JNGE Nhảy nếu Not (Opt1 >= Opt2) JLE Nhảy nếu Opt1 <= Opt2

JNG Nhảy nếu Not (Opt1 > Opt2)

LỆNH NHẢY DỰA TRÊN CÁC CỜ .

JCXZ Nhảy nếu CX=0 JS Nhảy nếu SF=1 JNS Nhảy nếu SF =0

JO Nhảy nếu đã tràn trị

JL Nhảy nếu Opt1 < Opt2

JNGE Nhảy nếu Not (Opt1 >= Opt2) JLE Nhảy nếu Opt1 <= Opt2

JNO Nhảy nếu tràn trị

JP Nhảy nếu parity chẳn JNP Nhảy nếu PF =0

CÁC VỊ DỤ MINH HỌA LỆNH NHẢY CÓ ĐK

Ex1 : tìm số lớn hơn trong 2 số chứa trong thanh ghi AX và BX . Kết quả để trong DX

; giả sử AX là số lớn hơn.

; IF AX >=BX then

; nhảy đến QUIT

; ngược lại chép BX vào DX

MOV DX, AX CMP DX, BX JAE QUIT MOV DX, BX QUIT :

MOV AH,4CH INT 21H

…………

CÁC VÍ DỤ MINH HỌA LỆNH NHẢY CÓ ĐK

Ex1 : tỡm số nhỏ nhất trong 3 số chứa trong thanh ghi ALứ BL và CL . Kết quả để trong biến SMALL

MOV SMALL, AL CMP SMALL, BL JBE L1

MOV SMALL, BL L1 :

CMP SMALL, CL JBE L2

MOV SMALL, CL L2 : . . .

; giả sử AL nhỏ nhất

; nếu SMALL <= BL thì Nhảy đến L1

; nếu SMALL <= CL thì

; Nhảy đến L2

; CL là số nhỏ nhất

Các lệnh dịch và quay bit

SHL (Shift Left) : dịch các bit của toán hạng đích sang trái

Cú pháp : SHL toán hạng đích ,1 Dịch 1 vị trí.

Cú pháp : SHL toán hạng đích ,CL

Dịch n vị trí trong đó CL chứa số bit cần dịch.

Các lệnh dịch và quay bit

Ex : DH chứa 8Ah, CL chứa 3.

SHL DH, CL ; 01010000b

? Cho biết kết quả của : SHL 1111b, 3

MT thực hiện phép nhân bằng dịch trái

lệnh dịch phải SHR

Công dụng : dịch các bit của toán hạng đích sang bên phải.

Cú pháp : SHR toán hạng đích , 1

MT thực hiện phép chia bằng dịch phải

Hoạt động : 1 giá trị 0 sẽ được đưa vào bit msb của toán hạng đích, còn bit bên phải nhất sẽ được đưa vào cờ CF.

SHR toán hạng đích , CL ; dịch phải n bit trong đó CL chứa n

lệnh dịch phải SHR

Ex : shr 0100b, 1 ; 0010b = 2

Đối với các số lẻ, dịch phải sẽ chia đôi nó và làm tròn xuống số nguyên gần nhất.

Ex : shr 0101b, 1 ; 0010b = 2

Các phép nhân và chia tổng quát

Việc nhân và chia cho các số lũy thừa của 2 có thể thực hiện bằng lệnh dịch trái và dịch phải.

Để nhân và chia cho các số bất kỳ ta có thể kết hợp lệnh dịch và cộng.

Ex : nhân 2 số nguyên dương A và B bằng lệnh cộng và dịch bit.

Giả sử A = 111b và B = 1101b. Tính A*B

Các phép nhân và chia tổng quát Thuật toán :

Tích = 0 Repeat

If bit Lsb của B bằng 1 Then tích = tích + A

End If

Dịch trái A Dịch phải B Until B =0

Các phép nhân và chia tổng quát -Vì bit lsb của B = 1

tích = tích +A = 111b Dịch trái A : 1110b Dịch phải B : 110b

Vì bit lsb của B = 0 Dịch trái A : 11100b Dịch phải B : 11b

Vì bit lsb của B = 1

Tích =tích + A = 100011b Dịch trái A : 111000b Dịch phải B : 1b

Vì bit lsb của B =1

Tích = 100011b+111000b= 1011011b Dịch trái A : 1110000b

Dịch phải B : 0b Vì bit lsb của B = 0 Tích = 1011011b = 91d

Chương trình con

Có vai trò giống như chương trình con ở ngôn ngữ cấp cao.

ASM có 2 dạng chương trình con : dạng FAR và dạng NEAR.

Lệnh gọi CTC nằm khác đoạn bộ nhớ với CTC

được gọi Lệnh gọi CTC

nằm cùng đoạn bộ nhớ với CTC

được gọi

BIỂU DIỄN CẤU TRÚC LOGIC MỨC CAO Dù Assembly không có phát biểu IF, ELSE, WHILE, REPEAT, UNTIL,FOR,CASE nhưng ta vẫn có thể tổ hợp các lệnh của Assembly để hiện thực cấu trúc logic của ngôn ngữ cấp cao.

Cấu trúc IF Đơn giản

Phát biểu IF sẽ kiểm tra 1 điều kiện và theo sau đó là 1 số các phát biểu được thực thi khi điều kiện kiểm tra có giá trị true.

Cấu trúc logic IF (OP1=OP2)

<STATEMENT1>

<STATEMENT2>

ENDIF

HIỆN THỰC BẰNG ASM CMP OP1,OP2

JNE CONTINUE

<STATEMENT1>

<STATEMENT2>

CONTINUE : ….

Cấu trúc IF với OR

Phát biểu IF có kèm toán tử OR

Cấu trúc logic IF (A1>OP1) OR (A1>=OP2) OR (A1=OP3) OR (A1<OP4)

<STATEMENT>

ENDIF

HIỆN THỰC BẰNG ASM

CMP A1,OP1 JG EXCUTE

CMP A1,OP2 JGE EXCUTE

CMP A1,OP3 JE EXCUTE CMP A1,OP4 JL EXCUTE JMP CONTINUE

EXCUTE : <STATEMENT>

CONTINUE : …..

Cấu trúc IF với AND

Phát biểu IF có kèm toán tử AND

Cấu trúc logic

IF (A1>OP1) AND (A1>=OP2) AND (A1=OP3) AND (A1<OP4)

<STATEMENT>

ENDIF

HIỆN THỰC BẰNG ASM CMP A1,OP1

JNG CONTINUE CMP A1,OP2 JL CONTINUE

CMP A1,OP3 JNE CONTINUE

CMP A1,OP4 JNL CONTINUE

<STATEMENT>

JMP CONTINUE CONTINUE : …..

CHÚ Ý : khi điều kiện có toán tử AND, cách hay nhất là dùng nhảy với điều kiện ngược lại đến nhãn, bỏ qua phát biểu trong cấu trúc Logic.

Cấu trúc WHILE

VÒNG LẶP WHILE

Cấu trúc logic

DO WHILE (OP1<OP2)

<STATEMENT1>

<STATEMENT2>

ENDDO

HIỆN THỰC BẰNG ASM DO_WHILE :

CMP OP1, OP2 JNL ENDDO

<STATEMENT1>

<STATEMENT2>

JMP DO_WHILE ENDDO : …..

Cấu trúc WHILE có lồng IF

VÒNG LẶP WHILE CÓ LỒNG IF

Cấu trúc logic

DO WHILE (OP1<OP2)

<STATEMENT>

IF (OP2=OP3) THEN

<STATEMENT2>

<STATEMENT3>

ENDIF ENDDO

HIỆN THỰC BẰNG ASM _WHILE :

CMP OP1, OP2 JNL WHILE_EXIT

<STATEMENT1>

CMP OP2,OP3 ; phần If

JNE ELSE ; không thỏa If

<STATEMENT2> ; thỏa If

<STATEMENT3>

JMP ENDIF; thỏa If nên bỏ qua Else ELSE : <STATEMENT4>

ENDIF : JMP _WHILE WHILE_EXIT : …..

Cấu trúc REPEAT UNTIL

VÒNG LẶP REPEAT UNTIL

Cấu trúc logic REPEAT

<STATEMENT1>

<STATEMENT2>

<STATEMENT3>

UNTIL (OP1=OP2) OR (OP1>OP3)

HIỆN THỰC BẰNG ASM REPEAT :

<STATEMENT1>

<STATEMENT2>

<STATEMENT3>

TESTOP12:

CMP OP1, OP2 JE ENDREPEAT TESTOP13 :

CMP OP1, OP3 JNG REPEAT

ENDREPEAT : …..

Cấu trúc CASE

Cấu trúc logic CASE INPUT OF

‘A’ : Proc_A

‘B’ : Proc_B

‘C’ : Proc_C

‘D’ : Proc_D End ;

HIỆN THỰC BẰNG ASM

CASE : MOV AL, INPUT CMP AL, ‘A’

JNE TESTB CALL PROC_A JMP ENDCASE TESTB :

CMP AL, ‘B’

JNE TESTC CALL PROC_B JMP ENDCASE TESTC :

CMP AL, ‘C’

JNE TESTD CALL PROC_C JMP ENDCASE

TESTD : CMP AL, ‘D’

JNE ENDCASE CALL PROC_D ENDCASE : ……….

LooKup Table

Rất hiệu quả khi xử lý phát biểu CASE là dùng bảng OFFSET chứa địa chỉ của nhãn hoặc của hàm sẽ nhảy đến tuỳ vào điều kiện.

Bảng Offset này được gọi Lookup Table rất hiệu quả khi dùng phát biểu Case có nhiều trị lựa chọn.

LooKup Table

; giá trị tìm kiếm

Địa chỉ các procedure giả sử ở địa chỉ 0120

giả sử ở địa chỉ 0130 giả sử ở địa chỉ 0140 giả sử ở địa chỉ 0150 Case_table db ‘A’

Dw Proc_A Db ‘B’

Dw Proc_B Db ‘C’

Dw Proc_C Db ‘D’

Dw Proc_D

‘A’ 0120 ‘B’ 0130 ‘C

0140 ‘D’ 0150

Cấu trúc lưu trữ của CaseTable như sau

LooKup Table Case :

MOV AL, INPUT

MOV BX, OFFSET CASE_TABLE

MOV CX, 4 ; lặp 4 lần số entry của table TEST :

CMP AL, [BX] ; kiểm tra Input

JNE TESTAGAIN ; không thỏa kiểm tra tiếp

CALL WORD PTR [BX+1] ; gọi thủ tục tương ứng JMP ENDCASE

TESTAGAIN : ADD BX , 3 ; sang entry sau của CaseTable LOOP TEST

ENDCASE : …………..

Chương trình con

Cấu trúc CTC :

TênCTC PROC <Type>

; các lệnh RET

TênCTC ENDP

CTC có thể gọi 1 CTC khác hoặc gọi chính nó.

CTC được gọi bằng lệnh CALL <TenCTC>.

CTC gần (near) là chương trình con nằm chung segment với nơi gọi nó.

CTC xa (far) là chương trình con không nằm chung segment với nơi gọi nó.

Kỹ thuật lập trình

Hãy tổ chức chương trình  các chương trình con  đơn giản hoá cấu trúc luận lý của CT làm cho CT dễ đọc, dễ hiểu , dễ kiểm tra sai sót..

Đầu CTC hãy cất trị thanh ghi vào Stack bằng lệnh PUSH để lưu trạng thái hiện hành.

Sau khi hoàn tất công việc của CTC nên phục hồi lại trị các thanh ghi lúc trước đã Push bằng lệnh POP .

Nhớ trình tự là ngược nhau để trị của thanh ghi nào trả cho thanh ghi nấy.

Đừng tối ưu quá CT vì có thể làm cho CT kém thông minh, khó đọc.

Kỹ thuật lập trình (tt)

Cố gắng tổ chức chương trình cho tốt phải thiết kế được các bước chương trình sẽ phải thực hiện.

Bằng sự tổ hợp của lệnh nhảy ta hoàn toàn có thể phỏng cấu trúc điều khiển và vòng lặp.

Kinh nghiệm : khi vấn đề càng lớn thì càng phải tổ chức logic chương trình càng chặt chẽ.

SUMMARY

Có thể mô phỏng cấu trúc logic như ngôn ngữ cấp cao trong Assembly bằng lệnh JMP và LOOP.

các lệnh nhảy : có điều kiện và vô điều kiện.

Khi gặp lệnh nhảy, CPU sẽ quyết định nhảy hay không bằng cách dựa vào giá trị thanh ghi cờ.

các lệnh luận lý dùng để làm điều kiện nhảy là AND, OR, XOR, CMP . . .

Bất cứ khi nào có thể, hãy tổ chức chương trình thành các chương trình con  đơn giản được cấu trúc luận lý của chương trình.

Câu hỏi Câu hỏi

1. Giả sử DI = 2000H, [DS:2000] = 0200H. Cho biết địa chỉ ô nhớ toán hạng nguồn và kết quả lưu trong toán hạng đích khi thực hiện lệnh MOV DI, [DI]

2. Giả sử SI = 1500H, DI=2000H, [DS:2000]=0150H . Cho biết địa chỉ ô nhớ toán hạng nguồn và kết quả lưu trong toán hạng đích sau khi thực hiện lệnh ADD AX, [DI]

3. Có khai báo A DB 1,2,3

Cho biết trị của toán hạng đích sau khi thi hành lệnh MOV AH, BYTE PTR A.

4. Có khai báo B DB 4,5,6

Cho biết trị của toán hạng đích sau khi thi hành lệnh MOV AX, WORD PTR B.

Bài 1: Có vùng nhớ VAR1 dài 200 bytes trong đoạn được chỉ bởi DS.

Viết chương trình đếm số chữ ‘S’ trong vùng nhớ này.

Bài 2: Có vùng nhớ VAR2 dài 1000 bytes. Viết chương trình chuyển đổi các chữ thường trong vùng nhớ này thành các ký tự hoa, các ký tự còn lại không đổi.

Bài 3: Viết chương trình nhập 2 số nhỏ hơn 10.

In ra tổng của 2 số đó.

Bài tập LẬP TRÌNH Bài tập LẬP TRÌNH

Bài 4 : Viết chương trình nhập 2 số bất kỳ.

In ra tổng và tích của 2 số đó. Chương trình có dạng sau : Nhập số 1 : 12

Nhập số 2 : 28 Tổng là : 40 Tích là : 336

Bài 5 : Viết chương trình nhập 1 ký tự. Hiển thị 5 ký tự kế tiếp trong bộ mã ASCII.

Ex : nhập ký tự : a

5 ký tự kế tiếp : b c d e f

Bài tập LẬP TRÌNH Bài tập LẬP TRÌNH

Một phần của tài liệu Bài giảng assembly chương 7 nhập môn assembly (Trang 91 - 128)

Tải bản đầy đủ (PDF)

(128 trang)