匯編入門學(xué)習(xí)筆記 (七)—— dp,div,dup
參考: 《匯編語言》 王爽 第8章
1. bx、si、di、和 bp
8086CPU只有4個(gè)寄存器可以用 “[...]” 中進(jìn)行單元尋址。
bp:除了默認(rèn)的段地址是ss,其他與bx一樣。
它們所有正確的組合
- movax,[bx]
- movax,[si]
- movax,[di]
- movax,[dp]
- movax,[bx+si]
- movax,[bx+di]
- movax,[bp+si]
- movax,[bp+di]
- movax,[bx+si+idata]
- movax,[bx+di+idata]
- movax,[bp+si+idata]
- movax,[bp+di+idata]
注意:bx與bp不可以同時(shí)使用,如[bx+bp]是錯(cuò)誤的。
2. 指明要處理的數(shù)據(jù)長度
word ptr 表示字
byte ptr 表示字節(jié)
像這樣,寄存器就直接指定了數(shù)據(jù)的長度:
- movax,1
- movax,ds:[0]
但是,看下面的例子:
- assumecs:code,ds:data
- datasegment
- dw1111H,1111H,1111H,1111H,1111H,1111H,1111H,1111H
- dataends
- codesegment
- start:movax,data
- movds,ax
- movds:[0],1;Error
- movax,4c00H
- int21H
- codeends
- endstart
這樣編譯會(huì)報(bào)錯(cuò),因?yàn)榫幾g器不知道1是8位還是16位。
改進(jìn):
- assumecs:code,ds:data
- datasegment
- dw1111H,1111H,1111H,1111H,1111H,1111H,1111H,1111H
- dataends
- codesegment
- start:movax,data
- movds,ax
- movbyteptrds:[0],1;Error
- movax,4c00H
- int21H
- codeends
- endstart
加上byte ptr 或者 word ptr才對(duì)。
加上byte ptr時(shí),運(yùn)行后,ds段中的值為:0B56:0000 01 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11
加上word ptr時(shí),運(yùn)行后,ds段中的值為:0B56:0000 01 00 11 11 11 11 11 11-11 11 11 11 11 11 11 11
例子:
- assumecs:code,ds:data
- datasegment
- dw00FFH
- dataends
- codesegment
- start:movax,data
- movds,ax
- incbyteptrds:[0]
- movax,4c00H
- int21H
- codeends
- endstart
inc byte ptr ds:[0] 后,ds:[0] ds:[1] 為 00 00
如果改為inc word ptr ds:[0],運(yùn)行后 ds:[0] ds:[1] 位 00 01
3. 偽指令dd,div指令
偽指令dd 表示32位,dw表示16位,db表示8位。例子見下面。
div 是除法指令,格式:div 除數(shù)
除數(shù)有兩種,如果是8位的,被除數(shù)就是16位的,且存放在ax中。運(yùn)算結(jié)果:商存放在 al 中,余數(shù)存放在 ah 中
如果除數(shù)是16位的,被除數(shù)就是32位的,且低16位放在 ax 中,高16位就存放在 dx 中。運(yùn)算結(jié)果:商存放在 ax 中,余數(shù)存放在 dx 中
被除數(shù)就是32位的例子:
- assumecs:code,ds:data
- datasegment
- dd100001
- dw100
- dw0
- dataends
- codesegment
- start:movax,data
- movds,ax
- movax,ds:[0]
- movdx,ds:[2]
- divwordptrds:[4]
- movds:[6],ax
- movax,4c00H
- int21H
- codeends
- endstart
運(yùn)行后ax為03E8H ,dx 為0001H
4. dup
dup 要與dd,dw,db配合使用,用來重復(fù)定義數(shù)據(jù)
例子:
db 3 dup (0)
定義了3個(gè)字節(jié),它們都是0,相當(dāng)于 db 0,0,0
db 3 dup (0,1,2)
定義了9個(gè)字節(jié),它們是0、1、2、0、1、2、0、1、2
相當(dāng)于 db 0,1,2,0,1,2,0,1,2
db 3 dup(abc,ABC)
定義了18個(gè)字符,它們是 ‘abcABCabcABCabcABC’
相當(dāng)于 db‘abcABCabcABCabcABC’
評(píng)論