計算機cpu進行資料處理包括兩個基本的問題:1.資料在何處? 2.資料有多大? 本章作為乙個前面內容的總結性章節,主要來說明這兩個問題。我們定義兩個符號reg和sreg。其中reg為暫存器,sreg為段暫存器
reg包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di
sreg包括:ds,ss,sp,es
8.1 bx、 si、 di和bp
1.在8086cpu只有bx,si,di以及bp這四個暫存器可以用在'[...]'中進行記憶體定址:
比如下面的指令是正確的:
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]
下面的指令是不正確的:
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]
2.bx,si,di以及bp 這四個暫存器只有如下四種組合。bx與si,bx與di,bp與si,bp與di
比如下面的指令是正確的:
mov ax,[bx]
mov ax,[si]
mov ax,[di]
mov ax,[bp]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bx+di+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+idata]
下面的指令是錯誤的:
mov ax,[bx+bp]
mov ax,[si+di]
3.只要再'[....]'使用暫存器bp定址,段暫存器預設在ss中。
比如如下指令:
mov ax,[bp] (ax)=((ss)*16+(bp))
mov ax,[bp+idata] (ax)=((ss)*16+(bp)+idata)
mov ax,[bp+si] (ax)=((ss)*16+(bp)+(si))
mov ax,[bp+si+idata] (ax)=((ss)*16+(bp)+(si)+idata)
8.2 機器指令處理的資料在什麼地方
在執行機器指令的時候,我們往往總是關心執行指令所需的資料儲存在什麼地方。資料往往儲存在三個地方:cpu內部(暫存器),記憶體以及埠。
下圖說明了指令儲存資料的位置:
8.3 組合語言中資料位置的表達
(1)立即數:
直接包涵在彙編指令中的資料稱為立即數(執行前在cpu中的指令緩衝區)
例如: mov ax,1
add bx,2000h
(2)暫存器
執行指令所需要的資料在暫存器中:
比如: mov ax,bx
push bx
(3)段位址和偏移位址
指令要處理的資料在記憶體中則需要段位址加偏移位址進行定址
段位址可以是預設給出的(預設ds):
比如:mov ax,[0](預設段位址ds)
mov ax,[di](預設段位址ds)
mov ax,[bp]
(預設段位址ss)
mov ax,[bp+si]
(預設段位址ss)
mov ax,ds:[bp]
8.4 定址方式
當資料儲存在記憶體的時候,我們有多種方法可以求得其偏移位址,求得偏移位址的方法稱為定址方式。下圖為所有的定址方式的總結。
8.5 指令要處理的資料有多長
如何指定要處理的資料有多大有如下方式:
1.通過暫存器指明要處理資料的大小
比如字操作: mov ax,ds:[0]
比如位元組操作: mov al,ds:[0]
2.在沒有暫存器的情況下,可以使用x ptr指明需要處理資料大小。x可以為word或byte
比如字操作: mov word ptr ds:[0],1
比如位元組操作: mov byte ptr ds:[0],1
3.有些指令預設訪問資料大小
比如 push 指令
push [1000h]預設進行字操作
8.6定址方式的綜合應用
假設乙個公司的的資料存放在seg:60h為起始位址的記憶體區域,如下:
現在要個將137改為38,將40改為70,將'pdp'改為'vax'
我們可以通過[bx+si+idata]方式來定址,同時用x ptr指定要更改資料的長度。所以核心程式如下:
8.7 div指令
div指令的注意事項如下:
1.除數:有8位和16位兩種,在乙個reg和記憶體單元中。
2.被除數:預設放在ax或dx和ax中,如果除數為8位,則被除數為16位,預設在ax中存放;如果除數為16位,則被除數為32位,在dx和ax中存放,dx存放高16位,ax存放地16位
3.結果:如果除數為8位,則al儲存商,ah儲存餘數。如果除數為16位,則ax儲存商,dx儲存餘數。
格式如下:
div reg
div 記憶體單元
比如:
div byte ptr ds:[0]
含義:(al)=(ax)/((ds)*16+0)的商 (ah)=(ax)/((ds)*16+0)的餘數
div word ptr [bx+si+8]
含義:(ax)=[(dx)*10000h+(ax)]/((ds)*16+(bx)+(si)+8)的商
(dx)=[(dx)*10000h+(ax)]/((ds)*16+(bx)+(si)+8)的商
8.8偽指令dd
dw,db,dd
其中dw為定義乙個字空間,db為定義乙個位元組空間,dd為定義乙個雙字的空間
8.9 dup
dup也是乙個偽指令,是由編譯器識別的。往往dup配合著dw,db,dd使用進行資料的重複。
比如:db 3 dup (0)
定義了三個位元組,它們的值都為0,相當於 db 0,0,0
db 3 dup (0,1,2)
定義了九個位元組,它們的值為0,1,2,0,1,2,0,1,2相當於 db 0,1,2,0,1,2,0,1,2
組合語言第八章 資料處理的兩個基本問題
處理的資料在哪個地方?要處理的資料有多長?我們首先對暫存器進行乙個分類 前面三個我們已經學習過了。把這幾個放在一起,顯然是為了說記憶體定位。這四個均可以單獨定位記憶體,也可以兩兩組合,但是需要注意以下的寫法是錯的 mov ax,bx bp mov ax,si di 也就是說bx可以和si di組合,...
彙編基礎 筆記6(《組合語言》第八章)
資料處理 1.要處理的資料在什麼地方 指令執行前,可能是 cpu內部 暫存器 指令緩衝器 記憶體 埠 2.資料多長?bx,si,di,bp 只有這四個可以用在中進行定址 且只能1.單個出現 2.以四個組合出現 bx si,bx di,bp si,bp di 中出現bp,則預設段位址為ss push指...
組合語言第八章知識點總結
絕大部分機器指令都是進行資料處理的指令,可以分為讀取 寫入 運算。使用 bx 為偏移位址時,大多數情況段位址預設在ds中 使用 bp 時,段位址預設在ss中。8086cpu指令可以處理兩種尺寸資料 byte和word。指令執行的是字操作還是位元組操作。用word ptr 和 byte ptr 指明指...