Trong hợp ngữ, muốn so sánh hai số, ta phải thực hiện một phép toán số học hoặc logic trênhai số đó và căn cứ vào các bit trong thanh ghi cờ rồi đưa ra kết luận. Để làm việc này, có thểdùng lệnh CMP và TEST.Bản chất của lệnh CMP Des,Src là lệnh SUB Des,Src (thực hiện phép tính Des – Src) nhưngkết quả của phép tính không được lưu vào Des như trong lệnh SUB.
Nội dung trích xuất từ tài liệu:
Bài thực hành số 2: Lệnh so sánh – Lệnh nhảy – Lệnh lặp Bài thực hành số 2 Lệnh so sánh – Lệnh nhảy – Lệnh lặpMục đích Hiểu cách so sánh hai số trong hợp ngữ Hiểu cách thay đổi thứ tự thực hiện các lệnh Biết cách sử dụng các lệnh so sánh, nhảy và lặpTóm tắt lý thuyếtLệnh so sánh Trong hợp ngữ, muốn so sánh hai số, ta phải thực hiện một phép toán số học hoặc logic trênhai số đó và căn cứ vào các bit trong thanh ghi cờ rồi đưa ra kết luận. Để làm việc này, có thểdùng lệnh CMP và TEST. Bản chất của lệnh CMP Des,Src là lệnh SUB Des,Src (thực hiện phép tính Des – Src) nhưngkết quả của phép tính không được lưu vào Des như trong lệnh SUB. Ví dụ: so sánh hai số nguyên dương MOV AH,1 MOV AL,2 CMP AH,AL Sau khi thực hiện hai lệnh trên, cờ Carry (CF) bật, báo hiệu rằng AH < AL Bản chất của lệnh TEST Des,Src là lệnh AND Des,Src (thực hiện phép tính Des AND Src)nhưng kết quả của phép tính không được lưu vào Des như trong lệnh AND. Ví dụ: kiểm tra hai bit cuối cùng của AL TEST AL,3 ; 3h = 11b Nếu cờ Zero (ZF) bật, có nghĩa là cả hai bit 0 và 1 của AL đều bằng 0.Lệnh nhảy Thông thường, khi một lệnh (instruction) được thực hiện, giá trị của thanh ghi IP (instructionpointer) được tự động cập nhật để trỏ đến lệnh kế tiếp. Ngoài ra, nội dung của thanh ghi IP chỉcó thể bị thay đổi thông qua một số lệnh đặc biệt. Đó là: các lệnh nhảy (J*), lệnh lặp (LOOP*),lệnh gọi hàm (call, ret), lệnh gọi ngắt (int, iret). Các lệnh này được xếp vào nhóm “Lệnh điềukhiển luồng” (Program flow control instructions). Trong bài thực hành này, chúng ta sẽ học cáchsử dụng các lệnh nhảy và các lệnh lặp. Lệnh nhảy không điều kiện JMP Có các trường hợp sau: • JMP SHORT (short jump). Khi đó trong mã lệnh lưu 1 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này chỉ nhảy trong phạm vi từ –128 đến +127 byte so với vị trí hiện tại. Ví dụ: JMP SHORT Calculate • JMP (near jump). Khi đó trong mã lệnh lưu 2 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này nhảy tùy ý trong phạm vi segment. Ví dụ: JMP Calculate• JMP FAR PTR (far jump). Khi đó trong mã lệnh lưu offset và segment của vị trí cần nhảy đến. Kiểu này nhảy đến bất kì chỗ nào. Ví dụ: JMP FAR PTR Calculate• JMP (near indirect jump). Khi đó trong mã lệnh lưu địa chỉ offset của một ô nhớ. Khi thực hiện, IP sẽ được gán bằng giá trị lưu tại địa chỉ này. Có thể kết hợp dùng với định vị chỉ số. Ví dụ: myPointer DW Prepare, Calculate, Check, Output ... MOV bx,2 ; chỉ số trong mảng con trỏ SHL bx,1 ; nhân đôi JMP myPointer[bx] ... Prepare: ; công việc 0 ... Calculate: ; công việc 1 ... Check: ; công việc 2 – nơi cần nhảy đến ... Output: ; công việc 3 ...• JMP (far indirect jump). Tương tự trường hợp trên, nhưng con trỏ gồm cả segment và offset. Chỉ khác ở khai báo con trỏ Ví dụ: myPointer DD Prepare, Calculate, Check, Output ... MOV bx,1 ; chỉ số trong mảng con trỏ MOV cl,2 SHL bx,cl ; nhân 4 JMP myPointer[bx] ... Prepare: ; công việc 0 ... Calculate: ; công việc 1 – nơi cần nhảy đến ...• JMP (indirect jump via regs). Nhảy đến địa chỉ lưu trong thanh ghi AX. Ví dụ: MOV ax, offset Calculate ... JMP ax ; (IP ← AX) Lệnh nhảy có điều kiện J.... Các lệnh nhảy có điều kiện bắt đầu bằng chữ J sau đó là các chữ cái biểu thị điều kiện (vídụ JGE ah,5: Jump if Greater than or Equal, nhảy nếu AH lớn hơn hay bằng 5), tiếp sau là mộttên nhãn. Tùy thuộc vào trạng thái các cờ hiệu mà bộ vi xử lý có thực hiện việc nhảy đến nhãnhay không. Đối với bộ vi xử lý 80286 trở xuống, lệnh nhảy có điều kiện có độ dài 2 byte, byte đầu tiênchứa mã lệnh, byte thứ hai chứa khoảng cách tương đối từ lệnh đến nhãn, vì vậy tronglệnh nhảy có điều kiện phải nằm trong khoảng từ -128 đến 127 so với vị trí lệnh nhảy. Muốnnhảy xa hơn ta phải dùng kết hợp lệnh nhảy không điều kiện JMP Từ 80386 trở lên, bộ lệnh được bổ sung, cho phép sử dụng lệnh nhảy có điều kiện có độ dài4 byte, do đó có quyền nằm tùy ý trong cùng phạm vi segment. Khi sử dụng lệnh nhảy có điều kiện sau khi thực hiện phép so sánh, phải đặc biệt lưu ý toánhạng trong phép so sánh là số có dấu (signed) hay không có dấu (unsigned) để lựa chọn lệnh chophù hợp. Ví dụ: MOV AH,AL ...