當前位置:編程學習大全網 - 源碼下載 - 匯編語言上機環境...?

匯編語言上機環境...?

Subject:匯編語言上機指導及例示

Editor:admin Time:2004-3-20 20:18 Read:52369 Score:8 Print

Preface:

從如何建立源文件到進行調試作下簡要的介紹......

Content:

從如何建立源文件到進行調試作下簡要的介紹,並配例題說明。由於本人水平有限,在下文在如有錯誤及可以進壹步修改的地方請大家指出

匯編語言上機過程:

壹、上機前的軟件準備:

MS-DOS操作系統(如:MSDOS6.22 , MSDOS7.0 等)

文本編輯器 (如:EDIT.COM , TURBO.EXE , TC.EXE , C.EXE 等)

匯編程序 (如:MASM.EXE , ASM.EXE 等)

連接程序 (如:LINK.EXE 等)

調試程序 (如:DEBUG.EXE 等)

二、匯編程序建立過程:

a.建立匯編源程序—通過———→b.編譯為目標文件— ↓┬—→d.連接為可執行文件

│ c.不通過,重新修改(語句錯誤) ↓

├——————————————————————┘ ↓

↑ f.不正確,用調試工具調試,重新修改(邏輯錯誤) ↓

└————————————————————————————←e運行

↓正確

g.完成

三、現在對(二)的每壹個標有字母的過程(PROCEDURE)進行詳細說明

PROCEDURE a:建立匯編源程序(即:建立 文件名.asm)

這個過程就相當於我們在紙上編寫源程序代碼壹樣,只不過是將紙變為了計算機,這個過程也稱源代碼錄入。將源程序代碼錄入計算機的方法很多,下面將介紹具體方法。

1.通過MD-DOS自帶的EDIT.EXE文本編輯器進行輸入,在DOS提示符下鍵入:EDIT回車,這時如果妳系統內可調用時,EDIT的操作畫面便會出現在屏幕上,妳就可在提示下進行錄入了,當錄入完畢後,選擇存盤並給妳輸入的文件起壹個文件名,形式:filename.asm ;(其中filename為妳起的文件名,由1-8個字符組成),asm 是為匯編程序識別而必須加上去的,不可更改。存盤後在DOS下可用DOS命令DIR來查看,如果看到了所存的文件存在,就可以進行進程b。

2.如果妳的系統中沒有EDIT,也可用妳所熟悉的文本編輯器進行錄入、編輯,如可用c語言和pascal語言的文本編輯器來編輯,最後將文件存為filename.asm的形式即可。

PROCEDURE b:編譯目標文件(即:編譯為.obj .lst .crf文件)

這個過程計算機將把妳編的正確的源代碼編譯為機器語言、程序清單及交叉引用表的目標文件。如果此時妳的程序有語句錯誤,系統將報錯,並指出在第幾行,什麽類型的錯誤,妳可根據提示去逐壹修改。現介紹具體過程:

在DOS提示符下鍵入MASM filename回車

(註:妳系統內的匯編程序為MASM.EXE,如果妳系統的匯編程序為ASM.EXE時,便將命令變為ASM filename回車。其中filename為妳剛才在PROCEDURE a 中建立的文件名)

這時匯編程序的輸出文件可以有三個(分別:.obj .lst .crf),便會出現三次提問,在這可以壹路回車即可。下面顯示的信息是源程序中的錯誤個數,如果為0則表示順利通過,就可進行進程c。但如果不為0就說明有錯誤,並指出錯誤出現的行,可依據這個提示去進行修改。但如果錯誤太多還未等看清就顯示過去了,可用如下命令形將錯誤信息存於壹個妳指定的文件,再用文本編輯器去查看。 MASM filename >filen (filen為妳起的壹個沒用過的文件名,用以存放出錯信息)以後可查看filen來得到出錯信息。

PROCEDURE c:編譯不通過,重新修改(錯誤類型:源程序語句不合法)

在執行過PROCEDURE b後,如有出錯信息時,就要我們自己按PROCEDURE c去做,而不能跳躍到PROCEDURE d去,如果強行執行PROCEDURE d將無任何有效結果。

