Đề cương bài giảng Hợp ngữ

Chương 4 : CÁC LỆNH LOGIC , DỊCH VÀ QUAY

Trong chương này chúng ta sẽ xem xét các lệnh mà chúng có thể dùng để

thay đổi từng bit trên một byte hoặc một từ số liệu . Khả năng quản lý đến từng bit

thường là không có trong các ngôn ngữ cấp cao ( trừ C ) và đây là lý do giải thích tại

sao hợp ngữ vẫn đóng vai trò quan trọng trong khi lập trình .

4.1 Các lệnh logic

Chúng ta có thể dùng các lệnh logic để thay đổi từng bit trên byte hoặc trên

một từ số liệu .

Khi một phép toán logic được áp dụng cho toán hạng 8 hoặc 16 bit thì có thể

áp dụng phép toán logic đó trên từng bit để thu được kết qủa cuối cùng .

 

pdf108 trang | Chia sẻ: dungnc89 | Lượt xem: 2901 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Đề cương bài giảng Hợp ngữ, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
 Bước 2 : Đọc và xử lý một dòng văn bản 
 Bước này thực hiện hầu hết các công việc của chương trình : đọc các ký tự từ 
bàn phím , tìm ra ký tự đầu và ký tự cuối , nhắc nhở người dùng nếu ký tự gõ vào 
không phải là ký tự hoa . 
 Có thể biễu diễn bước này bởi thuật toán sau : 
 Read a character 
WHILE character is not a carrige return DO 
IF character is a capital (*) 
 THEN 
 IF character precedes first capital 
 Then 
 first capital= character 
 End_if 
 IF character follows last character 
 Then 
 last character = character 
 End_if 
END_IF 
 Read a character 
END_WHILE 
 Trong đó dòng (*) có nghĩa là điều kiện để ký tự là hoa là điều kiện AND 
 IF ( ‘A’<= character ) AND ( character <= ‘Z’) 
Bước 2 có thể mã hoá như sau : 
 MOV AH,1 ; đọc ký tự 
 INT 21H ; ký tự trên AL 
WHILE : 
;trong khi ký tự gõ vào không phải là CR thì thực hiện 
 CMP AL,0DH ; CR? 
 JE END_WHILE ;yes, thoát 
; nếu ký tự là hoa 
 CMP AL,’A’ ; char >=‘A’? 
 JNGE END_IF ;không phải ký tự hoa thì nhảy đến END_IF 
 CMP AL,’Z’ ; char <= ‘Z’? 
 JNLE END_IF ; không phải ký tự hoa thì nhảy đến END_IF 
