0x01 and 和 or 指令
and 邏輯"與"運(yùn)算,按位運(yùn)算都一為一
例:
mov al,01100011B
and al,00111011B
執(zhí)行后
al=00100011B
or 邏輯"或"運(yùn)算节槐,有一為一
例:
mov al,01100011B
or al,00111011B
執(zhí)行后
al=01111011B
0x02 字符串形式
匯編中的字符串有兩種字符串形式
- 用引號方式包圍的字符串
例
mov al,'hello world
- 用ASCII碼輸入字符串
例
mov al,'61H,64H,66H'
匯編主要是用ASCII碼運(yùn)算字符串包括的字符串編譯器會幫助計算機(jī)轉(zhuǎn)換成ASCII碼
[bx+idata]
[bx+idata]表示一個內(nèi)存單元哺眯,他的偏移地址是:(bx)+idata(bx中的值加上idata)
例
mov ax,[bx+200]
將一個內(nèi)存單元的內(nèi)容寫入ax优幸,這個內(nèi)存單元的長度為2個字節(jié)(字單元),存放一個字灾前,偏移地址為bx的數(shù)值加上200趴拧,段地址在ds中
它還有以下格式
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
簡單來說[bx+idata]就是他的偏移地址bx+idata指向的地址
[bx+idata]進(jìn)行數(shù)組數(shù)據(jù)處理
例 把字符串轉(zhuǎn)化大小寫
假如有一個代碼段
datasg segment
db 'hello'
db 'world'
datasg ends
我們可以這么獲取字符串
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s: mov al,[bx] ;第一個字符串
and al,11011111b
mov [bx],al
mov ah,[bx+5] ;第二個字符串
inc bx
loop s
C描述就是
char a[5]='hello';
char b[5]='world';
main()
{
int i;
i=0;
do
{
a[i]=a[i]&0xDF;
b[i]=b[i]|0x20;
i++;
}
while(i<5);
}
0x03 SI和DI
si和di是8086CPU中bx功能相近的寄存器,si和di不能分成兩個8位寄存器來使用
例
mov bx,0
mov ax,[bx]
mov si,0
mov ax,[si]
mov di,0
mov ax,[do]
0x04 總結(jié) 一
常見的指向內(nèi)存單元的還有
mov ax,[bx+si]
mov ax,[bx][si]
mov ax,[bx+si+idata]
常見內(nèi)存地址表示格式
[idata] 用一個常量來表示地址
[bx+idata] 用一個變量+常量表示地址
[bx+si] 用兩個變量表示地址
[bx+si+idata] 兩個變量+一個常量表示地址
一般來說暫存的數(shù)據(jù)我們都可以在棧地址中查找
0x05 數(shù)據(jù)處理的兩個基本問題
現(xiàn)在這里申明兩個符號
-
reg 用來表示寄存器
ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si
-
sreg 用來表示段寄存器
ds,ss,cs,es
1.處理的數(shù)據(jù)在什么地方?
- 機(jī)器指令處理的數(shù)據(jù)在何方
絕大部分機(jī)器指令都是進(jìn)行數(shù)據(jù)處理的指令供鸠,大致分為讀取畦贸,寫入,運(yùn)算楞捂。
在指令層面并不會關(guān)心數(shù)據(jù)的值是多少,而關(guān)心它執(zhí)行前的位置
所要處理的數(shù)據(jù)在三個地方:CPU內(nèi)部趋厉,內(nèi)存寨闹,端口
機(jī)器碼 | 匯編指令 | 指令執(zhí)行前數(shù)據(jù)的位置 |
---|---|---|
8E1E0000 | mov bx[0] | 內(nèi)存, ds:0單元 |
90C3 | mov bx,ax | CPU內(nèi)部君账, ax寄存器 |
BB0100 | mov bx,1 | CPU內(nèi)部繁堡,指令緩沖器 |
- 匯編中數(shù)據(jù)地址的表達(dá)方式
- 立即數(shù)
- 寄存器
- 段地址:偏移地址
- 尋址方式
2.要處理的數(shù)據(jù)有多長?
8086CPU的指令乡数,可以處理兩種尺寸的數(shù)據(jù),byte和word.所以在機(jī)器指令中要指明椭蹄,指令進(jìn)行的是字操作還是字節(jié)操作。
匯編用一下方法處理
1)通過寄存器名指明要處理的數(shù)據(jù)的尺寸
例如寄存器中的al和ax
通過ax操作的都是字
通過al操作的都是字節(jié)
2)在沒有寄存器的情況下净赴,用操作符X ptr指明內(nèi)存單元的長度绳矩,X在匯編中的指令可以為word或Byte
例如
下面的指令中,用word ptr指明了訪問的內(nèi)存單元是一個字單元
mov word ptr ds:[0],1
下面的指令中玖翅,用byte ptr指明了訪問的內(nèi)存單元是一個字單元
mov byte ptr ds:[0],1
在沒有寄存器參與的內(nèi)存單元訪問指令中翼馆,用word ptr或byte ptr顯性的指明所要訪問的內(nèi)存單元的長度是很有必要的,否者CPU無法得知要訪問的單元是字還是字節(jié)單元
在修改的時候就會很明顯的
mov ax,2000H
mov ds,ax
mov byte ptr [1000H],1
他就將內(nèi)存的內(nèi)容變?yōu)?/p>
2000:1000 01 FF FF FF FF
mov ax,2000H
mov ds,ax
mov word ptr [1000H],1
2000:1000 01 00 FF FF FF
0x06 div
div 是觸發(fā)指令金度,使用div做除法的時候應(yīng)注意
- 除數(shù):有8位和16位兩種应媚,在一個reg或內(nèi)存單元中
- 被除數(shù):默認(rèn)放在AX或DX中如果是8為被除數(shù)就是16位默認(rèn)在AX中存放,如果是除數(shù)是16位猜极,被除數(shù)則為32位中姜,默認(rèn)在DX和AX兩個中存放,DX存放高16位跟伏,AX存放低16位
- 結(jié)果:如果除數(shù)為8位丢胚,則AL存儲除法操作的商,AH存儲除法草坪做的余數(shù)酬姆;如果除數(shù)為16位嗜桌,則AX存儲除法操作商,DX存儲除法操作的余數(shù)辞色。
格式如下
div reg
div 內(nèi)存單元
例子
div byte ptr ds:[0]
含義:
(al)=(ax)/((ds)*16+0)的商
(ah)=(ax)/((ds)*16+0)的余數(shù)
div word ptr [bx+si+8]
div byte ptr [bx+si+8]
div word ptr es:[0]
0x07 偽指令dd
db和dw是用于定義字節(jié)型和字形數(shù)據(jù)
dd是用來定義dword 雙字型數(shù)據(jù)的例如
data segment
db 1
dw 1
dd 1
data ends
在data段定義了3個數(shù)據(jù):
第一個數(shù)據(jù)為01H骨宠,在data:0處浮定,占1個字節(jié)
第二個數(shù)據(jù)為0001H,在dat:1處层亿,占一個字
第三個數(shù)據(jù)為00000001H桦卒,在data:3,占2個字
0x08 dup
dup它是和db,dw,dd等數(shù)據(jù)定義偽指令配合使用的匿又,用來進(jìn)行數(shù)據(jù)的重復(fù)
例
db 3 dup (0)
db 3 dup(0,1,2)
定義了3個字節(jié)方灾,它們的值都是0 相當(dāng)于 db 0,0,0
定義了9個字節(jié),他們是0碌更,1裕偿,2,0痛单,1嘿棘,2,0旭绒,1鸟妙,2