現在就開現找錯吧!首先要清楚,在PROCEDURE b中檢測出的錯誤均為每壹條語句的語法或用法錯誤,它並不能檢測出程序的邏輯設計(語句按排位置)錯誤,所以就要記好出錯的行號。在記錄行號後,就應再次執行PROCEDURE a,這時和操作應是打開已編好的源程序(以EDIT為例:在DOS提示符下鍵入:

EDIT filename.asm回車),依據行號進行修改並存盤,再次進行匯編,直至PROCEDURE b通過為止。便可繼續向下執行PROCEDURE d。

下面給出壹些常見出錯信息,以便查對:

1、Register already defined 匯編內部出現邏輯錯誤

2、Unknown symbol type 在符號語句的類型中,有些不能識別的東西

3、Symbol is multi-defined 重復定義壹個符號

4、Symbol not defined 符號沒有定義

5、Syntax error 語句的語法與任何可識別的語法不匹配

6、Symbol is reserved word

企圖非法使用壹個匯編程序的保留字(例:定義add為壹變量)

7、Not proper align/combine type SEGMENT參數不正確

8、One operand must be const 這是加法指令的非法使用

9、Operands must be same or 1 abs 這是減法指令的非法使用

10、Already have base register 試圖重復基地址

11、Illegal size for item 引用的項的長度是非法的,(如:雙字移位)

12、Illegal register value 指定的寄存器值不能放入“reg” 字段

13、Must be AX or AL 某些指令只能用AX或AL

14、Improper use of segment reg 段寄存器使用不合法(如:mov ds,0)

15、Division by 0 or overflow 給出壹個用0作除數的表達式

16、value is out of range 數值大於需要使用的

17、CS register illeal usage 試圖非法使用CS寄存器

18、DUP is too large for linker

DUP嵌套太長,以至於從連接程序不能得到所要的記錄

PROCEDURE d:連接為可執行文件(即:連接為.exe 或.com文件)

在這個過程中壹般沒有意外,如果有也就是文件名打錯了。

形式:在DOS提示符下: LINK filename 回車

PROCEDURE e:運行編譯好的可執行文件

當PROCEDURE d通過後,會產生壹個可執行文件,這時只需運行這個程序,看它是否按妳所想象那樣得出結果。在試運行期間,要盡量試壹些臨界狀態,看 程序是否運行穩定、結果是否正確。如壹切正常,便可進入PROCEDURE g了。

可最怕的是不OK,程序產生壹些莫名其妙的結果(妳可不要以為是妳的計算機不聽妳的指揮,其實它是在壹絲不茍地按照妳編的程序執行。我以前總以為我的計算機出了毛病),如果是在考場上這時千萬不要慌,穩住自己的情緒,先不要看計算機,靜幾分鐘(反正時間多得是)。這時就要用到最關鍵、最常用的壹步了,進行PROCEDURE f 。

PROCEDURE f:用調試工具調試,重新修改(邏輯錯誤)

在這我將介紹用DOS中自帶的調試程序DEBUG.EXE來進行程序調試、檢查錯誤.

首先我們要了解DEBUG的基本用法:

1、用於調試程序時的輸入格式:

DEBUG FILENAME. 回車

其中FILENAME是主文件名,是擴展文件名,例如我們在此前已編譯好了壹個文件,它的名子為:djx.exe 要對它進行調試時就在DOS提示符下

打:DEBUG djx.exe 回車,便可見到 '-' 提示符,如無任何提示說明正確,可進行調試。

2、DEBUG調試過程中用到的DEBUG命令介紹:

(註:在指令中用 [] 括起來的內容可缺省)

1)D(Dump)顯示指定內存單元內容(壹般用來看數據數的內容,即DS段):

格式:d[地址] 從[地址]指定的內存單元顯示128個字節的內容

[地址]缺省時,顯示上壹個DUMP命令後面的內容

d 地址範圍 顯示指定範圍內的內存內容。

示例:-d100 顯示從DS段100H開始的內容(以十六進制顯示)

2)E(Enter)修改存儲單元內容(壹般在DS段)

格式:e 地址 [數據] 用給定的[數據]代替指定範圍的存儲單元內容

e 地址 修改壹個指定內存單元的內容

