基於8086cpu的彙編語言學習總結

寄存器


  • 通用寄存器:ax、bx、cx、dx。在8086cpu中都是16位的,可拆分成兩個8位的來用,如ax可分成al(低8位)、ah(高8位)
  • 段寄存器:cs(code segment)、ds(data segment)、ss(stack segment)、es(external segment)
  • 可用於內存單元尋址的寄存器:bx、bp、di、si,其中bx、di、si段地址默認在ds中,bp的段地址默認在ss中
  • 直接尋址:不使用寄存器。[idata],idata是一個常數,在編寫彙編代碼時需要添加段前綴,否則編譯器會將[idata]解釋成一個數據,而不是內存偏移地址。                         如:ds:[idata]表示SA(段地址)=(ds),EA(偏移地址)=idata
  • 寄存器間接尋址:使用一個寄存器。只有bx、di、si、bp這四個寄存器能用於內存單元尋址。前三個的段地址默認在ds中,bp的段地址默認在ss中。如:[bx]表示SA=(ds),EA=(bx),[bp]表示SA=(ss),EA=(bp)
  • 寄存器相對尋址:使用一個寄存器加一個常數。如[bx+idata]表示SA=(ds),EA=(bx)+idata。實際應用:用於數組idata[bx],把idata想象成數組名,c/c++中數組名存的就是數組的起始地址,把bx想象成數組下標
  • 基址變址尋址:使用兩個寄存器。如[bx+si]表示SA=(ds),EA=(bx)+(si),bx和si兩個都是可變的,可用於二維結構體
  • 相對基址變址尋址:使用兩個寄存器加一個常數。如[bx+si+idata]表示SA=(ds),EA=(bx)+(si)+idata。實際應用與二維數組:idata[bx][si]。原理同一維數組類似
  • CS:IP:用於定位指令的內存地址。在8086cpu中CS:IP表示SA=(CS),EA=(IP)。每次執行完一條指令,IP會自動增加,增加的值爲所執行完指令的長度
  • SS:SP:用於定位棧空間的內存地址。在8086cpu中SS:SP表示SA=(SS),EA=(SP)。在執行push指令時,SP的值會減少,即棧頂指針向低地址方向移動,執行pop指令時則相反
  • 標誌寄存器flag:用來存儲相關指令的某些執行結果;用來爲CPU執行某些相關指令提供行爲依據;用來控制CPU的相關工作方式。
用來存儲相關指令的某些執行結果:在8086CPU的指令集中,有的指令是影響標誌寄存器的,如add、sub、mul、div、inc、or、and等運算指令;有的指令的執行對標誌寄存器沒有影響,如push、pop、mov等傳送指令。
  • ZF標誌,零標誌位。它記錄相關指令執行後,其結果是否爲零。如果是,則爲1,否則爲0
  • PF標誌:奇偶標誌位。它記錄相關指令執行後,其結果的所有位中1的個數是否爲偶數。如果是,則爲1,否則爲0
  • SF標誌,符號標誌位。它記錄相關指令執行後,其結果是否爲負。如果是,則爲1,否則爲0
  • CF標誌,進位標誌位。一般情況下,在進行無符號數運算的時候,它記錄了運算結果的最高有效位向更高位的進位值或借位值
  • OF標誌,溢出標誌位。一般情況下,在進行有符號數運算的時候,它記錄了運算結果是否發生了溢出。如果發生溢出,OF=1,否則OF=0
  • DF標誌,方向標誌位。在串處理指令中,控制每次操作後si、di的增減:DF=0,每次操作後si、di遞增;DF=1,每次操作後si、di遞減
用來爲CPU執行某些相關指令提供行爲依據:
  • adc指令,帶進位加法指令,它利用了CF位上記錄的進位值。如adc ax,ax實現的功能是(ax)=(ax)+(ax)+ CF
  • sbb指令,帶借位減法指令,它利用了CF位上記錄的借位值。如sbb ax,ax實現的功能是(ax)=(ax)-(ax)- CF
  • cmp指令,比較指令,相當於減法指令,不保存運算結果,只改變標誌寄存器中相關位的值。cmp指令格式:cmp 操作對象1,操作對象2
對於兩個有符號整數a、b,執行cmp a,b指令,通過ZF、SF、OF標誌位判斷大小:
  • a>b:ZF=0&&(OF=0&&SF=0 || OF=1&&SF=1)
  • a==b:ZF=1
  • a<b:ZF=0&&(OF=0&&SF=1 || OF=1&&SF=0)
