指令的一般格式:
操作碼
操作數(shù)
……
操作數(shù)
計算機中的指令由操作碼字段和操作數(shù)字段組成。
操作碼:指計算機所要執(zhí)行的操作,或稱為指出操作類型,是一種助記符。
操作數(shù):指在指令執(zhí)行操作的過程中所需要的操作數(shù)。該字段除可以是操作數(shù)本身外,也可以是操作數(shù)地址或是地址的一部分,還可以是指向操作數(shù)地址的指針或其它有關(guān)操作數(shù)的信息。
尋址方式就是指令中用于說明操作數(shù)所在地址的方法,或者說是尋找操作數(shù)有效地址的方法。8086的基本尋址方式有六種。
1.立即尋址
所提供的操作數(shù)直接包含在指令中。它緊跟在操作碼的后面,與操作碼一起放在代碼段區(qū)域中。如圖所示。
例如:movax,3000h
立即數(shù)可以是8位的,也可以是16位的。若是16位的,則存儲時低位在前,高位在后。立即尋址主要用來給寄存器或存儲器賦初值。
2.直接尋址
操作數(shù)地址的16位偏移量直接包含在指令中。它與操作碼—起存放在代碼段區(qū)域,操作數(shù)一般在數(shù)據(jù)段區(qū)域中,它的地址為數(shù)據(jù)段寄存器ds加上這16位地址偏移量。如下圖所示。
例如:mov ax,ds:[2000h];
(對ds來講可以省略成movax,[2000h],
系統(tǒng)默認(rèn)為數(shù)據(jù)段)
這種尋址方法是以數(shù)據(jù)段的地址為基礎(chǔ),
可在多達64kb的范圍內(nèi)尋找操作數(shù)。8086中
允許段超越,即允許操作數(shù)在以代碼段、堆棧
段或附加段為基準(zhǔn)的區(qū)域中。
此時只要在指令中指明是段超越的,則16位地址偏移量可以與cs或ss或es相加,作為操作數(shù)的地址。
mov ax,[2000h] ;數(shù)據(jù)段
mov bx,es:[3000h]?。欢纬?,操作數(shù)在附加段
即絕對地址=(es)*16+3000h
3.寄存器尋址
操作數(shù)包含在cpu的內(nèi)部寄存器中,如寄存器ax、bx、cx、dx等。
例如:movds,ax
moval,bh
4.寄存器間接尋址
操作數(shù)是在存儲器中,但是,操作數(shù)地址的16位偏移量包含在以下四個寄存器si、di、bp、bx之一中??梢苑殖蓛煞N情況:
(1) 以si、di、bx間接尋址,則通常操作數(shù)在現(xiàn)行數(shù)據(jù)段區(qū)域中,即數(shù)據(jù)段寄存器(ds)*16加上si、di、bx中的16位偏移量,為操作數(shù)的地址,【例如】movax,[si]操作數(shù)地址是:(ds)*16+(si)
(2) 以寄存器bp間接尋址,則操作數(shù)在堆棧段區(qū)域中。即堆棧段寄存器(ss)*16與bp的內(nèi)容相加作為操作數(shù)的地址, 【例如】movax,[bp]操作數(shù)地址是:(ss)*16+(bp)
若在指令中規(guī)定是段超越的,則bp的內(nèi)容也可以與其它的段寄存器相加,形成操作數(shù)地址?! 纠纭縨ovax,ds:[bp]操作數(shù)地址是:(ds)*16+(bp)
5.變址尋址
由指定的寄存器內(nèi)容,加上指令中給出的8位或16位偏移量(當(dāng)然要由一個段寄存器作為地址基準(zhǔn))作為操作數(shù)的偏移地址。(操作數(shù)在存貯器中)
可以作為寄存器變址尋址的四個寄存器是si、di、bx、bp。
(1) 若用si、di和bx作為變址,則與數(shù)據(jù)段寄存器相加,形成操作數(shù)的地址即默認(rèn)在數(shù)據(jù)段;
(2) 若用bp變址,則與堆棧段寄存器相加,形成操作數(shù)的地址即默認(rèn)在堆棧段。
【例如】 mov ax,count[si];
操作數(shù)地址是:(ds)*16+(si)+count
但是,只要在指令中指定是段超越的,則可以用別的段寄存器作為地址基準(zhǔn)。
6.基址加變址尋址
把bx和bp看成是基址寄存器,把si、di看著是變址寄存器,把一個基址寄存器(bx或bp)的內(nèi)容加上一個變址寄存器(si或di)的內(nèi)容,再加上指令中指定的8位或16位偏移量(當(dāng)然要以一個段寄存器作為地址基準(zhǔn))作為操作數(shù)的偏移地址,如圖所示。
操作數(shù)在存貯器中,其偏移地址由(基址寄存器)+(變址寄存器)+相對偏移量形成
基址寄存器――bx:數(shù)據(jù)段、bp:堆棧段;
變址寄存器――si、di。
【例如】mov ax,[bx][si]或mov ax,[bx+si]
也可放置一個相對偏移量,如count 、mask等等,用于表示相對尋址。
movax,mask[bx][si]
movbh,count[di][bp];movbh,count[bp+di]
若用bx作為基地址,則操作數(shù)在數(shù)據(jù)段區(qū)域
若用bp作為基地址,則操作數(shù)在堆棧段區(qū)域
但若在指令中規(guī)定段是超越的,則可用其它段寄存器作為地址基準(zhǔn)。
表1段寄存器使用的基本約定
訪問存儲器類型
默認(rèn)段寄存器
可指定段寄存器
段內(nèi)偏移地址來源
取指令碼
cs
無
ip
堆棧操作
ss
無
sp
串操作源地址
ds
cs、es、ss
si
串操作目的地址
es
無
di
bp用作基址寄存器
ss
cs、ds、es
根據(jù)尋址方式求得有效地址
一般數(shù)據(jù)存取
ds
cs、es、ss
根據(jù)尋址方式求得有效地址