?? e路陽光 - 編程專區(qū) - 匯編語言上機指導(dǎo)及例示 天天好心情!.htm
字號:
<BR>匯編語言上機過程: <BR>一、上機前的軟件準備:<BR>MS-DOS操作系統(tǒng)(如:MSDOS6.22
, MSDOS7.0 等)<BR>文本編輯器 (如:EDIT.COM , TURBO.EXE , TC.EXE
, C.EXE 等)<BR>匯編程序 (如:MASM.EXE , ASM.EXE 等)<BR>連接程序
(如:LINK.EXE 等)<BR>調(diào)試程序 (如:DEBUG.EXE
等)<BR>二、匯編程序建立過程:<BR> <BR><BR>a.建立匯編源程序─通過───→b.編譯為目標文件─ ↓┬─→d.連接為可執(zhí)行文件<BR> ↑
<BR> │ c.不通過,重新修改(語句錯誤)
↓ <BR> ├──────────────────────┘
↓<BR> ↑ f.不正確,用調(diào)試工具調(diào)試,重新修改(邏輯錯誤)
↓ <BR> └────────────────────────────←e運行<BR>
↓正確<BR>
g.完成<BR><BR>三、現(xiàn)在對(二)的每一個標有字母的過程(PROCEDURE)進行詳細說明<BR>PROCEDURE
a:建立匯編源程序(即:建立
文件名.asm)<BR>這個過程就相當于我們在紙上編寫源程序代碼一樣,只不過是將紙變?yōu)榱擞嬎銠C,這個過程也稱源代碼錄入。將源程序代碼錄入計算機的方法很多,下面將介紹具體方法。
<BR>1.通過MD-DOS自帶的EDIT.EXE文本編輯器進行輸入,在DOS提示符下鍵入:EDIT回車,這時如果你系統(tǒng)內(nèi)可調(diào)用時,EDIT的操作畫面便會出現(xiàn)在屏幕上,你就可在提示下進行錄入了,當錄入完畢后,選擇存盤并給你輸入的文件起一個文件名,形式:filename.asm
;(其中filename為你起的文件名,由1-8個字符組成),asm
是為匯編程序識別而必須加上去的,不可更改。存盤后在DOS下可用DOS命令DIR來查看,如果看到了所存的文件存在,就可以進行進程b。<BR>2.如果你的系統(tǒng)中沒有EDIT,也可用你所熟悉的文本編輯器進行錄入、編輯,如可用c語言和pascal語言的文本編輯器來編輯,最后將文件存為filename.asm的形式即可。<BR>PROCEDURE
b:編譯目標文件(即:編譯為.obj .lst
.crf文件)<BR>這個過程計算機將把你編的正確的源代碼編譯為機器語言、程序清單及交叉引用表的目標文件。如果此時你的程序有語句錯誤,系統(tǒng)將報錯,并指出在第幾行,什么類型的錯誤,你可根據(jù)提示去逐一修改。現(xiàn)介紹具體過程:<BR>在DOS提示符下鍵入MASM
filename回車<BR>(注:你系統(tǒng)內(nèi)的匯編程序為MASM.EXE,如果你系統(tǒng)的匯編程序為ASM.EXE時,便將命令變?yōu)锳SM
filename回車。其中filename為你剛才在PROCEDURE a
中建立的文件名)<BR>這時匯編程序的輸出文件可以有三個(分別:.obj .lst
.crf),便會出現(xiàn)三次提問,在這可以一路回車即可。下面顯示的信息是源程序中的錯誤個數(shù),如果為0則表示順利通過,就可進行進程c。但如果不為0就說明有錯誤,并指出錯誤出現(xiàn)的行,可依據(jù)這個提示去進行修改。但如果錯誤太多還未等看清就顯示過去了,可用如下命令形將錯誤信息存于一個你指定的文件,再用文本編輯器去查看。
MASM filename &gt;filen
(filen為你起的一個沒用過的文件名,用以存放出錯信息)以后可查看filen來得到出錯信息。<BR>PROCEDURE
c:編譯不通過,重新修改(錯誤類型:源程序語句不合法)<BR>在執(zhí)行過PROCEDURE
b后,如有出錯信息時,就要我們自己按PROCEDURE c去做,而不能跳躍到PROCEDURE
d去,如果強行執(zhí)行PROCEDURE
d將無任何有效結(jié)果。<BR>現(xiàn)在就開現(xiàn)找錯吧!首先要清楚,在PROCEDURE
b中檢測出的錯誤均為每一條語句的語法或用法錯誤,它并不能檢測出程序的邏輯設(shè)計(語句按排位置)錯誤,所以就要記好出錯的行號。在記錄行號后,就應(yīng)再次執(zhí)行PROCEDURE
a,這時和操作應(yīng)是打開已編好的源程序(以EDIT為例:在DOS提示符下鍵入:<BR>EDIT
filename.asm回車),依據(jù)行號進行修改并存盤,再次進行匯編,直至PROCEDURE
b通過為止。便可繼續(xù)向下執(zhí)行PROCEDURE
d。<BR>下面給出一些常見出錯信息,以便查對:<BR>1、Register already defined
匯編內(nèi)部出現(xiàn)邏輯錯誤<BR>2、Unknown symbol type
在符號語句的類型中,有些不能識別的東西<BR>3、Symbol is multi-defined
重復(fù)定義一個符號<BR>4、Symbol not defined 符號沒有定義<BR>5、Syntax
error 語句的語法與任何可識別的語法不匹配<BR>6、Symbol is reserved
word<BR>企圖非法使用一個匯編程序的保留字(例:定義add為一變量)<BR>7、Not proper
align/combine type SEGMENT參數(shù)不正確<BR>8、One operand must be
const 這是加法指令的非法使用<BR>9、Operands must be same or 1 abs
這是減法指令的非法使用<BR>10、Already have base register
試圖重復(fù)基地址<BR>11、Illegal size for item
引用的項的長度是非法的,(如:雙字移位)<BR>12、Illegal register value
指定的寄存器值不能放入“reg” 字段<BR>13、Must be AX or AL
某些指令只能用AX或AL<BR>14、Improper use of segment reg
段寄存器使用不合法(如:mov ds,0)<BR>15、Division by 0 or overflow
給出一個用0作除數(shù)的表達式<BR>16、value is out of range
數(shù)值大于需要使用的<BR>17、CS register illeal usage
試圖非法使用CS寄存器<BR>18、DUP is too large for
linker<BR>DUP嵌套太長,以至于從連接程序不能得到所要的記錄<BR>PROCEDURE
d:連接為可執(zhí)行文件(即:連接為.exe
或.com文件)<BR>在這個過程中一般沒有意外,如果有也就是文件名打錯了。<BR>形式:在DOS提示符下:
LINK filename 回車<BR>PROCEDURE
e:運行編譯好的可執(zhí)行文件<BR>當PROCEDURE
d通過后,會產(chǎn)生一個可執(zhí)行文件,這時只需運行這個程序,看它是否按你所想象那樣得出結(jié)果。在試運行期間,要盡量試一些臨界狀態(tài),看
程序是否運行穩(wěn)定、結(jié)果是否正確。如一切正常,便可進入PROCEDURE
g了。<BR>可最怕的是不OK,程序產(chǎn)生一些莫名其妙的結(jié)果(你可不要以為是你的計算機不聽你的指揮,其實它是在一絲不茍地按照你編的程序執(zhí)行。我以前總以為我的計算機出了毛病),如果是在考場上這時千萬不要慌,穩(wěn)住自己的情緒,先不要看計算機,靜幾分鐘(反正時間多得是)。這時就要用到最關(guān)鍵、最常用的一步了,進行PROCEDURE
f 。<BR>PROCEDURE
f:用調(diào)試工具調(diào)試,重新修改(邏輯錯誤)<BR>在這我將介紹用DOS中自帶的調(diào)試程序DEBUG.EXE來進行程序調(diào)試、檢查錯誤.<BR>首先我們要了解DEBUG的基本用法:
<BR>1、用于調(diào)試程序時的輸入格式:<BR>DEBUG FILENAME.???
回車<BR>其中FILENAME是主文件名,???是擴展文件名,例如我們在此前已編譯好了一個文件,它的名子為:djx.exe
要對它進行調(diào)試時就在DOS提示符下<BR>打:DEBUG djx.exe 回車,便可見到 '-'
提示符,如無任何提示說明正確,可進行調(diào)試。<BR>2、DEBUG調(diào)試過程中用到的DEBUG命令介紹:<BR>(注:在指令中用
[]
括起來的內(nèi)容可缺省)<BR>1)D(Dump)顯示指定內(nèi)存單元內(nèi)容(一般用來看數(shù)據(jù)數(shù)的內(nèi)容,即DS段):<BR>格式:d[地址]
從[地址]指定的內(nèi)存單元顯示128個字節(jié)的內(nèi)容<BR>[地址]缺省時,顯示上一個DUMP命令后面的內(nèi)容
<BR>d 地址范圍 顯示指定范圍內(nèi)的內(nèi)存內(nèi)容。<BR>示例:-d100
顯示從DS段100H開始的內(nèi)容(以十六進制顯示)<BR>2)E(Enter)修改存儲單元內(nèi)容(一般在DS段)<BR>格式:e
地址 [數(shù)據(jù)] 用給定的[數(shù)據(jù)]代替指定范圍的存儲單元內(nèi)容<BR>e 地址
修改一個指定內(nèi)存單元的內(nèi)容<BR>示例:-e ds:200 'djx'FF00AA
就可將DS段從200開始至205的內(nèi)容替<BR>換為64 6A 78 FF 00
AA<BR>3)G(GO)運行命令<BR>格式:-g [=地址][斷點地址1 [斷點地址2
...[斷點地址10]]]<BR>從指定[地址]開始執(zhí)行程序(如地址缺省從當前CS:IP開始),運行至[斷點地址1]停止,顯示所有寄存器及標志位內(nèi)容與下一條指令,如后面還有斷點,可鍵入g,繼續(xù)執(zhí)行。<BR>示例:-g001a
則執(zhí)行從當前cs:ip至001a的指令<BR>注意:地址設(shè)置必須從指令的第一字節(jié)設(shè)起。<BR>4)T(Trace)執(zhí)行一條語句<BR>格式:
-t [=地址]
從指定[地址]起執(zhí)行一條語句后停下來,顯示所有寄存器內(nèi)容及標志位的值與下一條指令。如[地址]缺省則從當前CS:IP開始執(zhí)行<BR>-t
[=地址][value]
從指定地址起執(zhí)行value條指令后停止。<BR>5)P(proceed)執(zhí)行一個循環(huán);一個軟中斷或call子過程<BR>格式:-p
[=地址][n]<BR>示例: mov ah,02h<BR>mov dl,41h<BR>int
21h<BR>此時用: -p 回車后系統(tǒng)將顯示一個字符A,如果在這不用P,而改用T,那么系統(tǒng)將進入INT
21H的中斷調(diào)用中,出不來,這時你會誤以為你的程序編錯了,一定注意!!<BR>6)R(register)顯示并可修改寄存器內(nèi)容<BR>格式:-r
顯示所有寄存器內(nèi)容<BR>-r 寄存器名
修改指定寄存器內(nèi)容(可改:AX,BX,CX,DX,SP,<BR>BP,SI,DI,CS,DS,ES,SS,PC,IP,F)<BR>7)U(Unassemble)反匯編<BR>格式:-u
[地址] 從指定[地址]反匯編32個字節(jié),若[地址]缺省則從當前地址匯編32個字節(jié)。<BR>-u 地址范圍
對指定范圍內(nèi)的存儲單元進行反匯編<BR>以上是在調(diào)試程序中可能用到的DEBUG命令解釋,DEBUG中還有其它命令,在檢查程序中不會用到,就不再介紹了。<BR>PROCEDURE
g:程序編好,那就一切OK!!!交卷過關(guān)了!大吃、大睡。<BR>下面給出一個有病句的程序,希望大家和我一起調(diào)試、修改并通過:<BR>先執(zhí)行PROCEDURE
a編輯源程序<BR>實現(xiàn)功能:在屏幕上顯示:Hello world<BR>My name is
DJX<BR>文件名:error.asm<BR>行號: 源程序代碼:<BR>1 data
segment<BR>2 out1 db 'Hello world'<BR>3 ax db 'My name
is DJX'<BR>4 data ens<BR>5<BR>6 code segment<BR>7 assume
cs:code;ds:data<BR>8 lea dx,out1<BR>9 mov ah,2<BR>10 int
21h<BR>11<BR>12 mov dl,0ah<BR>13 mov ah,2<BR>14 int
21h<BR>15 mov dl,0dh<BR>16 moo ah,2<BR>17 int
21h<BR>18<BR>19 lea dx,ax<BR>20 mov ah,<BR>21 int
21h<BR>22 code ends<BR>在編輯完執(zhí)行PROCEDURE b用masm進行編譯:masm
error回車后顯示如下:<BR>Microsoft (R) Macro Assembler Version
5.00<BR>Copyright (C) Microsoft Corp 1981-1985, 1987.
All rights reserved.<BR>Object filename
[error.OBJ]:<BR>Source listing
[NUL.LST]:<BR>Cross-reference [NUL.CRF]:<BR>End of file
encountered on input file<BR>error.ASM(23): warning
A4085: End of file, no END directive<BR>Open segments:
DATA<BR>error.ASM(3): warning A4016: Reserved word used
as symbol: AX<BR>error.ASM(4): error A2105: Expected:
instruction or directive<BR>error.ASM(16): error A2105:
Expected: instruction or directive<BR>error.ASM(19):
error A2049: Illegal use of register<BR>End of file
encountered on input file<BR>error.ASM(23): warning
A4085: End of file, no END directive<BR>51566 + 406450
Bytes symbol space free<BR>2 Warning Errors<BR>4 Severe
Errors<BR>說明這個程序有錯誤,并在第3,4,16,19,23行有錯,<BR>我們再執(zhí)行PROCEDURE
c去逐一檢查<BR>第三行:3 ax db 'My name is
DJX'<BR>它的錯誤在于AX不能作為變量名,更正:<BR>3 out2 db 'My name is
DJX'<BR>注意剛才我們定義AX為變量時在后面的程序中用過'變量AX'在第19行<BR>19 lea
dx,ax<BR>在出錯報告中也報第19行錯,因為不能將AX的有效地址賦給DX,更正:<BR>19 lea
dx,out2<BR>這樣一下就解決了兩個錯誤<BR>第四行:4 data
ens<BR>這行為一個段的結(jié)束,但語句漏打了字母,更正:<BR>4 data ends<BR>第十六行:16
moo ah,2<BR>這行也是語句打錯,更正:<BR>16 mov
ah,2<BR>第二十三行:<BR>出錯信息:error.ASM(23): warning A4085: End
of file, no END
directive<BR>說明本程序沒有結(jié)束偽操作,更正:<BR>加入:在第七、八行加入地址標志:
start:<BR>原23 end start<BR>執(zhí)行PROCEDURE
a將源程序修改如下:<BR>data segment<BR>out1 db 'Hello
world'<BR>out2 db 'My name is DJX'<BR>data ends<BR>code
segment<BR>assume cs:code;ds:data<BR>start:<BR>lea
dx,out1<BR>mov ah,2<BR>int 21h<BR>mov dl,0ah<BR>mov
ah,2<BR>int 21h<BR>mov dl,0dh<BR>mov ah,2<BR>int
21h<BR>lea dx,out2<BR>mov ah,9<BR>int 21h<BR>code
ends<BR>end start<BR>再次進行PROCEDURE
b進行編譯,屏幕顯示:<BR>Microsoft (R) Macro Assembler Version
5.00<BR>Copyright (C) Microsoft Corp 1981-1985, 1987.
All rights reserved.<BR>Object filename
[error.OBJ]:<BR>Source listing
[NUL.LST]:<BR>Cross-reference [NUL.CRF]:<BR>51524 +
406492 Bytes symbol space free<BR>0 Warning Errors<BR>0
Severe Errors<BR>本程序在語句上已無錯誤。<BR>再執(zhí)行PROCEDURE
d連接為可執(zhí)行文件(link error回車),屏幕顯示:<BR>Microsoft (R) Overlay
Linker Version 3.60<BR>Copyright (C) Microsoft Corp
1983-1987. All rights reserved.<BR>Run File
[ERROR.EXE]:<BR>List File [NUL.MAP]:<BR>Libraries
[.LIB]:<BR>LINK : warning L4021: no stack
segment<BR>這時error.exe可執(zhí)行文件已存在,可以執(zhí)行PROCEDURE
e來運行看一看是否正確<BR>在dos提示符下鍵入:error回車(小心!!!)<BR>屏幕顯示:亂碼,并死機。reset
My computer!<BR>說明程序在邏輯上有錯誤,并且嚴重。<BR>這是就要用PROCEDURE
f,用調(diào)試工具調(diào)試,查找錯誤。<BR>在DOS提示符下鍵入:debug error.exe回車<BR>屏幕出現(xiàn)
-
提示符,這時就可以用DEBUG的命令來找錯誤了,<BR>我首先用d命令來查看數(shù)據(jù)區(qū)和內(nèi)容,發(fā)展所定義的兩個字符串并不在數(shù)據(jù)段的段首,而在數(shù)據(jù)段內(nèi)的100h位置上,這時才想起masm有一個不成文的規(guī)定,那就是在定義完數(shù)據(jù)段后,所定義的變量均向后100h個單元,需要我們將ds段寄存器置位,在程序的start:后面加上如下指令:(執(zhí)行PROCEDURE
a)<BR>mov ax,data<BR>mov ds,ax<BR>再執(zhí)行PROCEDURE
b,PROCEDURE d,PROCEDURE e來運行程序,<BR>屏幕顯示:<BR>換行<BR>My
name is DJX及亂碼,并死機。(又要重新啟動!)<BR>再次執(zhí)行PROCEDURE
a檢查程序,發(fā)現(xiàn):<BR>1.匯編語言有規(guī)定每個字符串應(yīng)由$結(jié)尾<BR>2.在輸出第一個串的語句中的AH子功能號應(yīng)為09H<BR>將以上兩點改正。<BR>再執(zhí)行PROCEDURE
b,PROCEDURE d,PROCEDURE e來運行程序,<BR>屏幕顯示:<BR>Hello
world<BR>My name is
DJX并死機,不能返回DOS<BR>原因分析,在程序中沒有返回DOS的指令,更正:<BR>用PROCEDURE
a來進行編輯:<BR>用DOS 21H中斷的4cH子功能便可返回DOS,在code ends前加:<BR>mov
ah,4ch<BR>int 21h<BR>再執(zhí)行PROCEDURE b,PROCEDURE
d,PROCEDURE e來運行程序,<BR>屏幕顯示:<BR>Hello word<BR>My name is
DJX<BR>并返回DOS<BR>成功!<BR>這樣一個程序就調(diào)試完成,并正確。<BR>下面是正確的源程序:<BR>data
segment<BR>out1 db 'Hello world$'<BR>out2 db 'My name is
DJX$'<BR>data ends<BR>code segment<BR>assume
cs:code;ds:data<BR>start:<BR>mov ax,data<BR>mov
ds,ax<BR>lea dx,out1<BR>mov ah,9<BR>int 21h<BR>mov
dl,0ah<BR>mov ah,2<BR>int 21h<BR>mov dl,0dh<BR>mov
ah,2<BR>int 21h<BR>lea dx,out2<BR>mov ah,9<BR>int
21h<BR>mov ah,4ch<BR>int 21h<BR>code ends<BR>end
start<BR>以上這個程序很簡單,只是為了說明實現(xiàn)匯編語言的上機編程及調(diào)試過程,匯編語言須多練習才能掌握它的特點,以便順利通過考試<BR></TD></TR>
<TR>
<TD vAlign=bottom><IMG
src="E路陽光 - 編程專區(qū) - 匯編語言上機指導(dǎo)及例示 天天好心情!.files/sigline.gif"><BR>和你的年紀、差了一個音階。
<BR>對是否能吹響它、我感到非常的不安...。 <BR>在吹著熟悉的海風的夜晚、你所彈的風琴的音色反映著月光。
<BR>就這樣、分離的指尖、碎掉的四葉草、打開了弧光街道的門扉。 <BR>
<OBJECT id=RAOCX height=60 width=253
classid=clsid:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA><PARAM NAME="_ExtentX" VALUE="6694"><PARAM NAME="_ExtentY" VALUE="1588"><PARAM NAME="AUTOSTART" VALUE="0"><PARAM NAME="SHUFFLE" VALUE="0"><PARAM NAME="PREFETCH" VALUE="0"><PARAM NAME="NOLABELS" VALUE="0"><PARAM NAME="SRC" VALUE="http://bbs.elyg.org/UploadFile/xiny.mp3"><PARAM NAME="CONTROLS" VALUE="StatusBar,ControlPanel"><PARAM NAME="LOOP" VALUE="0"><PARAM NAME="NUMLOOP" VALUE="0"><PARAM NAME="CENTER" VALUE="0"><PARAM NAME="MAINTAINASPECT" VALUE="0"><PARAM NAME="BACKGROUNDCOLOR" VALUE="#000000">
<embed src="http://bbs.elyg.org/UploadFile/xiny.mp3"
width="253" autostart="true"
height="60"></embed></OBJECT><BR><A
onclick="return eggconfirm();"
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -