匯編語言(第3版)王爽

一、基礎知識

mov ax,bx把BX內容送到AX中。匯編語言有3類指令,匯編指令、偽指令,其他符號。CPU通過地址總線、控制總線、數據總線實現數據的讀寫。數據總線的寬度決定了CPU和外界的數據傳送速度。匯編指令是機器指令的助記符,同機器指令一一對應,只是寫法不同而已。主存是RAM,一般顯卡有顯卡RAM。CPU在操作物理器件如顯卡、網卡等時,實際上是這些設備都在物理存儲器中有對應的空間,CPU操作的是他們對應的這段空間(在其中讀寫數據)。

二、寄存器

對8086CPU,其寄存器都是16位的,AX,BX,CX,DX用來存放一般性的數據,被稱為通用寄存器,為兼容其上一代CPU中寄存器為8位的情況,這四個寄存器都可分為兩個可獨立使用的8位寄存器使用,由X分為H和L,如AX可分為AH和AL。16進制也可直接加,如4E20+1406=6226H,如原來AX中是00C5H,經過add al,93H,al與C5H相加得到158H,然后高位1丟失(只是寄存器不能保存,但CPU并不真是丟棄這個進位值)。進行數據傳送或運算時,兩個操作對象的位數應一致,如mov ax,bl有問題,mov al,100H是將一個高于位的數存放到8位寄存器中,也有問題。8086CPU的上一代8080、8085等是8位機,8086有20位地址總線達到1MB尋址能力,8086CPU又是16位結構,它實際是兩個16位地址合成的方法來形成一個20位的物理地址,物理地址=段地址16(左移4位)+偏移地址,應用到CPU尋址上,段(SA)16+偏移(EA)找到對應內存,因此段的起始地址是16的倍數,偏移為16位,因此大小為64KB,可根據需要將地址連續、起始地址為16的倍數的一組內存單元定義為一個段。8086CPU有4個段寄存器,CS、DS、SS、ES,CS為代碼段寄存器,IP為指令指針寄存器,在8086PC機中,設CS內容為M,IP內容為N,則8086CPU將從內存M*16+N單元開始讀取一條指令并執行即CS:IP中的指令作為當前指令,從CS:IP中讀取的指令放入指令緩沖器,IP在操作過程中會自加,8086CPU加電啟動后CS和IP被設置為FFFFH和0000H。 mov可改變通用寄存器的值,其指令被稱為傳送指令,但不能改變CS、IP中的值,他們需要轉移指令,如jmp,可用jmp 段地址:偏移地址,若只改IP用jmp 某一合法寄存器,如jmp ax,在Debug下,查看內存時對應ASCII會顯示,如果對應無可顯示內容,如0AH,則會可能會顯示為...(點點點)。

三、寄存器(內存訪問)

DS寄存器用來訪問數據的段地址。如mov bx,1000H mov ds bx mov al,[0]相當于把10000H的數據讀到al中,其中[0]是內存單元的偏移,其段地址會從ds中找,因為數據不能直接mov到段寄存器中,所以要用通用寄存器中轉,但內存單元,如[0]可直接到段寄存器。除mov,操作還有add,sub,jmp。 在基于8086CPU編程時,可將一段內存當作棧來使用,push,pop,其入和出都是以字為單位的,如以10000H~1000FH內存用作棧,壓棧時以10000H為頂,段寄存器SS存放棧頂的段地址,即10000H,寄存器SP存放偏移地址,任意時刻SS:SP指向棧頂,入棧時棧頂從高向低地址方向增長,當棧為空時,不存在棧頂,SS:SP只能指向棧的最底部單元下面的單元,如一個空棧先壓入再pop,則之前的數據會依然存在,但它們已不在棧中(可直接用地址訪問到但不能用棧操作),再次push會覆蓋掉這些內容,對棧CPU并未設置越界保護如push,pop過頭,可自己判定,push,pop的對象可是通用、段寄存器及內存(如設置ds后,push [0]),如要清空AX中內容,用sub ax, ax而不用mov ax, 0因為后者的機器碼為3個字節而前者只用2個,除此外還有and,xor(指令短且最快),壓棧時是SP先減2,再壓棧的,可根據空棧時壓棧想象,對一個大小設定為64K的棧,如棧滿了還繼續壓棧,則棧頂將環繞,覆蓋原來棧底的內容,段是自己定義的,對一段內存,可以既是代碼既是存儲空間,又是數據存儲空間還可是棧空間。

四、第一個程序

codesg和ends是一對成對使用的偽指令,其功能是定義一個段,需要也一個段名,至少有一個代碼段。end偽指令標識整個程序結束,assume偽指令假設某一段寄存器和程序中的某一個段相關聯,如assume cs:codesg將自定義的代碼段codesg和cs聯系起來,mov ax,4c00H int 21H用于程序返回。

五、[BX]和loop指令

[bx]表內存單元的偏移,約定符號idata表常量。inc bx表bx中的內容加1。loop 標號,cx里是執行次數,標號:指令。可mov ax,[bx]也可mov al,[bx]。在匯編源程序中,數據不能以字母開頭,如要寫成mov ax,0ffa3H。在debug下可直接用[0]表偏移為0,但在masm的匯編源程序中,此值表示數字0,有時可經bx再[bx]傳入或直接指明段地址所在的段寄存器,如mov al,ds:[0]。附加段寄存器ES:存放當前執行程序中一個輔助數據段的段地址。

六、包含多個段的程序

定義段后,可用dw(define word)定義字型數據,且這些數據處于代碼段的最開始位置。如前面設置個入口地址標志start,后面加end start則由end指定程序的開始位置是start,如果只用end則表示程序結束,可在前面定義數據,后面不規則指定開始標志。程序剛開始assume cs:code時系統會為其分配空間。將段用于棧可mov ax,cs mov ss,ax mov sp ,10H(指定頂)。

七、更靈活的定位內存地址的方法

and,or。db 'unIX',mov al,'a'。ASCII大小寫差20H,即在第6位上大寫為0,小寫為1,可用and/or方式轉換大小寫。可用[bx+idata]方式指定內存單元或idata[bx](如0[bx],5[bx]此方式同C語言中的下標如a[i],b[i]),[bx].200等。SI、DI是8086CPU中和BX功能相近的寄存器,如設置SI為源位置,DI為目標位置進行復制操作,[bx+si]或[bx+di],也可寫成[bx][si],[bx][di],[bx+si(di)+idata]或idata[bx][si]或[bx].200[si]或[bx][si].200,可認為idata是一個常量,而bx,si,di是變量。對于多層循環,可先把外層cx保存起來,內層循環退出后再恢復,可用棧的方式臨時保存數據。

八、數據處理的兩個基本問題

bx,bp,si,di可單獨使用,但bx與bp不能同時使用,si與di不能同時使用。直接包含在機器指令中的數據(執行前在CPU的指令緩沖器中),在匯編語言中稱為立即數(idata),bp類似sp段地址默認在ss中。尋址方式有:直接尋址,寄存器間接尋址,寄存器相對尋址,基址變址尋址(bx/bp+si/di),相對基址變址尋址。顯示指明數據操作單位長度:X ptr其中X為word或byte,如mov word ptr ds:[0],1,inc是16位,但inc si只是增加1。div是除法,除數是8位時被除數為16位放在AX中,商在AL,余數在AH,除數是16位時被除數為32位,高位16位在DX,低16位在AX中,商在AX,余數在DX中。偽指令dd用來定義dword(double dword類型),偽指令dup用于數據重復,db(dw,dd) 次數 dup (重復的數據)。

九、轉移指令的原理

操作符offset用來取標號的偏移地址,如offset start,結果是一個數字。jmp無條件,分段間、段內短轉移(-128127)、段內近轉移(-3276832767)。jmp short 標號,段內短轉移,使用jmp 標號時,會被轉成jmp 對應標號處指令的地址,然后其機器碼可能為EB03看不到目標地址,其中03是跳轉的偏移量,jmp short 標號的功能是(IP)=(IP)+8位位移(可能為負值),jmp near ptr 標號是16位,jmp far ptr 標號段間轉移(遠轉移),如對應機器碼為EA 0B 01 BD 0B其中高地址BD 0B是段地址,0B01是偏移地址。轉移地址在內存中的格式為:jmp word ptr 地址(段內轉移)或jmp dword ptr 地址(段間)(高地址字是段地址,CS=內存單元地址+2,IP=內存單元地址)。jcxz有條件轉移(所有有條件轉移指令都是短轉移),當(cx)=0時轉移不為0時不轉移。loop所有的循環指令都是短轉移。jmp short,jmp near ptr, jcxz,loop,在機器碼中包含的是位移(由補碼給出)而不是目的地址,此設計是為了程序段在內在中浮動裝配。

十、CALL和RET指令

ret指令用棧中的數據,修改IP實現近轉移,retf修改CS和IP實現遠轉移。call指令將當前IP或CS和IP壓入棧中然后轉移,且不能實現短轉移,轉移方式可是jmp near ptr 標號(16位偏移),或jmp far ptr 標號,或轉移地址在寄存器中,如call ax,或轉移地址在內存中如call word ptr 地址(只改IP)或call dword ptr 地址(改CS、IP)。mul只能是88位(一個默認在AL中,另一個在reg或內存中,結果在AX)或1616位(一個默認在AX中,另一個在reg或內存中,結果高位在DX,低位在AX)。

十一、標志寄存器

8086CPU中標志寄存器有16位,其中存儲的信息通常被稱為程序狀態字(PSW),有ZF(零),PF(奇偶),SF(符號),CF(進位),OF(溢出)(CF是對無符號數運算有意義的標志位,而OF是對有符號數運算有意義的標志位,兩者是獨立的,用哪種只與數是否有符號有關)。利用adc可對任意大的數據進行加法,對于連續兩個inc si,inc不會改變cf標志,add可能會修改cf,前面的adc需要加上cf,所有有時不能用add 2來代替inc,sbb帶借位減法。cmp比較指令,功能相當于減法只是不保存結果,執行后將對標志寄存器產生影響,如cmp ax,ax不改變ax的值,但zf,pf=1,sf,cf,of=0。常用無符號轉移指令:je,jne,jb,jnb,ja,jna。DF方向標志位,為0每次si、di遞增,為1遞減,串傳指令:movsb將ds:si指向的內存單元中的字節送入es:di中,再根據df將si和di遞增或遞減,也有movsw,配合rep使用如rep movsb,movsw,根據cx值確定次數。cld命令是設置df=0。pushf將標志寄存器的值壓棧,popf反之。在debug中,of對應OV,NV,sf對NG,PL,zf對ZR,NZ等。

十二、內中斷

內中斷可有除法錯誤(中斷類型碼為0),單步執行(1),執行into指令(4),int(指定),中斷類型碼的作用就是用來定位中斷處理程序。iret指令的作用是彈出IP、CS,及popf。

十三、int指令

int 10h顯示到屏幕。

十四、端口

對端口的讀寫用in,out。移位指令:shl,shr,移動次數放在cl中。BCD碼是以4位二進制數表示十進制數碼的編碼方法。

十五、外中斷

如鍵盤int 9。

十六、直接定址表

十七、使用BIOS進行鍵盤輸入和磁盤讀寫

鏈接:https://pan.baidu.com/s/1IwWYAS_rlEib0cZIhamFaA 密碼:mnii

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎入門學習匯編語言》系列視頻的筆記,在此感謝他和像他一樣...
    Gibbs基閱讀 37,334評論 8 114
  • 計算機通過執行指令序列來使機器得以工作,所以對于每一系列的計算機都有指定的一組指令集供計算機使用,這組指令...
    未來科技工作室閱讀 8,077評論 1 10
  • 王爽匯編全書知識點大綱 第一章 基礎知識 機器語言 匯編語言的產生 匯編語言的組成 存儲器 cpu對存儲器的讀寫 ...
    2c3ba901516f閱讀 2,439評論 0 1
  • # 常見匯編代碼 # 1. 編寫程序:比較AX,BX,CX中帶符號數的大小,將最大的數放在AX中 code...
    喝豆腐腦加糖閱讀 2,649評論 0 0
  • 路遠情如舊,箋頻愛更期。 性格才貌互心儀。 遙望數年甜蜜,相見不相惜。 北俊千花放,南矯百雪積。 冗雜零碎惹分歧。...
    忘了寵愛閱讀 405評論 0 2