Tài liệu Các lệnh số học và các chương trình - Pdf 90

chương 6
Các lệnh số học và các chương trình
6.1 Phép cộng và trừ không dấu.
Các số không dấu được định nghĩa như những dữ liệu mà tất cả mọi bit của chúng
đều được dùng để biểu diễn dữ liệu và khó có bit dành cho dấu âm hoặc dương. Điều này có
nghĩa là toán hạng có thể nằm giữa 00 và FFH (0 đến 255 hệ thập phân) đối với dữ liệu 8 bit.
6.1.1 Phép cộng các số không dấu.
Trong 8051 để cộng các số với nhau thì thanh ghi tổng (A) phải được dùng đến. Dạng lệnh
ADD là:
ADD A, nguồn; A = A + nguồn
Lệnh ADD được dùng để cộng hai toán hạng. Toán hạng đích luôn là thanh ghi
A trong khi đó toán hạng nguồn có thể là một thanh ghi dữ liệu trực tiếp hoặc là ở
trong bộ nhớ. Hãy nhớ rằng các phép toán số học từ bộ nhớ đến bộ nhớ không bao giờ
được phép trong hợp ngữ. Lệnh này có thể thay đổi một trong các bit AF, CF hoặc PF
của thanh ghi cờ phụ thuộc vào các toán hạng liên quan. Tác động của lệnh ADD lên
cờ tràn sẽ được trình bày ở mục 6.3 vì nó chủ yếu được sử dụng trong các phép toán
với số có dấu. Xét ví dụ 6.1 dưới đây:
Ví dụ 6.1:
Hãy biểu diễn xem cá lệnh dưới đây tác động đến thanh ghi cờ như thế nào?
MOV A, # 0F5H ; A = F5H
MOV A, # 0BH ; A = F5 + 0B = 00
Lời giải:
F5H 1111 0101
+ 0BH + 0000 1011
100H 0000 0000
Sau phép cộng, thanh ghi A (đích) chứa 00 và các cờ sẽ như sau:
CY = 1 vì có phép nhớ từ D7
PF = 1 vì số các số 1 là 0 (một số chẵn) cờ PF được đặt lên 1.
AC = 1 vì có phép nhớ từ D3 sang D4
6.1.1.1 Phép cộng các byte riêng rẽ.
ở chương 2 đã trình bày một phép cộng 5 byte dữ liệu. Tổng số đã được cất

ở phần cuối khi vòng lặp kết thúc, tổng số được giữ bởi thanh ghi A và R7,
trong đó A giữ byte thấp và R7 chứa byte cao.
6.1.1.2 Phép cộng vó nhớ và phép cộng các số 16 bit.
Khi cộng hai toán hạng dữ liệu 16 bit thì ta cần phải quan tâm đến phép truyền
của cờ nhớ từ byte thấp đến byte cao. Lệnh ADDC (cộng có nhớ) được sử dụng trong
những trường hợp như vậy. Ví dụ, xét phép cộng hai số sau: 3CE7H + 3B8DH.
3C E7
+ 3B 8D
78 74
79
Khi byte thứ nhất được cộng (E7 + 8D = 74, CY = 1). Cờ nhớ được truyền lên
byte cao tạo ra kết quả 3C + 3B + 1 = 78. Dưới đây là chương trình thực hiện các
bước trên trong 8051.
Ví dụ 6.3:
Hãy viết chương trình cộng hai số 16 bit. Các số đó là 3CE7H và 3B8DH. Cất
tổng số vào R7và R6 trong đó R6 chứa byte thấp.
Lời giải:
CLR ; Xoá cờ CY = 0
MOV A, #0E7H ; Nạp byte thấp vào A → A = E7H
ADD A, #8DH ; Cộng byte thấp vào A → a = 74H và CY
= 1
MOV R6, A ; Lưu byte thấp của tổng vào R6
MOV A, #3CH ; Nạp byte cao vào A → A = 3CH
ADDC A, #3BH ; Cộng byte cao có nhớ vào A → A = 78H
;
MOV R7, A ; Lưu byte cao của tổng vào R7
6.1.1.3 Hệ thống số BCD (số thập phân mã hoá theo nhị phân).
Số BCD là số thập phân được mã hoá theo nhị phân 9 mà không dùng số thập
phân hay số thập lục (Hex). Biểu diễn nhị phân của các số từ 0 đến 9 được gọi là
BCD (xem hình 6.1). Trong tài liệu máy tính ta thường gặp hai khái niệm đối với các