對於兩個無符號整數a、b,執行cmp a,b指令,通過ZF、CF標誌位判斷大小:
  • a>b:ZF=0&&CF=0
  • a==b:ZF=1
  • a<b:ZF=0&&CF=1
根據無符號數的比較結果進行轉移的條件轉移指令:
  • je(jmp equal):等於則轉移
  • jne(jmp not equal):不等於則轉移
  • jb(jmp below):小於則轉移
  • jnb(jmp not below):不小於則轉移
  • ja(jmp above):大於則轉移
  • jna(jmp not above):不大於則轉移
串傳送指令:
  • movsb:將ds:si指向的內存單元中的字節送入es:di中,然後根據DF的值增減si、di的值
  • movsw:將ds:si指向的內存單元中的字送入es:di中,然後根據DF的值增減si、di的值
  • cld:設置DF=0;std:設置DF=1
  • rep movsb:根據cx的值,循環執行movsb。相當於 s:movsb;loop s

指令


  • mov:進行賦值操作。注意:段寄存器必須要通過其它寄存器來賦值,不能直接賦值;在賦值時需指定數據大小,用 byte ptr 或word ptr,如 mov byte ptr, [bx]
  • add:加
  • sub:減
  • div:除。用ax和dx兩個寄存器來存被除數。在8086cpu中被除數有16位和32位兩種情況,如果是16位,直接用ax來存,如果是32位,用ax存低16位,dx存高16位;除數有8位和16位兩種情況,如果除數爲8位,則al存除法操作的商,ah存餘數;如果除數爲16位,則ax存除法操作的商,dx存餘數
  • mul:乘。兩個相乘的數,要麼都是8位,要麼都是16位。如果都是8位,一個默認放在AL中,結果默認放在AX中;如果都是16位,一個默認放在AX中。結果高位放在DX中,低位放在AX中
  • 數據指定:dd(data double word)、dw(data word)、db(data byte),可用dub重複數據,格式:dd/dw/db 重複的次數 dup(重複的數據內容)
  • 位操作:and,or
  • loop:循環指令。通過命名標識來實現,可以嵌套循環,循環次數存儲在cx中
  • 操作符offset,放在標識名的前面,用來獲取標識名的段內偏移地址
  • jmp指令是根據位移來進行轉移的。cpu在執行jmp指令時,用jmp標號的地址減去jmp指令下一條指令地址,從而得到位移,這樣提高靈活性
  • 轉移地址在指令中的jmp指令:段內轉移:jmp short 標號(8位位移);jmp near ptr標號( 16位位移);段間轉移:jmp far ptr 標號,會同時修改CS和IP的值
  • 轉移地址在寄存器中的jmp指令:jmp 寄存器表示爲IP=(寄存器)
  • 轉移地址在內存中的jmp指令:jmp word ptr 內存單元地址(段內轉移);jmp dword ptr內存單元地址(段間轉移),IP=(內存單元地址),CS=(內存單元地址+2)
  • jcxz指令:條件指令,判斷cx是否等於0,如果c等於0,則跳轉到標號位置,否則沒有任何作用。jcxz標號 相當於 if(cx==0) jmp short 標號
  • ret指令:用棧中的數據修改IP的值,實現段內近轉移。相當於pop IP
  • retf指令:用棧中的數據修改IP、CS的值,實現段間轉移。相當於pop IP、pop CS
  • call指令:將當前的IP或CS值入棧,然後轉移
  • call 標號 相當於 push IP;jmp near ptr 標號
  • call far ptr 標號 相當於 push CS; push IP;jmp far ptr 標號
  • call 16位reg  相當於 push IP; jmp 16位reg
  • call word ptr 內存單元地址 相當於 push IP,jmp word ptr 內存單元地址
  • call dword ptr 內存單元地址 相當於 push CS,push IP,jmp dword ptr 內存單元地址
  • call 和ret指令搭配使用可實現子程序的調用
  • lea指令:把數據的內存地址載入到寄存器中。形如lea  reg,[data] 

中斷

中斷信息:
  • 除法錯誤:0
  • 單步執行:1。TF=1
  • 執行into指令:4
  • 執行int指令:int n,n即爲中斷類型碼。
中斷過程,由硬件自動完成:
  1. 從中斷信息中取得中斷類型碼:N;
  2. 將標誌寄存器的值入棧:pushf;
  3. 設置標誌寄存器的第8位TF和第9位IF的值爲0:TF=0,IF=0;
  4. CS的內容入棧:push CS;
  5. IP的內容入棧:push IP;
  6. 根據中斷類型碼,從中斷向量表中讀取中斷處理程序的入口地址,設置CS和IP的值:(IP) = (N*4),(CS) = (N*4+2)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章