示例:-e ds:200 'djx'FF00AA 就可將DS段從200開始至205的內容替

換為64 6A 78 FF 00 AA

3)G(GO)運行命令

格式:-g [=地址][斷點地址1 [斷點地址2 ...[斷點地址10]]]

從指定[地址]開始執行程序(如地址缺省從當前CS:IP開始),運行至[斷點地址1]停止,顯示所有寄存器及標誌位內容與下壹條指令,如後面還有斷點,可鍵入g,繼續執行。

示例:-g001a 則執行從當前cs:ip至001a的指令

註意:地址設置必須從指令的第壹字節設起。

4)T(Trace)執行壹條語句

格式: -t [=地址] 從指定[地址]起執行壹條語句後停下來,顯示所有寄存器內容及標誌位的值與下壹條指令。如[地址]缺省則從當前CS:IP開始執行

-t [=地址][value] 從指定地址起執行value條指令後停止。

5)P(proceed)執行壹個循環;壹個軟中斷或call子過程

格式:-p [=地址][n]

示例: mov ah,02h

mov dl,41h

int 21h

此時用: -p 回車後系統將顯示壹個字符A,如果在這不用P,而改用T,那麽系統將進入INT 21H的中斷調用中,出不來,這時妳會誤以為妳的程序編錯了,壹定註意!!

6)R(register)顯示並可修改寄存器內容

格式:-r 顯示所有寄存器內容

-r 寄存器名 修改指定寄存器內容(可改:AX,BX,CX,DX,SP,

BP,SI,DI,CS,DS,ES,SS,PC,IP,F)

7)U(Unassemble)反匯編

格式:-u [地址] 從指定[地址]反匯編32個字節,若[地址]缺省則從當前地址匯編32個字節。

-u 地址範圍 對指定範圍內的存儲單元進行反匯編

以上是在調試程序中可能用到的DEBUG命令解釋,DEBUG中還有其它命令,在檢查程序中不會用到,就不再介紹了。

PROCEDURE g:程序編好,那就壹切OK!!!交卷過關了!大吃、大睡。

下面給出壹個有病句的程序,希望大家和我壹起調試、修改並通過:

先執行PROCEDURE a編輯源程序

實現功能:在屏幕上顯示:Hello world

My name is DJX

文件名:error.asm

行號: 源程序代碼:

1 data segment

2 out1 db 'Hello world'

3 ax db 'My name is DJX'

4 data ens

5

6 code segment

7 assume cs:code;ds:data

8 lea dx,out1

9 mov ah,2

10 int 21h

11

12 mov dl,0ah

13 mov ah,2

14 int 21h

15 mov dl,0dh

16 moo ah,2

17 int 21h

18

19 lea dx,ax

20 mov ah,

21 int 21h

22 code ends

在編輯完執行PROCEDURE b用masm進行編譯:masm error回車後顯示如下:

Microsoft (R) Macro Assembler Version 5.00

Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.

Object filename [error.OBJ]:

Source listing [NUL.LST]:

Cross-reference [NUL.CRF]:

End of file encountered on input file

error.ASM(23): warning A4085: End of file, no END directive

Open segments: DATA

error.ASM(3): warning A4016: Reserved word used as symbol: AX

error.ASM(4): error A2105: Expected: instruction or directive

error.ASM(16): error A2105: Expected: instruction or directive

error.ASM(19): error A2049: Illegal use of register

End of file encountered on input file

error.ASM(23): warning A4085: End of file, no END directive

51566 + 406450 Bytes symbol space free

2 Warning Errors

4 Severe Errors

說明這個程序有錯誤,並在第3,4,16,19,23行有錯,

我們再執行PROCEDURE c去逐壹檢查

第三行:3 ax db 'My name is DJX'

它的錯誤在於AX不能作為變量名,更正:

3 out2 db 'My name is DJX'

註意剛才我們定義AX為變量時在後面的程序中用過'變量AX'在第19行

19 lea dx,ax

在出錯報告中也報第19行錯,因為不能將AX的有效地址賦給DX,更正:

19 lea dx,out2

這樣壹下就解決了兩個錯誤

第四行:4 data ens

