① 匯編語言中 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。這段內存的容易相當於一個普通文檔的大小。不過這就足夠了。
② es是前任嗎
不是,
ES這個縮寫和他的前任VaR一樣非常沒有特點,極其容易被混淆,比如程序員就會想到滑乎純Extra Segment和Engineer Station,游戲宅會想到Earth Shaker和Evil Sylvanas,足球迷會想起Espanyol,歌迷會頃賣想起陳奕迅信咐。
③ 堆棧和堆棧段的區別
你說的堆棧 是指內存中的 堆和棧吧, 有些人也喊棧叫 堆棧, 堆和棧是操作系統為應用程序在內存中分配的一部分空間,棧通常是用來保存局部變數等,彈棧壓棧操作等,肢昌 而堆通常是用來存儲程序員申請的空間,比如new操作,通常需要程序員自己去delete,不然就形成僵屍內存,
而堆棧段 應該是匯編裡面的 堆棧段寄存器中的一個說法吧?
堆棧段寄存器在匯編中稱為 SS, Stack Segment, 是一種寄存器 。是cpu的組件吧。
以下是的
為歷擾扒了運用所有的內存空間,8086設定了四個段寄存器,專門用來保存段地址:
CS(Code Segment):代碼段寄存器;
DS(Data Segment):數據段寄存器;
SS(Stack Segment):堆棧段寄存器;李李
ES(Extra Segment):附加段寄存器。
當一個程序要執行時,就要決定程序代碼、數據和堆棧各要用到內存的哪些位置,通過設定段寄存器 CS,DS,SS 來指向這些起始位置。通常是將DS固定,而根據需要修改CS。所以,程序可以在可定址空間小於64K的情況下被寫成任意大小。 所以,程序和其數據組合起來的大小,限制在DS 所指的64K內,這就是COM文件不得大於64K的原因。8086以內存做為戰場,用寄存器做為軍事基地,以加速工作。
以上純屬個人見解~ 不要拍我
④ 通用寄存器和專用寄存器有什麼區別和聯系
對於8086的系統:
1.寄存器按照功能的不同可分為通用寄存器(AX,BX,CX,DX,SP,BP,SI,DI。其中的前四個寄存器可分別分成AH,AL ;BH,BL;CH,CL;DH,DL的八位寄存器)、指令指針寄存器(IP)、標志寄存器(FLAGS)、段寄存器(CS,DS,ES,SS)。它們的區別和聯系體現在它們的功能上,對它們的深入了解和正確運用需要通過編寫程序來實現。
2.大致功能如下:
AX,可存放一般數據,而且可作為累加器使用;
BX,可存放一般數據唯蠢,而且可用來存放數據的指針(偏移地址),常常和DS寄存器連用;
CX,可存放一般數據,而且可用來做計數器,常常將循環次數用它來存放;
DX,可存放一般數據,而且可用來存放乘法運算產生的部分積,或用來存放輸入輸出的埠地址(指針);
SP,用於定址一個稱為堆棧的存儲區,通過它來訪問堆棧數據;
BP,可存放一般數據,用來存放訪問堆棧段的一個數據區,作為基地址;
SI,可存放一般數據,還可用於串操作中,存放源地址,對一串數據訪問;
DI,可存放一般數據,還可用於串操作中,存放目的地址,對一串數據訪問;
IP,用於定址當前需要取出的指令位元組,程序員不能對它直接大宴操作;
FLAGS,用於指示微處理器的狀態並控制它的操作;
CS,代碼段寄存器,代碼段是一個存儲區域,存放的是CPU要使用的代碼,CS存放代碼段的段基地址;
DS,數據段寄存器,數據段是包含程序使用的大部分數據的存儲區,DS中存放數據段的段基地址;
ES,附加段寄存器,附加段是為某些串操作指令存放目的操作數而附近的一個數據段,ES中存放該數據段的段基地址;
SS,堆棧段寄存器,堆棧段是內存中一個特殊的存儲區,用於暫時存放程序運行時所需的數據或地址信息。SS中存放該存儲區的段基地址。
基本功能就是這些,要想透徹掌握深層的寄存器功能,必須要編寫匯編源程序,可用微軟的masm匯編程序進行編譯,用dos系統自帶的debug命令調試,直到程序正確運行,才能體會其中的奧妙。
最後,還是用我的導指仿陪師給我的一句話吧:「記住,學好匯編語言最重要的環節永遠是上機調試出正確程序!」
共勉!
⑤ 匯編語言寄存器都叫什麼
1、寄存器
32位寄存器有16個,分別是:
4個數據寄存器(EAX、EBX、ECX、EDX)。
2個變址和指針寄存器(ESI和EDI);2個指針寄存器(ESP和EBP)。
6個段寄存器(ES、CS、SS、DS、FS、GS)。
1個指令指針寄存器(EIP);1個標志寄存器(EFlags)。
2、數據寄存器
數據寄存器主要用來保存操作數和運算結果等信息,從而節省讀取操作數所需佔用匯流排和訪問存儲器猛基的時間。
32位CPU有4個32位通用寄存器:EAX、EBX、ECX和EDX。對低16位數據的取存,不會影響高16
位的數據,這些低16位寄存器分別命名為AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4個16位寄存器又可分割成8個獨立的8位寄存器(AX:ah~al、BX:bh~bl、CX:ch~cl:DX:dh~dl)。
每個寄存器都有自己的名稱,可獨立存取。程序員可利用數據寄存器的這種「可合可分」的特性,靈活地處理字/
位元組的信息。
AX和al通常稱為累加器,用累加器進行的操作可能需要更少時間,累加器可用於乘、除、輸入/輸出等操作,
它們的使用頻率很高。
BX稱為基地址寄存器,它可作為存儲器指針來使用。
CX稱為計數寄存器,在循環和字元串操作時,要用它來控制循環次數;在位操作中,當移多位時,要用cl來
指明位移的位數。
DX稱為數據寄存器,在進行乘、除運算時,枝巧謹它可以為默認的操作數參與運算,也可用於存放I/O的埠地址。
在16位CPU中,AX、BX、CX和DX不能作為基址和變址寄存器來存放存儲單元的地址,但在32位CPU
中,寬核其32位寄存器EAX、EBX、ECX和EDX不僅可傳送數據、暫存數據、保存算術邏輯運算結果,而且也可
作為指針寄存器,所以,這些32位寄存器更具有通用性。
3、變址寄存器
32位CPU有2個32位通用寄存器ESI和EDI,其低16位對應先前CPU中的SI和DI,對低16位數據的
存取,不影響高16位的數據。
ESI、EDI、SI和DI稱為變址寄存器,它們主要用於存放存儲單元在段內的偏移量,用它們可實現多種存儲器
操作數的定址方式,為以不同的地址形式訪問存儲單元提供方便。
變址寄存器不可分割成8位寄存器,作為通用寄存器,也可存儲算術邏輯運算的操作數和運算結果。
它們可作一般的存儲器指針使用,在字元串操作指令的執行過程中,對它們有特定的要求,而且還具有特殊的
功能。
4、指針寄存器
32位CPU有2個32位通用寄存器EBP和ESP,其低16位對應先前CPU中的BP和SP,對低16位數
據的存取,不影響高16位的數據。
EBP、ESP、BP和SP稱為指針寄存器,主要用於存放堆棧內存儲單元的偏移量,用它們可實現多種存儲器
操作數的定址方式,為以不同的地址形式訪問存儲單元提供方便。
指針寄存器不可分割成8位寄存器,作為通用寄存器,也可存儲算術邏輯運算的操作數和運算結果。
它們主要用於訪問堆棧內的存儲單元,並且規定:
BP為基指針寄存器,用它可直接存取堆棧中的數據。
SP為堆棧指針寄存器,用它只可訪問棧頂。
5、段寄存器
段寄存器是根據內存分段的管理模式而設置的。內存單元的物理地址由段寄存器的值和一個偏移量組合而成
的,這樣可用兩個較少位數的值組合成一個可訪問較大物理空間的內存地址。
32位CPU有6個段寄存器,分別如下:
CS:代碼段寄存器 ES:附加段寄存器
DS:數據段寄存器 FS:附加段寄存器
SS:堆棧段寄存器 GS:附件段寄存器
在16位CPU系統中,只有4個段寄存器,所以,程序在任何時刻至多有4個正在使用的段可直接訪問,在
32位微機系統中,它有6個段寄存器,所以在此環境下開發的程序最多可同時訪問6個段。
32位CPU有兩個不同的工作方式:實方式和保護方式。在每種方式下,段寄存器的作用是不同的,有關規定
簡單描述如下:
實方式:段寄存器CS、DS、ES和SS與先前CPU中的所對應的段寄存器的含義完全一致,內存單元的邏輯
地址仍為「段地址:偏移地址」的形式,為訪問某內存段內的數據,必須使用該段寄存器和存儲單元的偏移地址。
保護方式:在此方式下,情況要復雜得多,裝入段寄存器的不再是段值,而是稱為「選擇子」的某個值。
6、指令指針寄存器
32位CPU把指令指針擴展到32位,並記作EIP,EIP的低16位與先前CPU中的IP作用相同。
指令指針EIP、IP是存放下次將要執行的指令在代碼段的偏移地址,在具有預取指令功能的系統中,下次要執
行的指令通常已被預取到指令隊列中,除非發生轉移情況,所以,在理解它們的功能時不考慮存在指令隊列的情
況。
在實方式下,由於每個段的最大范圍為64KB,所以,EIP的高16位肯定都為0,此時,相當於只用其低16
位的IP來反映程序中的指令的執行次序。
7、標志寄存器
1.運算結果標志位。一共6個,包括:CF進位標志位、PF奇偶標志位、AF輔助進位標志位、ZF零標志位、
SF符號標志位、OF溢出標志位。
2.狀態控制標志位。一共3個,包括:TF追蹤標志位、IF中斷允許標志位、DF方向標志位。
以上標志位在第7章里都講過了,在這里就不再解釋了,現在講講32位標志寄存器增加的4個標志位。
1. I/O特權標志IOPL。
IOPL用兩位二進制位來表示,也稱為I/O特權級欄位,該欄位指定了要求執行I/O指令的特權級,如果當前
的特權級別在數值上小於等於IOPL的值,那麼,該I/O指令可執行,否則將發生一個保護異常。
2. 嵌套任務標志NT。
NT用來控制中斷返回指令IRET的執行。具體規定如下:
(1) 當NT=0,用堆棧中保存的值恢復EFlags、CS和EIP,執行常規的中斷返回操作。
(2) 當NT=1,通過任務轉換實現中斷返回。
3. 重啟動標志RF。
RF用來控制是否接受調試故障。規定:RF=0時,表示接受,否則拒絕。
4. 虛擬8086方式標志VM。
如果VM=1,表示處理機處於虛擬的8086方式下的工作狀態,否則,處理機處於一般保護方式下的工作狀態。
8、32位地址的定址方式
最後說一下32位地址的定址方式。在前面我們學習了16位地址的定址方式,一共有5種,在32位微機系統
中,又提供了一種更靈活、方便但也更復雜的內存定址方式,從而使內存地址的定址范圍得到了進一步擴大。
在用16位寄存器來訪問存儲單元時,只能使用基地址寄存器(BX和BP)和變址寄存器(SI和DI)來作為
偏移地址的一部分,但在用32位寄存器定址時,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、
EDX、ESI、EDI、EBP、和ESP)都可以是偏移地址的一個組成部分。
當用32位地址偏移量進行定址時,偏移地址可分為3部分:
1. 一個32位基址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)。
2. 一個可乘以1、2、4、8的32位變址寄存器(EAX、EBX、ECX、EDX、ESI、EDI和EBP)。
3. 一個8位~32位的偏移常量。
比如,指令:mov ebx, [eax+edx*2+300]
Eax就是基址寄存器,edx就是變址寄存器,300H就是偏移常量。
上面那3部分可進行任意組合,省去其中之一或之二。
下面列舉幾個32位地址定址指令:
Mov ax, [123456]
Mov eax, [ebx]
Mov ebx, [ecx*2]
Mov ebx, [eax+100]
Mov ebx, [eax*4+200]
Mov ebx, [eax+edx*2]
Mov ebx, [eax+edx*4+300]
Mov ax, [esp]
由於32位定址方式能使用所有的通用寄存器,所以,和該有效地址相組合的段寄存器也就有新的規定,具體
規定如下:
1. 地址中寄存器的書寫順序決定該寄存器是基址寄存器還是變址寄存器。
如:[ebx+ebp]中的ebx是基址寄存器,ebp是變址寄存器,而[ebp+ebx]中的ebp是基址寄存器,ebx是變
址寄存器,可以看出,左邊那個是基址寄存器,另一個是變址寄存器。
2. 默認段寄存器的選用取決於基址寄存器。
3. 基址寄存器是ebp或esp時,默認的段寄存器是SS,否則,默認的段寄存器是DS。
4. 在指令中,如果顯式地給出段寄存器,那麼顯式段寄存器優先。
下面列舉幾個32位地址定址指令及其內存操作數的段寄存器。
指令列舉: 訪問內存單元所用的段寄存器
mov ax, [123456] ;默認段寄存器為DS。
mov ax, [ebx+ebp] ;默認段寄存器為DS。
mov ebx, [ebp+ebx] ;默認段寄存器為SS。
mov ebx, [eax+100] ;默認段寄存器為DS。
mov edx, ES:[eax*4+200] ;顯式段寄存器為ES。
mov [esp+edx*2], ax ;默認段寄存器為SS。
mov ebx, GS:[eax+edx*8+300] ;顯式段寄存器為GS。
mov ax, [esp] ;默認段寄存器為SS。
⑥ ES與傳統資料庫的比較
1.結構名稱不同
2.ES分布式搜索,傳統資料庫遍歷式搜索
3.ES採用倒排索引,傳統資料庫採用B+樹索引
4.ES沒有用戶驗證和許可權控制
5.ES沒有事務的概念,不支持回滾,誤刪不能恢復
6.ES免費,完全開源;傳統資料庫部分免費
有關更詳細的比較內容,可以到黑馬程序員官網找到社區技術文章,找不到可以對話框問一下。裡面還有結合工作的舉例。
⑦ 段寄存器一共有哪些
數據段寄存器DS
代碼段寄存器CS
堆棧段飢旁寄存器SS
附加段[有的稱擴展段爛嘩橡]寄存器蘆頃ES
⑧ 什麼叫匯編語言
問題一:什麼是匯編和匯編語言? 匯編語言是一種低級計算機編程語言,說低級並不是指語言的功能和復雜程度,而是它出現在計算機發展史的早期,但現在仍廣泛應用於計算機開發領域,應為它是絕大多數語言的基礎.再者,它是一種面向機器的語言,即它運行與操作都與計算機硬體密切相關.
C語言是一種高級語言,它有利於人為操作,近於面向對象與面向機器之間(VB就是一種面向對象的編程語言),它的功能更加強大,可移植性高,是當今最廣泛的語言之一.
DOS匯編是說匯編語言的操作界面是DOST系統,這也說明是匯編是更低級一些,但執行鼎度是其它語言無法相比的,就是可移植性較差.
問題二:匯編語言中@是什麼意思 #表示立即數定址。採用立即定址方式的指令,在立即數前面加上立即定址符「#」。
例如指令MOV A,#30H中30H就是立即數,指令功能為將30H賦給累加器A。
@表示寄存器的間接定址。
例如指令MOV A,@R0就使用了寄存器間接定址方式,這條指令的意義為將地址指針R0指向的內部數據存儲器單元中的數據送入累加器A中。假設R0中內容為30H,則此指令的功能是以R0寄存器的內容30H為地址,把內部RAM 30H單元中的內容傳送給累加器A。
問題三:匯編語言里*是什麼意思 其表示去0x804a260地址處的內存內容
參考blog.csdn/...314473
問題四:什麼是匯編語言 匯編語言它是計算機語言,計算機語言說通俗點就是人類與計算機(CPU)溝通的橋梁,計算機它不認識人類的語言,聽不懂也讀不懂,要讓計算機替我們去完成我們的工作,就需要我們將要交給計算機完成的任務翻譯為計算機語言。匯編語言是各種語言中的一種,它屬於低級的計算機語言,這是相對於面向過程的C語言,以及面向對象的C++,java而言。它是除機器語言以外最接近硬體的計算機語言,而且可以通過學習匯編語言深入的了解操作系統的底層運行機制,並以CPU的角度思考問題。這樣可以讓你在編寫高級語言的程序的時候避免旅彎很多錯誤,並且能更深入理解高級語言的執行 原理。因為匯編語言屬於低級語言,所以既然低級就肯定不容易被普通用戶認識,這需要一定的硬體基礎知識和一些計算機工作原理的知識。以前在大學階段學過匯編語言,但沒有當回事兒,連作業都是復制加粘貼完成的(像這樣的不在少數瞎山吧:))。工作以後才發現這個語言是個好東西,它其實是個非常重要的基礎課程。所以現在有時間就把書打開多看一點,學一點。匯編語言目前常見的有兩種:一個是基於8086/88架構的DOS下的16位匯編語言,還有就是基於80386架構及其以後型號的windows下32位匯編語言。我不知道linux下有沒有匯編語言。順便說一下,不管什麼匯編語言它所編出來的程序都屬於軟體,所以不管什麼軟體都需要依賴操作系統這個基礎平台,它才可以被硬體CPU所執行,因為操作系統就是提供硬體與用戶之間的介面,所有軟體都要通過它來分配到硬體資源(不知道對不對哈:)才可以被執行)。一般先學習16位的DOS匯編,然後再學32位的windows匯編。所以我們先談談16位的DOS匯編哈。要學匯編語言首先就是要了解CPU,你只有了解了CPU才能了解匯編語言的執行,因為它基本就是直接在磨鎮中操作CPU的各個組成單元(像寄存器)。在 *** 上找了這個圖,如下:上面這個CPU的邏輯結構圖是8088的,8088和8086大的架構差不多,所以就以這個為例介紹下各個組成部分的作用。主寄存器:AX(AH,AL)累加寄存器,一般用作暫存數據;BX(BH,BL)基址寄存器,一般用作偏移地址存放;CX(CH,CL)計數寄存器,一般用在循環控制次數;DX(DH,DL)數據寄存器,好像和AX差不多吧;SP堆棧指針寄存器,棧指針;BP基址指針寄存器,可作SP使用;SI源變址寄存器和DI目的變址寄存器,這兩個做為BX擴展用於偏移地址存放。段寄存器: CS:代碼段寄存器,任何一個程序都是從代碼段開始執行的,CS寄存器指明了代碼段的段地址。DS:數據段寄存器,存放程序中數據部分的段地址。SS:堆棧段寄存器,堆棧是內存中特殊的內存塊,堆與棧不同,目前我只知道棧是尊循「先進後出,後進先出」的原則而使用。ES:附加段寄存器,應該是作為DS數據段寄存器的擴充吧。地址加法器: 這是用在對內存定址時所使用,它通過將段寄存器中的段地址與BX、SI、DI等寄存器中的偏移地址作一定處理從而輸出物理地址,然後就可以訪問內存單元了。匯編程序中的地址只是邏輯地址,並不是真實的內存上的地址。在程序實際運行時每次訪問內存都會先將邏輯地址轉換成物理地址才可以訪問到物理內存。關於CPU定址,邏輯地址,物理地址我也會再寫篇文章來討論。邏輯運算單元和控制單元:這是CPU最核心的單元,我們暫只記住它們是負責執行與控制就好了。內部數據,地址匯流排:CPU內部各部件之間通信的通道。外部地址匯流排:用來傳輸CPU想要讀取/寫入內存單元的物理地址。它的寬度就決定了CPU能夠訪問的內存的最大容量。外部數據和控制總......>>
問題五:匯編語言中,[ ]是什麼意思? mov al,bvar
mov al,[bvar]
這兩個是一樣的 都是取變數bvar的值.
問題六:匯編語言中$是什麼意思 「$」是匯編語言中的一個預定義符號,等價於當前正匯編到的段的當前偏移值。
指令「jmp $+3」中的「$」表示當前這條指令在代碼段中的偏移量。指令「jmp $+3」表示要向前跳轉到距離這條指令3個位元組的地方。若是「jmp $-3」,則表示要向後跳轉到距離這條指令3個位元組的地方。
「$」可用於表達式,並且可以用於表達式的任意位置。
更具體的內容,請參閱匯編語言的「預定義符號」章節。
問題七:匯編語言,這句代碼到底是什麼意思?? PTR是指針的意思, DWORD PTR 是DWORD 類型的指針
即 把 ebp+_tb 處開始的 sizeof(DWORD) 個位元組當成一個DWORD , 拷貝到ecx寄存器。
用C語言偽碼
ecx = *( (DWORD*)(ebp+_tb) );
問題八:匯編語言 CLRB 是什麼意思??? 宏指令 CLRB,完成用空格符將一字元區中的字元取代的工作。
問題九:編程語言和匯編語言有什麼區別啊 計算機語言從低級到高級可以分為:
機器語言,即由0、1組成的機器硬體可以識別的語言;
低級語言,即匯編語言
中級語言,如C語言
高級語言,如C++,JAVA,C#等。
匯編語言是將由0、1組成的機器語言用具有簡單語義的英文代碼表示,以便於理解和程序員編程。匯編語言通常用於對硬體的直接操控。由於匯編語言編寫的程序很小,所以通常在程序中最核心的、控制硬體的代碼可以採用匯編語言編寫,一方面是安全,另一方面提高運行速度。
對於計算機的初學者,應該從中高級語言學起,如c語言,vb,java等,如果你是想要學習如何編程,學習一到兩門高級語言已經夠用了。
如果你已經掌握了基本的編程技能,最好是可以學習數據結構和操作系統以及計算機硬體的基本工作原理,以便優化你編寫的程序,提高安全性和運行效率。
如果你想要從事更高級的開發工作,則可能需要學習匯編語言。
在高校中,計算機科技專業的學生匯編語言是必修課,而軟體工程專業的學生則對匯編語言不做要求。
至於匯編與編程的區別是顯而易見的,匯編語言是一種用於編寫某些程序的語言。而編程則是程序員用某種語言編寫程序的過程。
問題十:匯編語言的與和或是什麼意思 與和或就是邏輯運算,與: AND AX,BX;將AX中的內容與BX相與存入AX中,與就是條件要一起滿足,例如AX中的二進制數是10111111,BX中的數是11100000,那麼相與只有AX中就是10100000,因為只有bit5和bit7都為真。
類似,或就是只要有一個為真就為真,OR AX,BX;將AX中的內容與BX相或存入AX中,兩個寄存器內容相或後,AX中就變成了11111111。
⑨ 匯編語言中的堆棧段指針是干什麼的
堆棧段指針(寄存器SS)是用於確定堆棧在內存中的起始位置的寄存器;堆棧段寄存器的作用和其他段寄存器(CS,DS,ES)相同,都是為了在一整段的內存中劃分區域:由於內存為一整段儲存單元,CS(代碼段寄存器)中存放代碼段的起始位置,DS(數據段寄存器)中存放數據段的起始位置,SS(堆棧段寄存器)中存放堆棧段的起始位置,ES(附加段寄存器)中存放附加段的起始位置。
在操作系統孝斗架構的內存中,堆棧位於程序所使用內存的頂端,向內存低地址處擴展,DS寄存器中存放的是堆棧最低的地址。滑耐堆棧本身為內存的一部分,但是相對普通內存段(DS)的區別在於:普通內存段(DS)一般用於存放長久數據,無特殊存儲順序;堆棧內存段(SS)一般用於存放暫時數據(例如調用函數是的參數),可以使用PUSH,POP指令向棧頂壓入,彈出數據。
另外,若SP(棧頂寄存器)中的值小於DS寄存器(PUSH指令執行過多次)將會引發錯誤:系統顯示某某程序Stack Overflow(因為SS段往下的內存地址屬於數據段的區域)。若SP中的值大信慎春於一定程度(由程序的堆棧段大小決定)(POP指令執行過多),也將會引發錯誤:系統顯示某某程序Access Violation Reading Address(因為程序內存的頂端上有著其他數據)。
需要注意的是,在較新的操作系統下匯編其平台下的程序時,程序員將無法修改段寄存器中的值(修改會報錯),它們由操作系統自身管理(可以理解為由操作系統編寫者的代碼管理),其原因是出於安全起見。