reg 的集合包括:
ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di;sreg 的集合包括
ds, cs, ss, es8086CPU 中,只有 4 個寄存器可以用 “ [...] ” 來進(jìn)行內(nèi)存單元尋址。
bx, si, di, bp在 “ [...] ” 中,這4個寄存器可以單個出現(xiàn), 或只能以 4中組合出現(xiàn)
(1)bx 和 si
(2)bx 和 di
(3)bp 和 si
(4)bp 和 di在 “ [...] ” 中使用 寄存器 bp, 而 指令中沒有 顯性的給出地址段, 段地址默認(rèn)在 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 )
指令執(zhí)行前,所有處理的數(shù)據(jù)可以在 3 個地方: CPU內(nèi)部, 內(nèi)存, 端口。
匯編語言中數(shù)據(jù)位置的表達(dá)
(1)立即數(shù) idata
直接包含在機(jī)器指令中的數(shù)據(jù)(執(zhí)行前在 CPU的指令緩沖器中)
(2)寄存器
指令要處理的數(shù)據(jù)在寄存器中,在匯編指令中給出相應(yīng)的寄存器名
(3)段地址(SA)和 偏移地址(EA)
指令要處理的數(shù)據(jù)在內(nèi)存中,在匯編指令中可用 [X] 的格式給出 EA, SA在某個段寄存器中。-
尋址方式小結(jié)
7764CF2E-C851-4F8A-91AD-C97887EB6A4E.png 指令要處理的數(shù)據(jù)有多長
- 8086CPU 可以處理兩種尺寸的數(shù)據(jù): byte word,所有的機(jī)器指令中 要指明 指令進(jìn)行的是 字操作 還是 字節(jié)操作。
匯編語言處理方法如下:
(1)通過寄存器名指明要處理的數(shù)據(jù)尺寸;
(2)在沒有寄存器名存在的情況下,用 X ptr 指明內(nèi)存單元的長度。 X 在匯編指令中可以為 word 或 byte。
mov word ptr ds:[0],1
mov byte ptr ds:[0],1
(3)有些指令默認(rèn)了訪問字單元 還是 字節(jié)單元。 比如 push pop 只進(jìn)行 字操作
assume cs:codesg,ds:datasg
datasg segment
db 'DEC'
db 'Ken Oslen'
dw 137
dw 40
db 'PDP'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov word ptr [bx].0CH,38
add word ptr [bx].0EH,70
mov si,0
mov byte ptr [bx].10H[si],'V'
inc si
mov byte ptr [bx].10H[si],'A'
inc si
mov byte ptr [bx].10H[si],'X'
mov ax,4c00h
int 21h
codesg ends
end start
- div 指令
div 是除法指令,使用 div 做除法的時候注意以下問題:
(1)除數(shù): 有 8位 和 16位 兩種,在 一個 reg 或 內(nèi)存單元中。
(2)被除數(shù): 默認(rèn)放在 AX 或 DX和AX 中。
如果除數(shù)位 8 位,被除數(shù)則為 16 位, 默認(rèn)在 AX 中存放;
如果除數(shù)位 16 位,被除數(shù)則為 32位,在 DX 和 AX 中存放, DX 存放 高16位,AX 存放低16位。
(3)結(jié)果:
如果除數(shù)為 8位, 則 AL 存儲 除法操作的 商,AH 存儲除法操作的余數(shù);
如果除數(shù)位 16位,則 AX 存儲除法操作的商,DX存儲除法操作的余數(shù)。
- 格式如下
div reg
dic 內(nèi)存單元
/**
* (al) = (ax) / ((ds)*16+0)的商
* (ah)= (ax) / ( (ds*16) +0) 的余數(shù)
*/
div byte ptr ds:[0]
/**
* (ax) = ( (dx)*10000H + (ax) ) / ( (es)*16+0 )的商
* (dx) = ( (dx)*10000H + (ax) ) / ( (es)*16+0 )的余數(shù)
*/
div word ptr es:[0]
/**
* (al) = (ax) / ((ds)*16+(bx)+si+8)的商
* (ah)= (ax) / ((ds)*16+(bx)+si+8) 的余數(shù)
*/
div byte ptr [bx+si+8]
/**
* (ax) = ( (dx)*10000H + (ax) ) / ( (ds)*16+(bx)+si+8 )的商
* (dx) = ( (dx)*10000H + (ax) ) / ((ds)*16+(bx)+si+8)的余數(shù)
*/
div word ptr [bx+si+8]
偽指令 dd
db : 字節(jié)型 8位
dw:字型 16位
dd:dword(double word)雙字型數(shù)據(jù) 32位dup
dup 是一個操作符,由編譯器識別處理的符號。用來進(jìn)行數(shù)據(jù)的重復(fù)。
格式:
db 重復(fù)次數(shù) dup (重復(fù)的字節(jié)型數(shù)據(jù))
dw 重復(fù)次數(shù) dup (重復(fù)的字型數(shù)據(jù))
dd 重復(fù)次數(shù) dup (重復(fù)的雙字型數(shù)據(jù))
db 3 dup (0) //定義了3個字節(jié),它們值都是0,相當(dāng)于 db 0,0,0
db 3 dup (0,1,2) //定義了9個字節(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') //定義了16個字節(jié),它們是'abcABCabcABCabcABC' 相當(dāng)于 db 'abcABCabcABCabcABC'
//定義一個容量為 200 個字節(jié)的 棧段
stacksg segment
db 200 dup (0)
stacksg ends
- 將 data 段中的數(shù)據(jù)按照格式寫入到 table 段中,并計算 人均收入(取整):
assume cs:codesg,ds:datasg,es:table,ss:stack
datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197524
dd 345890,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
datasg ends
table segment
db 21 dup ('year sumn ne ?? ')
table ends
stack segment
dw 8 dup (0)
stack ends
codesg segment
start: mov ax,stack
mov ss,ax
mov sp,10H
mov ax,datasg
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov bp,0
mov si,0
mov cx,15H
s: push ds:[bx+si]
pop es:[bp]
push ds:[bx+si+2]
pop es:[bp+2]
push ds:54H[bx+si]
pop es:5H[bp]
push ds:54H[bx+si+2]
pop es:5H[bp+2]
push ds:0A8H[bx]
pop es:0AH[bp]
mov dx,es:5H[bp+2]
mov ax,es:5H[bp]
div word ptr es:0AH[bp]
mov es:0dH[bp],ax
add bp,10H
add bx,2H
add si,2H
loop s
mov ax,4c00H
int 21H
codesg ends
end start
運(yùn)行結(jié)果如下:

