① 匯編語言SI、DI、BX、BP、SS、DS分別是什麼怎樣根據這些求物理地址
1.匯編語言 SI DI BX BP SS DS 是什麼
SI: 16位寄存器,源變址寄存器
DI: 16為寄存器,目的變址寄存器
BX: 16位寄存器(可分成2個8位寄存器BH,BL),基址寄存器
BP: 16位寄存器,基址指針寄存器
SS : 16位段寄存器,作用是存放當前堆棧段的段地址,一般和SP連用
DS: 16為段寄存器, 作用是存放當前數據段的段地址
2.怎樣根據這些求物理地址
上面的這幾個寄存器跟求物理地址談不上關系.
有個公式: 物理地址 = 基礎地址 + 偏移地址 = CS*10H(基礎地址)+ IP(偏移地址)
CS: 16位段寄存器,存放當前代碼段的段地址
IP: 存放下一條要執行的指令的偏移地址
LZ如有不明白的地方,可追問
② 匯編語言:SI、DI、BX、BP、SS、DS分別是什麼怎樣根據這些求物理地址
si、di分別是源、目的變址寄存器,bx是數據基址寄存器,bp是棧基址寄存器,SS、DS是段地址寄存器。
物理地址=段地址×16+偏移地址,指令中出現BP作地址,則其段地址為SS,否則就為DS。
③ 8086/8088求物理地址時那些CS,DS,SS,IP什麼的有什麼用要怎麼求,求教!
...
求物理地址時基本上恩他們沒太大關系吧。。
他們只是存放數據的寄存器(相當與變數),比如把1234放到cs里,以後寫cs就是1234這個東東。
然後後來就有人規定一些東西一般只放特定含義的東西。
怎麼說呢,就像2l說的cs是放段基址的,在8086里一個20位的地址是由2個16位的地址構成的,所以要兩個16位的寄存器才能表示一個地址,cs里的內容+另一個特定的寄存器里的內容構成一個特定的地址而且這個地址是程序的......ds+另一個構成...數據地址的..ss一般用於堆棧的。比較復雜,還是看看書把,和定址有關。當訪問不同的東西(程序,數據,堆棧)時會配上不同的(cs,ds,ss)段寄存器。
至於物理地址的求法:
一個8086里地址是20位的它由兩個16位的數構成,一個叫段地址,一個叫偏移地址,
實際物理地址=段地址*10H+偏移地址,
10H是十六進制的10,(一般地址都是給出16位的形式。所以一般就是段地址後面加個0再與偏移地址相加。在程序中依據訪問不同內容段地址在cs,ds,ss中選(特殊的定址除外),例如用ip做偏移地址時,會調用cs作為段地址,實際物理地址就是cs*10h+ip,...)
④ 匯編 8086定址方式
1. 立即定址
立即定址方式用來表示常數,它主要用於給寄存器賦初值,注意:只能用於源操作數欄位,不能用於目的操作數欄位。
例1 MOV AL,5
2.直接定址
在IBM PC機中將操作數的偏移地址稱為有效地址EA。在直接定址方式中有效地址EA就在指令中,它存放在代碼段中指令操作碼之後,但操作數一般存放在數據段中,所以必須先求出操作數的物理地址,然後再訪問存儲器才能取得操作數.
如操作數在數據段中,則物理地址=16d×(DS)十EA。1BMPC機中允許數據存放在數據段以外的其他段中,此時應在指令中指定段跨越前綴,在計算物理地址時應使用指定的段寄存器。
例4 mov AX , [2000H]
(DS)=3000H,地址32000H中的值為 3050H則,執行結果為;(Ax)=3050H
因為實際mov AX中的內容為 16d * (Ds) +2000H= 32000H
在匯編語言指令中,可以用符號地址代替數值地址,如:
MOV AX,VALUE
此時VAIUE為存放操作數單元的符號地址。如寫成
MOV AX,[VALUE]
也是可以的.兩者是等效的。如果VALUE在附加段中,則應該指定段跨越前綴如下;
MOV AX, ES:VALUE
或 MOV AX, ES:[VALUE]
直接定址方式適用於處理單個變數,例如需要處理某個存放在存儲器里的變數,可用直接定址方式,將該變數先取到一個寄存器中,然後在做處理。
IBM PC機規定:除在雙操作數中,除立即數外,必須有一個操作數使用寄存器方式。這也是一個常量常常送到寄存器去的原因。
3.寄存器間接址
操作數的有效地址在基址寄存器BX、BP或變垃寄存器SI、DI中,而操作數則在存儲器中,如下圖所示。
a.如果指令中指定的寄存器是BX、SI、DI,則操作數在數據段(DS)中,所以用DS寄存器的內容作為段地址,即操作數的物理地址為:
物理地址=16d×(DS)十(BX)
或 物理地址;16 d×(DS)十(SI)
或 物理地址=16d×(DS)十(DI)
b.如指令中指定SP寄存器,則操作數在堆棧段(SS)中,段地址在SS中,所以操作數的物理地址為:
物理地址=16d×(SS)十(SP)
MOV AX ,[BX]
如果 (DS)=2000H , (BX)=1000H 則
物理地址=16d×(DS)十(BX) = 20000H+1000H = 21000H
21000H地址里的內容為 50A0H則 執行結果為:(AX)=50A0H
c.指令中也可指定段跨越前綴來取得其他段中的數據。如;
MOV AX,ES:[BX]
這種定址方式可以用於表格處理,執行完一條指令後,只需要修改寄存器內容就可取出表格中的下一項。
4.寄存器相對定址方式
操作數的有效地址是一個基址或變址寄存器的內容和指令中指定的8位或16位位移量之和。即
| (BX)
EA = | (BP) + 8位或者16位的位移量
| (SI)
| (DI)
同寄存器定址一樣 BX BP DI 若沒有段跨越前綴 物理地址為=16d×(DS) +位移量+*
SP 物理地址為=16d×(SS)十(SP) + 位移量 + *
舉個例子:
MOV AX,COUNT[SI] (也可表示為MOv AX,[COUKT十SI]
其中,COUNT 為16位位移量的符號地址。
如果(DS)=3000H,(SI)=2000H COUNT=3000H
則物理地址 = 30000十2000十3000 =35000H
⑤ 匯編語言中 cs, ds,ss 的區別
最近想初步了解一下匯編的內容,在網上搜了搜,發現一篇寫得很不錯的文章,特地轉過來留存。寫得淺顯易懂,而且加入了很多個人的見解,比書上寫的好懂多了。比較欽佩作者,可惜找了半天沒有找到這篇文章的原作者是誰。轉載地址: http://www.zxbc.cn/html/20070611/22772.html 學習匯編前你應該知道的知識
1、匯編需要什麼工具和程序,到哪裡下載?
目前階段,匯編程序僅需要兩個程序就夠了。masm.exe,link.exe。 前者是編譯程序,後者是鏈接程序。另外,為了驗證和調試程序,還需要一個程序debug.exe,該程序由windows本身就提供。
將二者下載後,放到某一個目錄中(任意目錄都可以),考慮到很多命令需要通過鍵盤敲入,所以建議你不要把文件放入到長文件名目錄、中文目錄或很深的目錄中。比如你可以建一個「D:\Masm」目錄,並建議此後的程序都放這個目錄,此後稱這個目錄為匯編目錄。 2、學習匯編需要有哪些編程方面的知識?
沒有任何編程方面的知識,學習此語言等於緣木求魚,所以請放棄學習的想法。一般來說至少要知道如下幾點:
*)程序的運行邏輯結構有順序(按語句依次執行)、分支結構(IF...THEN...ELSE...),循環結構(FOR...NEXT)三種結構。
*)知道什麼是子程序,什麼是調用。
*)匯編程序員的視角。不同編程視角編程要求是不一樣的。比如刪除文件:
>>用戶的視角是找到「刪除」按鈕或菜單,然後單擊一下即可。
>>高級程序員的視角是知道刪除的文件,並發出刪除命令。這些通過API實現。
>>匯編程員的視角是得到要刪除的文件名,找到該文件所在位置,通過調用刪除「中斷命令」進行刪除。
>>操作系統開發人員的視角則是接到刪除命令後,先找到系統根目錄區,由根目錄區的鏈接依次找到子目錄區,直到找到要刪除的文件,然後按照操作系統刪除文件的規則對該文件名進行修改。比如DOS,只把第一個字元改成"?"。 按程序語句等價的角度看,一行VB的列印語句,用匯編實現大約需要一百二十多行。知道匯編語言的視角後就要知道,前面的道路是坎坷的,沒有耐心是不行的。想通過幾分鍾幾行程序就完成很復雜的操作不是件容易的事。 3、學匯編有什麼用?
匯編產生於DOS時代或更早,而現在是Windows時代,所以可能 遺憾地說:盡管還有批牛人在用匯編開發核心級程序,但我們幾乎沒什麼用,除了必要時間能拿來分析一兩個程序的部分代碼之外,別的也就沒干什麼用了。並且並不是所有的匯編命令都能在windows下使用。而泛泛地追求「時髦」而學本語言,最後的結果是損了夫人又折兵。所以學之前你要考慮好。我勸那些為了當「黑客」而學匯編的人就此止步。
第零講 預備知識 1、一個匯編程序的編譯過程是怎麼樣的?
1)首先你需要找一個編輯器,編輯器用任何「純文本」編輯器都可以。比如記事本。編好以後保存到匯編目錄中。擴展名為asm,比如myfirst.asm。但這里建議你找一個能顯示出當前行的編譯器。這樣出錯後排錯很容易。
2)然後在DOS下進入D:\Masm目錄中,輸入「masm myfirst.asm",如果有錯系統會提示出錯的行位置和出錯原因。 3)然後再輸入「link myfirst.obj」,即可看到當前目錄下有一個myfirst.exe程序。 2、宏匯編和匯編有什麼區別嗎?
二者的區別在於前者提供宏,後者不提供。後者已找不到了,所以你可以認為二者沒有區別。 3、機器語言、匯編語言、高級語言的關系
最早的計算機採用機器語言,這種語言直接用二進制數表示,通過直接輸入二進制數,插拔電路板等實現,這種「編程」很容易出錯,每個命令都是通過查命令表實現,既然是通過「查表」實現的,那當然也可以讓計算機來代替人查表實現了。於是就產生了匯編語言,所以不管別人怎麼定義機、匯語言,我就認為,二者是等價。後來人們發現,用匯編語言編某一功能的時候,連續一段代碼都是相同或相似,於是就考慮用一句語言來代替這一段匯編語言,於是就產生了高級語言。因此,所有高級語言都能轉化成匯編語言,而所以匯編語言又可轉化成機器語言。反之,所有機器語言可以轉成匯編語言(因為二者等價)。但並不是所以匯編語言都能轉成高級語言。 4、計算機的組成
通常都把計算機定義成五部分:運算器、控制器、存儲器、輸入系統、輸出系統。
為了簡單起見,我們如此理解:運算器+控制器=CPU。存儲器=內存(暫不包括外存,也不包括CACHE)。輸入系統=鍵盤(不包括滑鼠),輸出系統=顯示器(不包括列印機,繪圖儀)。 5、寄存器和內存的區別
寄存器在CPU中。內存在內存條中。前者的速度比後者快100倍左右。後面的程序要求每條指定要麼沒有內存數據,要麼在有一個寄存器的參與下有一個內存數據。(也就是說,不存在只訪問內存的指令)。 6、匯編語言的計數
與生活中的計數不一樣,匯編中的計數是從0開始的。比如16個計數,則是從0~15,而不是生活中的1~16。這一點看起來簡單,真運算起來就不是件容易的事了,不信等著瞧。 7、進制問題
又與生活中不一樣的地方是進制。切記下面的常識:
*)計算機內部存儲都用二進制。
*)我們的匯編源程序默認都用十進制。(除非你指明類型)
*)我們用的調試程序debug默認的都是十六進制。(無法指明其他類型)
其中十六進制的十六個個位數依次是:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。 8、進制轉換
一個比較簡單的方法是查表法。
十進制 十六進制 二進制
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110 7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
好了,結合6,7,8三條。大家來算一個「題」。某一組數據顯示時,每個數據佔了四個位置,每行共十六個。問:十六進制的13位置在哪裡(第幾行,第幾列)。
格式如下:m m m m n n n n o o o o p p p p '註:之所以沒用ABC是怕與上面十六進制弄混。
r r r r s s s s t t t t u u u u
第一講 基礎知識
1、訪問內存
程序在內存中,訪問內存是幾乎每一程序都要進行的操作,計算機對內存編址是線性的,也就是說是一維的,比如256M的內存,地址就應該是從0~(256M-1),這個地址稱為物理地址或絕對地址。
1.1 地址表示
但從匯編程序員的角度看,內存卻是二維的,要說明一個地址,需要給出兩個值,就象你在平面上指定一點需要說出(X,Y)坐標一樣,匯編程序員的內存視角也需要兩個「坐標」,前一個稱為段地址(Segment),後一個稱為偏移地址(Offset),該地址稱為邏輯地址。
比如「1234:3DF5」就是一個地址。「1F3F:」不是一個地址,因為他只有段地址,沒有偏移地址。注意此後的地址都用十六進製表示。
1.2 地址計算
前面提到,計算機編址是一維的,匯編程序員是二維的,那麼二者怎麼換算呢?由後者到前者的換算方法是,「段地址串」後面加個「0」,然後再加上偏移地址。
比如「1234:3DF5」(十六進制的加減運算參見相關資料)
12340 --串後加了一個0
3DF5
-----
16135 --注意此串仍然是十六進制。
所以,匯編程序員眼中的地址「1234:3DF5」就是物理地址(計算機編址):16135。
知道了由後者向前者的轉換,那麼由前者向後者的轉換呢?
「不知道」,為什麼不知道,繼續往下看。
1.3 到底哪個地址對 知道了1.2的地址演算法後,我又發現一個問題:
「1000:6135」的物理地址是多少呢? 10000+6135=16135。
「1001:6125」的物理地址呢? 10010+6125=16135。
......
那麼到底哪個對呢?問題的回答是這樣的:假設我現在讓你按一下「L」鍵,我可以告訴你如下幾種方法中的一種或幾種。1 請按一下「L」鍵; 2請按一下鍵盤上第四行第十個鍵;3 請按一下第十列中的第四個鍵;4 請按一下「K」右邊的鍵;5 按標准指法單擊一下右手無名指。 舉上面的例子也就是說,同一個地址有很多種表示方式,具體用哪一種,要看實際使用時的情況。但無論用哪種方式,只要能達到目的即可。(實際中該問題一般不會受此問題困擾,但初學時突然想不通)。
1.4 有多少內存可以訪問
無論是段地址還是偏移地址都是四位十六進制(如果不夠四位,前面補0)。也就是說:總共可以訪問的地址說是:0000:0000~FFFF:FFFF。 總共FFFF0+FFFF+1=10FFF0個地址。也就是不到1M的空間。
記住如下結論:
*) 不管你實際內存有多少,目前我們只能訪問不到1M的空間。
*) 而實際上連這1M也用不完。其中上端的384K的址只能讀不能寫,只能讀,一般稱為ROM。
*) 低端的640K可以讀寫。但這640K的低端100多K也不能隨便寫,因此DOS系統使用該區。
*) 原來1024M的內存,匯編程序只能使用其中400多K。這段內存的容易相當於一個普通文檔的大小。不過這就足夠了。
⑥ 請問ss,bp,sp具體怎麼配合使用啊
BP為基地址。SP為堆棧的偏移地址
SS是堆棧段地址
物理地址表示形式為SS:SP
所以如果不存放數據時物理地址為:SS:SP=2000h:0016h
當初放了8位元組數據後(堆棧單元放的是16位數據)所以地址加4即SS:SP=2000h:001ah
⑦ 什麼時候段基址在ES、SS中
消滅0回復
⑧ 匯編語言 mov ax, [ bp ] 在求物理地址時 為什麼使用ss為段地址而不實用ds為段地址
1)MOVAX,ES:[1000H]AX=9ABCH地址:31000H演算法:ES*10H+1000H聲明的段寄存器ES2)MOVAX,[BX]AX=3412H地址:21000H演算法:DS*10H+BX默認段寄存器DS3)MOVAX,[BX][SI]AX=?地址:21001H演算法:DS*10H+BX+SI默認段寄存器DS這道題是不是你哪裡敲錯了,你題中沒有這個21001H地址4)MOVAX,[BP+DI]AX=9A78H地址:41002H演算法:SS*10H+BP+DI默認段寄存器SS方括弧裡面代表地址,比如movax,[bx]就等於movax,[1000h],冒號代表段前綴,冒號前面的是段寄存器,將以指明的段寄存器定址,段寄存器*10H+後面的地址即是物理地址,如果沒有指明段前綴,將以默認的段寄存器定址,BX,SI,DI這3個寄存器默認的段寄存器是DS,BP的默認段寄存器是SS