數據處理問題

一、處理的數據在什麼地方
二、要處理的數據有多長
描述性符號: regsreg
reg:表示寄存器;sreg:表示段寄存器
reg:{ ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di }
sreg:{ ds、ss、cs、es }
bp:基址指針寄存器

8086CPU 只有4個寄存器能夠用在 [ ... ] 中來進行內存單元的尋址;
mov ax , [bx]
mov ax , [bx+si]
mov ax , [bx+di]
mob ax , [bp]
mov ax , [bp+si]
mov ax , [bp+di]
這些組合中,bx+bp si+di 組合是不容許的,其餘能夠隨便組合還能夠加上idata,若是[ ... ]中用到了bp,默認的段地址就是 ss 寄存器
mov ax , [bp]
mov ax , [bp+idata]
mov ax , [bp+si]
mov ax , [bp+si+idata]
( ax )=( ( ss )*16+( bp ) )
( ax )=( ( ss )*16+( bp )+idata )
( ax )=( ( ss )*16+( bp ) )
( ax )=( ( ss )*16+( bp )+( si )+idata )




機器指令處理的數據所在位置寄存器
  指令都是進行數據處理,大體可分爲三類:讀取、寫入、運算; 機器指令關心的是執行指令前數據所在的位置
  所要處理的數據能夠在三個地方: CPU內部、內存、端口




彙編語言中數據位置的表達
一、當即數(idata):對於直接包含在機器指令中的數據(執行前在CPU指令緩衝器中)
eg:mov ax , 2000h
二、寄存器
三、段地址(SA)和偏移地址(EA)





尋址方式
  當數據存放在內存中時,能夠用多種方式給定這個內存單元的偏移地址,這種定位內存單元的方法通常稱爲 尋址方式。
尋址方式 含義 名稱 經常使用格式
[idata] EA=idata ; SA=(ds) 直接尋址 [idata]
[bx]
[si]
[di]
[bp]
EA=(bx);SA=(ds)
EA=(si);SA=(ds)
EA=(di);SA=(ds)
EA=(bp);SA=(ss)
寄存器間接尋址 [bx]
[bx+idata]
[si+idata]
[di+idata]
[bp+idata]
EA=(bx)+idata;SA=(ds)
EA=(si)+idata;SA=(ds)
EA=(di)+idata;SA=(ds)
EA=(bp)+idata;SA=(ss)
寄存器相對尋址 用於結構體:
[bx].idata
用於數組:
idata[si] , idata[di]
用於二維數組:
[bx][idata]([bx+idata])
[bx+si]
[bx+di]
[bp+si]
[bp+di]
EA=(bx)+(si);SA=(ds)
EA=(bx)+(di);SA=(ds)
EA=(bp)+(si);SA=(ss)
EA=(bp)+(di);SA=(ss)
基址變址尋址 用於二維數組:
[bx][si]
[bx+si+idata]
[bx+di+idata]
[bp+si+idata]
[bp+di+idata]
EA=(bx)+(si)+idata;SA=(ds)
EA=(bx)+(di)+idata;SA=(ds)
EA=(bp)+(si)+idata;SA=(ss)
EA=(bp)+(di)+idata;SA=(ss)
相對基址變址尋址 用於表格(結構)中的數組項:
[bx].idata[si]
用於二維數組:
idata[bx][si]





指令要操做的數據長度
一、指令能夠處理兩種長度的數據,byte 和 word (eg:al、ax)
二、沒有寄存器的狀況下能夠用操做符 X ptr 指明內存單元的長度,X 在彙編指令中能夠爲 word 或 byte。 
; word ptr 指明指令訪問的內存單元是一個 字單元
mov word ptr ds:[0] , 1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [2] , 2
; byte ptr 指明指令訪問的內存單元是一個 字節單元
mov byte ptr ds:[0] , 1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx] , 2
三、有些指令只能進行字操做   (eg:push、pop)





div 指令
一、除數:有8位和16位兩種,存放在一個寄存器或內存單元中。
二、被除數:默認存放在 AX 或 DX 和 AX 中,若是除數爲8位,被除數則爲16位,默認在 AX 中存放;若是除數爲16位,被除數則爲32位,在 DX 和 AX 中存放,DX 存放高16位,AX 存放低16位。
三、結果:若是除數爲8位,則 AL 存儲除法操做的商,AH 存儲除法操做的餘數;若是除數爲16位,則 AX 存儲除法操做的商,DX 存儲除法操做的餘數。

; 利用除法指令計算100001/100
; 由於100001大於65535,只能用 dx 和 ax 兩個寄存器存放。除數100能夠用一個8位寄存器,可是被除數32位,因此只能用16位寄存器

; 100001十六進制表示是:186A1H

mov dx , 1h                ; dx存放高16位
mov ax , 86A1h         ; ax存放低16位
mov bx , 100
div bx                        ;最終結果保存在AX和DX中
  //AX 存放商,DX存放餘數,最後結果:1000 ... 1
; 利用除法指令計算1001/100
;被除數1001能夠用ax寄存器來存放,100能夠用8位寄存器存放
mov ax , 1001
mov bl , 100
div bl               ; 結果存放在ax中
  //結果爲:0A ... 01( 10...1 )





僞指令 dd

dd:dword(double world , 雙字)型數據。
data segment
    db 1                     ; 01H                數據在data:0處,佔一個字節
    dw 1                   ;0001H            數據在data:1處,佔一個字
    dd 1                   ;00000001H,數據在data:3處,佔兩個字
data ends






dup
操做符,在彙編語言中和 db、dw、dd 等同樣,是由編譯器識別處理的符號。它是和 db、dw、dd 等數據定義僞指令配合使用的。 用來進行數據的重複
定義數據類型  重複的次數  dup  (重複的數據) db 3 dup (0)            ;定義了3個字節,它們的值都是0,至關於db 0 , 0 , 0db 3 dup (0 ,1 ,2)     ; 定義了9個字節,它們是0,1,2,0,1,2,0,1,2,至關於db 0,1,2,0,1,2,0,1,2db 3 dup ('abc' , 'ABC')    ; 18個字節,db 'abcABCabcABCabcABC'
相關文章
相關標籤/搜索