尋址是X86系列CPU中最大的一個特色抄淑,也是從8086CPU中繼承下來的。現在就來談談8086中的尋址方式驰后。
1.地址加法器
一開始就提到了肆资,8086是一個16位系統(tǒng),寄存器是16位的灶芝,但是他的地址總線卻有20位郑原,那么16位的寄存器如何表示20位的地址?
段地址+偏移地址夜涕,這種形式就自然而然的出現了犯犁,CS這個寄存器就是保存著代碼段的段地址,IP這個寄存器就是保存著代碼的偏移地址女器,這樣酸役,通過CS:IP所表示的地址就能尋找到執(zhí)行代碼的地方。
那么兩個16位寄存器怎么表示20位的地址驾胆?段地址*16+偏移地址涣澡,這就是段地址+偏移地址的真實含義,為什么要乘以16俏拱?這就是把段地址左移4位暑塑,加上原來的16位偏移地址,就可以得到一個20位的地址锅必。
2.DS,BX,DI,SI
那么如何定位內存中的數據事格?形式是一樣的,不過數據段的段地址保存在DS中搞隐,偏移地址需要由[BX]給出驹愚,前面也提到過了DI,SI是來幫助BX來完成對數據的尋址的,具體形式如下:
mov [BX+SI],AX ????? 劣纲;把AX的值放入DS:[BX+SI]這個地址中逢捺。
BX,DI,SI三個都是變量,這就提供了更加豐富的尋址方式癞季,這也為高級語言的數組提供了具體實現劫瞳,例如倘潜,把BX的當成數組首地址,變動DI志于,就可以對一個一維數組中的各個元素進行逐個尋址涮因,同理二維數組也是一樣,只是增多一個變量伺绽。
那么數據只能是存放在數據段中嗎养泡?換句話說,一定要用[BX]的形式來表示數據嗎奈应?不澜掩,只要顯示的給出段前綴(DS,CS,SS)就可以,如下:
mov CS:[BX],AX?????? 杖挣;把AX的值放入CS:[BX]這個地址中肩榕。
那么直接用[BX]表示和顯示給出段前綴有什么區(qū)別?其實很簡單程梦,直接用[BX]表示的段地址默認存在DS中点把。
3.prt
在存儲數據中橘荠,數據字長是一個問題屿附,計算機如何知道應該存儲一個Byte的大小還是一個Word的大小哥童?一般來說挺份,通過你給出的寄存器來判斷,如給出的是AX寄存器贮懈,那么這個數據大小就是16位匀泊,但是有時候沒有這種暗示,那么怎么判斷存儲字長朵你?例如我要向一個內存地址中直接寫入10這個數據各聘,那么這個10到底是8位?還是16位抡医?這時就需要顯示的指出數據字長躲因,例如:
mov [BX],AX????????????????? ;把AX的值當成一個Word存入DS:[BX]中忌傻。
mov byte ptr [BX],10???? 大脉;這就是將10看成一個Byte存入DS:[BX]中。