thấp và một trong 4 bit cao. Ví dụ “0101 1001” là số BCD đóng gói cho 59H. Chỉ mất
1 byte bộ nhớ để lưu các toán hạng BCD. Đây là lý do để dùng số BCD đóng gói vì
nó hiệu quả gấp đôi trong lưu giữ liệu.
Có một vấn để khi cộng các số BCD mà cần phải được khắc phục. Vấn đề đó
là sau khi cộng các số BCD đóng gói thì kết quả không còn là số BCD. Ví dụ:
MOV A, #17H
ADD A, #28H
Cộng hai số này cho kết quả là 0011 1111B (3FH) không còn là số BCD! Một
số BCD chỉ nằm trong giải 0000 đến 1001 (từ số 0 đến số 9). Hay nói cách khác phép
cộng hai số BCD phải cho kết quả là số BCD. Kết quả trên đáng lẽ phải là 17 + 28 =
45 (0100 0101). Để giải quyết vấn đề này lập trình viên phải cộng 6 (0110) vào số
thấp 3F + 06 = 45H. Vấn đề tương tự cũng có thể xảy ra trong số cao (ví dụ khi cộng
hai số 52H + 87H = D94). Để giải quyết vấn đề này ta lại phải cộng 6 vào số cao
(D9H + 60H = 139). Vấn đề này phổ biến đến mức mọi bộ xử lý như 8051 đều có
một lệnh để sử lý vấn đề này. Trong 8051 đó là lệnh “DA A” để giải quyết vấn đề
cộng các số BCD.
6.1.1.4 Lệnh DA.
Lệnh DA (Decimal Adjust for addition điều chỉnh thập phân đối với phép
cộng) trong 8051 để dùng hiệu chỉnh sự sai lệch đã nói trên đây liên quan đến phép
cộng các số BCD. Lệnh giả “DA”. Lệnh DA sẽ cộng 6 vào 4 bit thấp hoặc 4 bit cao
nếu cần. Còn bình thường nó đê nguyên kết quả tìm được. Ví dụ sau sẽ làm rõ các
điểm này.
MOV A, #47H ; A = 47H là toán hạng BCD đầu tiên
MOV B, #25H ; B = 25H là toán hạng BCD thứ hai
ADD A, B ; Cộng các số hex (nhị phân) A = 6CH
DA A ; Điều chỉnh cho phép cộng BCD (A = 72H)
Sau khi chương trình được thực hiện thanh ghi A sẽ chứa 72h (47 + 25 = 72).
Lệnh “DA” chỉ làm việc với thanh ghi A. Hay nói cách khác trong thanh ghi nguồn có
thể là một toán hạng của chế độ đánh địa chỉ bất kỳ thì đích phải là thanh ghi A để
DA có thể làm việc được. Cũng cần phải nhấn mạnh rằng lệnh DA phải được sử dụng

NEXT: INC R0 ; Tăng R0 dịch con trỏ lên ô nhớ kế tiếp
DJNZ R2, AGAIN ; Lặp lại cho đến khi R2 = 0
6.1.2 Phép trừ các số không dấu.
Cú pháp: SUBB A, nguồn; A = A - nguồn - CY.
Trong rất nhiều các bộ xử lý có hai lệnh khác nhau cho phép trừ đó là SUB và
SUBB (trừ có mượn - Sub, tract with Borrow). Trong 8051 ta chỉ có một lệnh SUBB
duy nhất. Để thực hiện SUB từ SUBB, do vậy có hai trường hợp cho lệnh SUBB là:
với CY = 0 và với CY = 1. Lưu ý rằng ở đây ta dùng cờ CY để mượn.
6.1.2.1 Lệnh SUBB với CY = 0.
Trong phép trừ thì các bộ vi xử lý 8051 (thực tế là tất cả mọi CPU hiện đại)
đều sử dụng phương pháp bù 2. Mặc dù mỗi CPU đều có mạch cộng, nó có thể quá
cồng kềnh (và cần nhiều bóng bán dẫn) để thiết kế mạch trừ riêng biệt. Vì ly do đó mà
8051 sử dụng mạch cộng để thực hiện lệnh trừ. Giả sử 8051 sử dụng mạch cộng để
thực hiện lệnh trừ và rằng CY - 0 trước khi thực hiện lệnh thì ta có thể tóm tắt các
bước mà phần cứng CPU thực hiện lệnh SUBB đối với các số không dấu như sau:
1. Thực hiện lấy bù 2 của số trừ (toán hạng nguồn)
2. Cộng nó vào số bị trừ (A)
3. Đảo nhớ
Đây là 3 bước thực hiện bởi phần cứng bên trong của CPU 8051 đối với mỗi
lệnh trừ SUBB bất kể đến nguồn của các toán hạng được cấp có được hỗ trợ chế độ
đánh địa chỉ hay không? Sau ba bước này thì kết quả có được và các cờ được bật. Ví
dụ 6.5 minh hoạ 3 bước trên đây:
Ví dụ 6.5:
Trình bày các bước liên quan dưới đây:
CLR C ; Tạo CY = 0
MOV A, #3FH ; Nạp 3FH vào A (A = 3FH)
MOV R3, #23H ; Nạp 23H vào R3 (R3 = 23H)
SUBB A, R3 ; Trừ A cho R3 đặt kết quả vào A
Lời giải:
A = 3F 0011 1111 0011 1111


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status