彙編語言學結

來源:文萃谷 2.44W

彙編語言由三類指令組成:

彙編語言學結

1.彙編指令:機器碼的助記符,有對應的助記碼(類似於mov,add,inc等等)

2.偽指令:不對應機器碼,有編譯器執行(類似於db,dw,dd,assume等等)

3.加減乘除等符號

指令和數據是應用上的概念。在內存和硬盤上,指令和數據沒有任何區別。例如1000100111011000機器碼,可以翻譯成數據89d8h,也可以翻譯成movax,bx。

cpu要想對數據進行讀寫,必須和外部器件進行以下三類交互:

1.存儲單元地址(地址信息)

2.器件的選擇,讀或寫的命令(控制信息)

3.讀或寫的數據(數據信息)

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

通過地址線將地址信息3發出。

通過控制線發出內存讀命令,通知存儲器芯片,將要從中讀取數據

3.存儲器將3號單元的數據通過數據線送入cpu

寫操作類似。

地址總線:

一個cpu有n根地址線,則這個cpu可以尋址2^n個地址單元。

數據總線:

8088cpu的數據總線寬度為八,8086為十六。若傳送數據89d8,8088需要兩次,8086需要一次。

控制總線:

控制總線的寬度決定了cpu對外部設備的控制能力。

彙編語言學結 [篇2]

其實説實話在學這門課之前自己對彙編語言一點都不瞭解,只知道它也是一種語言,而且是一門很少用的語言,可能很多人都是這麼想的,或許在學這門課之前不少同學也有和我當七年級樣的思想,大概學學就好,反正以後很少能用到,畢竟現在高級語言這麼發達,而且運用起來靈活易懂,像彙編這種低級語言又難又不易學。或許老師是知道我們之前有這種想法,所以第一節課就跟我們講解了一下了彙編語言在當今這種高速發展的社會的作用和地位,讓我們能夠正確的認識彙編語言的精華,正確對待這麼課。而且還在課堂了百度了彙編語言的招聘信息,或許這才是使我們正確對待彙編的最直接的原因,關係到我們以後的出路,或許我們學好了一門彙編,以後出去找工作的機會不就更廣了嗎?正是在這種動力的驅使下我才對彙編語言有了一個新的認識,而且決定要把它學好。

在後來的學習中我發現其實彙編不是很難學,其實學彙編就像學其他的高級語言一樣,高級語言要求對語言非常瞭解。在學彙編的過程中,我們最重要的就是要掌握彙編語言中的指令的一些基本用法。當然要能夠真正的瞭解其中的內涵,這樣我們在實際的編程中也能夠像運用高級語言一樣靈活的變通。彙編語言作為一種低級程序設計語言,既然是低級所以應該是最底層的,與我們計算機內部的結構聯繫應該聯繫很密切,而且在我們學習中也深刻的瞭解到了這一點。比如説後來學到的寄存器、中斷、還要各種尋址方式以及進棧出棧,好多的就是設計到計算機硬件。前面幾章都是對計算機內部結構和一些常用的指令以及尋址方式的尋址方式。到後面學到子程序以及宏的作用才真正發現到其實跟高級語言差別不大。以C語言為例,C語言不也是由一個一個的函數組成的嗎?沒想到想彙編這樣的低級語言也可以這樣。在彙編語言的子程序和宏中,我個人更感覺宏的運用更像我們高級語言的子函數,通過定義好的宏,我們在後面直接調用就可以了。尤其是宏帶參數的宏跟C語言中帶參數的函數真的很像,根據參數的不同調用宏就能得到不同的結果。而彙編中的子程序沒有這個傳遞參數這個功能。在調用子程序的時候要注意各寄存器中的內容。子程序是在程序執行期間由主程序調用的,它只佔有它自身大小的一個空間,他不僅是源程序級別 簡化,形成的目標代碼較短;而宏調用則是在彙編期間展開的,每調用依次進把宏定義體展開一次,它是源程序級的簡化。因而它佔有的存儲空間與調用次數有關,調用次數越多則佔有的存儲空間越大。如果宏調用次數較多的話,則其空間上的開銷也是應該考慮的因素

