2.6.1. Tập lệnh của CPU Chức năng mỏy tớnh:
Xửlớtin
Truyềnthụng
Về cơ bản việc xử lớ thụng tin và truyền thụng đều dựa trờn nguyờn tắc thự hiện lệnh (Instruction).
Lệnh bao gồm:
Mólệnh+Toỏnhạng
Toỏntử
Toỏn tử chứa mó lệnh dạng tượng trưng
Mólệnh:chứcnăngcủathaotỏc
-23-
Dẫn hướngbiờndịch:toỏntửchứatoỏntửgiả(pseudo_op),cỏctoỏntửgiảnàykhụng đượcdịchsangmómỏymàchỉbỏochochươngtrỡnhdịchlàmviệcgỡđú.
Toỏn hạng
Toỏnhạng:xỏcđịnhdữliệusẽđượcthaotỏc
Toỏnhạng:Đớch,Nguồn
2.6.2. Cỏc nhúm lệnh của CPU Ngụn ngữ mỏy (Machine Language):
Chươngtrỡnhđưavàobộnhớcho mỏythựchiệntheonhiềudạng,dạngcơbảnnhấtmà mỏycúthể hiểungayđượcgọi làngụnngữmỏy. TuỳtheoCPUmà ngụnngữmỏycúdạng nhấtđịnh, chươngtrỡnhviếtbằngngụnngữmỏythựchiệnrấtnhanhvàchiếmớtchỗ trongbộ nhớ,tuynhiờnchươngtrỡnhkhúviếtvàkhúnhớ.
Hợp ngữ (Assembly)
Ngụnngữ giỳplập trỡnh viờnviết chươngtrỡnhđẽ dàng hơn, thaycho ngụn ngữmỏy. Mộtlệnhcủahợpngữtươngđươngnhưmộtlệnhcủangụnngữmỏynhưngthayviếtchương trỡnhdướidạngnhịphõnsẽdựngkớhiệutượngtrưng.
Đểbiểu diễn cỏc nhúm lệnhCPU, dựngtập lệnhHợp ngữdựngcho VXL8086 Intel.
Cỏc nhúm lệnh bao gồm: Nhúmlệnhcơsở Cỏclệnhvàora Nhúmlệnhsốhọc Nhúmlệnhlogic Cỏclệnhđiềukhiển,rẽnhỏnh. a.Nhúmlệnhcơsở
Lệnh MOV (move): chuyển dữ liệu giữa cỏc thanh ghi, giữa 1 thanh ghi và 1 ụ nhớ hoặctrựctiếp1sốvào1thanhghihayụnhớ
Cỳphỏp:
MOV đớch,nguồn; khụnglàmthayđổinộidungnguồn
Lệnh XCHG (exchange):hoỏnchuyểnnộidungcủa2thanhghi,1thanhghivà1ụnhớ Cỳphỏp:
XCHG đớch,nguồn
Lệnh LEA (load effective address):nạpđịachỉthực(hiệudụng)
Hàm 9hcủa ngắt21h yờu cầu địa chỉtương đốicủa chuỗikớ tự chứa trongDX, thựchiệnđiềunàydựnglệnhLEA
LEA đớch,nguồn
Đớch:thanhghicụngdụngchung Nguồn:ụnhớ
b.Nhúmlệnhvào/ra
CPUliờnlạcvới cỏcthiếtbịngoạiviquacỏcthanhghivào/rahaycỏccổngvào/ra. Cú 2lệnhtruynhậptrựctiếpcỏccổngđúlàlệnhINvàOUT,tuynhiờnớtsửdụng
Lệnh INT:dựngđểgọicỏcchươngtrỡnhconngắtcủaDOSvàBIOS Cỳphỏp:
IN số hiệu ngắt
Sốhiệungắtlà1sốxỏcđịnh1chươngtrỡnh(ngắtmềm)
-24-
Mó ASCII Kớ hiệu Chức năng điều khiển
7 BEL PhỏttiếngBớp
8 BS(backspace) Lựilại1kớtự
9 HT Tab
A LF(linefeed) Xuốngdũng
D CR(carryreturn) Xuốngdũng,vềđầudũng TaxemxộtcỏcngắtcủaDOS:
Ngắt20h:kếtthỳcchươngtrỡnh,1chươngtrỡnhcú thểdựngngắt20hđểtrảđiều khiểnvềchoDOS(dựngtrongchươngtrỡnhđuụi.COM)
Ngắt 22h -26h: cỏc phục vụ quản lý CTRL + BREAK, cỏc lỗi nghiờm trọng và truynhậptrựctiếpđĩa
Ngắt 27h:kếtthỳcchươngtrỡnhvàởlạithườngtrỳ
Ngắt 21h:gọicỏchàm:
Hàm0h:kếtthỳcchươngtrỡnh
Hàm1h:vàotừbànphớm:đợiđọc1kýtựtừthiếtbịvàochuẩnsauđúđưakớ tựđútớithiếtbịravàtrảvềmóASCIIcủadữliệutrongDL
• AH=01h
• AL=kớtựvào
Hàm2h:hiểnthị:đưakớtựtrongDLrathiếtbịrachuẩn
• AH=02h
• DL=kớtựra
Hàm5h:inra:đưadữliệutrongDLrathiếtbịin
• AH=5h
• DL=kớtựra
Hàm9h:inchuỗi:đưachuỗikớtựrathiếtbịchuẩn
• AH=9h
• DS:DXcontrỏđếnchuỗikớtựkếtthỳcbằng$
* Chỉ thị ADD (add) và SUB (subtract):Đượcsửdụngđểcộnghoặctrừnộidungcủa2 thanhghi,1thanhghivà1ụnhớhoặccộngtrừ1sốvàothanhghihay1ụnhớ
Cỳphỏp:
ADD đớch,nguồn SUB đớch,nguồn
Vớdụ:
SUB AX,DX; AXnhậngiỏtrịAX+DX ADD BL,5; BLnhậngiỏtrịBL+5 Chỳý:phộpcộng,trừtrựctiếpgiữacỏcụnhớlàkhụnghợplệ
* Chỉ thị INC (increment) và DEC (decrement): đượcsửdụngđể cộng,trừ 1vàonội dung1thanhghihayụnhớ
Cỳphỏp:
INC đớch
DEC đớch
-25-
Vớdụ:
INC WORD; WORDnhậngiỏtrịWORD+1
* Lệnh NEG (negavi):lệnhNEGdựngphủđịnhnộidungcủatoỏnhạngđớch,thaythế nộidungbởiphầnbự2
Cỳphỏp:
NEG đớch
Toỏnhạngđớchcúthểlà1thanhghihayụnhớ
* Cỏc lệnh MUL (Multiply) và IMUL (Integer MUL): Lệnhnhõn giỏtrị số học. Khi xột cỏcsố cú dấuvà khụngdấu thỡ kếtqủathực hiệnphộptoỏn làkhỏc nhau, vớicỏc sốcú dấutadựnglệnhIMUL,cỏcsốkhụngdấutadựnglệnhMUL
Cỳphỏp:
MUL toỏn hạng nguồn IMUL toỏn hạng nguồn
Khinhõncỏc bytevớinhau, 1 sốđược chứatrongtoỏnhạng nguồn, số cũnlạiđược giảthiếtđóchứatrongAL.Toỏnhạngnguồncúthểlà1thanhghihayụnhớ.
* Cỏc lệnh DIV (Device) và IDIV (Integer DIV):Lệnhchiasốhọc. Khixộtcỏcsốcú dấuvàkhụngdấuthỡkếtqủathựchiệnphộptoỏnlàkhỏcnhau,vớicỏcsốcúdấutadựnglệnh IDIV,cỏcsốkhụngdấutadựnglệnhDIV
Cỳphỏp:
DIV số chia
IDIV số chia
Dạngbyte:số chia làthanhghi hayụ nhớ 1byte, sốbị chia:16bit được giả địnhchứatrongAXthương8bitchứatrongAL,sốdư8bittrongAH
Dạngword:số chia 16bit, sốbịchia giảđịnhchứatrongDX:AX, thương16 bitchứatrongAX,sốdư16bittrongDX
c.
Cỏc lệnh logic dịch v à quay
* Cỏc lệnh logic: AND, OR, NOT, XOR:thayđổitừngbittrongmỏy Cỳphỏp:
AND đớch,nguồn
nếuDLchứamóASCIIcủakớtựđiềukhiển,hàmnàysẽthihànhchứcnăngđ
b.
OR đớch,nguồn XOR đớch,nguồn Ảnhhưởngtớicỏccờ: SF,ZF,PFphảnỏnhkếtquảlệnh AFkhụngxỏcđịnh CF,OF=0
LệnhAND:xoỏcỏcbitnhấtđịnhcủatoỏnhạngđớchtrongkhigiữnguyờncỏcbit cũnlại,cỏcbitcầnxoỏđượcANDvới0
Lệnh OR:thiết lậpcỏc bitxỏc địnhcủatoỏnhạngđớchkhivẫn giữnguyờncỏc bitcũnlại,cỏcbitcầnthiếtlậpđượcORvới1
LệnhXOR:đảocỏcbitxỏcđịnh
Sửdụng:
ĐổimóASCIIcủa1sốthànhsốtươngứng:khiđọc1kớtựtừbànphớm,AL
sẽchứamóASCIIcủakớtựđúvỡvậydựnglệnhANDđổimóASCIIcủakớtựra
giỏtrịthậpphõntươngứng
-26-
Vớdụ:
Số5móASCIIlà35hvỡvậykhiđổiragiỏtrịthậpphõnthựchiệnphộp:
AND AL,0Fh
Đổichữthườngthànhchữhoa:
cúthểdựnglệnhSUB SUB đớch,20h
hoặcdựnglệnhAND: AND đớch,0DFh
Xoỏ1thanhghi:
XOR đớch,nguồn; đớch=nguồn
Vớdụ:
MOV AX,0
SUB AX,AX
XOR AX,AX
Kiểmtraxem1thanhghicúbằng0haykhụng:
OR đớch,nguồn; đớch=nguồn
Vớdụ:
OR CX,CX;(CMPCX,0)
* Lệnh NOT:lấysốbự1củatoỏnhạngđớch
Cỳphỏp:
NOT toỏn hạng đớch; khụng ảnh hưởng tới cờ
* Lệnh TEST:thực hiện phộp AND giữa toỏn hạng đớch với toỏn hạngnguồnnhưng khụnglàmthayđổitoỏnhạngđớchmàchỉthiếtlậpcờ
Cỳphỏp:
TEST toỏn hạng đớch,toỏn hạng nguồn
Cỏccờbịtỏcđộng: SF,ZF,PF:phảnỏnhkếtquả AF:khụngxỏcđịnh CF,OF=0 d. Cỏc lệnh dịch v à quay
Lệnhdịch:cỏcbitbịdịchrakhỏitoỏnhạngsẽbịmất
Lệnhquay:cỏcbitbịdịchra1phớacủatoỏnhạngđớchsẽđựơcđưatrởlạiphớa
bờnkiaquay1vịtrớ Cỳphỏp: Quay,dịch1vịtrớ Mó lệnh Toỏn hạng đớch,1 Quay,dịchNvịtrớ Mó lệnh Toỏn hạng đớch,CL; CL chứa N *Cỏclệnhdịchtrỏi L ệnh SHL(Shift Left):
Dịchcỏcbitcủatoỏnhạngsangtrỏi1vịtrớ:
SHL toỏn hạng đớch,1;
Giỏtrị0sẽđượcđưavàovịtrớbờnphảinhấtcủatoỏnhạng,cũnMSBcủanúsẽđược đưavàoCF Nvịtrớ
SHL toỏn hạng đớch,CL
-27-
Nphộpdịchtrỏisẽđượcthựchiện
CúthểdựnglệnhSHLđểthựchiệnphộpnhõnnhịphõn
L
ệnh SAL(Shift Arithmetic Left):TươngtựnhưlệnhSHL
L
ệnh SHR(Shift Right):
Dịchcỏcbitcủatoỏnhạngsangphải1vịtrớ:
SHR toỏn hạng đớch,1;
Giỏ trị0 sẽđược đưavàovịtrớbờntrỏinhấtcủatoỏnhạng,cũnLSBcủanú sẽđược đưavàoCF Nvịtrớ
SHR toỏn hạng đớch,CL
Nphộpdịchphảisẽđượcthựchiện
CúthểdựnglệnhSHRđểthựchiệnphộpchianhịphõn
L
ệnh SAR(Shift Arithmetic Right):TươngtựnhưlệnhSHR
*Cỏclệnhquay
L
ệnh ROL(Rotate Left) :
Dịchcỏcbớtcủatoỏnhạngsangtrỏi1vịtrớ:
ROL toỏn hạng đớch,1;
BitMSBsẽđượcdịchvàovịtrớbờnphảinhấtcủatoỏnhạng,đồngthờiđượcđưavào CFNvịtrớ
ROL toỏn hạng đớch,CL
Nphộpquaytrỏisẽđượcthựchiện
L
ệnh ROR(Rotate Right) :
Dịchcỏcbớtcủatoỏnhạngsangphải1vịtrớ:
ROR toỏn hạng đớch,1;
Bit bờnphải nhất (LSB) sẽđược dịch vào vịtrớ bờntrỏi (MSB)nhất của toỏnhạng, đồngthờiđượcđưavàoCFNvịtrớ
ROR toỏn hạng đớch,CL
Nphộpquayphảisẽđượcthựchiện
Vớdụ: đếmsốbit1cútrongthanhghiBXmàkhụnglàmthayđổinộidungBX, kết quảlưutrongAX
MOV CX,16;biếnđếmvũnglặp Top:
ROL BX,1
JNC Next;bit0?
INC AX;khụng,tăngbiếnđếmkếtquả Next:
LOOP Top;quaylại
LệnhRCL (RotateCarryLeft):quaytrỏiquacờnhớ
Dịchcỏc bớt củatoỏnhạng đớchsang trỏi. Bit MSB đượcđặt vào CF, giỏ trịcủa CF đượcđưavàobitphảinhất(LSB)củatoỏnhạngđớch
Cỳphỏp:
RCL toỏn hạng,1
hoặc
RCL toỏn hạng,CL
-28-
Kớ hiệu Chức năng Điều kiện nhảy
JG/JNLE Nhảy nếu lớn hơn, nhảy nếu khụng nhỏ hơn h ay
bằng (Jump if Greate, Jump if Not Less than
ZF=0vàSF=0
JGE/JNL Nhảy nếu lớn hơn hay bằng, nhảy nếu khụng nh ỏ
SF=OF JL/JNGE Nhảy nếu nhỏ hơn, nhảy nếu khụng lớn hơn h
ay
SF<>OF JLE/JNG Nhảynếu nhỏ hơn hoặc bằng, nhảynếu khụng l
ớn
ZF=1haySF=OF
Cỏc lệnh nhảy khụng dấu
JA/JNBE Nhảy nếu lớnhơn, nhảy nếu khụng nhỏ hơn ho ặc
CF=0vàZF=0 JAE/JNB/JNC Nhảynếukhụngnhớ(NoCarry) CF=0
JB/JNAE/JC Nhảynếucúnhớ CF=1
JBE/JNA Nhảynếunhỏhơnhaybằng CF=1hayZF=1
Cỏc lệnh nhảy điều kiện đơn
JE/JZ Nhảynếukếtquảbằngnhau,nhảynếukếtquảbằ ng
ZF=1 JNE/JNZ Nhảynếukhụngbằngnhau,nếukếtquảkhỏc0 ZF=0
JO Nhảynếutràn(JumpifOverflow) OF=1
L
ệnh RCR (Rotate Carry Right):quayphảiquacờnhớ
Dịchcỏcbớtcủatoỏnhạngđớchsangphải.BitLMSBđượcđặtvàoCF,giỏtrịcủaCF đượcđưavàobitphảinhất(LSB)củatoỏnhạngđớch
Vớdụ:đảocỏcbittrong1bytehay1word MOV CX,8;sốlầnlặp Everse:
SHL AL,1;lấy1bitvàoCF RCR BL,1;quay,đưavàoBL LOOP Reverse
MOV AL,BL;đưavàoAL
e.
Cỏc l ệnh điều khiển rẽ nhỏnh
Chophộpchọnlựavàlặplạicỏcđoạnmólệnh
* Cỏclệnhnhảycúđiềukiện
Cỳphỏp:
Tờn lệnh nhón đớch
Nếuđiềukiệncủalệnhnhảythoảmón,lệnhcúnhónđớchsẽđượcthựchiện.Lệnhnày cúthểởtrướchoặcsaulệnhnhảy.Nếuđiềukiệnkhụngthoảlệnhngay saulệnhnhảy đượcthựchiện
Phạmvicủalệnhnhảycúđiềukiện:
Nhónđớchphảiđứngtrướclệnhnhảykhụngquỏ126bytehoặcđứngsaulệnhnhảy khụngquỏ127byte
CPUthựchiện1lệnhnhảyntn?
CPUdựavàothanhghicờđểđiềuchỉnhIPchỉđếnnhónđớch
Kớ hiệu Chức năng Điều kiện nhảy
JNO Nhảynếukhụngtràn OF=0
JS Nhảynếudấuõm(JumpifSigned) SF=1
JNS Nhảynếudấudương SF=0
JP/JPE Nhảy nếu chẵn (Jump if Parity, Jump if Parit y
PF=1 JNP/JPO Nhảynếulẻ(JumpifParityOdd) PF=0
CỏcđiềukiệnnhảythườngđượccungcấpbởilệnhCMP
Cỳphỏp:
CMP đớch,nguồn
Sosỏnhcỏctoỏntử đớchvới toỏntửnguồnbằngcỏch lấytoỏntửđớchtrừđitoỏntử nguồn
Toỏntửđớchkhụngthểlàhằngsố,cỏctoỏntửkhụngcựnglàụnhớ
Lệnh JMP (Jump)
LệnhJMPdẫnđếnviệcchuyểnđiềukhiểnkhụngđiềukiện
Cỳphỏp:
JMP đớch
Đớchphảilà1nhóntrongcựng1đoạnvớilệnhJMP
*Cấutrỳclặp
Lặp: cho phộp lặp lại 1 đoạn chương trỡnh nào đú, số lần lặp cú thể biết trước hoặc khụngbiếttrước Vũng lặp FOR FORsốlầnlặpDO cỏc dũng lệnh END_FOR Th ực hiện:dựnglệnhLOOP Cỳphỏp: LOOP nhón đớch
BộđếmvũnglặplàthanhghiCX,đượckhởitạobằngsốlầnlặp
Mỗi lầnthực hiện LOOP thanh ghi CX tự động giảm đi 1, và nếu CX<>0 thỡ điều khiểnđược chuyểntớinhón đớch. Nếu CX=0 thỡ lệnh tiếp theo LOOP sẽ được thực hiện
2.6.3. Hợp ngữ (Assembly)
a.Cỳphỏpcủa hợpngữ
Cỏc chương trỡnh hợp ngữ đượcdịch ra cỏc chỉ thị mỏybằng một chương trỡnh biờn dịchvỡvậykhiviếtphảiphựhợpvớicỏckhuụnmẫucủatrỡnhbiờndịchđú
Cỏcdũnglệnh:
Chươngtrỡnhlàtậphợpcủacỏcdũnglệnh,baogồm:
o Lệnhmàtrỡnhbiờndịchdịchramómỏy
o Lệnhdẫnhướngbiờndịch Cỳphỏp:
Tờn Toỏn tử Toỏn hạng Chỳ thớch
-30-
CỏctrườngcỏchnhauớtnhấtmộtdấucỏchhayTAB Vớdụ:
START: MOV CX,5 ;KhởitạoCX Tờntrường:
Sửdụng:Nhónlệnh,tờnthủtục,tờnbiến
Chươngtrỡnhbiờndịchchuyểncỏctờnthànhđịachỉbộnhớ
Độdài:1đến31kớtự(khụngchứadấucỏch)
Khụngbắtđầubởichữsố
Khụngphõnbiệtchữhoa,chữthường
Nếucúdấuchấm(.)phảiđặtởđầu Toỏntử
Toỏntửchứamólệnhdạngtượngtrưng
Mólệnh:chứcnăngcủathaotỏc
Dẫn hướngbiờn dịch:toỏn tửchứa toỏn tử giả(pseudo_op), cỏc toỏn tử giả này khụng được dịch sang mó mỏy mà chỉ bỏo cho chương trỡnh dịch làm việcgỡđú.
Toỏnhạng
Toỏnhạng:xỏcđịnhdữliệusẽđượcthaotỏc
Toỏnhạng:Đớch,Nguồn Lờigiảithớch
Đặtsaudấu;vàgiảithớchxemdũnglệnhđúlàmgỡ Dữliệuchươngtrỡnh
Biểudiễndữliệudướidạngsốnhịphõn,thậpphõn,hexathậmchớkớtự
Sốnhịphõn:kếtthỳcbằngBhoặcb
Sốthậpphõn:kếtthỳcbằngDhoặcd
Sốhexa:kếtthỳcbằngHhoặch,bắtđầubằngchữsốthậpphõn Cỏckýtự:baotrongdấunhỏykộp“”
Cỏctoỏntửgiảđịnhnghĩasốliệu DB byte
DW word(2byte)
DD doubleword(2word) DQ quardword(4word) DT 10byteliờntiếp
b.Cỏcbiến
Mỗibiếncúmộtkiểudữliệuvàđượcchươngtrỡnhgỏnchomộtđịachỉbộnhớ BiếnkiểuByte
Địnhnghĩa:
Tờn DB giỏ trị khởi tạo
Vớdụ:
ALPHA DB 4
Giớihạnthậpphõncủacỏcgiỏtrịkhởitạo:-128đến127hoặc0đến255 Nếudựngdấu?thỡbiếnkhụngđượckhởitạo
BiếnkiểuWord Địnhnghĩa:
Tờn DW giỏ trị khởi tạo
-31-
vớdụ:
ALPHA DW ?
BiếnkiểuMảng
Mảng:chuỗibytenhớhaytừnhớ Địnhnghĩa:
Tờn Kiểu giỏ trị khởi tạo
Phầntửđầutiờncủamảngchớnhlàtờnmảng
Mảngbyte:tờn+1làphầntửtiếptheo
Mảngword:tờn+1làphầntửtiếptheo vớdụ:
phầntử1:ARRAY phầntử2:ARRAY+1 phầntử3:ARRAY+2
Chỳý:bytethấpvàbytecaotrongmộttừ