這行為壹個段的結束,但語句漏打了字母,更正:

4 data ends

第十六行:16 moo ah,2

這行也是語句打錯,更正:

16 mov ah,2

第二十三行:

出錯信息:error.ASM(23): warning A4085: End of file, no END directive

說明本程序沒有結束偽操作,更正:

加入:在第七、八行加入地址標誌: start:

原23 end start

執行PROCEDURE a將源程序修改如下:

data segment

out1 db 'Hello world'

out2 db 'My name is DJX'

data ends

code segment

assume cs:code;ds:data

start:

lea dx,out1

mov ah,2

int 21h

mov dl,0ah

mov ah,2

int 21h

mov dl,0dh

mov ah,2

int 21h

lea dx,out2

mov ah,9

int 21h

code ends

end start

再次進行PROCEDURE b進行編譯,屏幕顯示:

Microsoft (R) Macro Assembler Version 5.00

Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.

Object filename [error.OBJ]:

Source listing [NUL.LST]:

Cross-reference [NUL.CRF]:

51524 + 406492 Bytes symbol space free

0 Warning Errors

0 Severe Errors

本程序在語句上已無錯誤。

再執行PROCEDURE d連接為可執行文件(link error回車),屏幕顯示:

Microsoft (R) Overlay Linker Version 3.60

Copyright (C) Microsoft Corp 1983-1987. All rights reserved.

Run File [ERROR.EXE]:

List File [NUL.MAP]:

Libraries [.LIB]:

LINK : warning L4021: no stack segment

這時error.exe可執行文件已存在,可以執行PROCEDURE e來運行看壹看是否正確

在dos提示符下鍵入:error回車(小心!!!)

屏幕顯示:亂碼,並死機。reset My computer!

說明程序在邏輯上有錯誤,並且嚴重。

這是就要用PROCEDURE f,用調試工具調試,查找錯誤。

在DOS提示符下鍵入:debug error.exe回車

屏幕出現 - 提示符,這時就可以用DEBUG的命令來找錯誤了,

我首先用d命令來查看數據區和內容,發展所定義的兩個字符串並不在數據段的段首,而在數據段內的100h位置上,這時才想起masm有壹個不成文的規定,那就是在定義完數據段後,所定義的變量均向後100h個單元,需要我們將ds段寄存器置位,在程序的start:後面加上如下指令:(執行PROCEDURE a)

mov ax,data

mov ds,ax

再執行PROCEDURE b,PROCEDURE d,PROCEDURE e來運行程序,

屏幕顯示:

換行

My name is DJX及亂碼,並死機。(又要重新啟動!)

再次執行PROCEDURE a檢查程序,發現:

1.匯編語言有規定每個字符串應由$結尾

2.在輸出第壹個串的語句中的AH子功能號應為09H

將以上兩點改正。

再執行PROCEDURE b,PROCEDURE d,PROCEDURE e來運行程序,

屏幕顯示:

Hello world

My name is DJX並死機,不能返回DOS

原因分析,在程序中沒有返回DOS的指令,更正:

用PROCEDURE a來進行編輯:

用DOS 21H中斷的4cH子功能便可返回DOS,在code ends前加:

mov ah,4ch

int 21h

再執行PROCEDURE b,PROCEDURE d,PROCEDURE e來運行程序,

屏幕顯示:

Hello word

My name is DJX

並返回DOS

成功!

這樣壹個程序就調試完成,並正確。

下面是正確的源程序:

data segment

out1 db 'Hello world$'

out2 db 'My name is DJX$'

data ends

code segment

assume cs:code;ds:data

start:

mov ax,data

mov ds,ax

lea dx,out1

mov ah,9

int 21h

mov dl,0ah

mov ah,2

int 21h

mov dl,0dh

mov ah,2

int 21h

lea dx,out2

mov ah,9

int 21h

mov ah,4ch

int 21h

code ends

end start

以上這個程序很簡單,只是為了說明實現匯編語言的上機編程及調試過程,匯編語言須多練習才能掌握它的特點,以便順利通過考試

  • 上一篇:神馬影視什麽影院午夜電影院
  • 下一篇:以網絡源代碼工具為例
  • copyright 2024編程學習大全網