彙編程序給人感覺最煩的就是好多程序的結果不能直接通過運行EXE文件顯示出來,而更多的是經過DEBUG單步調試才能看到其內在變化,看是否正確。在初次接觸彙編的幾個彙編工具時,有一種神奇的感覺,因為彙編程序不像其他的高級語言一樣需要編譯器,而是直接的就能在記事本上編寫,然後進行彙編和

連接就可以了。學習彙編調試,關鍵就是要掌握DEBUG的運用。我們在實際的調試中,最常用的幾個命令有:D:顯示內存單元的內容。T:單步執行。G:連續單步執行。G:連續單步執行。我們編程也只用過這幾個。説到這個DUBUG我就不得不説我之前有一次的經歷了。我在最後一次的上級實驗的編程中我用到的是AX這種寄存器,我按照我自己的程序認真走了好幾遍,找不到一點錯誤,但程序運行就是不對,我為此鬱悶了好久。後來只有一步一步的單步調試。由於是最後一個綜合實驗,實驗比較長,我就一直盯着AX內容的變化,經過我的苦苦等候才找到了錯誤,就是在DOS功能運用的時候出現了錯誤。也就是執行下面這條指令Mov ah 02h,int 21h,其實這兩條指令中裏面還包含好多的微指令,不自己親自調試一下根本就發現不了問題。正是因為這些微指令對AX寄存器的影響所以才導致了我的錯誤。於是我就感覺學好彙編步進要把指令學好,還要把DEBUG學好,這樣才能少走好多彎路。

學完彙編這門課我也對之前的高級語言中的一些知識有了更新的認識,能夠讓我們更好的理解高級語言,尤其是高級語言中的C語言,彙編語言對於內存的操作都是基於內存地址的,而C語言中最令人頭疼的指針概念,説白了就是內存的地址指針的學習和應用中最頭疼的就是在指針這個抽象的概念和實際的內存單元之間建立思維映射,而這些恰恰是我們在彙編語言學習中頻繁做的一件平常事另外,對於C語言中的數據類型形參實參函數調用全局變量局部變量等概念及操作,我們都可以用匯編語言中的一些操作相關聯,把這些抽象的概念和過程,通過彙編語言形成一個具體的映像,深度剖析,這樣我們才能真正的學會學好C語言計算機科學的各個方面是一個統一的整體,只有多方面穿插,交互才能更好的搭建計算機知識體系,彙編語言本身還是一門很重要的應用技術。首先由於彙編的操作由於跟硬件緊密相關,所以,很多硬件設施的嵌入式編程使用的都是使用的彙編語言,因為彙編語言更直接,更有效率!我們現在的數碼產品很多,而這些數碼產品賴以生存的芯片,主板等,都包含了嵌入式程序,而這些程序中,彙編語言的使用是相當重要的!我想如果我們以後想從事嵌入式這方面的話彙編語言是必備的一種本領。而且我也正是想從事這一方面。我想如果想學好計算機編程技能,如果想做一名合格的編程人員,如果想在計算機編程之路走的更遠,我們只有,也必須從彙編語言開始,才能完整、完善的建立計算機編程知識體系!所以對於我自己來説,要以今天的學習為跳板,為今後的彙編語言的繼續學習打好基礎。願自己在計算機這條道路上越走越遠。

彙編語言學結 [篇3]

8086cpu的所有寄存器都是16位的,可以存放兩個字節。通常用ax,bx,cx,dx存放一般性的數據。

當存放數據多於2個字節時(加法運算後導致),寄存器存放後四個16位進制數,前一個1被排除(其實是cf的值,後面詳述)

十六位進制的運算很容易,與十進制相似,例:

c5 + 93 = 158

40 + 85 = c5

abcdef分別代表10到15.

下面舉一個例子:

