Các lệnh Dịch bít – Quay bít
Các lệnh dịch bít là các lệnh làm cho các bít trong một thanh ghi bị dịch về bên trái (lệnh ShR) hoặc về bên phải (lệnh ShL) một hoặc nhiều bít. Lệnh quay bít làm cho các bít trong một thanh ghi quay theo “chiều trái” hoặc theo “chiều phải” một hoặc nhiều bít. Thông thường các bít được dịch hay được quay đều lần lượt được đưa qua cờ CF. Do đo, các lệnh dịch bít và quay bít thường được sử dụng để kiểm tra giá trị bít (= 0 hay = 1) của các bít trong thanh ghi.
Hợp ngữ cung cấp hai dạng lệnh quay bít, quay không qua cờ CF (lệnh RoL và RoL) và quay có qua cờ CF (lệnh RcL và RcR).
Cú pháp:
- Shr [Toán hạng đích], <n>
- Shl [Toán hạng đích], <n>
- Rcr [Toán hạng đích], <n>
- Rcl [Toán hạng đích], <n>
Trong đó: [Toán hạng đích] là một thanh ghi 8 bít hoặc 16 bít. <n> là số bít cần dịch, nếu <n> = 1 thì chỉ định trực tiếp trong câu lệnh, nếu <n> lớn hơn 1 phải chỉ định thông qua thanh ghi CL.
Tác dụng:
- Lệnh ShR (Shift Logical Right): Dịch chuyển các bít trong thanh ghi [Toán hạng đích] sang phải một hoặc nhiều bít. Các bít được dịch lần lượt được đưa vào cờ CF, cờ CF sẽ chứa bít của lần dịch cuối cùng. Sau khi dịch các bít bị khuyết (ở bên đối diện) sẽ được thay bằng các bít có trị 0. Tức là, với thanh ghi 8 bít thì sau 8 lần dịch nó sẽ nhận được một dãy 8 bít = 0, tương tự với thanh ghi 16 bít thì sau 16 lần dịch nó sẽ nhận được một dãy 16 bít = 0. Nếu thanh ghi AL = 01001001 thì sau khi bị dịch về bên trái 2 bít nó sẽ như sau: AL = 00100100, khi đó CF = 1.
- Lệnh ShL (Shift Logical Left): Tương tự như lệnh ShR nhưng các bít được dịch về phía bên trái.
- Lệnh RCR (Rotate through Carry Right): Tương tự như lệnh ShR, nhưng bít được dịch sẽ được đặt vào lại bít bị khuyết ở bên đối diện. Tức là, với thanh ghi 8 bít thì sau 8 lần dịch nó sẽ nhận lại dãy bít ban đầu, tương tự với thanh ghi 16 bít thì sau 16 lần dịch nó sẽ nhận lại dãy bít ban đầu. Nếu thanh ghi AL = 01001001 thì sau khi bị quay về bên trái 2 bít nó sẽ như sau: AL = 00100101, khi đó CF = 1.
- Lệnh RCL (Rotate through Carry Left): Tương tự như lệnh RCR nhưng các bít được quay về phía bên trái.
Ví dụ 1:
- Shr Al, 1
- Mov Cl, 2
Shr Al, CL
Shl Bl, CL
Rcl AL, CL
- Rcr Dl, 1
Ví dụ 2: Các lệnh sau đây đếm số bít bằng 1 trong thanh ghi BX, kết quả chứa ở thanh ghi Al mà không làm thay đổi giá trị của nó:
Mov Al, 0
Mov Cx, 16
DemBit1:
Rol Bx, 1
Jnc TiepTuc
Inc Al
TiepTuc:
Loop DemBit1
;--------------------------
Ví dụ 3: Các lệnh sau đây đếm số bít giống nhau (tương ứng) giữa hai thanh ghi Ax và Bx. Kết quả chứa trong biến Dem (Dem DB 0):
Mov Dem, 0
Xor Ax, Bx
Mov Cx, 16
KTra:
Shl Ax, 1
Jnc Bit_0
Jmp TiepTuc
Bit_0:
Inc Dem
TiepTuc:
Loop KTra
;------------------------
Ví dụ 4: Các lệnh sau đây in nội dung của thanh ghi BX ra màn hình dưới dạng sô nhị phân:
Mov Cx, 16 ; lặp in đủ 16 bít
Mov Ah, 02 ; in ra kí tự với hàm 02/21h
In_NhiPhan:
Shl Bx, 1 ; dịch trái để bít cần in rơi vào cờ CF
Jc In_1 ; lệnh JC nhảy khi cờ CF = 1
Mov Dl, ‘0’ ; CF = 0 tức là bít cần in có trị = 0, nên in ra kí tự ‘0’
Int 21h
Jmp In_Tiep
In_1:
Mov Dl, ‘1’
Int 21h
In_Tiep:
Loop In_NhiPhan
;-------------------------
Ví dụ 5: Các lệnh sau đây nhập một số nhị phân từ bàn phím đưa vào lưu trữ trong thanh ghi BX:
Mov Bx, 0
Mov Cx, 0
Mov Ax, 0
Mov Ah, 1
Nhap:
Int 21h
Cmp Al, 0Dh ; nếu nhập Enter thì kết thúc
Je KetThuc
;--------------------
Cmp Al, ‘1’
Je Them_Bit
Cmp Al, ‘0’
Je Them_Bit
;----------------------
Mov Ah,09
Mov Dx, Seg TB ; Biến TB được khai báo như sau:
Mov DS, Dx ; TB DB ‘Ban phai nhap 0/1 hoac Enter$’
Mov Dx, Offset TB
Int 21h
Jmp Nhap
Them_Bit:
Sub Al, 30h ; có thẻ sử dụng lệnh And Al, 0Fh
Shl Bx, 1
Or Bx, Al
Inc Cx
Cmp Cx, 17
Jne Nhap
KetThuc:
Mov 4Ch
Int 21h
;----------------------------------
Ví dụ 6: Giả sử tại địa chỉ 0B000:0010 trong bộ nhớ có chứa một byte dữ liệu, nó cho biết một số thông tin liên quan đến cấu hình hệ thống. Byte 3 cho biết máy tính hiện tại có (byte 3 = 1) hay không có (byte 3 = 0) cổng cắm USB.
Các lệnh sau đây cho biết máy tính hiện tại (máy thực hiện đoạn lệnh) có hay không có cổng cắm USB. Kết quả được thông báo thông qua thanh ghi Cx: Cx = 0: không có cổng cắm USB; Cx = 0FFFFh: có cổng cắm USB.
Mov Ax, 0B000h
Mov DS, Ax
Mov DI, 0010h
;-------------------------
Mov Ax, 0
Mov Al, byte PTR DS:[DI]
;-------------------------------------
Mov Cl, 4
Shr Al, Cl
Jc CoUSB ; co cong USB
Mov Cx, 0 ; khong co cong USB
Jmp KetThuc
CoUSB:
Mov Cx, 0FFFFh
KetThuc:
...
;-------------------------
Trong thực tế, kết quả kiểm tra này thường được trả lời thông qua ngay chính cờ CF. CF = 0: không có cổng USB, CF = 1: có cổng USB.
Chú ý 1: Có thể sử dụng lệnh dịch bít ShR/ShL để thực hiện phép chia/phép nhân giá trị của một thanh ghi (chứa số nguyên không dấu) với một số là bội số của 2.
Ví dụ: Hai lệnh sau đây sẽ dịch AL sang trái 3 bít, tức là nhân AL với 8:
Mov Cl, 3
Shl Al, Cl ; Al ß AL * 8, 8 = 23.
Ví dụ: Hai lệnh sau đây sẽ dịch AL sang phải 3 bít, tức là chia AL với 8:
Mov Cl, 3
Shr Al, Cl ; Al ß AL * 8, 8 = 23.
Chú ý 2: Hợp ngữ còn cung cấp các lệnh dịch chuyển số học SAL (Shift Arithmetic Left) và SAR (Shift Arithmetic Right) . SAL tương tự hoàn toàn ShL, có thể sử dụng để thực hiện nhân 2 với các số âm. SAR tương tự ShR nhưng bít cuối cùng của [Toán hạng đích] không bị thay bằng bít 0 mà vẫn giữ nguyên giá trị cũ, có thể sử dụng để thực hiện chia 2 với các có dấu.
Các lệnh dich bít, quay bít của các vi xử lý Intel 80286/80386/.... cho phép viết số bít cần dịch, trong trường hợp lớn hơn một, trực tiếp trong lệnh dịch, quay mà không cần thông qua thanh ghi Cl [1 – 540].
1 Comment:
bạn xem lại ví dụ của RCL hộ mình với
Đăng nhận xét
Thank you for your comments!