汇编语言 王爽第二版 总结
匯編語言 王爽第二版 總結,所以內容都是8086的
summary asssembly ,匯編總結
why:
最初始的編程語言就是使用打孔機,打出來的0 1 代碼,然后把卡片插入到電腦中運行然后
看輸出結果,這種純01的二進制代碼,編寫困難調試困難運行結果的顯示看著也很蛋疼,就像
一個簡單的“hello world”,11個字符,需要11×8個二進制,并且再進行輸出,就更麻煩,因為
全部都是二進制,代碼。為了更高效的開發程序,就出現了匯編語言,用來代替二進制代碼的輸入。
what:
匯編語言主要由偽指令和匯編指令,和其他符號組成。
how:要想知道,匯編語言是怎么運行的,并且呈現出我們現在看到的圖形化界面,比如你敲擊
鍵盤然后在屏幕上面出現相應的字符,或者你現在正在瀏覽的網頁上面的文字是怎么顯示出來的
如果你想知道這些,那就學習匯編語言把,他會幫助你了解你想知道的并且幫助你更好學習操作
系統。
總線
cpu的外部總線總共分三種,地址總線 數據總線 控制總線
我們知道計算機一切操作轉為二進制,在轉為高低電平,也就是說在計算機的硬件層次所有信息的
傳遞就是依賴高低電平(0代表低電平1代表高電平),cpu通過總線和內存,總線就像是管道把cpu
和內存相連接,cpu相當于是一個工作站,內存就是水庫,總線就是水管,把工作站和水庫相連接
當然因為,工作站通過管道獲取需要的東西,地址總線相當于管道的位置,數據總線就是管道內部
流通的水,控制總線相當于開關。
寄存器
因為cpu和內存之間數據的傳輸以及一些其他的問題,后面我們會說到,所以就有了寄存器就相當于
c語言中的全局變量,只不過名字已經固定好了,相應的變量里面存儲的相應的內容,只不過這里的
寄存器是硬件:寄存器就是和cpu內部的一些存儲器,主要是用來存儲一些數據,提供cpu的使用,
主要分為: 段寄存器,偏移寄存器,普通寄存器,標志寄存器,
段寄存器存: cs(指令段地址) ss(棧的段地址) ds es
偏移寄存器:ip(指令) sp(棧偏移即棧頂) di si bx 這三個寄存器默認指向ds bp 默認指向cs
普通寄存器:ax dx cx dx 都是16位的寄存器,但是為了兼容以前的八位cpu就需要有八位寄存器
所以所有的16位寄存器又都可以分成倆個8位寄存器,把寄存器名字第一位不變,第二位改成:
l(low) or h(hign) such as : al ah cl ch ,這樣我們就能得到8位的寄存器。
標志寄存器:就是一個16位長的特殊結構體,就跟c語言里面bit-field一樣由相應的名字代替,
存儲一些標記用來進行一些運算,比如我們最常見的:5+18 = 23,5+8=13就需要進一位,5+8
就會導致溢出寄存器的值變為1,然后進行十位的加法時,再加上寄存器的值,0+1+1=2,就得到了
23,總共有16個標志為,可以幫我處理很多程序運行過程中的問題,特別判斷大小。
尋址方式
前面我們講到了地址總線,寄存器,這里我們就說一下,cpu怎么通過地址總線,在內存中找到相應
的地址的,我們知道16根地址總線的地址范圍就是64kb,這對于我們的程序來說太小了,為了增加
地址的范圍,我們采用了段+偏移的方法來增加尋址范圍,就像我們寫作文一樣,把文章劃分位不同
的段落,每一個段落里面都有第一句話,我們只要知道第幾段第幾句話就可以找到對應的文字
cpu 也可以通過這種方式增加尋址范圍,8086cpu的實際地址是20位,并不是我們的16位所以實際的
地址就需要段+偏移,組成20位的地址,其實很簡單,就是把段地址左移4位,然后加上偏移的
4位就構成了20位的實際地址。更進一步的說,內存是沒有段的概念的,只是cpu自己劃分的段,通過
段和偏移找到實際的地址,實際情況中可能有的程序比較大,就需要一大塊內存來管理,這個時候
16位的地址×16就是段的起始地址,16位的偏移地址就指向的段內的地址,雖然偏移是相對的,但是通過
段和偏移就是可以找到實際的地址,這樣我們程序的處理速度就會更快其實我覺得這跟數組是一樣的原理
當然了我們要理解的就是這種思想就可以了。實際cpu的尋址方式有三種,就跟我們c語言里面的定義:
常量 變量 變量+常量 變量+變量+常量
同樣cpu尋址方式,也可以通過這種 常量(直接給出地址) 變量(通過寄存器存儲的值) 變量+常量
such as : ax:[0] ax:[bx] ax:[bx+1] ax:[cx+bx+1] ax里面存儲的是段的地址
這樣通過ax里面鍛的地址找到段的地址,然后通過偏移找到實際的地址。cpu就是通過這種方式在寄存器
和內存之間互相傳遞數據,從而達到自己寫內存或者讀內存的目的。
這里就是一點就是所有的段地址都是16的倍數,并且偏移都是從0開始的。
說道這里提一下,寄存器沖突的問題,使用stack來保存寄存器的值,把子程序中用到的寄存器,在使用前
把寄存器的值全部入棧,退出子程序的時候恢復相應寄存器的值,就可以解決寄存器沖突(針對多個程序共用寄存器
的情況)。當然了也可以通過棧來一次傳遞多個參數,解決參數過多的問題,就跟我們在c語言中使用數組是一樣的
道理,這里可以使用棧也可以數組,在cpu里面就是內存。
指令
我們都知道一個程序是由一條條指令組成的,就像我們寫的c語言一樣,匯編語言也是一樣,只不過匯編語言
由匯編指令和偽指令組成,匯編指令由cpu處理,偽指令又匯編編譯器處理,我們寫的c語言都是由c語言編譯器
編譯 鏈接 最后形成二進制可執行文件,但是由于我們的cpu可以識別匯編語言,匯編語言可以直接在cpu中執行
所以就不需要編譯,這就是匯編語言厲害的一個地方,另外牛逼的地方就是可以通過地址,操作我們想做的一切
事情,做到c語言java語言等語言不能做到的,這就是我們學習它的原因,也是它的魅力,當我們用用工具把u盤
制作為啟動盤的時候,都感覺很神奇吧,學習匯編就可以慢慢揭開這些神秘的面紗,你也可以通過自己寫的程序
制作u盤啟動盤,這都不是問題,關鍵的問題是,你要了解不同cpu的指令。當然了我覺得現在cpu更新換代很快
但是不用擔心,這些都是有標準的,只是個別地方不一樣而已,并且都會有說明哦。說了這么多,就讓我們寫一個
最簡單的ax = 1,ax = ax +1 吧。
mov ax, 1;把ax寄存器存儲為1 即0001H ,h表示是16進制
add ax, 1; ax = ax + 1
匯編指令一般分為:轉移指令,跳轉指令,對比指令
轉移指令:其實和c語言中的賦值語句道理一樣,跳轉指令就是跟go語法是一樣的通過一個標記,判斷就是if else….
轉移指令:mov push pop
跳轉指令:jump loop call ret iret
對比指令:cmp 判斷倆個值的大小 結果存在標志寄存器中,通過判斷指令可以得到判斷結果
條件跳轉指令:jcxz je jne ja jna jb jnb 通過字面意思就可以理解,jcxz 等于 je就是判斷等于(if 語句)
jne 就是不等于 ja就是above 高于jb blow 就是低于的意思,通過cmp 對比然后使用判斷語句(相當于if 判斷語句)
我們的if語句就是通過這些實現的。
數據格式: db:(byte 類型) dw(一個字倆個字節) dd(double word ,雙字節)
操作數據: add sub mul div 分別是: 加 減 乘 除; inc(自增 類似于 ++ ) dec(自檢)
操作標志寄存器:popf pushf std ctd 等,可以查看相關的資料
重復操作: rep db ’a‘ 根據cx 寄存器的值,連續分配cx個內存但原來存儲a,
移動操作: movb movdw movdd 一次復制 byte word dword 大小的數據從一個地址到另外一個地址 根據相應的寄存器
存儲的地址,以及偏移,并且會自動把存儲偏移的寄存器的值加1
內部中斷
所謂中斷,就是打斷cpu正在處理的事情(當cpu處理完正在執行的指令),然后讓cpu來處理你提交的事情。
以前我知道bios就是basic input and output基本輸入輸出但是也就僅此而已了,看完匯編之后我我知道了,
就是使用中斷來調用已經寫在內存的輸入輸出方法。cpu使用一個表來存儲所有硬件提供的中斷方法的地址,
中斷向量表中存儲的相應方法在內存中的地址,中斷發生后,去中斷向量表找到對應的地址,然后跳轉過去
執行執行完畢,中斷結束,繼續下一條指令。內中斷主要指的是cpu內部的中斷,中斷信息來自cpu內部比如
除法錯誤 單步執行 執行into指令 執行int 指令,我們還知道cpu有端口可以用來連接外部設備比如鍵盤鼠標等,那么鍵盤
輸入怎么處理的呢,鍵盤輸入一個字符后,就調用相應的外部中斷,告訴cpu我這里有輸入信息,然后cpu就會處理,然后我們
就在屏幕上看到了剛才輸入的字符了,由外部設備發出的中斷就是外部中斷。
中斷 原理
中斷首先要把你寫好的中斷程序,放到一個穩定的安全的內存中,然后把程序的地址偏移放到中斷表中,這就是中斷程序的安裝
過程,然后就是根據你的中斷向量的在中斷向量表中的下標來調用,8086cpu 中斷調用是用關鍵字 int +中斷向量下標,就可以調用了。
程序的編譯 鏈接 運行調試
masm link debug 這些工具打包放到這里:
http://pan.baidu.com/s/1c2kEHXI
http://pan.baidu.com/s/1qYQnHFm 我寫的練習
總結
看著本書主要就是打一個匯編的基礎,讓你對地址、數據、指令有一個明確的認識,知道一個程序是如何運行起來,cpu通過各種寄存器來區分
誰是數據,誰是指令的,讓你明白這種處理邏輯,流程以及處理問題的思想,當然了我覺得看完這個之后,在去看操作系統組成原理等書,會
事半功倍,因為匯編會讓你對系統的底層有一個清晰的認識,底層了解了再去學上層的操作系統就會有一種恍然大悟的感覺,了解操作系統的發展
你才會對他肅然起敬,因為這些都是最好的程序員科學家們的結晶,你每天在用的東西就是無數個牛人寫出來的,雖然我只是在使用計算機
但是我覺的這就像是跟他們在交流一樣,難道你不覺得你在鍵盤上打出一個字符就會在屏幕上顯示出一個字符這是很神奇的一件事情嗎?在這個
大家習以為常的背后到底隱藏了多么深奧的知識歷經了幾代人的發展呢,我想作為一個優秀的計算機學習人員一個都需要掌握。學習技術發展史
的重要意義正在與此:追溯的歷史越久遠,技術的脈絡就變得越清晰。
總結
以上是生活随笔為你收集整理的汇编语言 王爽第二版 总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端搭建小人逃脱游戏(内附源码)
- 下一篇: 两轮电自2.0时代开启 小牛电动以独立主