mov al,c5h

add al,93h

現在ax中的數據為多少?

上面已經知道,c5 + 93 =158,但al為八位寄存器,只能存放兩位十六進制的數據,所以‘1’被捨棄,ax中應該為‘0058h’。

有些人可能會覺得奇怪,為什麼不把進位帶到ah裏呢?當單獨使用al與ah時,兩者互不關聯。如果執行addax,93h的話,此時ax裏應該為‘0158h’。

在進行數據傳輸或運算時,要注意指令的兩個操作對象的位數應當一致。

例如:

mov al,20000(大於256)

以及

add al,100h(大於兩位)

都是錯誤的指令。

物理地址是由段地址乘以16(10h)再加上偏移地址得到的。一個地址內部存儲着一個字節的內容。

分段是由人為自己定出來的。編程人員根據需要,將若干地址連續的內存單元看做一個段。

段也有相對應的寄存器,這裏我們先介紹cs和ip,cs為代碼段寄存器,ip為指令寄存器。在任一時刻,cpu將cs:ip指向的內容當做指令執行。

我們可以通過jmp指令來修改cs、ip中的內容。

如:

jmp 2ae3:3;

jmp 3:0b16

若只想修改ip的值,可以通過寄存器來實現。

如:

mov ax,1000h

jmp ax

此時,ip就被置為1000h。

在程序中,如果設置了代碼段的定義,則cs:ip自動指向代碼的開頭位置。

彙編語言學結 [篇4]

在接觸這門課之前就已對彙編語言有所瞭解, 一方面是在計算機組成原理中 有所涉及,雖然那時只知道簡單的 mov、add、jmp 指令,不清楚其具體用法, 缺乏系統性的學習; 另一方面是在相關書籍中瞭解到彙編語言寫驅動比較好但比 較難,當時就覺得彙編是門很牛的語言,很想學習。接觸這門課後,感到彙編語 言的確不是很容易就可以弄懂的,相比較以前學過的高級語言如

c、c++等,電 腦等於在遷就人的思維方式,但學彙編,人卻必須要去遷就電腦的思維方式,要 設身處地地用電腦的角度去思考問題, 這就是我們學習彙編語言時遇到的最大的 障礙。 通過這一學期的學習, 對彙編有了初步的掌握, 可以説是彙編的入門教程。 首先主要學習了彙編語言的基本知識,介紹了彙編的背景知識及由來,讓我 知道了彙編語言是處在機器語言和高級語言中間的一種低級語言。 由於計算機能 夠直接識別的數據是由二進制數 0 和 1 組成的代碼。 所以用機器語言編寫的程序 是計算機惟一能夠直接識別並執行的程序, 而用其他語言編寫的程序必須經過翻 譯才能變換成機器語言程序,為了克服機器語言的缺點,人們採用助記符表示機 器指令的操作碼,用變量代替操作數的存放地址等,這樣就形成了彙編語言。 然後介紹了 8086 計算機組織,彙編的學習不僅僅是學習其語法,而更多的 是學習計算機基本的體系結構,學到這還沒見到很多的指令和語句,但這是學習 彙編前必須要知道和掌握的, 只有知道了彙編的實質、 如何工作及一些基本概念, 才能進行下一步的學習。 直到後面終於學了 80x86 指令系統和尋址方式及後來的 彙編語言格式,才真正進入了彙編的指令學習階段,每一條指令的學習雖然簡單 但比較多,特別是有些指令的使用場合及錯誤用法等易犯錯、易混淆,例如在編 寫數據傳送指令時,目的操作數和源操作數的類型一定要匹配,cs 不能作為目 的操作數,offset 後只能跟簡單地址符號,等等。但總的歸納起來主要掌握三點: 1、 要求指令操作數的尋址方式; 指令對標誌位的影響和標誌位對指令的影響; 2、 3、指令的執行時間,對可完成同樣功能的指令,要選用執行時間短的指令。這 樣學習起來方便的多,也更容易理解記住,這為以後的學習做了鋪墊。 彙編的基本指令學完後,就開始進行應用了,首先學習的是循環與分支程序 設計,第一個例子是簡單的加法計算,雖然簡單,卻讓我有點恐懼,一個在 c 語言中只要三四句就解決的問題,用匯編卻寫了將近 20 句,且還沒有輸出,也 就是不知道結果是否正確。後來學習了 dos 系統功能調用,知道 02 號功能可以 輸出加法的結果,於是使用了,但輸出的卻是一個 ascii 碼值,又需要進行二進 制到十六進制的轉換,當時覺得很困惑,不知道為什麼要轉換,我們輸入的不就 是十六進制嗎,算出來應該還是十六進制啊?隨着繼續深入的學習,才徹底明白 為什麼要轉換,同時也瞭解了計算機中對於數字運算是如何工作的。這時發現匯 編有很多高級語言所沒有的優點,它能讓我們更加了解計算機內部的組織結構, 對我們計算機專業的學生來説,學習彙編也是提升綜合能力的關鍵環節。一旦對

