彙編語

就是電腦中的一種語言,它編的程式也需要轉換成機器語才能運行。這種語言現在已不常使用,多用做底層開發,和編功能簡單的小程式。

基本介紹

  • 中文名:彙編語
  • 外文名:Assembly Language
簡介,中斷向量號表,

簡介

編彙編語程式的工具有Debug等,Delphi等一些高級開發工具也支持內嵌彙編語。下面我來介紹一下Debug吧:
打開Cmd 輸入Debug然後輸入命令:
a (Assemble) 逐行彙編 a [address]
c (Compare) 比較兩記憶體塊 c range address
d (Dump) 記憶體16進制顯示 d [address]或 d [range]
e (Enter) 修改記憶體位元組 e address
f (fin) 預置一段記憶體 f range list
g (Go) 執行程式 g [=address][address...]
h (Hexavithmetic) 制算術運算 h value value
i (Input) 從指定連線埠地址輸入 i pataddress
l (Load) 讀盤 l [address [driver seetor>
m (Move) 記憶體塊傳送 m range address
n (Name) 置檔案名稱 n filespec [filespec...]
o (Output) 從指定連線埠地址輸出 o portadress byte
q (Quit) 結束 q
r (Register) 顯示和修改暫存器 r [register name]
s (Search) 查找位元組串 s range list
t (Trace) 跟蹤執行 t [=address] [value]
u (Unassemble) 反彙編 u [address ]或range
w (Write) 存檔 w [address[driver sector secnum>
debug小彙編a命令
debug小彙編a命令是一個很有用的功能,許多的小程式都要他來做。
編一些小程式比彙編要來得方便,快潔。
在Debug中,中斷是非常有用的,首先,讓我們先了解一下中斷。
所謂中斷,其實,就是,當你做某事時,有人過來找你有其他事,你先放下手中的事(計算機中,稱為保護現場)
,再去與叫你的那個人辦事去,等完了,你又回,接著做剛才的事。這是個很通俗的講法。
計算機在運行時,也會出現這種情況,我們叫之中斷。
下面是他的一些常用中斷向量的入口值詳解:(記住喔,很用的...呵呵)
IBM PC 中斷 int10
ooH 螢幕方式設定
入口:AH=0,AL=顯示方式代碼(0--6)
0:40*25 黑白
1:40*25 彩色
2:80*25 黑白
3:80*25 彩色文本
4:320*200 彩色
5:320*200 黑白
6:640*200 黑白圖形模式
7:80*25 單色字元(單色顯示器)
0BH 色彩設定
入口:AH=0B,BL=0 設背景色,BH=0--15 BL=1 設調色碼,BH=0--1
0CH 寫圖形點
入口:AH=0C,CX:DX=列號:行號,AL=顏色
ODH 讀圖形點
入口:AH=0D,CX:DX=列號:行號
返回:AL=顏色
0EH 在當前頁、當前游標處寫字元
入口:AH=0E,AL=字元的ASCII碼,BL=前景色
OFH 顯示器狀態
入口:AH=0F
返回:AL=當前顯示器方式,AH=螢幕列數,BH=當前頁號
01H 游標設定
入口:AH=1,CH=游標起始行號(00--0C),CL=游標結束行號(00--0C)
註:CH > CL
02H 游標定位
入口:AH=2,BH=頁號,DH:DL=起始行:列
03H 讀游標位置
入口:AH=3,BH=頁號。
返回:DH:DL=起始行:列
06H 視窗上卷
入品:AH=6,AL=視窗上卷行數,CH:CL-DH:DL 視窗坐標
註:AL=0 捲動整個視窗
07H 視窗下卷
入口:AH=7,AL=視窗下卷行數,CH:CL-DH:DL 視窗坐標
08H 讀當前游標處字元和屬性
入口:AH=8,BH=頁號。
返回:AH:AL=字元的顏色:字元的ASCII碼
註:顏色代碼見下對照表
09H:在當前游標處寫字元和屬性
註:游標不下移
入口:AH=9,BH=頁號,BL:AL=字元的顏色:字元的ASCII碼,CX=重複次數
1 2 3 4 5 6 7 8
BL R G B I R G B
閃爍 字元底色 加亮 字元顏色

中斷向量號表

中斷號 解釋 中斷號 解釋
0 除數為0錯 19 引導裝入程式
1 音步中斷 1A 日時調用
2 不可禁止中斷NMI 1B 鍵盤阻斷時得到控制權
3 斷電中斷(CCH) 1C 時鐘中斷時得到控制權
4 溢出中斷 1D 指向CRT初始參數表
5 螢幕列印中斷 1E 指向盒帶參數表
6-7 保留 1F 1KB圖形模式
8 計時器中斷(18.2秒) 20 結束DOS程式
9 鍵盤中斷 21 DOS功能調用
A-D 保留 22 結束地址(建義用EXEC)
E 軟碟機中斷 23 DOS Crtl-Break退出地址
F 保留 24 DOS致命錯向量
10 螢幕I/O調用 25 DOS絕對磁碟讀
11 設備檢查調用 26 DOS絕對磁碟寫
12 存儲器檢查調用 27 結束程式並駐留(建義用31h)
13 軟碟機I/O調用 28-3F DOS保留
14 RS-233I/O調用 40-7F 未用
15 盒帶機I/O調用 80-85 BASIC保留
16 鍵盤I/O調用 86-F0 BASIC解釋程式
17 印表機I/O調用 F1-FF 未用
18 ROM-BASIC入口
指令名詳解
call 指令(過程調用)(控制指令-長轉移)
詳解:
段內直接調用
段內間接調用(暫存器
段內間接調用(存儲器
段間直接調用
段間間接調用
指令名
jmp 指令(無條件轉移指令)(控制指令-長轉移)
詳解:
段內直接跳轉
短段內直接跳轉
段內間接跳轉(暫存器
段內間接跳轉(存儲器
段間直接跳轉
段間間接跳轉
指令名
ret 指令(過程返回)(控制指令-長轉移)
詳解:
段內返回
段內返回立即數加於sp
段間返回
段間返回立即數加於sp
na/jnbe 指令(控制指令-短轉移) 不小於或不等於時轉移
jae/jnb 指令 (控制指令-短轉移) 大於或等於時轉移
jb/jnae 指令 (控制指令-短轉移) 小於轉移
jbe/jna 指令 (控制指令-短轉移) 小於或等 於轉移
jg/jnle 指令(控制指令-短轉移) 大於轉移
jge/jnl 指令 (控制指令-短轉移) 大於或等於轉移
jl/jnge 指令 (控制指令-短轉移) 小於轉移
jle/jng 指令 (控制指令-短轉移) 小於或等 於轉移
je/jz 指令 (控制指令-短轉移) 等於轉移
jne/jnz 指令 (控制指令-短轉移) 不等於轉移
jc 指令 (控制指令-短轉移) 有進位時轉移
jnc 指令 (控制指令-短轉移) 列進位時轉移
jno 指令 (控制指令-短轉移) 不溢出時轉移
jnp/jpo 指令 (控制指令-短轉移) 奇偶性為奇數時轉移
jns 指令 (控制指令-短轉移) 符號位為"0"轉移
jo 指令 (控制指令-短轉移) 溢出轉移
jp/jpe 指令 (控制指令-短轉移) 奇偶性為偶數時轉移
js 指令 (控制指令-短轉移) 符號位為"1"時轉移
loop 指令 (循環控制指令-短轉移) cx 不為0時循環
loope/loopz 指令 (循環控制指令-短轉移) cx 不為0且標誌 z=1 時循環
loopne/loopnz 指令 (循環控制指令-短轉移) cx 不為0且標誌 z=0 時循環
jcxz 指令 (循環控制指令-短轉移) cx 為0時轉移
★int 指令 (中斷指令) 中斷指令(後詳解)
into 指令 (中斷指令) 溢出中斷
iret 指令 (中斷指令) 中斷返回
指令名
shl 指令(邏輯左移)
sal 指令(算術左移)
shr 指令(邏輯右移)
sar 指令(算術右移) 暫存器,1
rol 指令(循環左移) 暫存器,cl
ror 指令(循環右移) 存儲器,1
rcl 指令(通過進位的循環左移)存儲器,cl
rcr 指令(通過進位的循環右移)(邏輯運算)
not 指令(取反運算)暫存器求反
(邏輯運算)存儲器求反
and 指令(與運算) (邏輯運算)
暫存器 and 暫存器 暫存器
暫存器 and 存儲器 暫存器
立即數 and 累加器 累加器
or 指令(或運算)(邏輯運算)
暫存器 or 暫存器 暫存器
暫存器 or 存儲器 暫存器
存儲器 or 暫存器 存儲器
立即數 or 存儲器 存儲器
立即數 or 累加器 累加器
test 指令(測試) (邏輯運算)
暫存器 test 暫存器
movs 指令(串傳送)(字元串操作指令)
單個傳送
重複傳送
cmps 指令(串比較) (字元串操作指令)
單個比較
重複比較
scas 指令(串掃描)(字元串操作指令)
單個搜尋
重複搜尋
lods 指令(裝入串)
(字元串操作指令)
單個裝載
重複裝載
stos 指令(保存串) (字元串操作指令)
單個存儲
重複存儲
mov 指令(傳送字或位元組)(數據傳送命令)
暫存器與暫存器間傳送
存儲器與暫存器間傳送
立即數傳送給存儲器
立即數傳送給暫存器
存儲器傳送給累加器
累加器傳送存儲器
暫存器傳送給段暫存器
存儲器傳送給段暫存器
段暫存器傳送給暫存器
段暫存器傳送給存儲存器
pop 指令(把字彈出堆疊) (數據傳送命令)
push 指令(把字壓入堆疊
存儲器
暫存器
段寄器
xchg 指令(交換字或位元組) (數據傳送命令)
暫存器與暫存器交換
存儲器與暫存器交換
暫存器與累加器交換
in 指令(連線埠輸入) (數據傳送命令)
直接輸入
間接輸入
out 指令(連線埠輸出) (數據傳送指令)
直接輸出
間接輸出
add 指令(加法)(算術指令)
adc 指令(帶進位加法)
暫存器+暫存器 暫存器
暫存器+存儲器 暫存器
存儲器+暫存器 存儲器
立即數+存儲器 存儲器
立即數+累加器 累加器
inc 指令(加1)(算術指令)
存儲器增量
暫存器增量
sub 指令(減法) (算術指令)
sbb 指令(帶借位減法)
暫存器-暫存器 暫存器
暫存器-存儲器 暫存器
存儲器-暫存器 存儲器
立即數-存儲器 存儲器
立即數-累加器 累加器
dec 指令(減1)(算術指令)
存儲器減量
暫存器減量
nec 指令(求反,以0減之)
暫存器求補
存儲器求補
cmp 指令(比較)(算術指令)
暫存器與暫存器比較
暫存器與存儲器比較
暫存器與立即數比較
存儲器與立即數比較
累加器與立即數比較
mul 指令(無符號乘法) (算術指令)
imul 指令(整數乘法)
與8位暫存器相乘
與16位暫存器相乘
與8位存儲單元相乘
與16位存儲單元相乘
div 指令(無符號除法)(算術指令)
idiv 指令(整數除法)
被8位暫存器除
被16位暫存器除
被8位存儲單元
被16位存儲單元
Debug實戰
1.查看主機板的生產日期,版本
D ffff:05
D fe00:0e
2.模擬Rest鍵功能
A
:100 jmp ffff:0000
:105
g
L 100 0 0 * '插入一張己格式化軟碟
W 100 0 0 * '放入一張欲格式化軟碟
註:* 分別為:720K e |1.2M id |1.44M 21
4.硬碟格式化兩種方法
(1)G=c800:05
(2) A 100
mov ax,0703
mov cx,0001
mov dx,0080
int 13
int 3
g 100
5.加速鍵盤
A
mov ax,0305
mov bx,0000
int 16
int 20
rcx
10
n fast. com
w
q
6.關閉顯示器(恢復時,按任意鍵
A
mov ax,1201
mov bl,36
int 10
mov ah,0
int 16
mov ax,1200
int 10
rcx
10
n crt-of. com
w
q
7.硬碟DOS引導記錄的修復
在軟碟機中放入一張己格式化軟碟
debug
-l 100 2 0 1
-w 100 0 50 1
把軟碟放入故障機軟碟機中
debug
-l 100 0 50 1
-w 100 2 0 1
-q
8.清coms中setup口令
debug
-a
mov bx,0038
mov cx,0000
mov ax,bx
out 70,al
inc cx
cmp cx,0006
jnz 0106
int 20
-rcx
:20
-nclearpassword .com
-w
-q
註:以上適合super與dtk機,對於ast機,因為他的口令放在coms的4ch-51h地址處,只要將:mov bx,0038 改為: mov
bx,004c即可
9.取消coms的密碼(將coms數據清為初始化)
-o 70,10
-o 71,10
-g
-q
10.將硬碟主引導記錄保存到檔案中
debug
-a
mov ax,0201
mov bx,0200
mov cx,0001
mov dx,0080
mov int 13
int 3
-rcx
:200
-nboot.dat
-w
-q
11.調用中斷實現重啟計算機(可以成檔案)
debug
-a
int 19
int 20
-rcx
:2
-nrese t. com
-w
-q
DEBUG主要命令
DEBUG是為彙編語言設計的一種高度工具,它通過單步、設定斷點等方式為彙編語言程式設計師提供了非常有效的調試手段。
一、DEBUG程式的調用
在DOS的提示符下,可鍵入命令:
C:\DEBUG [D:][PATH][FILENAME[.EXT>[PARM1][PARM2]
其中,檔案名稱是被調試檔案的名字。如用戶鍵入檔案,則DEBUG將指定的檔案裝入存儲器中,用戶可對其進行調試。如果未鍵入檔案名稱,則用戶可以用當前存儲器的內容工作,或者用DEBUG命令N和L把需要的檔案裝入存儲器後再進行調試。命令中的D指定驅動器PATH為路徑,PARM1和PARM2則為運行被調試檔案時所需要的命令參數。
在DEBUG程式調入後,將出現提示符,此時就可用DEBUG命令來調試程式。
二、DEBUG的主要命令
1、顯示存儲單元的命令D(DUMP),格式為:
_D[address]或_D[range]
例如,按指定範圍顯示存儲單元內容的方法為:
-d100 120
18E4:0100 c7 06 04 02 38 01 c7 06-06 02 00 02 c7 06 08 02 G...8.G.....G...
18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ..;..h..M PQVW.
7
18E4:0120 8B
其中0100至0120是DEBUG顯示的單元內容,左邊用十六進制表示每個位元組,右邊用ASCII字元表示每個位元組,·表示不可顯示的字元。這裡沒有指定段地址,D命令自動顯示DS段的內容。如果只指定首地址,則顯示從首地址開始的80個位元組的內容。如果完全沒有指定地址,則顯示上一個D命令顯示的最後一個單元後的內容。
2、修改存儲單元內容的命令有兩種。
·輸入命令E(ENTER),有兩種格式如下:第一種格式可以用給定的內容表來替代指定範圍的存儲單元內容。命令格式為:
-E address
例如,-E DS:100 F3'XYZ'8D
其中F3,'X','Y','Z'和各占一個位元組,該命令可以用這五個位元組來替代存儲單元DS:0100到0104的原先的內容
第二種格式則是採用逐個單元相繼修改的方法。命令格式為:
-E address
例如,-E DS:100
則可能顯示為:
18E4:0100 89.-
如果需要把該單元的內容修改為78,則用戶可以直接鍵入78,再按"空格"鍵可接著顯示下一個單元的內容,如下:
18E4:0100 89.78 1B.-
這樣,用戶可以不斷修改相繼單元的內容,直到用ENTER鍵結束該命令為止。
·填寫命令F(FILL),其格式為:
-F range list
例如:-F 4BA:0100 5 F3'XYZ'8D
使04BA:0100~0104單元包含指定的五個位元組的內容。如果list中的位元組數超過指定的範圍,則忽略超過的項;如果list的位元組數小於指定的範圍,則重複使用list填入,直到填滿指定的所有單元為止。
3)檢查和修改暫存器內容的命令R(register),它有三種格式如下:
·顯示CPU內所有暫存器內容和標誌位狀態,其格式為:
-R
例如,-r
AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC
18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000
·顯示和修改某個暫存器內容,其格式為:
-R register name
例如,鍵入
-R AX
系統將回響如下:
AX F1F4
即AX暫存器的當前內容為F1F4,如不修改則按ENTER鍵,否則,可鍵入欲修改的內容,如:
-R bx
BX 0369
:059F
則把BX暫存器的內容修改為059F。
·顯示和修改標誌位狀態,命令格式為:
-RF系統將回響,如:
OV DN EI NG ZR AC PE CY-
此時,如不修改其內容可按ENTER鍵,否則,可鍵入欲修改的內容,如:
OV DN EI NG ZR AC PE CY-PONZDINV
即可,可見鍵入的順序可以是任意的。
4)運行命令G,其格式為:
-G[=address1][address2[address3…>
其中,地址1指定了運行的起始地址,如不指定則從當前的CS:IP開始運行。後面的地址均為斷點地址,當指令執行到斷點時,就停止執行並顯示當前所有暫存器及標誌位的內容,和下一條將要執行的指令。
5)跟蹤命令T(Trace),有兩種格式:
·逐條指令跟蹤
-T [=address]
從指定地址起執行一條指令後停下來,顯示所有暫存器內容及標誌位的值。如未指定地址則從當前的CS:IP開始執行。
·多條指令跟蹤
-T [=address][value]
從指定地址起執行n條指令後停下來,n由value指定。
6)彙編命令A(Assemble),其格式為:
-A[address]
該命令允許鍵入彙編語言語句,並能把它們彙編成機器代碼,相繼地存放在從指定地址開始的存儲區中。必須注意:DEBUG把鍵入的數字均看成十六進制數,所以如要鍵入十進制數,則其後應加以說明,如100D。
7)反彙編命令U(Unassemble)有兩種格式。
·從指定地址開始,反彙編32個位元組,其格式為:
-U[address]
例如:
-u100
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70606020202 MOV WORD PTR[0208],0202
18E4:0112 BBO4O2 MOV BX,0204
18E4:0115 E80200 CALL 011A
18E4:0118 CD20 INT 20
18E4:011A 50 PUSH AX
18E4:011B 51 PUSH CX
18E4:011C 56 PUSH SI
18E4:011D 57 PUSH DI
18E4:011E 8B37 MOV SI,[BX]
如果地址被省略,則從上一個U命令的最後一條指令的下一個單元開始顯示32個位元組
·對指定範圍內的存儲單元進行反彙編,格式為:
-U[range]
例如:
-u100 10c
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70606020202 MOV WORD PTR[0208],0202
-u100 112
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70606020202 MOV WORD PTR[0208],0202
可見這兩種格式是等效的。
8)命名命令N(Name),其格式為:
-N filespecs [filespecs]
命令把兩個檔案標識符格式化在CS:5CH和CS:6CH的兩個檔案控制塊中,以便在其後用L或W命令把檔案裝入存檔。filespecs的格式可以是:
[d:][path] filename[.ext]
例如,
-N myprog
-L
-
可把檔案myprog裝入存儲器
9)裝入命令(Load),有兩種功能。
·把磁碟上指定扇區範圍的內容裝入到存儲器從指定地址開始的區域中。其格式為:
-L[address[drive sector sector]
·裝入指定檔案,其格式為:
-L[address]
此命令裝入已在CS:5CH中格式化了檔案控制塊所指定的檔案。如未指定地址,則裝入CS:0100開始的存儲區中。
10)寫命令W(Write),有兩種功能。
·把數據寫入磁碟的指定扇區。其格式為:
-W address drive sector sector
·把數據寫入指定的檔案中。其格式為:
-W[address]
此命令把指定的存儲區中的數據寫入由CS:5CH處的檔案控制塊所指定的檔案中。如未指定地址則數據從CS:0100開始。要寫入檔案的位元組數應先放入BX和CX中。
11)退出DEBUG命令Q(Quit),其格式為:
-Q
它退出DEBUG,返回DOS。本命令並無存檔功能,如需存檔應先使用W命令。
問題:初學者問一個低級問題,執行debug-a後,如果有一行輸入錯誤,如何更改這一行?
回答:
加入進行如下輸入:
D:\PWIN95\Desktop>debug
-a
2129:0100movax,200
2129:0103movbx,200
2129:0106movcx,200
2129:0109
此時,發現movbx,200一句錯誤,應為movbx,20,可以敲回車返回"-"狀態,然後輸入:
-a103
2129:0103movbx,20
如果多或者少若干行,不必重新輸入,可以用M命令移動後面的程式來去掉或者增加程式空間.
A.程式調用命令
C>DEBUG [D:] [PATH] [FILENAME[.EXT]] [PARM1] [PARM2]
其中,檔案名稱是被調試檔案的名字。如未鍵入檔案名稱。可用DEBUG命令N和L把需要檔案裝入存儲器後再調試。D指定驅動器,PATH為路徑,FILENAME為檔案名稱,PARM為命令參數
B.顯示存儲單元命令
-D [ADDRESS]或 ;ADDRESS 地址
-D [RANGE] ;RANGE 範圍
C.修改存儲單元內容命令
-E ADDRESS [LIST]
D.檢查和修改暫存器內容命令
-R [REGISTER NAME] ;Register name 暫存器名字
E.彙編命令
-A [ADDRESS]
F.跟蹤命令
-T [=ADDRESS] [VALUE] ;Value 變數
-G [=ADDRESS ] [ADDRESS2 [ADDRESS3]
H.反彙編命令
-U [ADDRESS]
-U [RANGE]
I.命名命令
-N FILESPECS [FILESPECS]
FILESPECS的格式可為[D:][PATH]FILENAME [.EXT]
J.裝入命令
-L [ADDRESS[DRIVE SECTOR SECTOR]] ;DRIVE SECTOR 磁碟 扇區
K.寫命令
W ADDRESS DRIVE SECTOR
L.退出命令
-Q

相關詞條

熱門詞條

聯絡我們