數據處理的兩個基本問題
匯編語言中數據位置的表達
在匯編語言中如何表達數據的位置?
匯編語言中用三個概念來表達數據的位置:
1) 立即數(idata)
2) 寄存器
3) 內存(段地址SA和偏移地址EA)
尋址方式
當數據存放在內存中的時候,我們可以用多種方式來給定這個內存單元的偏移地址,這種定位內存單元的方法一般被稱為尋址方式。
指令要處理的數據有多長?
8086CPU的指令,可以處理兩種尺寸的數據,byte和word。
所以在機器指令中要指明指令進行的是字操作還是字節操作。
1) 通過寄存器名指明要處理的數據的尺寸。
2) 在沒寄存器名存在的情況下,用操作符X ptr指明內存單元的長度,X在匯編指令中可以為word或byte。
3) 其他方法,有些指令默認了訪問的是字單元還是字節單元,比如,push[1000H]就不用指明訪問的是字單元還是字節單元,因為push指令只進行字操作。
尋址方式的綜合應用
8086CPU提供的如[bx+si+idata]的尋址方式為結構化數據的處理提供了方便。
div指令
div是除法指令。
1) 除數:有8位和16位兩種,在一個寄存器或內存單元中。
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] ;除數指定為8位
(al) = (ax)/((ds)*16+0)的商;
(ah)=(ax)/((ds)*16+0)的余數。
div word ptr es:[0]
(ax) =( (dx)*10000H+(ax))/((ex)*16+0)的商;
(dx)= ( (dx)*10000H+(ax))/((ex)*16+0)的余數。
div byte ptr [bx+si+8]
(al)=(ax)/((ds)*16+(bx)+(si)+8)的商;
(ah)= (ax)/((ds)*16+(bx)+(si)+8)的余數。
div word ptr [bx+si+8]
(ax)=((dx)*10000H)+(ax))/((ds)*16+(bx)+(si)+8))的商;
(ax)=((dx)*10000H)+(ax))/((ds)*16+(bx)+(si)+8))的余數。
實踐:100001/100
被除數100001大于65535(FFFF、十六位),不能用ax寄存器存放,所以我們只能用dx和ax兩個寄存器聯合存放100001,也就是說要進行16位的除法,除數100小于255,可以在一個8位寄存器中存放,但是,因為被除數是32位的,除數應為16位,所以要用一個16位寄存器來存放除數100。
100001表為十六進制:186A1H。
mov dx,1
mov ax,86A1H
mov bx,100
div bx
程序執行后,(ax)=03E8H(即1000),(dx)=1(余數為1)。
計算1001/100
被除數1001可用ax寄存器存放。除數100可用8位寄存器存放。即可進行8位的除法。
mov ax,1001
mov bl,100
div bl
程序執行后,(al)=0AH(即10),(ah)=1(余數為1)。
偽指令dd
db 定義字節型數據;define byte; 一個字節表示8個位;
dw 定義字型數據; define word; 一個節表示兩個字節;
dd 定義雙字型數據;define dword(double word,雙字)。兩個字。四個字節。
data segment
db 1
dw 1
dd 1
data ends
在data段中定義了三個數據:
第一個數據為01H,在data:0處,占1個字節;
第二個數據為0001H,在data:1處,占1個字,兩個字節;
第三個數據為00000001H,在data:3處,點2個字,四個字節。
dup
dup是一個操作符,在匯編語言中同db、dw、dd等一樣,也是由編譯器識別處理的符號。它是和db、dw、dd等數據定義偽指令配合使用的,用來進行數據的重復。如:
db 3 dup (0)
定義了3個字節,它們的值都是0,相當于 db 0,0,0
db 3 dup (0,1,2)
定義了9個字節,它們是0、1、2、0、1、2、0、1、2,相當于db 0,1,2, 0,1,2, 0,1,2
db 3 dup (‘abc’, ‘ABC’)
定義了18個字節,它們是’ abcABC abcABC abcABC’,相當于 db ‘abcABC abcABC abcABC’
dup的使用格式如下:
db 重復的次數 dup (重復的字節型數據)。
dw 重復的次數 dup (重復的字型數據)。
dd 重復的次數 dup (重復的雙字數據)。
dup是一個十分有用的操作符,比如我們要定義一個容量為200個字節的棧段。
stack segment
db 200 dup (0)
stack ends