Loading...

TẬP LỆNH ASSEMBLY CỦA INTEL 8088/8086 - (Tiếp theo)

 

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].

Các lệnh xử lý chuỗi

Tu hoc

Ý kiến của bạn

Mã bảo vệ
Làm mới

Hãy đăng quảng cáo trên TuHocAnNinhMang.com

Bài xem nhiều nhất

Tự học lập trình C - Bài 1: Một số khái niệm cơ bản

Khái niệm tên rất quan trọng trong quá trình lập trình, ...

MySQL – Bài 8: Khóa chính (primary key) và khóa ngoại (foreign key) của table

Với ràng buộc này thì, việc người sử dụng vô tình hay cố ...

Tự học lập trình JAVA – Bài 1: Bước đầu với Java

Một chương trình java có thể được định nghĩa như là một ...

Tự học lập trình C - Bài 10: Mảng một chiều

Mảng 1 chiều là tập hợp các phần tử có cùng kiểu dữ ...

Tự học lập trình C - Bài 2: Cấu trúc chương trình C

Một chương trình bao gồm một hoặc nhiều hàm, mỗi hàm ...

Hướng dẫn in ấn trong Word 2007/2010 – Step by Step

[Tự học] - Tiêu đề đầu trang (Header)/tiêu đề cuối ...

Tự học lập trình Assembly - Bài 1: Bước đầu với lập trình Assembly trên vi xử lý Intel 8086/8088

Như đã biết, lệnh ngôn ngữ máy là một dãy các con số 0, ...

Hãy đăng quảng cáo trên TuHocAnNinhMang.com

Về đầu trang Hỏi - Đáp