I. Cấu trúc phần cứng của 8251: 1 Sơ đồ khối:
1. SP ← SP-2, {SP}← FR
JMP DWORD PTR [BX]
Đây là lệnh nhảy xa ứng. Địa chỉ nhảy đến ứng với CS:IP, giá trị gán cho IP và CS được chức trong 4 ơ nhớ do BX và BX+1 (cho IP) và BX+2 và BX+3 (cho CS) chỉ ra trong đoạn DS (SI, DI cĩ thể dùng thay chỗ của BX).
Đây cũng là lệnh nhảy gián tiếp vì địa chỉ lệch và địa chỉ cơ sở nằm trong ơ nhớ.
Lệnh này khơng tác động đến các cờ.
JNA – Xem JBE
JNAE – Xem JB
JNB – Xem JAE
JNBE – Xem JA
JNC – Xem JAE
JNE/JNZ – Jump if Not Equal/Jump if Not Zero (Nhảy nếu khơng bằng nhau/Nhảy nếu kết quả khơng rỗng)
Viết lệnh : JNE NHAN
JNZ NHAN
Mơ tả : IP ← IP + Dịch chuyển
Hai lệnh trên biểu diễn cùng một thao tác : nhảy (cĩ điều kiện) tới NHAN nếu ZF = 0. Nhãn NHAN phải nằm cách xa (dịch đi một khoảng) –128…+127 byte so với lệnh tiếp theo sau lệnh JNE/JNZ. Chương trình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển. Lệnh này khơng tác động đến các cờ. JNG – Xem JLE JNGE – Xem JL JNL – Xem JGE JNLE – Xem JG
JNO – Jump if No Overflow (Nhảy nếu khơng tràn)
Viết lệnh: JNO NHAN
Mơ tả: IP ← IP + Dịch chuyển
Đây là lệnh nhảy (cĩ điều kiện) tới NHAN nếu OF=0, tứ khơng xảy ra tràn sau khi thực hiện các phép tốn với các số cĩ dấu. Nhãn NHAN phải nằm cách xa (dịch đi một khoảng) –128…+127 byte so với lệnh tiếp theo sau lệnh JNO. Chương trình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển.
Lệnh này khơng tác động đến các cờ
JNZ − Xem JNE
JO − Jump if Overflow (nhảy nếu tràn)
Viết lệnh : JO NHAN
Mơ tả : IP ← IP + Dịch chuyển.
Đây là lệnh nhảy (cĩ điều kiện) tới NHAN nếu OF =1, tức xảy ra tràn sau khi thực hiện các phép tốn với các số cĩ dấu. Nhãn NHAN phải nằm cách xa (dịch đi một khoảng (-128…+127 byte so với lệnh tiếp theo sau lệnh JO. Chương trình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển.
Lệnh này khơng tác động đến các cờ.
JP/JPE − Jump if Parity/Jump if Parity Even (Nhảy nếu parity chẵn)
Cú pháp: JP NHAN
JPE NHAN
Hai lệnh trên biểu diễn cùng một thao tác : Nhảy (cĩ điều kiện) tới NHAN nếu PE=1. Nhãn NHAN phải nằm cách xa (dịch đi một khoảng) − 128... byte so với lệnh tiếp theo sau lệnh JP/JPE. Chương trình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển.
Lệnh này khơng tác động đến các cờ.
JPE − Xem JP
JPO − Xem JNP
JS − Jump if Signed (Jump if Negative) (Nhảy nếu kết quả âm).
Cú pháp: JS NHAN
Mơ tả : IP ← IP + Dịch chuyển.
Đây là lệnh nhảy (cĩ điều kiện) tới NHAN SF=1, tức kết quả là âm sau khi thực hiện các phép tốn với các số cĩ dấu. Nhãn NHAN phải nằm cách xa (dịch đi một khoảng) −128…+127 byte so với lệnh tiếp theo sau lệnh JS. Chương trình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển.
Lệnh này khơng tác động đến các cờ.
JZ − Xem JE
LAHF − Load AH with the low byte of the Flag Register (Nạp byte thấp của thanh cờ vào AH).
Dùng lệnh này phối hợp với lệnh PUSH AX thì cĩ thể mơ phỏng lệnh PUSH PSW của bộ vi xử lý 8085 trên 8086 (lệnh PUSH PSW của vi xử lý 8085 cất thanh ghi cờ và Acc của nĩ vào ngăn xếp).
Lệnh này khơng tác động đến các cờ.
DS − Load Register and DS with Words from Memory Nạp một từ (từ bộ nhớ) vào thanh ghi cho trong lệnh và một từ tiếp theo vào DS).
Cú pháp: LDS Đích, Gốc
Trong đĩ :
+ Đích là một trong các thanh ghi : AX, BX, CX, DX, SP, BP, SI, DI. + Gốc là ơ nhớ trong đoạn DS được chỉ rõ trong lệnh.
Mơ tả : Đích ← Gốc, DS ← Gốc + 2.
Đây là lệnh để nạp vào thanh ghi đã chọn và vào DS từ 4 ơ nhớ liên tiếp.
Một trong những ứng dụng của lệnh này là làm cho SI và DS chỉ vào địa chỉ đầu của vùng nhớ chứa chuỗi gốc trước khi dùng đến lệnh thao tác chuỗi.
Lệnh này khơng tác động đến các cờ.
LEA − Load Effective Address (Nạp địa chỉ hiệu dụng vào thanh ghi).
Cú pháp: LEA Đích, Gốc
Trong đĩ:
+ Đích thường là một trong các thanh ghi: BX, CX, DX, BP, SI, DI. + Gốc là tên biến trong đoạn DS được chỉ rõ lệnh hoặc ơ nhớ cụ thể.
Mơ tả: Đích ← Địa chỉ lệnh của Gốc, hoặc Đích ← Địa chỉ hiệu dụng của gốc.
Đây là lệnh để tìm địa chỉ lệch của biến hoặc địa chỉ của ơ nhớ chọn làm gốc rồi nạp vào thanh ghi đã chọn
Lệnh này khơng tác động đến các cờ
LES – Load Register and ES with Words from Memory Nạp một từ từ bộ nhớ) vào thanh ghi cho trong lệnh và một từ tiếp theo vào ES)
Cú pháp: LES Đích, Gốc
Trong đĩ :
+ Đích là một trong các thanh ghi : AX, BX, CX, DX, SP, BP, SI, DI. + Gốc là ơ nhớ tong đoạn DS được chỉ rõ trong lệnh.
Mơ tả : Đích ← Gốc, ES ← Gốc + 2.
Đây là lệnh để nạp vào thanh ghi đã chọn và vào ES từ 4 ơ nhớ liên tiếp.
Một trong những ứng dụng của lệnh này là làm cho DI và ES chỉ vào địa chỉ dấu của vùng nhớ chứa chuỗi đích trước khi dùng đến lệnh thao tác chuỗi.
Lệnh này khơng tác động đến các cờ
Nạp vào DI nội dung 2 ơ nhớ do BX và BX + 1 chỉ ra nạp vào ES nội dung 2 ơ nhớ tiếp theo do BX + 2 và BX + 3 chỉ ra. Các ơ nhớ này đều nằm trong đoạn dữ liệu DS và chứa địa chỉ của chuổi đích. Do vậy sau đĩ ES:DI chỉ vào đầu chuổi đích cần thao tác.
LOCK – Assert Bus Lock Signal (Đưa ra tín hiệu khĩa bus)
Lệnh LOCK dùng đặt trước các lệnh mà khi chạy nĩ cĩ nguy cơ gây lỗi do khả năng xảy ra tranh chấp trong việc sử dụng bus giữa bộ vi xử lý 8086 và các bộ xử lý khác trong hệ thống đa xử lý. Nếu cĩ lệnh LOCK đặt trước một lệnh nào đĩ, thì khi chạy lệnh này, 8086 đưa ra tín hiệu khĩa bus. Tín hiệu này sẽ nối ra thiết bị điều khiển bus ngồi để cấm các bộ xử lý khác trong hệ thống sử dụng bus.
Lệnh này khơng tác động đến các cờ.
Lệnh XCHG cần 2 lần thâm nhập bus để hồn tất việc thực hiện lệnh, do đĩ cần đặt sau LOCK để tránh nguy cơ tranh chấp bus cĩ thể xảy ra trong hệ thống đa xử lý.
LODS/LODSB/LODSW – Load String Byte/Word into AL/AX (Nạp vào AL/AX 1 phần tử của chuỗi byte/từ)
Cú pháp: LODS Chuỗi gốc LODSB
LODSW
Mơ tả : AL ← Phần tử hiện thời, SI ← SI + tùy theo DF, nếu là chuỗi byte
AX ← Phần tử hiện thời, SI ← SI + 2 tùy theo DF, nếu là chuỗi từ
(Phần tử hiện thời của chuỗi là do DS : SI hiện thời chỉ ra)
Lệnh LODS nạp vào AL/AX 1 bytes/ từ (1 phần tử của chuỗi đã được định nghĩa trước là chuỗi gồm các byte hoặc từ do SI chỉ ra trong đoạn DS, sau đĩ SI tự động tăng/giảm để chỉ vào phần tử tiếp theo tùy theo cờ hướng. Khi phải dịch lệnh LODS
Chuỗigốc, chương trình dịch dùng tên Chuỗigốc để xác định xem lúc khai báo thì
Chuỗigốc cĩ các phần tử là byte hay từ. Muơn chỉ rõ cho chương trình dịch hợp ngữ rằng ta làm việc với chuỗi các byte hoặc các từ, ta cũng cĩ thể dùng lệnh LODSB hoặc LODSW.
Lệnh này khơng tác động đến các cờ
LOOP – Jump to Speciafied Label if CX # O after Autodecrement (lặp lại đoạn chương trình do nhãn chỉ ra cho đến khi CX = 0.
Cú pháp: LOOP NHAN
Mơ tả:
Lệnh này dùng để lập lại đoạn chương trình (gồm các lệnh nằm trong khoảng từ nhãn NHAN đến hết lệnh LOOP NHAN) cho đến khi số lần lặp CX = 0. Điều này cĩ
nghĩa là trước khi vào vịng lặp ta phải đưa số lần lặp mong muốn vào thanh ghi CX và sau mỗi lần thực hiện lệnh LOOP NHAN thì đồng thời CX tự động giảm đi 1 (tức là CX ← CX – 1)
Nhãn NHAN phải nằm cách xa dịch đi một khoảng) – 128 byte so với lệnh tiếp theo sau lệnh LOOP.
Lệnh này khơng tác động đến các cờ
LOOPE/LOOPZ – Loop White CX # O and ZF = 1 (Lặp lại đoạn chương trình do nhãn chỉ ra cho đến khi CX=0 hoặc ZF = 0)
Cú pháp: LOOPE NHAN LOOPZ NHAN
Mơ tả:
Lệnh này dùng để lập lại đoạn chương trình (gồm các lệnh nằm trong khoản từ nhãn NHAN đến hết lệnh LOOPE NHAN hoặc LOOPZ NHAN) cho đến khi số lần lặp CX = 0, hoặc ZF = 0. Điều này cĩ nghĩa là trước khi vào vịng lặp ta phải đưa số lần lặp mong muốn vào thanh ghi CX và sau mỗi lần thực hiện lệnh LOOP NHAN thì đồng thời CX tự động giảm đi 1 (tức là CX ← CX – 1)
Nhãn NHAN phải nằm cách xa (dịch đi một khoảng) –128 byte so với lệnh tiếp theo sau lệnh LOOPE / LOOPZ.
Lệnh này khơng tác động đến các cờ.
LOOPNE/LOOPNZ – Loop While CX # O and ZF = 0 (Lặp lại đoạn chương trình do nhãn chỉ ra cho đến khi CX = 0 hoặc ZF = 1)
Cú pháp: LOOPE NHAN LOOPZ NHAN
Mơ tả:
Lệnh này dùng để lập lại đoạn chương trình (gồm các lệnh nằm trong khoảng từ nhãn NHAN đến hết lệnh LOOPNE NHAN hoặc LOOPNZ NHAN) cho đến khi số lần lặp CX = 0 hoặc ZF = 1. Điều này cĩ nghĩa là trước khi vào vịng lặp ta phải đưa số lần lặp mong muốn vào thanh ghi CX và sau mỗi lần thực hiện lệnh LOOP NHAN thì đồng thời CX tự động giảm đi 1 (tức là CX ← CX – 1)
Nhãn NHAN phải nằm cách xa (dịch đi một khoảng) – 128 byte so với lệnh tiếp theo sau lệnh LOOPNE/LOOPNZ.
Lệnh này khơng tác động đến các cờ
LOOPNZ – Xem LOOPNE LOOPZ – Xem LOOPE
MOV – Move a Word or Byte (Chuyển một từ hay một byte)
Cú pháp: MOV Đích, Gốc
Mơ tả : Đích ← Gốc
Trong đĩ tốn hạng đích và gốc cĩ thể tìm được theo các chế độ địa chỉ khác nhau, nhưng phải cĩ cùng độ dài và khơng được phép đồng thời là 2 ơ nhớ hoặc 2 thanh ghi đoạn.
Lệnh này khơng tác động đến các cờ.
MOVS/MOVSB/MOVSW – Move String Byte or String Word (Chuyển 1 phần tử của 1 chuỗi sang một chuỗi khác)
Cú pháp: MOVS Chuỗiđích, Chuỗigốc MOVSB
Mơ tả : Phần tử Chuỗiđích ← Phần tử Chuỗigốc
Lệnh này dùng chuyển từng byte hay từng từ của chuỗi gốc sang chuỗi đích trong đĩ:
+ DS:SI là địa chỉ của phần tử trong chuỗi gốc. + ES:DI là địa chỉ của phần tử trong chuỗi đích.
+ Sau mỗi lần chuyển SI ← SI + 1. DI ← DI + 1 hoặc SI ← SI + 2. DI ← DI + 2 một cách tự động tùy thuộc cờ hướng DF là 0/1 và chuỗi là chuỗi byte hoặc chuỗi từ.
Cĩ 2 cách để chỉ ra chuỗi byte hoặc chuỗi từ. Cách đầu tiên là ta khai rõ bằng tên chuỗi nguồn và chuỗi đích là loại gì ngay từ đầu chương trình. Cách thứ hai là ta thêm vào lệnh MOVS đuơi “B” cho chuỗi byte hoặc đuơi “W” cho chuỗi từ (xem mơ tả cách sử dụng tại lệnh COMPS).
Lệnh MOVS/MOVSB/MOVSW cĩ thể dùng kèm với lện REPE hoặc REPNE để so sánh tất cả các phần tử trong chuỗi.
MUL – Multiply Unsigned Byte or Word (Nhãn số khơng dấu)
Cú pháp: MUL Gốc
Trong đĩ tốn hạng Gốc là số nhân và cĩ thể tìm được theo các chế độ địa chỉ khác nhau.
Mơ tả:
Tùy theo độ dài của tốn hạng Gốc ta cĩ 2 trường hợp tổ chức phép nhân, chỗ để ngầm định cho số bị nhân và kết quả.
+ Nếu Gốc là số 8 bit : AL x Gốc
số bị nhân phải là số 8 bit để trong AL. sau khi nhân : AX ← tích
+ Nếu Gốc là số 16 bit : AX x Gốc
số bị nhân phải là số 16 bit để trong AX. sau khi nhân : DXAX ← tích
Nếu byte cao (hoặc 16 bit cao) của 16 (hoặc 32) bit kết quả chứa 0 thì CF = OF = 0.
Như vậy các cờ CF và OF sẽ báo cho ta biết cĩ thể bỏ đi bao nhiêu số 0 trong kết quả.
Cập nhật : CF, OF
Khơng xác định : AF, PF, SF, ZP
NEG – Negate a Operand (Form its 2’s Complement) (Lấy bù hai của một tốn hạng, đảo dấu của một tốn hạng).
Cú pháp: NEG Đích
Trong đĩ tốn hạng đích cĩ thể tìm được theo các chế độ địa chỉ khác nhau.
Mơ tả : Đích ← 0 - (Đích)
Điều này hồn tồn tương đương với việc lấy (Đích + 1) làm kết quả. Nếu ta lấy bù hai của –128 hoặc –32768 thì ta sẽ được kết quả khơng đổi nhưng cờ OF = 1 để báo là kết quả bị tràn (vì số dương lớn nhất biểu diễn được là +127 và +32767)
Cập nhật : AF, CF, OF, PF, SF, ZF.
NOP – No Operation (CPU khơng làm gì)
Lệnh này khơng thực hiện một cơng việc gì ngoại trừ việc tăng nội dung của IP và tiêu tốn 3 chu kỳ đồng hồ. Nĩ thường được dùng để tính thời gian trong các vịng
trễ hoặc để chiếm chỗ cho các lệnh cần thêm vào chương trình sau này mà khơng làm ảnh hưởng tối độ dài của chương trình.
Lệnh này khơng tác động đến các cờ
NOT – Invert Each Bit of an Operand (From its 1’s Complement) (Lấy bù của một tốn hạng, đảo bit của một tốn hạng)
Cú pháp: NOT Đích
Trong đĩ tốn hạng đích cĩ thể tìm được theo các chế độ địa chỉ khác nhau.
Mơ tả: Đích ← (Đích)
Lệnh này khơng tác động đến các cờ.
OR – Logically Or Corresponding Bits of Two Operands (Hoặc 2 tốn hạng)
Cú pháp: OR Đích, Gốc.
Mơ tả: Đích Đích v Gốc
Trong đĩ tốn hạng đích và gốc cĩ thể tìm được theo các chế độ địa chỉ khác nhau, nhưng phải chứa dữ liệu cùng độ dài và khơng được phép đồng thời là 2 ơ nhớ và cũng khơng được là thanh ghi đoạn. Phép OR thường dùng để lập một vài bit nào đĩ của tốn hạng bằng cách cộng logic tốn hạng đĩ với tốn hạng tức thời cĩ các bit 1 tại các vị trí tương ứng cần thiết lập.
Xố: CF, OF
Cập nhật : PF, SF, ZP, PF chỉ cĩ nghĩa khi tốn hạng là 8 bit
Khơng xác định : AF
OUT – Output a Byte or a Word to a Port (Đưa dữ liệu từ Acc ra cổng)
Cú pháp: OUT Port, Acc
Mơ tả: Acc → {Port}
Trong đĩ {Port} là dữ liệu của cổng cĩ địa chỉ là Port. Port là địa chỉ 8 bit của cổng, nĩ cĩ thể cĩ các giá trị trong khoảng 00H…FFH. Như vậy ta cĩ thể cĩ các khả năng sau:
+ Nếu Acc là AL thì dữ liệu 8 bit được đưa ra cổng Port
+ Nếu Acc là AX thì dữ liệu 16 bit được đưa ra cổng Port và cổng Port + 1 Cĩ một cách khác để biểu diễn địa chỉ cổng là thơng qua thanh ghi DX. Khi dùng thanh ghi DX để chứa địa chỉ cổng ta sẽ cĩ khả năng địa chỉ hĩa cổng mềm dẻo hơn. Lúc này địa chỉ cổng nằm trong dải 0000H…FFFFH và ta phải viết lệnh theo dạng:
OUT DX, Acc
Trong đĩ DX phải được gán từ trước giá trị ứng với địa chỉ cổng.
Lệnh này khơng tác động đến các cờ.
POP – Pop Word from Top of Stack (Lấy lại 1 từ vào thanh ghi từ đỉnh ngăn xếp)
Cú pháp: POP Đích
Mơ tả : Đích ← {SP} SP ← SP + 2
Trong đĩ tốn hạng đích cĩ thể tìm được theo các chế độ địa chỉ khác nhau: cĩ thể là các thanh ghi đa năng, thanh ghi đoạn (nhưng khơng được là thanh ghi đoạn mã CS) hoặc ơ nhớ. Dữ liệu để tại ngăn xếp khơng thay đổi. Giá trị của SS khơng thay đổi.
Lệnh này khơng tác động đến các cờ.
POPF – Pop Word from Top of Stack to Flag Register (Lấy 1 từ từ đỉnh ngăn xếp rồi đưa vào thanh cờ)
Cú pháp: POPF
Mơ tả : RF ← {SP} SP ← SP + 2
Sau lệnh này dữ liệu để tại ngăn xếp khơng thay đổi, SS khơng thay đổi.
Lệnh này khơng tác động đến các cờ.
PUSH – Push Word on the Stack (Cất 1 từ vào ngăn xếp)
Cú pháp: Push Gốc
Mơ tả : SP ← SP – 2 Gốc → {SP}
Trong đĩ tốn hạng gốc cĩ thể tìm được theo các chế độ địa chỉ khác nhau: cĩ thể là các thanh ghi đa năng, thanh ghi đoạn hoặc ơ nhớ. Lệnh này thường dùng với lệnh POP như là một cặp đối ngẫu để xử lý các dữ liệu và trạng thái của chương trình chính