; thì 
Chương 3 : Các lệnh lặp và rẽ nhánh 41 
; nếu ký tự nằm trước biến FIRST ( giá trị ban đầu là‘[‘ : ký tự sau Z ) 
 CMP AL,FISRT ; char < FIRST ? 
 JNL CHECK_LAST; >= 
; thì ký tự viết hoa đầu tiên = ký tự 
 MOV FIRST,AL ; FIRST=character 
;end_if 
CHECK_LAST: 
; nếu ký tự là sau biến LAST ( giá trị ban đầu là ‘@’: ký tự trước A) 
 CMP AL,LAST ; char > LAST ? 
 JNG END_IF ; <= 
;thì ký tự cuối cùng = ký tự 
 MOV LAST, AL ;LAST = character 
;end_if 
END_IF : 
; đọc một ký tự 
 INT 21H ; ký tự trên AL 
 JMP WHILE_ ; lặp 
END_WHILE: 
Các biến FIRST và LAST được định nghĩa như sau trong đoạn số liệu : 
 FIRST DB ‘[ $‘ ; ‘[‘ là ký tự sau Z 
 LAST DB ‘@ $ ’ ; ‘@’ là ký tự trước A 
Bước 3 : In kết qủa 
Thuật toán 
IF no capital were typed 
THEN 
 display ‘No capital’ 
ELSE 
 display first capital and last capital 
END_IF 
Bước 3 sẽ phải in ra các thông báo : 
· NOCAP_MSG nếu không phải chữ in 
· CAP1_MSG chữ in đầu tiên 
· CAP2_MSG chữ in cuối cùng 
Chúng được định nghĩa như sau trong đoạn số liệu . 
 NOCAP_MSG DB 0DH,0AH,‘No capitals $’ 
 CAP1_MSG DB 0DH,0AH, ‘First capital= ’ 
 FIRST DB ‘[ $ ’ 
 CAP2_MSG DB 0DH,0AH,‘Last capital=’ 
Chương 3 : Các lệnh lặp và rẽ nhánh 42 
 LAST DB ‘@ $’ 
Bước 3 có thể mã hoá như sau : 
;in kết quả 
 MOV AH,9 ; hàm xuất ký tự 
; IF không có chữ hoa nào được nhập thì FIRST =‘[’ 
 CMP FIRST,’[’ ; FIRST=‘[’ ? 
 JNE CAPS ; không , in kết qủa 
;THEN 
 LEA DX,NOCAP_MSG 
 INT 21H 
CAPS: 
 LEA DX,CAP1_MSG 
 INT 21H 
 LEA DX,CAP2_MSG 
 INT 21H 
; end_if 
 Chương trình có thể viết như sau : 
 TITLE PGM3-1 : FIRST AND LAST CAPITALS 
 .MODEL SMALL 
 .STACK 100h 
 .DATA 
 PROMPT DB ‘Type a line of text’, 0DH, AH, ‘$’ 
 NOCAP_MSG DB 0DH,0AH, ‘No capitals $’ 
 CAP1_MSG DB 0DH,0AH, ‘First capital=’ 
 FIRST DB ‘[ $’ 
 CAP2_MSG DB ‘Last capital = ’ 
 LAST DB ‘@ $’ 
 .CODE 
 MAIN PROC 
 ; khởi tạo DS 
 MOV AX,@DATA 
 MOV DS,AX 
 ; in dấu nhắc 
 MOV AH,9 ; hàm xuất chuỗi 
 LEA DX,PROMPT ;lấy địa chỉ chuỗi vào DX 
 INT 21H ; xuất chuỗi 
Chương 3 : Các lệnh lặp và rẽ nhánh 43 
;đọc và xử lý 1 dòng văn bản 
 MOV AH,1 ; đọc ký tự 
 INT 21H ; ký tự trên AL 
WHILE : 
;trong khi ký tự gõ vào không phải là CR thì thực hiện 
 CMP AL,0DH ; CR? 
 JE END_WHILE ;yes, thoát 
; nếu ký tự là hoa 
 CMP AL,’A’ ; char >=‘A’? 
 JNGE END_IF ;không phải ký tự hoa thì nhảy đến END_IF 
 CMP AL,’Z’ ; char <= ‘Z’? 
 JNLE END_IF ; không phải ký tự hoa thì nhảy đến END_IF 
; thì 
; nếu ký tự nằm trước biến FIRST 
 CMP AL,FISRT ; char < FIRST ? 
 JNL CHECK_LAST; >= 
; thì ký tự viết hoa đầu tiên = ký tự 
 MOV FIRST,AL ; FIRST=character 
;end_if 
CHECK_LAST: 
; nếu ký tự là sau biến LAST 
 CMP AL,LAST ; char > LAST ? 
 JNG END_IF ; <= 
;thì ký tự cuối cùng = ký tự 
 MOV LAST, AL ;LAST = character 
;end_if 
END_IF : 
; đọc một ký tự 
 INT 21H ; ký tự trên AL 
 JMP WHILE_ ; lặp 
END_WHILE: 
;in kết quả 
 MOV AH,9 ; hàm xuất ký tự 
; IF không có chữ hoa nào được nhập thì FIRST =‘[‘ 
 CMP FIRST,’[‘ ; FIRST=‘[‘ ? 
 JNE CAPS ; không , in kết qủa 
;Then 
 LEA DX,NOCAP_MSG 
 INT 21H 
CAPS: 
 LEA DX,CAP1_MSG 
Chương 3 : Các lệnh lặp và rẽ nhánh 44 
 INT 21H 
 LEA DX,CAP2_MSG 
 INT 21H 
 ; end_if 
; dos exit 
 MOV AH,4CH 
 INT 21h 
MAIN ENDP 
 END MAIN 
Chương 4 : Các lệnh dịch và quay 45 
 Chương 4 : CÁC LỆNH LOGIC , DỊCH VÀ QUAY 
 Trong chương này chúng ta sẽ xem xét các lệnh mà chúng có thể dùng để 
thay đổi từng bit trên một byte hoặc một từ số liệu . Khả năng quản lý đến từng bit 
thường là không có trong các ngôn ngữ cấp cao ( trừ C ) và đây là lý do giải thích tại 
sao hợp ngữ vẫn đóng vai trò quan trọng trong khi lập trình . 
 4.1 Các lệnh logic 
 Chúng ta có thể dùng các lệnh logic để thay đổi từng bit trên byte hoặc trên 
một từ số liệu . 
 Khi một phép toán logic được áp dụng cho toán hạng 8 hoặc 16 bit thì có thể 
áp dụng phép toán logic đó trên từng bit để thu được kết qủa cuối cùng . 
 Ví dụ : Thực hiện các phép toán sau : 
 1. 10101010 AND 1111 0000 
 2. 10101010 OR 1111 0000 
 3. 10101010 XOR 1111 0000 
 4. NOT 10101010 
 Giải : 
 1. 10101010 
 AND 1111 0000 
 = 1010 0000 
 2. 10101010 
 OR 1111 0000 
 = 1111 1010 
 3. 1010 1010 
 XOR 1111 0000 
 0101 1010 
 4. NOT 10101010 
 = 01010101 
Chương 4 : Các lệnh dịch và quay 46 
 4.1.1 Lệnh AND,OR và XOR 
 Lệnh AND,OR và XOR thực hiện các chức năng đúng như tên gọi của nó . 
 Cú pháp của chúng là : 
 AND destination , source 
 OR destination , source 
 XOR destination , source 
 Kết qủa của lệnh được lưu trữ trong toán hạng đích do đó chúng phải là thanh 
ghi hoặc vị trí nhớ . Toán hạng nguồn là có thể là hằng số , thanh ghi hoặc vị trí nhớ . 
Dĩ nhiên hai toán hạng đều là vị trí nhớ là không được phép . 
 Aûnh hưởng đến các cờ : 
 Các cờ SF,ZF và PF phản ánh kết qủa 
 AF không xác định 
 CF=OF=0 
 Để thay đổi từng bit theo ý muốn chúng ta xây dựng toán hạng nguồn theo 
kiểu mặt nạ ( mask) . Để xây dựng mặt nạ chúng ta sử dụng các tính chất sau đây 
của các phép toán AND ,OR và XOR : 
b AND 1 = b b OR 0 = b b XOR 0 = b 
b AND 0 = 0 b OR 1 = 1 b XOR 1 = not b 
· Lệnh AND có thể dùng để xóa ( clear) toán hạng đích nếu mặt nạ bằng 0 
· Lệnh OR có thể dùng để đặt ( set) 1 cho toán hạng đích nếu mặt nạ bằng 1 
· Lệnh XOR có thể dùng để lấy đảo toán hạng đích nếu mặt nạ bằng 1 . Lệnh XOR 
cũng có thể dùng để xóa nội dung một thanh ghi ( XOR với chính nó ) 
 Ví dụ : Xoá bit dấu của AL trong khi các bit khác không thay đổi 
 Giải : Dùng lệnh AND với mặt nạ 0111111=7Fh 
 AND AL,7Fh ; xóa bit dấu ( dấu + ) của AL 
 Ví dụ : Set 1 cho các bit MSB và LSB của AL , các bit khác không thay đổi . 
 Giải : Dùng lệnh OR với mặt nạ 10000001 =81h 
 OR AL,81h ; set 1 cho LSB và MSB của AL 
 Ví dụ : Thay đổi bit dấu của DX 
 Giải : Dùng lệnh XOR với mặt nạ 1000000000000000=8000h 
 XOR DX,8000h 
 Các lệnh logic là đặc biệt có ích khi thực hiện các nhiệm vụ sau : 
 Đổi một số dưới dạng ASCII thành một số 
 Giả sử rằng chúng ta đọc một ký tự từ bàn phím bằng hàm 1 ngắt 21h . Khi 
đó AL chứa mã ASCII của ký tự . Điều này cũng đúng nếu ký tự đó là một số 
( digital character) . Ví dụ nếu chúng ta gỏ số 5 thì AL = 35h ( ASCII code for 5) 
Chương 4 : Các lệnh dịch và quay 47 
 Để chứa 5 trên AL chúng ta dùng lệnh : 
 SUB AL,30h 
 Có một cách khác để làm việc này là dùng lệnh AND để xóa nửa byte cao 
(high nibble = 4 bit cao ) của AL : 
 AND AL,0Fh 
 Vì các số từ 0-9 có mã ASCII từ 30h-39h , nên cách này dùng để đổi mọi số 
ASCII ra thập phân . 
 Chương trình hợp ngữ đổi một số thập phân thành mã ASCII của chúng được 
xem như bài tập . 
 Đổi chữ thường thành chữ hoa 
 Mã ASCII của các ký tự thường từ a-z là 61h-7Ah và mã ASCII của các ký 
tự hoa từ A-Z là 41h -5Ah . Giả sử DL chưá ký tự thường , để đổi nó thành chữ hoa 
ta dùng lệnh : 
 SUB DL,20h 
 Nếu chúng ta so sánh mã nhị phân tương ứng của ký tự thường và ký tự hoa 
thì thấy rằng chỉ cần xóa bit thứ 5 thì sẽ đổi ký tự thường sang ký tự hoa . 
 Character Code Character Code 
 a(61h) 01100001 A (41h) 01000001 
 b (62h) 01100010 B ( 42h) 01000010 
 . 
 . 
 z ( 7Ah) 01111010 Z ( 5Ah) 01011010 
 Có thể xóa bit thứ 5 của DL bằng cách dùng lệnh AND với mặt nạ 
 11011111= DF h 
 AND DL,0DFh ; đổi ký tự thường trong DL sang ký tự hoa 
 Xóa một thanh ghi 
 Chúng ta có thể dùng lệnh sau để xóa thanh ghi AX : 
 MOV AX,0 
 hoặc SUB AX,AX 
 XOR AX,AX 
 Lệnh thứ nhất cần 3 bytes trong khi đó 2 lệnh sau chỉ cần 2 bytes . Nhưng 
lệnh MOV phải được dùng để xoá 1 vị trí nhớ . 
 Kiểm tra một thanh ghi có bằng 0 ? 
Chương 4 : Các lệnh dịch và quay 48 
 Thay cho lệnh 
 CMP AX,0 
 Người ta dùng lệnh 
 OR CX,CX 
để kiểm tra xem CX có bằng 0 hay không vì nó làm thay đổi cờ ZF ( ZF=0 nếu CX=0 
) 
 4.1.2 Lệnh NOT 
 Lệnh NOT dùng để lấy bù 1 ( đảo) toán hạng đích . Cú pháp là : 
 NOT destination 
 Không có cờ nào bị ảnh hưởng bởi lệnh NOT 
 Ví dụ : Lấy bù 1 AX 
 NOT AX 
 4.1.3 Lệnh TEST 
 Lệnh TEST thực hiện phép AND giữa toán hạng đích và toán hạng nguồn 
nhưng không làm thay đổi toán hạng đích . Mục đích của lệnh TEST là để set các cờ 
trạng thái . Cú pháp của lệnh test là : 
 TEST destination,source 
 Các cờ bị ảnh hưởng của lệnh TEST : 
 SF,ZF và PF phản ánh kết qủa 
 AF không xác định 
 CF=OF=0 
 Lệnh TEST có thể dùng để khám 1 bit trên toán hạng . Mặt nạ phải chứa bit 1 
tại vị trí cần khám , các bit khác thì bằng 0 . Kết quả của lệnh : 
 TEST destination,mask 
sẽ là 1 tại bit cần test nếu như toán hạng đích chứa 1 tại bit test . Nếu toán hạng 
đích chứa 0 tại bit test thì kết quả sẽ bằng 0 và do đó ZF=1 . 
 Ví dụ : Nhảy tới nhãn BELOW nếu AL là một số chẳn 
 Giải : Số chẳn có bit thứ 0 bằng 0 , lệnh 
 TEST AL,1 ; AL chẳn ? 
 JZ BELOW ; đúng , nhảy đến BELOW 
 4.2 Lệnh SHIFT 
Chương 4 : Các lệnh dịch và quay 49 
 Lệnh dịch và quay sẽ dịch các bit trên trên toán hạng đích một hoặc nhiều 
vị trí sang trái hoặc sang phải . Khác nhau của lệnh dịch và lệnh quay là ở chỗ : các 
bit bị dịch ra ( trong lệnh dịch ) sẽ bị mất .Trong khi đó đối với lệnh quay , các bit bị 
dịch ra từ một đầu của toán hạng sẽ được đưa trở lại đầu kia của nó . 
 Có 2 khả năng viết đối với lệnh dịch và quay : 
 OPCODE destination,1 
 OPCODE destination,CL 
 trong cách viết thứ hai thanh ghi CL chưá N là số lần dịch hay quay . Toán 
hạng đích có thể là một thanh ghi 8 hoặc 16 bit , hoặc một vị trí nhớ . 
 Các lệnh dịch và quay thường dùng để nhân và chia các sôù nhị phân . Chúng 
cũng được dùng cho các hoạt động nhập xuất nhị phân và hex . 
 4.2.1 Lệnh dịch trái ( left shift ) 
 Lệnh SHL dịch toán hạng đích sang trái .Cú pháp của lệnh như sau : 
 SHL destination ,1 ; dịch trái dest 1 bit 
 SHL destination , CL ; dịch trái N bit ( CL chứa N) 
 Cứ mỗi lần dịch trái , một số 0 được thêm vào LSB . 
CF 7 6 5 4 3 2 1 0 0 
 1 byte 
 Các cờ bị ảnh hưởng : 
 SF,PF,ZF phản ảnh kết qủa 
 AF không xác định 
 CF= bit cuối cùng được dịch ra 
 OF= 1 nếu kết qủa thay đổi dấu vào lần dịch cuối cùng 
 Ví dụ : Giả sử DH =8Ah và CL=3 . Hỏi giá trị của DH và CF sau khi lệnh 
 SHL DH,CL được thực hiện ? 
 Kết qủa DH=01010000=50h , CF=0 
 Nhân bằng lệnh SHL 
 Chúng ta hãy xét số 235decimal . Nếu dịch trái 235 một bit và thêm 0 vào 
bên phải chúng ta sẽ có 2350 . Noí cách khác , khi dịch trái 1 bit chúng ta đã nhân 10. 
 Đối với số nhị phân, dịch trái 1 bit có nghĩa là nhân nó với 2.Ví dụ 
 AL=00000101=5d 
 SHL AL,1 ; AL=00001010=10d 
 SHL AL,CL ; nếu CL=2 thì AL=20d sau khi thực hiện lệnh 
 Lệnh dịch trái số học ( SAL =Shift Arithmetic Left) 
Chương 4 : Các lệnh dịch và quay 50 
 Lệnh SHL có thể dùng để nhân một toán hạng với hệ số 2 . Tuy nhiên trong 
trường hợp người ta muốn nhấn mạnh đến tính chất số học của phép toán thì lệnh 
SAL sẽ được dùng thay cho SHL . Cả 2 lệnh đều tạo ra cùng một mã máy . 
 Một số âm cũng có thể được nhân 2 bằng cách dịch trái . Ví dụ : Nếu 
AX=FFFFh= -1 thì sau khi dịch trái 3 lần AX=FFF8h = -8 
 Tràn 
 Khi chúng ta dùng lệnh dịch trái để nhân thì có thể xảy ra sự tràn . Đối với 
lệnh dịch trái 1 lần , CF và OF phản ánh chính xác sự tràn dấu và tràn không dấu . 
Tuy nhiên các cờ sẽ không phản ánh chính xác kết qủa nếu dịch trái nhiều lần bởi vì 
dịch nhiều lần thực chất là một chuỗi các dịch 1 lần liên tiếp và vì vậy các cờ CF 
và OF chỉ phản ánh kết quả của lần dịch cuối cùng . Ví dụ : BL=80h , CL=2 thì lệnh 
 SHL BL,CL 
sẽ làm cho CF=OF=0 mặc dù trên thực tế đã xảy ra cả tràn dấu và tràn không dấu . 
 Ví dụ : viết đoạn mã nhân AX với 8 . Giả sử rằng không có tràn . 
 MOV CL,3 ; CL=3 
 SHL AX,CL ; AX*8 
 4.2.2 Lệnh dịch phải ( Right Shift ) 
 Lệnh SHR dịch phải toán hạng đích 1 hoặc N lần . 
 SHR destination,1 
 SHR destination,CL 
 Cứ mỗi lần dịch phải , một số 0 được thêm vào MSB 
 Các cờ bị ảnh hưởng giống như lệnh SHL 
0 7 6 5 4 3 2 1 0 CF 
 1 byte 
 Ví dụ : giả sử DH = 8Ah , CL=2 
 Lệnh SHR DH,CL ; dịch phải DH 2 lần sẽ cho kết quả như sau : 
 Kết qủa trên DH=22h , CF=1 
 Cũng như lệnh SAL , lệnh SAR ( dịch phải số học ) hoạt động giống như SHR 
, chỉ có 1 điều khác là MSB vẫn giữ giá trị nguyên thủy ( bit dấu giữ nguyên) sau khi 
dịch . 
 Chia bằng lệnh dịch phải 
Chương 4 : Các lệnh dịch và quay 51 
 Lệnh dịch phải sẽ chia 2 giá trị của toán hạng đích . Điều này đúng đối với 
số chẳn . Đối với số lẻ , lệnh dịch phải sẽ chia 2 và làm tròn xuống số nguyên gần 
nó nhất . Ví dụ , nếu BL = 00000101=5 thì khi dịch phải BL=00000010 =2 . 
 Chia có dấu và không dấu 
 Để thực hiện phép chia bằng lệnh dịch phải , chúng ta phải phân biệt giữa số 
có dấu và sốù không dấu . Nếu diễn dịch là không dấu thì dùng lệnh SHR , còn nếu 
diễn dịch có dấu thì dùng SAR ( bit dấu giữ nguyên ) . 
 Ví dụ : dùng lệnh dịch phải để chia số không dấu 65143 cho 4 . Thương số đặt 
trên AX . 
 MOV AX,65134 
 MOV CL,2 
 SHR AX,CL 
 Ví dụ : Nếu AL = -15 , cho biết AL sau khi lệnh 
 SAR AL,1 được thực hiện 
 Giải : AL= -15 = 11110001b 
 Sau khi thực hiện SAR AL ta có AL = 11111000b = -8 
 4.3 Lệnh quay ( Rotate) 
 Quay trái ( rotate left ) = ROL sẽ quay các bit sang trái , LSB sẽ được thay 
bằng MSB . Còn CF=MSB 
CF 7 6 5 4 3 2 1 0 
 Cú pháp của ROL như sau : 
 ROL destination,1 
 ROL destination,CL 
 Quay phải ( rotate right ) = ROR sẽ quay các bit sang phải , MSB sẽ được 
thay bằng LSB . Còn CF=LSB 
7 6 5 4 3 2 1 0 CF 
Cú pháp của lệnh quay phải là 
Chương 4 : Các lệnh dịch và quay 52 
 ROR destination,1 
 ROR destination,CL 
Trong các lệnh quay phải và quay trái CF chứa bit bị quay ra ngoài . 
Ví dụ sau đây cho thấy cách để khám các bit trên một byte hoặc 1 từ mà không làm 
thay đổi nội dung của nó . 
 Ví dụ : Dùng ROL để đếm số bit 1 trên BX mà không thay đổi nội dung của 
nó . Kết qủa cất trên AX . 
 Giải : 
 XOR AX,AX ; xoá AX 
 MOV CX,16 ; số lần lặp = 16 ( một từ ) 
 TOP: 
 ROL BX,1 ; CF = bit quay ra 
 JNC NEXT ; nếu CF =0 thì nhảy đến vòng lặp 
 INC AX ; ngược lại (CF=1) , tăng AX 
 NEXT: 
 LOOP TOP 
 Quay trái qua cờ nhớ ( rotate through carry left ) = RCL . Lệnh này giống như 
lệnh ROL chỉ khác là cờ nhớ nằm giữa MSB và LSB trong vòng kín của các bit 
CF 
7 6 5 4 3 2 1 0 
 Cú pháp của của lệnh RCL như sau : 
 RCL destination,1 
 RCL destination,CL 
 Quay phải qua cờ nhớ ( rotate through carry right ) = RCR . Lệnh này giống 
như lệnh ROR chỉ khác là cờ nhớ nằm giữa MSB và LSB trong vòng kín của các 
bit . 
Chương 4 : Các lệnh dịch và quay 53 
CF 
7 6 5 4 3 2 1 0 
 Cú pháp của của lệnh RCR như sau : 
 RCR destination,1 
 RCR destination,CL 
 Ví dụ : Giả sử DH = 8Ah ,CF=1 và CL=3 . Tìm giá trị của DH,CF sau khi 
lệnh 
 RCR DH,CL được thực hiện 
 Giải : 
 CF DH 
 Giá trị ban đầu 1 10001010 
 Sau khi quay 1 lần 0 11000101 
 Sau khi quay 2 lần 1 01100010 
 Sau khi quay 3 lần 0 10110001=B1H 
 Aûnh hưởng của lệnh quay lên các cờ 
 SF,PF và ZF phản ảnh kết quả 
 CF-bit cuối cùng được dịch ra 
 OF=1 nếu kết qủa thay đổi dấu vào lần quay cuối cùng 
 Ưùng dụng : Đảo ngược các bit trên một byte hoặc 1 từ .Ví dụ AL =10101111 
thì sau khi đảo ngược AL=11110101 . 
 Có thể lặp 8 lần công việc sau :Dùng SHL để dịch bit MSB ra CF , Sau đó 
dùng RCR để đưa nó vào BL . 
 Đoạïn mã để làm việc này như sau : 
 MOV CX,8 ;số lần lặp 
 REVERSE : 
 SHL AL,1 ; dịch MSB ra CF 
 RCR BL,1 ; đưa CF ( MSB) vào BL 
 LOOP REVERSE 
 MOV AL,BL ; AL chứa các bit đã đảo ngược 
 4.4 Xuất nhập số nhị phân và số hex 
Chương 4 : Các lệnh dịch và quay 54 
 Các lệnh dịch và quay thường được sử dụng trong các hoạt động xuất nhập số 
nhị phân và số hex. 
 4.4.1 Nhập số nhị phân 
 Giả sử cần nhập một số nhị phân từ bàn phím , kết thúc là phím CR . Số nhị 
phân là một chuỗi các bit 0 và 1 . Mỗi một ký tự gõ vào phải được biến đổi thành 
một bit giá trị ( 0 hoặc 1) rồi tích luỹ chúng trong 1 thanh ghi . Thuật toán sau đây sẽ 
đọc một số nhị phân từ bàn phím và cất nó trên thanh ghi BX . 
 Clear BX 
 input a character ( ‘0’ or ‘1’) 
 WHILE character CR DO 
 convert character to binary value 
 left shift BX 
 insert value into LSB of BX 
 input a character 
 END_WHILE 
 Đoạn mã thực hiện thuật toán trên như sau : 
 XOR BX,BX ; Xoá BX 
 MOV AH,1 ; hàm đọc 1 ký tự 
 INT 21h ; ký tự trên AL 
WHILE_: 
 CMP AL,0DH ; ký tự là CR? 
 JE END_WHILE ; đúng , kết thúc 
 AND AL,0Fh ; convert to binary value 
 SHL BX,1 ; dịch trái BX 1 bit 
 OR BL,AL ; đặt giá trị vào BX 
 INT 21h ; đọc ký tự tiếp theo 
 JMP WHILE_ ; lặp 
END_WHILE: 
 4.4.2 Xuất số nhị phân 
 Giả sử cần xuất số nhị phân trên BX ( 16 bit) . Thuật toán có thể viết như sau 
FOR 16 times DO 
 rotate left BX ( put MSB into CF) 
 IF CF=1 
Chương 4 : Các lệnh dịch và quay 55 
 then 
 output ‘1’ 
 else 
 output ‘0’ 
 END_IF 
END_FOR 
 Đoạn mã để xuất số nhị phân có thể xem như bài tập . 
 4.4.3 Nhập số HEX 
 Nhập số hex bao gồm các số từ 0 đến 9 và các 
ký tự A đến F . Kết qủa chứa trong BX . 
Để ch o đơn giản chu

File đính kèm:

  • pdfgiao trinh hop ngu.pdf
Giáo án liên quan