它的原理掌握後,編寫程序就容易多了。後來學的越多,越複雜,程序也是越來 越長,一堆的跳轉指令,覺得很麻煩,且感覺整個程序無秩序,有時對於一段程 序實現的功能還要研究半天。直到學習了子程序設計,一個過程定義對應一個功 能,就像 c 語言中的函數,很有條理性。子程序設計能讓一個大程序分成幾個模 塊來做,提供了模塊化程序設計的條件,可以節省存儲空間及程序設計所花的時 間,並且在主程序中進行 call 調用,十分方便,便於以後的維護、調試和修改。 最後學習了部分宏彙編,只是簡單的幾個用法並沒有深入,但已經為我們做 好了基礎工作,便於我們自學後面的部分。宏(或宏指令)是源程序中一段有獨 立功能的程序代碼,只需定義一次,可以多次調用。這似乎和子程序結構很像, 但子程序有自己的優缺點,優點很明顯,缺點是子程序為轉子及返回、保存及恢 復寄存器以及參數的傳送等都要增加程序的開銷, 這些操作所消耗的時間以及它 們所佔用的存儲空間, 都是為取得子程序結構使程序模塊化這一優點而增加的額 外開銷。所以,有時,特別在子程序本身較短或者是需要傳送的參數較多的情況 下,使用宏彙編更加有利。當然,在程序較複雜,實現的功能較多的情況下,子 程序也必不可少。我的理解是:子程序是調用,而宏是替換,比如一個 max 宏, 所有出現 max 的地方,都用宏代碼代替。兩者各有利弊,在掌握深入的基礎上 結合使用更好。 還有一點十分重要,和所有的程序設計語言一樣,要學好彙編語言,實驗是 必不可少的環節。我深有體會:書上的程序都能看懂,基本原理也都明白,但是 在自己親手編寫程序時,卻無從下手,甚至連第一句該怎麼寫都不知道。後來隨 着老師的講解和實驗的'進行,知道了程序的編寫格式,包括數據段、堆棧段和代 碼段,其中數據段和堆棧段可以不定義,但代碼段是必不可少的,也掌握了該怎 麼調試程序、運行程序等。特別是 debug 命令的使用,可以配合與 list 文件的使 用,讓我們可以調試排錯、檢查結果是否正確等,掌握 debug 的使用對實驗有很 大的幫助。程序的編寫在記事本中進行即可,再在 mask 中編譯,link 中連接運 行,當然也可以在專門的彙編工具中進行。通過實驗,可以在很大程度上加深印 象,在書上看程序,一切都是理所當然,十分順利,而自己動手,才會真正發現 自己的不足之處。 現在彙編語言的課程已經告一段落了,學習過程中遇到的所有困難以及遺留 的難點都需要我們在其餘時間裏逐步攻克,在打好基礎的前提下,學習更加專業 的彙編知識來為我們所用。

