TẬP LỆNH ASSEMBLY CỦA INTEL 8088/8086 P6

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!