# **段前綴的使用**
指令"mov ax,\[bx\]"中,內存單元的偏移地址由bx給出,而段地址默認在ds中。我們可以在訪問內存單元的指令中顯式地給出內存單元的段地址所在的段寄存器。比如:
1) mov ax,ds:[bx]將一個內存單元的內容送入ax,這個內存單元的長度為2字節(字單元),存放一個字,偏移地址在bx中,段地址在ds中。
2) mov ax,cs:[bx]將一個內存單元的內容送入ax,這個內存單元的長度為2字節(字單元),存放一個字,偏移地址在bx中,段地址在cs中。
3) mov ax,ss:[bx]將一個內存單元的內容送入ax,這個內存單元的長度為2字節(字單元),存放一個字,偏移地址在bx中,段地址在ss中。
4) mov ax,es:[bx]將一個內存單元的內容送入ax,這個內存單元的長度為2字節(字單元),存放一個字,偏移地址在bx中,段地址在es中。
5) mov ax,ss:[0]將一個內存單元的內容送入ax,這個內存單元的長度為2字節(字單元),存放一個字,偏移地址為0,段地址在ss中。
6) mov ax.cs:[0]將一個內存單元的內容送入ax,這個內存單元的長度為2字節(字單元),存放一個字,偏移地址為0,段地址在cs中。這些出現在訪間內存單元的指令中,用于顯式地指明內存單元的段地址的"ds:" "cs:" "ss:" "es:" ,在匯編語言中稱為段前綴。
**匯編異常:在編譯連接后,mov al,[0000]變成了mov al,00、mov bl,[0001]變成了mov bl,01、mov cl,[0002]變成了mov cl,02、mov dl,[0003]變成了mov dl,03**
解決辦法:在[idata]前顯示的加上段寄存器(即段前綴的用法)

**計算ffff:0~ffff:b字節單元中的數據的和, 結果存入dx中**
分析:
* (1)運算后的結果是否會超出dx所能存儲的范圍?
fff:0 ~ fff:b-內存單元中的數據是字節型數據,范圍在0~255之間, 12個這樣的數據相加,結果不會大于65535(最大3060),所以可以在dx中存放下。
* (2)是否可以將fff:0 ~fffb中的數據直接累加到dx中?
add ds:[addr] ;(dx)=(dx)+?
期望:取出內存中的8位數據進行相加
實際:取出的是內存中的16位數據
* (3)是否可以將fff:0~fft:b中的數據直接累加到dl中?
add dl:[addr] ;(dl)=(dl)+?
期望:取出內存中的8位數據相加
實際:取出的是內存中的8位數據,但很有可能造成進位丟失(相加超出8位會被丟棄)。
對策:取出8位數據,加到16位的寄存器
mov al, ds:[addr]
mov ah, 0
add dx, ax

**將內存ffff:0~ffff:b字節單元中的數據拷貝到0:200~0:20b單元中**
分析:0:200-0:20b單元等同于0020:0-0020:b單元,它們描述的是同一段內存空間
>實際地址=段地址\*16+偏移地址
1.段地址:0000,偏移地址:0200 則,實際地址=0000H\*16+0200H\=00000H+0200H=00200H
2.段地址:0020,偏移地址:0000 則,實際地址=0020H\*16+0000H=00200H+0000H=00200H

```
assume cs:code
code segment
mov bx,0
mov cx,12
s:mov ax,0ffffH
mov ds,ax #(ds)=ffffH
mov dl,[bx] #(ffff:0)=(dl)=EA即通用寄存器(dx)=00EAH、(ffff:1)=00C0H、...
mov ax,0020H #段地址是0020H則(物理地址=段地址x16+偏移地址)得出20H就是物理地址的200
mov ds,ax #(ds)=0020
mov[bx],dl #(0020:0)=00EAH、(0020:1)=00C0H、...
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
```
改進
```
assume cs:code
code segment
mov ax,0ffffH
mov ds,ax # (ds)=ffffH
mov ax,0020H
mov es,ax # 附加段寄存器(es)=0020H
mov bx,0
mov cx,12
s:mov dl,[bx] #(ffff:0)=(dl)=EAH即(dx)=00EAH
mov es:[bx],dl #(0020:0)=00EAH
inc bx #bx累加
loop s
mov ax,4c00H
int 21H
code ends
end
```
# **在代碼段中使用數據**
>[danger]上面這個程序是危險的,因為在程序中直接寫入地址危險比如`mov ax,0ffffH
、mov ax,0020H`,那么安全的存放這個數據應該存放在哪呢?
對策:
>[info]在程序的段中存放數據,運行時由操作系統分配空間。
段的類別:數據段、代碼段、棧段
各種段中均可以有數據
可以在單個的段中安置,也可以將數據、代碼、棧放入不同的段中。


改進

