題外話:學好彙編,建議大家看王爽老師的《彙編語言》 清華大學出版社
圖書配套網站 彙編網:http://www.asmedu.net/ 討論氛圍非常好。
JRH的彙編網博客(賣弄一下呵呵):http://www.asmedu.net/blog/user/usermain.jsp?neighborId=39135
----------------------------------------------------------------------正文------------------------------------------------------------
Author:JRH from XJTU CS 09 2011-7-10
彙編語言考前總結
第一章基礎知識
【大綱要求】
1.掌握常用的各種進制數的表示、轉換規則和運算;
2.掌握帶符號數的碼製表示方法及其補碼運算;
3.熟悉數據的表示範圍;
4.瞭解計算機存取信息的基本數據類型;
5.瞭解計算機中字符的表示;
6.熟悉幾種基本的邏輯運算;
7.什麼叫彙編語言。
【思考題】
1. 計算機內部是採用什麼計數制來表示數和信息的?
二進制
2. 十進制數轉換爲二進制數有幾種方法?
降冪法、除法
3. 二進制數和十六進制數是如何相互轉換的?
二進制到十六進制:從低到高四位一組,直接用十六進制數表示。
4. 計算機中如何表示正負數的?
原碼、反碼、補碼
●5. 計算機中的整數有幾種表示方法?最常用的是哪一種碼制?
6. 基本的邏輯運算包括哪幾種運算?
與、或、非、異或
7. 求補的運算規則是什麼?
除符號位,按位取反最後加一
8. 計算機中是採用什麼代碼來表示字符的?
ASCII碼
第2章 80X86 計算機組織
【大綱要求】
1.熟悉計算機系統的組成;
2.熟練掌握8086/8088CPU的寄存器組;
3.掌握80X86CPU的寄存器組;
4.掌握存儲器地址的分段表示及其物理地址的計算;
5.熟悉段的引用規定。
1.微計算機系統一般包括哪兩部分?
硬件和軟件
2. 8086 微處理器主要由哪幾部分組成?它們的功能是什麼?
算術邏輯部件ALU(arithmetic logic unit):進行算術和邏輯運算。
控制邏輯:負責全機的控制工作。
工作寄存器:相當於運算器中的一個儲存單元,存放計算過程中所需要或所得到的各種信息(地址、數據、中間結果)
3.一個字節和一個字分別由幾個二進制位組成?
8位 16位
●4.在Intel系列微型機中是如何編址的?
5.一個字節和一個字在存儲器中是如何存儲的?
字節:8bit存放一個字節
字:低位字節存入低地址,高位字節存入高地址
6.字單元的地址是偶數或是奇數時,訪問存儲器有什麼不同?
字單元的地址用其低位地址表示,因爲以偶地址訪問(讀/寫)存儲器,,一次讀一個字節長度。如果字單元地址是偶數,那麼訪問一個字只需一次,而如果字單元地址是奇數,訪問一個字序兩次。
7.8086微型機可以訪問的最大存儲空間是多少?應用幾位地址來表示?
1M 20位地址
8.在8086微機中,如何提供20位的地址?如何形成物理地址?
儲存器採用分段管理,一個內存單元地址由 段基址:偏移量 兩個邏輯地址來描述。
物理地址=10H×段寄存器 + 偏移地址
9.8086微機中,存儲器空間可分爲幾種邏輯段?每段的可尋址空間是多大?段地址存放在哪些寄存器中?
4種。64K。代碼段CS寄存器、數據段DS寄存器、堆棧段SS寄存器、附加段ES寄存器
10.CPU中有哪幾類寄存器,它們各自的專門用途是什麼?
數據寄存器:AX:累加器,乘除指令存放操作數,I/O指令使用其與外設傳送信息
BX:通用,常用作基址寄存器
CX:計數器(移位指令、循環指令、傳處理指令)
DX:雙字長運算(和AX組合)存放高位字,I/O操作存放I/O端口地址(對256~65535號端口讀寫時用)。
指針及變址寄存器:SP:存放當前堆棧棧頂偏移量,總是和SS堆棧寄存器配合
BP:存放地址偏移量或數據,缺省和SS配合
DI:存放串數據的目的地址偏移量(或數據)若存放偏移量時,缺省情況與DS配合。
SI:存放串數據的原地址偏移量(或數據)若存放偏移量時,缺省情況與DS配合
控制寄存器:IP:存放代碼段中的指令地址偏移量,始終指向下一條即將執行的指令的首地址,控制器根據指令字長自動增加
FLAGES
段寄存器: CS:存放當前正在運行的程序代碼段基地址
DS:指定當前運行程序所使用的數據段基地址
SS:指定堆棧段位置,存放堆棧段的基地址
ES:指定當前運行程序所使用的附加數據段基地址
11.條件碼標誌和控制標誌各包含幾位?它們每位所表示的意義是什麼?
條件碼標誌位用於記錄程序運行結果的狀態信息,共6位:
OF 溢出標誌
SF 符號標誌
ZF 零標誌
CF 進位標誌
AF 輔助進位標誌
PF 奇偶標誌
控制標誌位控制處理器的操作,要通過專門的指令才能使控制標誌位變化。
DF 方向標誌
IF 中斷標誌
TF 陷阱標誌
12.什麼是DOS和BIOS功能調用?
第三章80x86的指令系統和尋址方式
●1.什麼是指令和指令系統?指令在什麼時候由哪部分來執行?
指令:
指令系統:一組指令集。計算機所能執行的所有指令的集合就是指令系統。
算術邏輯單元執行。
2.8086彙編語言指令由幾部分組成?各部分的作用是什麼?
操作碼字段:指示計算機所要做的操作
操作數字段:指出在指令操作過程中所需要的操作數
3.8086彙編語言指令可以有幾個操作數?指令中指定的操作數可能存放在哪裏?
零地址指令:ret
一地址指令:inc ax
二地址指令:mov ax,[2000h]
三地址指令:很少用
存放在:指令中、寄存器中、內存單元中、I/O接口寄存器中
4.什麼是尋址方式?8086彙編語言提供了幾種尋址方式?
1.(太哲學了!!!!)
2. (這樣的問題很×疼)
尋址方式實際上非常之容易:記住四個寄存器:
BX,BP;
DI,SI;
可以
單獨使用 如MOV AX,[BX] MOV AX,[SI]
組合使用,但只能BX,BP中的一個和DI,SI中的一個搭配 如MOV AX,[BX+SI]
而MOV AX,[BX+BP]及MOV AX,[DI+SI]是錯誤的!
當然可以加常數如MOV AX,[BX+SI+5]
知道這些後自己再對應其名字吧,什麼“基址變址”什麼××× . 會用就行。
5.各種尋址方式所確定的有效地址是什麼?
偏移地址
6.在存儲器尋址方式中,爲什麼有時候要使用段跨越前綴?
段跨越前綴用以指定段寄存器
7.8086機器語言指令由哪幾個字節組成?爲什麼說彙編語言指令與機器指令是一一對應的?
8086機器語言指令是多字節指令,一條指令可以由1~7個字節組成。
具體見P49
8.8086的指令系統按功能可分爲幾組?
數據傳送指令,算術指令,邏輯指令,傳處理指令,控制轉移指令。
9.每條指令的功能、助記符、所支持的尋址方式、對標誌位的影響、需要預置的參數以及隱含使用的或限定使用的寄存器等。
這個得好好看,看書吧。
第四章彙編語言程序格式
【大綱要求】
1.瞭解機器語言和彙編語言的基本概念;
機器語言:
彙編語言:
2.掌握彙編語言語句的種類;
指令、僞操作(也叫僞指令)和宏指令
3.掌握常用的僞指令;
處理器選擇僞操作:.8086
段定義僞操作:
完整段定義僞操作
簡化段定義僞操作
數據定義及儲存僞操作:DB、DW、DD、?、DUP、LABLE
表達式賦值僞操作:EQU
地址計數器與對準僞操作:
$:指令中--當前所在彙編的指令的首地址;僞操作參數字段—地址計數器當前值
ORG:設置當前地址計數器的值
應用例:BUFFER LABEL BYTE
ORG $+8
相當於:BUFFER DB 8 DUP(?)
EVEN:使下一個變量或地址開始於偶地址
ALIGN:保證雙字數組邊界從4的倍數開始
基數控制僞操作:.RADIX expression
4.掌握彙編語言語句的格式;
名字 操作 操作數 註釋
5.熟悉彙編語言程序的上機過程。
編輯程序、彙編程序、連接程序、調試程序
【學習目標】
瞭解編輯程序、彙編程序、連接程序的功能及其輸入、輸出文件的類型;
編輯程序文本文件->asm 彙編程序 ->obj 與lst 連接程序->exe
●瞭解彙編語言源程序的格式;
●熟練掌握並運用段定義僞指令和數據定義及存儲器分僞指令;
●熟悉數值表達式書寫規範;
學會使用DEBUG調試程序
一些命令:D T U R 等等
【思考題】:
1. 建立並運行一個彙編語言程序有幾個操作步驟?
編輯程序、彙編程序、連接程序、執行程序
2. 指令和僞指令的區別是什麼?
指令在程序運用期間會被計算機執行,而僞指令是在彙編程序對源程序進行彙編時處理的操作。
3. 在彙編語言程序中,段定義僞指令和數據定義僞指令起什麼作用?
(很哲學)
段定義爲指令作用:
數據定義爲指令作用:
4. 變量和標號的類型屬性分別有哪幾種?
3種屬性
段、偏移及類型。
對於標號:段(CS)、偏移、類型(near、far)
對於變量:段、偏移、類型()
●5. 什麼是表達式?表達式的優先級順序是如何排列的?
6. 彙編語言的上機過程是什麼?
編輯程序、彙編程序、連接程序、調試程序
7. 彙編語言源程序一般由幾個段組成?
一般有數據段、代碼段、堆棧段
●8. 彙編程序和連接程序的輸入、輸出文件有哪些?它們的作用是什麼?
彙編程序:輸入:asm文件 輸出:obj文件
連接程序:輸入:obj文件(加上庫文件和其他目標文件) 輸出:exe 文件
彙編程序主要作用:
檢查源程序;測出源程序中的語法錯誤並給出出錯信息;產生源程序的目標程序,並可給出列表。
第五章循環與分支程序設計
【大綱要求】
1.掌握彙編語言程序設計的基本步驟;
2. 熟練掌握順序、分支和循環程序設計方法;
3. 掌握彙編語言程序常用的幾種退出方法;
4. DOS系統功能調用。
【學習目標】
瞭解並掌握循環程序的構造方法,尤其是對循環控制條件的設置以及可能出現的邊界情況的考慮。
掌握起泡排序算法這種多重循環程序設計中的常用方法。交換標誌位的設置在此算法中更能提高效率。
學會在數組排序算法中採用折半查找法來提高查找效率。
學會使用跳躍表法實現CASE結構。
【思考題】
1. 編制一個彙編語言程序分哪幾步?
分析題意,確定算法
根據算法,畫出程序框圖
根據框圖編寫程序、
上機調試程序
2. 循環程序有哪兩種基本結構?由幾部分組成?
DO_WHILE與 DO_UNTIL
三部分:設置循環初始狀態
循環體
循環控制部分
●3. 設計算法時對可能出現的邊界情況如何考慮?
4. 如何設置邏輯尺?
練習程序:
assume ds:data
data segment
x dw 1,2,3,4,5,6,7,8
y dw 1,2,3,4,5,6,7,8
z dw 8 dup(?)
logic_rule dw 5h
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
mov si,0
mov dx,logic_rule
next:
mov bx,x[si]
mov bp,x[si]
shr dx,1
jc one
add bx,bp
jmp short result
one:
sub bx,bp
result:
mov z[si],bx
add si,2
loop next
mov ax,4c00h
int 21h
code ends
end start
由於logic_rule 設爲00000101,實現在對x,y相應進行 —+—+++++
5. 起泡排序算法用彙編語言如何實現?
;冒泡排序
;author JRH
;2011.7.10
assume ds:data
data segment
a dw 1,4,2,5,7,9,6,3
data ends
code segment
start:
mov ax,data
mov ds,ax
mov cx,8
dec cx
lop1:
push cx
mov dx,0
mov si,0
lop2:
mov bp,a[si]
cmp bp,a[si+2]
jnb go_on
xchg bp,a[si+2]
mov a[si],bp
mov dx,1 ;標誌位
go_on:
add si,2
loop lop2
pop cx
cmp dx,0
jz over
loop lop1
over:
mov ax,4c00h
int 21h
code ends
end start
●6. 如何理解數組排序算法中採用的折半查找法?
7. 如何使用跳躍表法實現CASE結構?
例:
;author JRH
;2011.7.10
assume ds:data
data segment
branch_table dw rout1,rout2,rout3,over,over,over,over,over
jump_rule dw 2h ; 00000010B ,這裏“跳”rout2 .
data ends
code segment
start:
mov ax,data
mov ds,ax
lea bx,branch_table
mov ax,jump_rule
keep:
shr ax,1
jnb not_yet;IF CF=0
jmp WORD ptr [bx]
rout1:
mov cx,1
jmp over
rout2:
mov cx,2
jmp over
rout3:
mov cx,3
jmp over
not_yet:add bx,type branch_table
jmp keep
over:
mov ax,4c00h
int 21h
code ends
end start
第六章子程序結構
【大綱要求】
1.掌握子程序結構和參數傳遞;
2.熟練掌握嵌套子程序和遞歸子程序設計;
3.熟悉MASM提供的結構僞操作STRUC;
4.熟練運用子程序編程。
【思考題】
1. 子程序調用和返回時需要保護與恢復哪些寄存器?
一般而言子程序用到的寄存器是應該保存的。但如果使用寄存器在主程序與子程序之間傳遞參數的話,這種寄存器不用保存。
2. 子程序的參數傳送有幾種方法?
寄存器、堆棧、地址表
3. 僞操作STRUC的用途是什麼?
使用STRUC可以把不同類型的數據放在同一數據結構裏。
具體實現:
4. 子程序嵌套與遞歸的區別?
第七章高級彙編語言技術
【大綱要求】
1.熟練掌握宏彙編;
2..掌握重複彙編;
3.熟悉條件彙編。
【學習目標】
瞭解並掌握宏彙編、重複彙編及不定重複彙編、條件匯
編和高級語言結構編程技術。
【思考題】
1. 宏彙編技術與子程序技術相比有哪些優、缺點?它們的工作方式有何差別?
宏彙編
優點:多參數傳送
缺點:調用次數較多時佔用較大空間,比較適用於代碼較短且變元較多的情況
工作方式差別:
在源程序中通過寫宏名來調用宏,而子程序則通過call調用
宏彙編是在彙編階段展開,宏調用多少次就展開多少次,因而主程序長度會因此變長。而子程序是在程序執行時調用,它只佔有自身大小的一個空間。
2. 虛參與實參是否應一一對應?
不一定。實參可以比虛參個數多,相應多的部分不做處理;實參也可以比虛參個數少,相應少的部分做“空”處理。
3. 啞元表中的變元可以取何種值?
4. &操作符及%操作符如何應用?
必須掌握,見P263+
5. 宏定義體內的程序段有標號怎麼辦?
爲防止展開後出現標號多重定義,使LOCAL操作。LOCAL操作只能用在宏定義體內,且必須是MACRO僞操作後的第一個語句。
●6. 宏定義允許嵌套、遞歸調用嗎?
在宏定義中允許宏調用,其限制條件是:必須先定義後調用。同時,宏定義體內還可以包含宏定義。
7. IRP與IRPC之間的區別?
IRP的自變量表可以是常數、符號和字符串,重複次數由自變量表中的自變量個數確定。
IRPC的自變量表必須是字符串,重複次數由該字符串中字符個數確定。
例:
irp reg,<AX,BX,CX>
push reg
endm
irpc k,<ABC>
push k&X
endm
8. 條件彙編中有哪幾種條件?
IF IFE IF1 IF2 IFDEF IFNDEF IFB<argument> IFNB<argument>
見P281
9. 高級語言結構中有哪幾種形式?
見P293
題:編寫一條宏指令CRLF,實現回車換行功能
CRLF MACRO
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
ENDM
第八章 輸入輸出程序設計
【大綱要求】
1.瞭解輸入輸出程序設計概念;
2.掌握查詢方式傳送數據程序設計;
例如:
WAIT: IN AL,72h
TEST AL,80h
JE WAIT
注意:端口號如果在256~65535則應放在DX中。
查詢方式優點:可以安排幾個輸入輸出設備的優先次序,依次查詢
缺點:CPU在外設沒有準備好之前一直在查詢等待,不能進行別的操作,效率低。
3.熟悉中斷方式傳送數據程序設計。
中斷優點:避免了因反覆查詢外部設備而浪費時間,提高CPU效率
取與設置中斷向量:
;----------------------------這個應該不用掌握------------------------------------------------
﹡直接讀寫內存:例如int N的中斷處理程序的 IP放在N*4 ,CS放在N*4+2。
所以可以:
設置:如我想將ip=200h,cs=0處開始的程序作爲7號中斷的處理程序則
mov ax,0
mov es,ax
mov word ptr es:[7*4],200h
mov word ptr es:[7*4+2],0
取中斷向量就很顯然了,不再贅述。
;-----------------------------------------------------------------------------------------------------
教材(沈書)是下面這個:
﹡運用DOS功能調用:
同上例
MOV AX,200H
MOV DX,AX
MOV AX,0
MOV DS,AX
AH=25h
AL=7
INT 21H
中斷與子程序調用相比:中斷還需保存FLAGS的內容。中斷返回用IRET
第九章 BIOS和DOS中斷
【大綱要求】
1. 掌握鍵盤和顯示器I/O的BIOS/DOS中斷程序設計;
鍵盤:
BIOS鍵盤中斷:INT 16H
DOS鍵盤中斷:INT 21H
功能:AH=1 從鍵盤讀入一個字符並回顯
AH=0AH 從鍵盤讀入一串字符並把它存入用戶定義的緩衝區中。DS:DX爲緩衝區地址。
AH=0CH 清除緩衝區
AH=0BH 檢驗鍵盤狀態
顯示器:
可以採用直接寫顯示儲存單元的方法。
BIOS顯示器中斷:P359
DOS顯示器中斷:P365
2. 熟悉打印機I/O的BIOS/DOS中斷程序設計。
第十三章 模塊化程序設計
【大綱要求】
1.掌握模塊化程序設計的基本概念;
把一個總體任務分成具有明確子任務的程序模塊,分別編制調試後再將它們連接在一起,形成一個完整的程序。這樣的程序設計方法叫做模塊化程序設計。
2.掌握段的完整定義和段的簡化定義的用法;
完整定義:name segment 定位類型 組合類型 類別
簡化定義:.CODE
.STACK [大小]
.DATA
3.掌握模塊間的通信的編程方法;
多個模塊之間的通信方法:
(1)用外部符號定義共享參數和過程
PUBLIC 與EXTRN的使用
(2)利用common
●4.熟悉子程序庫的建立和使用的編程方法;
5.彙編語言程序與高級語言程序的連接。
直接插入法 _asm
將彙編語言程序作爲外部子過程來調用。
教材:《80x86彙編語言程序設計》沈美明 溫冬嬋
參考資料:計算機系彙編語言教學大綱
彙編語言複習 ---- Dr. Xingjun Zhang