TÌM HIỂU VỀ LỆNH DỊCH VÀ QUAY TRONG ASSEMBLY CHO VÍ DỤ MINH HỌA I NHẬN THỨC CHUNG VỀ NGƠN NGỮ ASSEMBLY Ngơn ngữ Assembly (còn gọi hợp ngữ) ngôn ngữ bậc thấp dùng việc viết chương trình máy tính Ngơn ngữ Assembly sử dụng từ có tính gợi nhớ, từ viết tắt để giúp ta dễ ghi nhớ thị phức tạp làm cho việc lập trình Assembly dễ dàng Mục đích việc dùng từ gợi nhớ nhằm thay việc lập trình trực tiếp ngôn ngữ máy sử dụng máy tính thường gặp nhiều lỗi tốn thời gian Một chương trình viết ngơn ngữ Assembly dịch thành mã máy chương trình tiện ích gọi Assembler (Một chương trình Assembler khác với trình biên dịch chỗ chuyển đổi lệnh chương trình Assembly thành lệnh Các chương trình viết ngơn ngữ Assembly liên quan chặt chẽ đến kiến trúc máy tính Điều khác với ngơn ngữ lập trình bậc cao, phụ thuộc vào phần cứng Trước ngôn ngữ Assembly sử dụng nhiều ngày phạm vi sử dụng hẹp, chủ yếu việc thao tác trực tiếp với phần cứng hoặc làm công việc không thường xuyên Ngôn ngữ thường dùng cho trình điều khiển (tiếng Anh: driver), hệ nhúng bậc thấp (tiếng Anh: low-level embedded systems) hệ thời gian thực Những ứng dụng có ưu điểm tốc độ xử lí lệnh Assembly nhanh II TÌM HIỂU CÁC LỆNH DỊCH VÀ QUAY TRONG ASSEMBLY VÀ CÁC VÍ DỤ MINH HỌA 2.1 Các lệnh dịch quay Assembly Lệnh dịch quay dịch bit trên tốn hạng đích nhiều vị trí sang trái sang phải Khác lệnh dịch lệnh quay chỗ : bit bị dịch (trong lệnh dịch ) bị Trong lệnh quay, bit bị dịch từ đầu toán hạng đưa trở lại đầu Có khả viết lệnh dịch quay : OPCODE destination,1 OPCODE destination,CL cách viết thứ hai ghi CL chưá N số lần dịch hay quay Toán hạng đích ghi 16 bit, vị trí nhớ Các lệnh dịch quay thường dùng để nhân chia sô nhị phân Chúng dùng cho hoạt động nhập xuất nhị phân hex 2.2 Lệnh dịch trái (left shift ) Lệnh SHL dịch toán hạng đích sang trái Cú pháp lệnh sau : SHL destination ,1 ; dịch trái dest bit SHL destination, CL ; dịch trái N bit (CL chứa N) Cứ lần dịch trái, số thêm vào LSB 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 dịch OF= kết qủa thay đổi dấu vào lần dịch cuối Ví dụ : Giả sử DH = 8Ah CL = Hỏi giá trị DH CF sau lệnh SHL DH,CL thực ? Kết qủa DH = 01010000 =50h, CF=0 Nhân lệnh SHL Chúng ta xét số 235 decimal Nếu dịch trái 235 bit thêm vào bên phải có 2350 Noí cách khác, dịch trái bit nhân 10 Đối với số nhị phân, dịch trái bit có nghĩa nhân với 2.Ví dụ AL=00000101=5d SHL AL,1 ; AL=00001010=10d SHL AL,CL ; CL=2 AL=20d sau thực lệnh Lệnh dịch trái số học (SAL =Shift Arithmetic Left) Lệnh SHL dùng để nhân toán hạng với hệ số Tuy nhiên trường hợp người ta muốn nhấn mạnh đến tính chất số học phép tốn lệnh SAL dùng thay cho SHL Cả lệnh tạo mã máy Một số âm nhân cách dịch trái Ví dụ : Nếu AX = FFFFh = -1 sau dịch trái lần AX = FFF8h = -8 Tràn Khi dùng lệnh dịch trái để nhân xảy tràn Đối với lệnh dịch trái lần, CF OF phản ánh xác tràn dấu tràn khơng dấu Tuy nhiên cờ không phản ánh xác kết qủa dịch trái nhiều lần dịch nhiều lần thực chất chuỗi dịch lần liên tiếp cờ CF OF phản ánh kết lần dịch cuối Ví dụ : BL=80h, CL=2 lệnh SHL BL,CL làm cho CF = OF = thực tế xảy tràn dấu tràn khơng dấu Ví dụ : viết đoạn mã nhân AX với Giả sử tràn MOV CL,3 ; CL=3 SHL AX,CL ; AX*8 2.3 Lệnh dịch phải (Right Shift ) Lệnh SHR dịch phải tốn hạng đích N lần SHR destination,1 SHR destination,CL Cứ lần dịch phải, số thêm vào MSB Các cờ bị ảnh hưởng giống lệnh SHL Ví dụ : giả sử DH = 8Ah, CL=2 Lệnh SHR DH,CL ; dịch phải DH lần cho kết sau : Kết qủa DH=22h, CF=1 Cũng lệnh SAL, lệnh SAR (dịch phải số học ) hoạt động giống SHR , có điều khác MSB giữ giá trị nguyên thủy (bit dấu giữ nguyên) sau dịch Chia lệnh dịch phải Lệnh dịch phải chia giá trị tốn hạng đích Điều số chẳn Đối với số lẻ, lệnh dịch phải chia làm tròn xuống số ngun gần Ví dụ, BL = 00000101=5 dịch phải BL=00000010 =2 Chia có dấu khơng dấu Để thực phép chia lệnh dịch phải, phải phân biệt số có dấu số khơng dấu Nếu diễn dịch khơng dấu dùng lệnh SHR, diễn dịch có dấu dùng SAR (bit dấu giữ ngun ) Ví dụ : dùng lệnh dịch phải để chia số không dấu 65143 cho Thương số đặt AX MOV AX,65134 MOV CL,2 SHR AX,CL Ví dụ : Nếu AL = -15, cho biết AL sau lệnh SAR AL,1 thực Giải : AL= -15 = 11110001b Sau thực SAR AL ta có AL = 11111000b = -8 2.3 Lệnh quay (Rotate) Quay trái (rotate left ) = ROL quay bit sang trái, LSB thay MSB Còn CF=MSB Cú pháp ROL sau : ROL destination,1 ROL destination,CL Quay phải (rotate right ) = ROR quay bit sang phải, MSB thay LSB Còn CF=LSB Cú pháp lệnh quay phải ROR destination,1 ROR destination,CL Trong lệnh quay phải quay trái CF chứa bit bị quay Ví dụ sau cho thấy cách để khám bit byte từ mà không làm thay đổi nội dung Ví dụ : Dùng ROL để đếm số bit BX mà khơng thay đổi nội dung Kết qủa cất 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 JNC NEXT ; CF =0 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 giống lệnh ROL khác cờ nhớ nằm MSB LSB vòng kín bit Cú pháp của lệnh RCL sau : RCL destination,1 RCL destination,CL Quay phải qua cờ nhớ (rotate through carry right ) = RCR Lệnh giống lệnh ROR khác cờ nhớ nằm MSB LSB vòng kín bit Cú pháp của lệnh RCR sau : RCR destination,1 Ảnh hưởng lệnh quay lên cờ SF,PF ZF phản ảnh kết CF-bit cuối dịch OF=1 kết qủa thay đổi dấu vào lần quay cuối Ứng dụng : Đảo ngược bit byte từ Ví dụ AL =10101111 sau đảo ngược AL=11110101 Có thể lặp lần cơng việc sau :Dùng SHL để dịch bit MSB CF, Sau dùng RCR để đưa vào BL Đoạn mã để làm việc sau : MOV CX,8 ;số lần lặp REVERSE : SHL AL,1 ; dịch MSB CF RCR BL,1 ; đưa CF (MSB) vào BL LOOP REVERSE MOV AL,BL ; AL chứa bit đảo ngược III BÀI TẬP CODE ASSEMBLY Đề : Sử dụng emu8086 nhập vào hình số kiểu word in hình tổng hai số vừa nhập Giải: ...các bit bị dịch (trong lệnh dịch ) bị Trong lệnh quay, bit bị dịch từ đầu toán hạng đưa trở lại đầu Có khả viết lệnh dịch quay : OPCODE destination,1 OPCODE destination,CL... destination,CL Quay phải (rotate right ) = ROR quay bit sang phải, MSB thay LSB Còn CF=LSB Cú pháp lệnh quay phải ROR destination,1 ROR destination,CL Trong lệnh quay phải quay trái CF chứa bit bị quay. .. nguyên) sau dịch Chia lệnh dịch phải Lệnh dịch phải chia giá trị tốn hạng đích Điều số chẳn Đối với số lẻ, lệnh dịch phải chia làm tròn xuống số ngun gần Ví dụ, BL = 00000101=5 dịch phải BL=00000010