• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            luqingfei@C++

            為中華之崛起而崛起!
            兼聽則明,偏聽則暗。

            匯編語言--基礎知識

            知識點:機器語言、匯編語言的產生、匯編語言的組成、存儲器、指令和數據、存儲單元、CPU對存儲器的讀寫、地址總線、數據總線、控制總線、內存地址空間(概述)、主板、接口卡、各類存儲器芯片、內存地址空間。


            匯編語言是直接在硬件之上工作的編程語言,首先要了解硬件系統的結構,才能有效地應用匯編語言對其編程。

            機器語言
            說到匯編語言的產生,首先要講一下機器語言。機器語言是機器指令的集合。機器指令展開來講就是一臺機器可以正確執行的命令。
            電子計算機的機器指令是一列二進制數字。計算機將之轉變為一列高低電平,以使計算機的電子器件受到驅動,進行運算。

            上面所說的計算機指的是可以執行機器指令,進行運算的機器。這是早期計算機的概念。現在,在常用的PC機中,有一個芯片來完成上面所說的計算機的功能,這個芯片就是我們常說的CPU(Central Processing Unit,中央處理器單元),CPU是一種微處理器。

            以后我們提到的計算機是指由CPU和其他受CPU直接或間接控制的芯片、器件、設備組成的計算機系統,比如我們最常見的PC機。

            每一種微處理器,由于硬件設計和內部結構和不同,就需要用不同的電平脈沖來控制,使它工作。所以每一種微處理器都有自己的機器指令集,也就是機器語言。

            早期的程序設計均使用機器語言。程序員們將用0、1數字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過紙帶機或卡片機輸入計算機,進行運算。

            應用8086CPU完成計算 s = 768 + 12288 - 1280,機器碼如下:
            1011000000000000000000000000011
            0000010100000000000000000110000
            0010110100000000000000000000101


            要書寫和閱讀機器碼程序不是一件簡單的工作,要記住所有抽象的二進制碼。上面只是一個非常簡單的小程序,就暴露了機器碼的晦澀難懂和不易查錯。


            匯編語言的產生
            早期的程序員很快就發現了使用機器語言帶來的麻煩,它是如此難于辨別和記憶,給整個產業的發展帶來了障礙。于是匯編語言產生了。

            匯編語言的主體是匯編指令。
            匯編指令和機器指令的差別在于指令的表示方法上。
            匯編指令是機器指令便于記憶的書寫格式。

            例如:機器指令 1000100111011000表示把寄存器BX的內容送到AX中。匯編指令則寫成mov ax, bx,這樣的寫法與人類語言接近,便于閱讀和記憶。

            操作:寄存器BX的內容送到AX中
            機器指令:1000100111011000
            匯編指令:mov ax, bx

            (寄存器,簡單地講是CPU中可以存儲數據的器件,一個CPU中有多個寄存器。AX是其中一個寄存器的代號,BX是另一個寄存器的代號。)

            此后,程序員們就用匯編指令編寫源程序??墒牵嬎銠C能讀懂的只有機器指令,那么如何讓計算機執行程序員用匯編指令編寫的程序呢?這時,就需要有一個能夠將匯編指令轉換成機器指令的翻譯程序,這樣的程序被稱為編譯器。程序員用匯編語言寫出源程序,再用匯編編譯器將其編譯機器碼。由計算機最終執行。


            用匯編語言編寫程序的工作過程:
            (程序員)匯編指令   -->  編譯器   -->  機器碼  -->  計算機


            匯編語言的組成
            匯編語言發展至今,由以下3類指令組成。
            匯編指令:機器碼的助記符,有對應的機器碼。
            偽指令:沒有對應的機器碼,由編譯器執行,計算機并不執行。
            其他符號:如:+、-、*、/等,由編譯器識別,沒有對應的機器碼。

            匯編語言的核心是匯編指令,它決定了匯編語言的特性。


            存儲器
            CPU是計算機的核心部件,它控制整個計算機的運作并進行運算。
            要想讓一個CPU工作,就必須向它提供指令和數據。
            指令和數據在存儲器中存放,也就是平時所說的內存。

            在一臺PC機中內在的作用僅次于CPU。離開了內存,性能再好的CPU也無法工作。
            這就像再聰明的大腦,沒有了記憶也無法進行思考。

            磁盤不同于內存,磁盤上的數據或程序如果不讀到內存中,就無法被CPU使用。

            要靈活地利用匯編語言編程,首先要了解CPU是如何從內存中讀取信息,以及向內存中寫入信息的。


            指令和數據
            指令和數據是應用上的概念。在內存或磁盤上,指令和數據沒有任何區別,都是二進制信息。
            CPU在工作的時候把有的信息看作指令,有的信息看作數據,為同樣的信息賦予了不同的意義。
            就像圍棋的棋子,在棋盒里的時候沒有任何區別,在對弈的時候就有了不同的意義。

            例如,內存中的二進制信息 1000100111011000,計算機可以把它看作大小為89D8H的數據來處理,也可以將基看作指令mov ax, bx來執行。

            1000100111011000     -->    89D8H(數據)
            1000100111011000     -->    mov ax, bx(指令)


            存儲單元
            存儲器被劃分成若干個存儲單元,每個存儲單元從0開始順序編號,例如一個存儲器有128個存儲單元,編號從0~127。

            電子計算機的最小信息單位是bit(音譯為比特),也就是一個二進制位。
            8個bit組成一個Byte,也就是通常講的一個字節。
            微型機存儲器的存儲單元可以存儲一個字節,即8個二進制位。
            一個存儲器有128個存儲單元,它可以存儲128個字節。

            微機存儲器的容量是以字節為最小單位來計算的。
            對于擁有128個存儲單元的存儲器,我們可以說,它的容量是128字節。

            對于大容量的存儲器一般還用以下單位計量容量(以下B來代表Byte):
            1KB = 1024B
            1MB = 1024KB
            1GB = 1024 MB
            1TB = 1024 GB

            磁盤的容量單位同內存的一樣,以上單位是微機中常用的計量單位。



            CPU對存儲器的讀寫
            存儲器被劃分成多個存儲單元,存儲單元從零開始順序編號。這些編號可以看作存儲單元在存儲器中的地址。就像一條街,每個房子都有門牌號碼。

            CPU要從內在中讀數據,首先要指定存儲單元的地址。
            也就是說它要先確定讀取哪一個存儲單元的數據。就像在一條街上找人,先要確定他住哪個房子里。

            另外,在一臺微機中,不只有存儲器這一種器件。CPU在讀寫數據時還要指明,它要對哪一個器件進行操作,進行哪種操作,是從中讀出數據,還是向里面寫入數據。

            可見,CPU要想進行數據的讀寫,必須和外部器件(標準的說法是芯片)進行3類信息的交互:
            *存儲單元的地址(地址信息)
            *器件的選擇,讀或寫的命令(控制信息)
            *讀或寫的數據(數據信息)

            那么CPU是通過什么將地址、數據和控制信息傳到存儲器芯片中的呢?
            電子計算機能處理、傳輸的信息都是電信號,電信號當然要用導線傳送。在計算機中專門有連接CPU和其他芯片的導線,通常稱為總線
            總線從物理上來講,就是一根根導線的集合。
            根據傳送信息的不同,總線從邏輯上又分為3類,即地址總線、控制總線、和數據總線。

            CPU從3號單元中讀取數據的過程如下:

            CPU

            內存

            地址線

            12     [0]
            3-----> 3B    [1]
            9C    [2]
            數據線 08     [3]
            8<----- 31     [4]
            23     [5]
            控制線 15     [6]
            內存讀寫命令---> 13     [7]
            18     [8]

            cpu從內存中讀取數據的過程。

            (1)CPU通過地址線將地址信息3發出。
            (2)CPU通過控制線發出內在讀命令,選中存儲器芯片,并通知它,將要從中讀取數據。
            (3)存儲器將3號單元中的數據08通過數據線送入CPU。

            寫操作與讀操作的步驟相似。向3號單元寫入數據26:
            (1)CPU通過地址線將地址信息3發出。
            (2)CPU通過控制線發出內存寫命令,選中存儲器芯片,并通知它,要向其中寫入數據。
            (3)CPU通過數據線將數據26送入內存的3號單元中。

            從上面的我們知道CPU是如何進行數據讀寫的??墒?,我們如何命令計算機進行數據的讀寫呢?
            要讓一個計算機或微處理器工作,應向它輸入能夠驅動它進行工作的電平信息(機器碼)。

            對于8086CPU,下面的機器碼能夠完成從3號單元讀數據:
            機器碼:101000000000001100000000
            含義:從3號單元讀取數據送入寄存器AX

            CPU接收這條機器碼后將完成上面所述的讀寫工作。

            機器碼難于記憶,用匯編指令來表示,情況如下:
            機器碼:101000000000001100000000
            對應的匯編指令:MOV AX, [3]
            含義:傳送3號單元的內容到AX


            地址總線
            CPU是通過地址總線來指定存儲器單元的。
            地址總線上能傳送多少個不同的信息,CPU就可以對多少個存儲單元進行尋址。

            現假設,一個CPU有10根地址線,讓我們來看一下它的尋址情況。
            在電子計算機中,一根導線可以傳送的穩定狀態只有兩種,高電平或低電平。
            用二進制表示就是1或0,10根導線可以傳送10位二進制數據。
            而10位二進制數可以表示多個不同的數據呢?
            2的10次方個,最小數為0,最大數為1023。

            一個CPU有N根地址線,則可以說這個CPU的地址總線的寬度為N。
            這樣的CPU最多可以尋找2的N次方個內存單元。



            數據總線
            CPU與內存或其他器件之間的數據傳送是通過數據總線來進行的。
            數據總線的寬度決定了CPU和外界的數據傳送速度。
            8根數據總線一次可傳送一個8位二進制數據(即一個字節)。
            16根數據總線一次可傳送2個字節。


            控制總線
            CPU對外部器件的控制是通過總線來進行的。在這里控制總線是個總稱,控制總線是一些不同控制線的集合。
            有多少根控制總線,就意味著這個CPU提供了對外部器件的多少種控制。
            所以,控制總線的寬度決定了CPU對外部器件的控制能力。

            內存讀寫命令是由幾根控制線綜合發出的,其中有一根名為讀信號輸出控制線負責由CPU向外傳送讀信號,CPU向該控制線上輸出低電平表示將要讀取數據;有一根名為寫信號輸出的控制線則負責傳送寫信號。


            小結
            1)匯編指令是機器指令的助記符,同機器指令一一對應。
            2)每一種CPU都有自己的匯編指令集。
            3)CPU可以直接使用的信息在存儲器中存放。
            4)在存儲器中指令和數據沒有任何區別,都是二進制信息。
            5)存儲單元從零開始順序編號。
            6)一個存儲單元可以存儲8個bit(用作單位寫成"b"),即8位二進制數。
            7)1B=8b     1KB=1024B     1MB=1024KB     1GB=1024MB
            8)每一個CPU芯片都有許多管腳,這些管腳和總線相連。也可以說,這些管腳引出總線。
                  一個CPU可以引出三種總線的寬度標志了這個CPU的不同方面的性能:
                           地址總線的寬度決定了CPU的尋址能力;
                           數據總線的寬度決定了CPU與其他器件進行數據傳送時的一次數據傳送數;
                           控制總線的寬度決定了CPU對系統中其他器件的控制能力。

                         
            習題:
            (1)1個CPU的尋址能力為8KB,那么它的地址總線的寬度為________。
            (2)1KB的存儲器有________個存儲單元?存儲單元的編號從__________到__________。
            (3)1KB的存儲器可以存儲_________個bit,_________個byte。
            (4)1GB,1MB,1KB分別是_____________________________byte。
            (5)8080、8088、80286、80386的地址總線分別為16根、20根、24根、32根,則它們的尋址能力分別為:__________KB、________MB、__________MB、______________GB。
            (6)8080、8088、8086、80286、80386的數據總線寬度分別為8根、8根、16根、16根、32根。則它們一次可以傳送的數據為:_______B、________B、________B、__________B、_______B。
            (7)從內存中讀取1024字節的數據,8086至少要讀_______次,80386至少要讀__________次。
            (8)在存儲器中,數據和程序以________形式存放。


            答案:
            (1)13
                       解析:微型機的存儲單元可以存儲一個字節,即8個二進制位。8KB即8K字節,即2的13次方個存儲單元。一個CPU有N根地址線,則可以說這個CPU的地址總線的寬度為N,這樣的CPU最多可以尋找2的N次方個存儲單元。
            (2)1024,0,1023
                       解析:1KB,即1024字節,一個存儲單元為一個字節。存儲單元從零開始順序編號。
            (3)8192,1024
                       解析:1B=8b     1KB=1024B
            (4)2^30,   2^20, 2^10
            (5)64, 1, 16, 4
                      解析:一個CPU有N根地址線,表示這個CPU地址總線寬度為N,可以尋址2的N次方個存儲單元。
            (6)1,1,2,2,4
                     解析:一根數據線,只能傳送一位二進制數(0或1,低電平或高電平)
            (7)512, 256
                    解析:8086的數據總線寬度為16,一次可以傳送2個字節,80386的數據總線寬度為32,一次可以傳送4個字節。
            (8)二進制(0或1)



            內存地址空間(概述)
            什么是內存地址空間呢?
            舉例來講,一個CPU的地址線寬度為10,那么可以尋址1024個內存單元(存儲單元,一個存儲單元在微型機中表示一個字節),這1024個可尋到的內存單元就構成了這個CPU的內存地址空間。



            主板
            在每一臺PC機中,都有一個主板,主板上有核心器件和一些主要器件,這些器件通過總線(地址總線、數據總線、控制總線)相連。
            這些器件有:CPU、存儲器、外圍芯片組、擴展插槽等。
            擴展插槽上一般插有RAM內存條和各類接口卡。

            接口卡
            計算機系統中,所有可用程序控制其工作的設備,必須受到CPU的控制。
            CPU對外部設備都不能直接控制,如顯示器、音箱、打印機等。
            直接控制這些設備進行工作的是插在擴展插槽上的接口卡。
            擴展插槽通過總線和CPU相連,所以接口卡也通過總線同CPU相連。
            CPU可以直接控制這些接口卡,從而實現CPU對外設的間接控制。
            簡單地講,就是CPU通過總線向接口卡發送命令,接口卡根據CPU的命令控制外設進行工作


            各類存儲器芯片
            一臺PC機中,裝有多個存儲器芯片,這些存儲器芯片從物理連接上看是獨立的、不同的器件。
            從讀寫屬性上看分為兩類:隨機存儲器(RAM)和只讀存儲器(ROM)。
            隨機存儲器可讀可寫,但必須帶電存儲,關機后存儲的內容丟失;
            只讀存儲只能讀取不能寫入,關機后其中的內容不丟失。
            這些存儲器從功能和連接上又可分為以下幾類:

            隨機存儲器
            用于存放供CPU使用的絕大部分程序和數據,主隨機存儲器一般由兩個位置上的RAM組成,裝在主板上的RAM和插在擴展插槽上的RAM。

            裝有BIOS(Basic Input/Output System,基本輸入輸出系統)的ROM
            BIOS是由主板和各類接口卡(如:顯卡、網卡等)廠商提供的軟件系統,可能通過它利用該硬件設備進行最基本的輸入輸出。
            在主板和某些接口卡上插有存儲相應BIOS的ROM,例如:主板上的ROM中存儲著主板的BIOS(通常稱為系統BIOS);顯卡上的ROM中存儲顯卡的BIOS;如果網卡上裝有ROM,那其中就可以存儲網卡的BIOS。

            接口卡上的RAM
            某些接口卡需要對大批量輸入、輸出數據進行暫時存儲,在其上裝有RAM。最典型的是顯示卡上的RAM,一般稱為顯存。顯示卡隨時將顯存中的數據向顯示器上輸出。換句話說,我們將需要顯示的內容寫入顯存,就會出現在顯示器上。


            內存地址空間
            上述的各種存儲器,它們在物理上是獨立的器件,但是它們在以下兩點上相同:
            1)都和CPU的總線相連;
            2)CPU對它們進行讀或寫的時候都通過控制線發現內在讀寫命令。

            也就是說,CPU在操縱和控制它們的時候,把它們都當作內存來對待,把它們總的看作一個由若干存儲單元組成的存儲器。
            這個邏輯存儲器就是我們所說的內在地址空間。

            所有的物理存儲器被看作是一個由若干存儲單元組成的邏輯存儲器,每個物理存儲器在這個邏輯存儲器中占有一個地址段,即一段地址空間。
            CPU在這段地址空間中讀寫數據,實際上就是在相對應的物理存儲器中讀寫數據。

            內存地址空間的大小受CPU地址總線寬度的限制。
            8086CPU的地址總線寬度為20,可以傳送2^20個不同的地址信息(大小從0至2^20-1)。即可以定位2^20個內在單元,則8086PC的內在地址空間大小為1MB。
            同理,80386CPU的地址總線寬度為32,則內存地址空間最大為4GB。

            我們在基于一個計算機硬件系統編程的時候,必須得知道這個系統中的內在地址空間分配情況。

            因為當讀者想在某類存儲器中讀寫數據的時候,讀者必須知道它的第一個單元的地址和最后一個單元的地址,才能保證讀寫操作是在預期的存儲器中進行。

            比如,讀者希望向顯示器輸出一段信息,那么讀者必須將這段信息寫到顯存中,顯卡才能將它輸出到顯示器上。要向顯存中寫入數據,讀者必須知道顯存在內存地址空間中的地址。

            不同的計算機系統的內存地址空間的分配情況是不同的。

            內存地址空間
            最終運行程序的是CPU,我們用匯編編程的時候,必須要從CPU角度考慮問題。
            對CPU來講,系統中的所有存儲器中的存儲單元都處于一個統一的邏輯存儲器中,它的容量受CPU尋址能力的限制。
            這個邏輯存儲器即是我們所說的內存地址空間。













            posted on 2010-07-11 14:50 luqingfei 閱讀(740) 評論(0)  編輯 收藏 引用 所屬分類: 匯編語言基礎學習

            導航

            <2009年3月>
            22232425262728
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統計

            留言簿(6)

            隨筆分類(109)

            隨筆檔案(105)

            Blogers

            Game

            Life

            NodeJs

            Python

            Useful Webs

            大牛

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            精品久久久无码21p发布 | 午夜精品久久久久久影视777 | 亚洲欧洲久久av| 亚洲伊人久久大香线蕉综合图片| 久久无码AV一区二区三区| 国产A级毛片久久久精品毛片| 久久久噜噜噜久久熟女AA片| 伊人丁香狠狠色综合久久| 日日狠狠久久偷偷色综合96蜜桃| 影音先锋女人AV鲁色资源网久久 | 狠狠精品久久久无码中文字幕| 少妇精品久久久一区二区三区| 国内精品久久久久影院一蜜桃| 久久久久黑人强伦姧人妻| 久久66热人妻偷产精品9| 99久久国产亚洲高清观看2024 | 精品久久久久久无码中文字幕| 久久人人爽人人爽人人av东京热 | 久久香蕉超碰97国产精品| 一本大道久久a久久精品综合| 亚洲精品午夜国产va久久| 免费精品99久久国产综合精品| 中文字幕久久久久人妻| 久久伊人五月天论坛| 国产精品久久久久久久| 久久综合精品国产二区无码| 亚洲欧美国产精品专区久久| 久久精品国产69国产精品亚洲| 午夜精品久久久久久中宇| 2021最新久久久视精品爱| 国内精品久久久久久久亚洲| 日本道色综合久久影院| 久久国产亚洲精品无码| 亚洲国产精品无码久久| 国产亚洲精久久久久久无码77777| 久久九九免费高清视频| 久久精品国产亚洲精品| 久久精品国产99久久久香蕉| 久久播电影网| 色婷婷噜噜久久国产精品12p| 日本精品久久久久久久久免费|