seg指令
bootsect.S分析一文中有這樣一段代碼:
seg fs
lds si,(bx)? ! ds:si是源地址;
!! 將fs:bx地址所指的指針值放入ds:si中;
先講一下寄存器的默認組合問題,比如指令mov [si], ax表示將ax中的內容存入ds:si指向的內存單元,也就是說在寄存器間接尋址的情況下,以si間接尋址時總是默認以ds為相應的段地址寄存器。同樣di是以es為默認的段地址寄存器。
第二個要了解的是“段超越”的問題,就是在某些時候你不想使用默認的段地址寄存器,那
么你可以強制指定一個段地址寄存器(當然這種強制是在允許的情況下,建議看一下匯編
教材上的說明),同上例mov [si],ax表示存入ds:si中,但如果你想存入cs指向的段中可
以這樣mov cs:[si],ax, 這樣就強制指定將ax中的內容存入cs:si的內存單元。
第三個要明白的是seg cs這樣的語句只影響到它下一條指令,比如在linux啟動代碼中的一段:
seg cs
mov sectors,ax
mov ax,#INITSEG
要說明兩點:
第一,seg cs 只影響到mov sectors,ax而不影響mov ax,#INITSEG
第二,如果以Masm語法寫,seg cs和mov sectors,ax兩句合起來等
?? ?? 價于mov cs:[sectors],ax,這里使用了間接尋址方式。
?? ?? 重復一下前面的解釋,mov [sectors],ax表示將ax中的內容
?? ?? 存入ds:sectors內存單元,而mov cs:[sectors],ax強制以
?? ?? cs作為段地址寄存器,因此是將ax的內容存入cs:sectors內存
?? ?? 單元,一般來說cs與ds的值是不同的,如果cs和ds的值一樣,
?? ?? 那兩條指令的運行結果會是一樣的。(編譯后的指令后者比前
?? ?? 者一般長一個字節,多了一個前綴。)
結論,seg cs只是表明緊跟它的下一條語句將使用段超越,因為在編譯后的代碼中可以清楚的看出段超越本質上就是加了一個字節的指令前綴,因此as86把它單獨作為一條指令來寫也是合理的。
note:seg指令只會影響數據寄存器(目前知道的有bx)的段地址信息,不會影響索引寄存器(si和di)的段地址信息,索引寄存器在計算地址時仍使用數據段(ds)為段寄存器
總結
- 上一篇: 8086汇编基础 push,pop指令执
- 下一篇: 8086地址传送指令LDS,LES