8.《匯編語言》-王爽第三版學(xué)習(xí)筆記 數(shù)據(jù)處理的2個基本問題

  1. reg 的集合包括:
    ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di;

  2. sreg 的集合包括
    ds, cs, ss, es

  3. 8086CPU 中,只有 4 個寄存器可以用 “ [...] ” 來進(jìn)行內(nèi)存單元尋址。
    bx, si, di, bp

  4. 在 “ [...] ” 中,這4個寄存器可以單個出現(xiàn), 或只能以 4中組合出現(xiàn)
    (1)bx 和 si
    (2)bx 和 di
    (3)bp 和 si
    (4)bp 和 di

  5. 在 “ [...] ” 中使用 寄存器 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 )
  1. 指令執(zhí)行前,所有處理的數(shù)據(jù)可以在 3 個地方: CPU內(nèi)部, 內(nèi)存, 端口。

  2. 匯編語言中數(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在某個段寄存器中。

  3. 尋址方式小結(jié)


    7764CF2E-C851-4F8A-91AD-C97887EB6A4E.png
  4. 指令要處理的數(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
  1. 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]     
  1. 偽指令 dd
    db : 字節(jié)型 8位
    dw:字型 16位
    dd:dword(double word)雙字型數(shù)據(jù) 32位

  2. 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
  1. 將 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é)果如下:


B805AD8C-89AF-42E6-A8C0-315499ED0C6B.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容