彙編語言學結 [篇5]

在沒有學習彙編語言以前,我可能會對彙編這門強大而又難學的程序設計語言產生懷疑,因為現在我們有那麼多的高級編程語言可以學習,尤其是現在日益強大的面嚮對象語言。而且每種語言都要比彙編語言學起來容易,而且開發效率更高。那麼我們為什麼還要學習彙編,彙編這門程序設計語言的存在意義在哪。

學習了彙編語言之後,我發現我不再懷疑彙編語言的強大之處了,彙編語言是一種很強的語言,這是我以前不願意承認的事實,它的強大在於效率。因為彙編語言要實現的是執行的效率,而不是開發上的效率,這一點可能與現階段的那些所謂的面向對象以及其它的一些開發語言的目標不同。用匯編語言寫的程序,無論是在程序的大小上還是在執行時間上都遠遠優於高級語言,即使這種高級語言可能使大家公認的已經比較底層的c語言。

彙編語言與其它的程序設計語言相比,操作的是更加底層的東西,它可以直接與硬件打交道,而別的語言基本不可能實現這樣的功能。既然是與硬件打交道,那麼我們在寫程序的時候就要更加小心了,可能一不小心就會把程序跑丟了。如果我們不能夠控制程序的正常邏輯,那麼程序運行超出我們的控制範圍以後,到底會運行到哪裏,我們也無從知曉。比如説我們本來是要操作一個用户內存地址空間的數據,但是有時我們會不注意,程序運行到了內核內存地址空間去了,那麼這樣的程序肯定要面臨崩潰了。幸好我們現在使用的是虛擬模式下的彙編語言編程,不用去考慮那麼多的問題,大不了重新啟動一下資源管理器,要不然電腦還不知道會崩潰多少次。

與彙編語言相比,高級語言在這方面做的就很不錯了,畢竟我們在寫高級語言代碼的時候,沒有直接對底層的硬件進行操作,而先與操作系統打交道。至於操作硬件,那是操作系統的事情了,這樣我們可以在一定程度上少犯錯誤,而且與此同時可以減少花在調試程序上的時間,提高了開發效率。但是這並不代表不會出現問題,用高級語言寫程序,有時也會出現這樣或者那樣的問題。而且出了問題,我們可能更加無所適從,因為我們有時不知道語言內部是如何實現交互的,我們也不可能瞭解每種解決方案的實現細節。彙編語言的另一個優勢就是我們必須很清楚我們寫的代碼是幹什麼的。這是因為這樣,我們寫出來的代碼沒有太多的無用代碼,幾乎每一句代碼都為我們實現了某些實質性的操作。同時由於彙編語言直接操作底層硬件,所以不會像高級語言那樣,需要一大堆的代碼先和操作系統交互,然後操作系統再操作硬件邏輯。高級語言產生的程序之所以非常大且臃腫還有一個原因是它要包含一些程序集之類的東西,可能一個程序集裏面我們只需要某一點,但是在編譯、連接產生應用程序的時候,高級語言卻將一個很大的程序集包含進來(比如説#include <stdio.h>),這使得我們的程序與彙編語言相比變得很臃腫,而且真正有用的東西並不是很多。學習彙編語言我認為還有一個好處就是使我們對於一些底層的東西更加了解和熟悉,知道在程序運行的過程中,操作系統和內存裏面到底在發生着些什麼事情,這樣更加有助於我們加深對於程序設計的理解。

通過彙編語言的學習,我認為自己學到了很多東西,可能有的時候對於一些內存裏發生的事情還不是很清楚。但是即使這樣,現階段學到的這些東西已經很有助於我對於操作系統和組成原理方面的一些內容的理解了。其實學習一門語言,有時感覺一是在學習他的語法上的內容,另一方面可能也是在學習它的一些思想。彙編語言對於語法的嚴謹性讓我們在思考問題的時候變得思維變得更加嚴謹、縝密,而不再是僅僅的想象一下就罷了。

熱門標籤