汇编语言——基础知识
目標
1、了解機器語言、匯編語言、匯編源程序、匯編程序、匯編、宏匯編程序等基本概念,正確認識學習匯編語言的重要性。
2、掌握8086處理器中各寄存器的符號表示形式、大小及主要用途。
3、理解主存的編址方式以及存儲器物理地址形成的方式。
4、理解8086處理器關于使用堆棧的有關規定,掌握堆棧操作指令的功能以及使用格式。
5、掌握數值數據及字符數據在機內的表示形式、壓縮BCD碼和非壓縮BCD碼在機內的表示形式。
6、掌握標志寄存器中各標志位的置位方式。
?
三種語言的層次關系
機器語言
匯編語言
高級語言
?
機器指令
指揮計算機完成某一基本操作的命令。
格式:
操作碼 地址碼1 地址碼2
例:將偏移地址為100的字存儲單元中的內容加2,在回送到原存儲單元中去的機器指令如下:
8306640002
其中8306H為 操作碼
6400H 為 目的操作數
02H 為源操作數
?
指令系統
機器指令面向機器,每臺計算機都規定了自己所特有的一定數量的基本指令,這批指令的全體即為該計算機的指令系統
?
匯編語言
用助記符表示機器指令的操作碼;
用變量代替操作數的存放地址;
在指令前冠以標號,用來代表指令的存放地址
匯編語言的特點:
① 所占空間、執行速度與機器語言相仿
② 直接、簡捷,能充分控制計算機的硬件功能
?
Intel 8086 微處理器簡介
通用寄存器:
AX(累加器)
BX(基址寄存器)
CX(計數器)
DX(數據寄存器) ;可以分8位使用。
指針及變址寄存器:
SP(堆棧指針寄存器)
BP(基址指針寄存器)
SI(源變址寄存器)
DI(目的變址寄存器)
IP(指令指針寄存器):用來存放下一條要執行指令在內存中代碼段中的偏移地址。
?
主存儲器
- 主存的基本存儲單位是位(bit),它能容納一個二進制數的0或1
- 字節編址:以字節為最小尋址單位。
- 8086的最大尋址空間1M
- 字的存放形式“低位在前,高位在后”
- “對準字”和“不對準字”
?
堆棧
在內存中開辟出一片存儲區,采用一端固定,另一端活動的方式存取數據
?
進棧指令 PUSH
格式: PUSH OPS
功能:將寄存器、段寄存器或存儲器中的一個字數據壓入堆棧。
(SP)-2 -> SP
例:假設(SP)=1000H (AX)= 1234H
PUSH AX
執行后:(SP)=0FFEH
注:PUSH AL ;錯誤
PUSH 0003H ;錯誤
?
出棧指令 POP
格式: POP OPD
功能:將棧頂元素(字)彈出送至寄存器、段寄存器(CS除外)或存儲器中。
(SP)+2 -> SP
例:設 (BX)=2004H
POP BX
執行后: (BX)=1234H (SP)=1000H
注:PUSH CS ;正確
POP CS ;錯誤
?
存儲器的分段管理
- 地址表示的一對矛盾:
直接尋址能力為1M (字節);
而寄存器是16位結構的。
- 解決方法:
引入了存儲器“分段”的概念,即把1M字節內存空間分成若干段。每段最大可達64K字節--可由16位寄存器進行尋址。
段的起始地址成為“段基址”,要訪問的單元距段基址的距離(字節數)為“偏移量”(Offset)。
?
程序設計時,使用的是邏輯地址。邏輯地址由“段基址”和“偏移量”構成(均為16位)。
“段基址”由段寄存器CS、DS、SS和ES提供;
“偏移量”由BX、BP、IP、SP、SI、DI或根據尋址方式計算出的有效地址EA(Effective Address)提供。
- 注意:
①每個存儲單元有唯一的物理地址,但它卻可由不同的“段基址”和“偏移量”組成。例如:
1200H:0345 -> 12345H 1100H:1345 -> 12345H
② 除非專門指定,一般情況下,段在存儲器中的分配是由操作系統負責的。
例1:設(CS)=8000H (IP)=0100H
問下一條要執行的指令的物理地址PA?
(CS)內容左移4位+(IP)
PA = 80000H+0100H=80100H
例2:設(DS)=1000H 該數據段中偏移量為0200H處的物理地址PA?
(DS)內容左移4位+偏移量
PA = 10000H +0200H =10200H
例3:設(SS)=1000H (SP)=2000H 問該堆棧段棧頂的的物理地址PA?
(SS)內容左移4位+(SP)
PA = 10000H +2000H =12000H
?
數值數據在機器內的表示形式
8086的兩個規定:
- 數值數據均指無符號定點數
- 有符號數則一律采用n位二進制補碼表示。
?
- 8086中,16位補碼的表示范圍:
7FFFH ~~ 8000H
注:機器在進行算術運算時,總是把參加運算的用補碼表示的操作數作為無符號數處理。
?
字符數據在機器內的表示形式
ASCII碼 (美國信息標準交換碼)
- 字符數據是以ASCII碼形式存放在內存中的。
例如 “1” 就是 31H
“A” 就是 41H
BCD碼
定義:利用二進制形式來表示十進制數。
利用4位二進制數(0000B~1001B)來表示十進制數(0~9)
例如: 19 = 00011001BCD
= 000010011B
?
標志寄存器
1、狀態標志:表示前面的操作執行后,算術邏輯部件處于怎樣一種狀態。
例如,是否產生了進位,是否發生了溢出等等。程序中,可以通過對某個狀態標志的測決
定后面的走向及操作。
零標志ZF(Zero Flag):若運算結果為0,則ZF=1;否則ZF=0。
例1:MOV AL, 4
SUB AL, 4
例2:XOR AX, AX
執行后,ZF也一定為1。
進位標志CF(Carry Flag):
它反映:
加法時,最高位(字節操作時的D7位,字操作時的D15位)是否有進位產生。
減法時,最高位(字節操作時的D7位,字操作時的D15位)是否有借位產生。
例如:
MOV AL, 3;
SUB AL, 4;
執行后,CF=1。
?
奇偶標志PF(Parity Flag):
若運算結果低8位中“1”的個數為偶數,則PF=1;否則PF=0。
例:MOV AL, 2
ADD AL, 1
執行后,PF位為1。
?
輔助進位標志AF(Auxiliary carrry Flag):
也稱“半進位標志”,它反映:
加法時,第3位向第4位有進位;
減法時,第3位向第4位有借位。
?
溢出標志OF(Overflow Flag):
若運算過程中發生了“溢出”,則OF=1。
定義:運算結果超出計算裝置所能表示的范圍,稱為溢出。
判斷方法之一【邏輯】:
溢出=最高位進位 ⊕ 次高位進位
?
符號標志SF (Sign Flag):
當運算結果的最高位為1時SF=1,否則SF=0。
例:分析執行下述兩條指令后,以上六個標志位的變化。
MOV BL,58H
ADD BL,4AH
解: 0101 1000B
+ 0100 1010B
1010 0010B
CF=0 SF=1 OF=1 PF=0 ZF=0 AF=1
?
2、控制標志(3位):
每一位控制標志都對一種特定的功能起控制作用。可以通過專門的指令對其進行“置位”(Set)或“復位”(Reset)。
中斷標志IF(Interrupt Enable Flag):
如果IF置“1”,則CPU可以接受可屏蔽中斷請求;反之,則CPU不能接受可屏蔽中斷請求。
指令系統中有兩條專門的指令可以置“1”或置“0” IF標志位:
STI 使IF置“1”,即開放中斷。
CLI 使IF清“0”,即關閉中斷
?
方向標志DF(Direction Flag):
用于串操作指令中的地址增量修改(DF=0)還是減量修改(DF=1)。
STD
CLD
跟蹤標志TF(Trap Flag):
若TF=1,則CPU按跟蹤方式(單步方式)執行程序。
3、標志位寄存器的操作
- 傳送
LAHF
功能:將標志位寄存器的低8位送入AH中,即:
(FLAGS)7~0 -> AH
例:執行前 (FLAGS)=0485H (AX)=0FFFFH
執行后 (FLAGS)=0485H (AX)=85FFH
?
SAHF
功能:將AH的內容送入標志位寄存器的低8位中,即:
AH ->(FLAGS)7~0
- 棧操作
PUSHF
POPF
例: MOV AX,0FFFFH
PUSH AX
POPF
結果:(FLAGS)=0FFFFH
總結
以上是生活随笔為你收集整理的汇编语言——基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MinGW-W64安装及其使用
- 下一篇: “AlphaGo之父”获最新一届ACM计