基于UCOS的紅外通信設(shè)計(jì)
基于UCOS的紅外通信設(shè)計(jì),基于,ucos,紅外,通信,通訊,設(shè)計(jì)
實(shí)驗(yàn)一 學(xué)習(xí)使用DEBUG 主要命令 -----------------------1
實(shí)驗(yàn)二 80X86指令系統(tǒng)和尋址方式(一) -----------------6
實(shí)驗(yàn)三 80X86指令系統(tǒng)和尋址方式(二) -----------------10
實(shí)驗(yàn)四 匯編語(yǔ)言程序格式、上機(jī)過(guò)程 -------------------14
實(shí)驗(yàn)五 分支程序設(shè)計(jì) ---------------------------------17
實(shí)驗(yàn)六 循環(huán)程序程序 ---------------------------------20
實(shí)驗(yàn)七 子程序設(shè)計(jì) -----------------------------------22
實(shí)驗(yàn)八 輸入輸出程序設(shè)計(jì) -----------------------------27
2
1
實(shí)驗(yàn)一 學(xué)習(xí)使用 DEBUG 主要命令
實(shí)驗(yàn)?zāi)康?
通過(guò)實(shí)驗(yàn)掌握下列知識(shí):
1、DOS 命令: DIR,DEL,RENAME,FORMAT,COPY。
2、8088 指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG
3、DEBUG 命令: A,D,E,F,H,R,T,U。
4、BCD 碼,ASCII 碼及用 16 進(jìn)制數(shù)表示二進(jìn)制碼的方法。
5、8088 寄存器: AX,BX,CX,DX,F,IP。
內(nèi)容及步驟:
一、DOS 常用命令練習(xí):
1、 將機(jī)房提供的系統(tǒng)盤插入A驅(qū)動(dòng)器中,開機(jī),出現(xiàn)提示符后打入命令FORMAT
B:/S。等屏幕上出現(xiàn)提示后將新盤插入 B 驅(qū)動(dòng)器并打回車。PC 機(jī)即對(duì)新盤格式
化并將糸統(tǒng)拷入。
2、打命令 COPY A:*。* B 將糸統(tǒng)盤上全部文件拷到你的盤上。
3、將新盤插到 A 驅(qū)動(dòng)器中,用 DIR 命令查看盤上文件。
4、用命令 COPY DEBUG。COM BUG 復(fù)制一個(gè)文件。
5、用命令 RENAME BUG BG 將 BUG 文件改為 BG。
6、用命令 DEL BG 將文件 BG 刪除。
在操作時(shí)要注意提示信息,并按提示操作。
二、DEBUG 命令使用:
1、打 DEBUG 進(jìn)入 DEBUG 控制,顯示提示苻 '_ '。
2、用命令 F100 10F 'A' 將'A'的 ASCII 碼填入內(nèi)存。
3、用命令 D100 10F 觀察內(nèi)存中的 16 進(jìn)制碼及屏幕右邊的 ASCII 字符。
4、用命令 F110 11F 41 重復(fù)上二項(xiàng)實(shí)驗(yàn),觀察結(jié)果并比較。
1
5、用命令 E100 30 31 32 …… 3F 將 30H-3FH 寫入地址為 100 開始的內(nèi)存
單元中,再用 D 命令觀察結(jié)果,看鍵入的 16 進(jìn)制數(shù)是什么字符的 ASCII 碼?
6、用 H 命令檢查下列各組 16 進(jìn)制數(shù)加減結(jié)果并和你的手算結(jié)果比較:
(1)34H,22H (2)56H,78H (3)A5,79H (4)1284H,5678H (5)A758,347FH
7、用 R 命令檢查各寄存器內(nèi)容,特別注意 AX,BX,CX,DX,IP 及標(biāo)志位中 ZF,CF
和 AF 的內(nèi)容。
8、用 R 命令將 AX,BX 內(nèi)容改寫為 1050H 及 23A8H。
三、8088常用指令練習(xí)
1、傳送指令
1)用 A 命令在內(nèi)存 100H 處鍵入下列內(nèi)容:
MOV AX,1234
MOV BX,5678
XCHG AX,BX
MOV AH,35
MOV AL,48
MOV DX,75AB
XCHG AX,DX
2)用 U 命令檢查鍵入的程序并記錄,特別注意左邊的機(jī)器碼。
3)用 T 命令逐條運(yùn)行這些指令,每運(yùn)行一行檢查并記錄有關(guān)寄存器及 IP 的變
化情況。并注意標(biāo)志位有無(wú)變化。
2、加減法指令:
1)用 A 命令在內(nèi)存 100H 處鍵入下列內(nèi)容:
MOV AH,34
MOV AL,22
2
ADD AL,AH
SUB AL,78
MOV CX,1284
MOV DX,5678
ADD CX,DX
SUB CX,AX
SUB CX,CX
2)用 U 命令檢查鍵入的程序及對(duì)應(yīng)的機(jī)器碼。
3)用 T 命令逐條運(yùn)行這些指令,檢查并記錄有關(guān)寄存器及 ZF 情況。
思考:這次運(yùn)行還是打入 T,行不行?怎么辦?用 R 命令檢查一下 IP 的內(nèi)容。注
意 T 命令與 IP 的關(guān)系。
3、帶進(jìn)位加減法:
1)用 A 命令在內(nèi)存 200H 處鍵入下列內(nèi)容,并用 U 命令檢查:
MOV AH,12
MOV AL,84
MOV CH,56
MOV CL,78
ADD AL,CL
ADC AH,CH
MOV DH,A7
MOV DL,58
SUB DL,7F
SBB DH,34
2)用 T 命令逐條運(yùn)行這些指令,檢查并記錄有寄存器及 CF 內(nèi)容。
3
3)上面這段程序若改用 16 位操作指令達(dá)到同樣結(jié)果,怎么改?試修改并運(yùn) 行
之。
4、BCD 碼加減法
1)內(nèi)容:
MOV AL,58
ADD AL,25
DAA
2)要求:用 A 命令鍵入,U 命令檢查,T 命令逐條運(yùn)行并記錄有關(guān)寄存器及 AF
內(nèi)容。
實(shí)驗(yàn)報(bào)告要求:
1、16 進(jìn)制數(shù)加減法手算結(jié)果及實(shí)驗(yàn)結(jié)果
2、8088 常用指令練習(xí)部分的逐條運(yùn)行記錄,思考結(jié)果及自編程序運(yùn)行記錄
(列出自編程序)。
附:
DEBUG 使用:
1、打 DEBUG 進(jìn)入 DEBUG,顯示提示苻 '_ '。
2、退出 DEBUG 命令:Q
3、顯示內(nèi)存命令:D 起始地址 結(jié)束地址
4、修改內(nèi)存命令:E 起始地址,連續(xù)修改打空格鍵。打回車鍵退出 E 命令。
5、檢查寄存器命令:R
標(biāo)志位顯示 1 0
CF CY NC
ZF ZR NZ
SF NG PL
AF AC NA
4
OF OV NV
PF PE PO
DF DN UP
IF EI DI
6、修改寄存器命令:R 寄存器名
7、小匯編命令:A 起始地址,不輸入指令打回車鍵退出 A 命令。
8、反匯編命令:U 起始地址 結(jié)束地址
9、文件命名命令:N 盤號(hào):文件名
10、讀文件命令:L 內(nèi)存地址
11、寫文件命令:W 內(nèi)存地址
10、讀扇區(qū)命令:L 內(nèi)存地址 盤號(hào)(0--A:,1--B:) 扇區(qū)號(hào) 扇區(qū)數(shù)
11、寫扇區(qū)命令:W 內(nèi)存地址 盤號(hào) 扇區(qū)號(hào) 扇區(qū)數(shù)
12、運(yùn)行命令:G=起始地址 結(jié)束(斷點(diǎn))地址
13、單步命令:T=起始地址 運(yùn)行指令數(shù),進(jìn)入子程序內(nèi)部。
14、單步命令:P=起始地址 運(yùn)行指令數(shù),不進(jìn)入子程序內(nèi)部。
15、內(nèi)存搬家命令:M 起始地址 結(jié)束地址 目的地址
5
實(shí)驗(yàn)二 80X86指令系統(tǒng)和尋址方式(一)
實(shí)驗(yàn)?zāi)康?
通過(guò)實(shí)驗(yàn)掌握下列知識(shí):
1、DEBUG 命令:G,N,W,L 及 Q。
2、8088 系統(tǒng)中數(shù)據(jù)在內(nèi)存中的存放方式和內(nèi)存操作數(shù)的幾種尋址方式。
3、8088 指令:INC,DEC,LOOP,INT 3,INT 20H,寄存器 SI,DI。
4、8088 匯編語(yǔ)言偽操作:BYTE PTR,WORD PTR。
5、求累加和程序和多字節(jié)加減法程序。
實(shí)驗(yàn)內(nèi)容和步驟:
一、內(nèi)存操作數(shù)及各種尋址方式使用:
內(nèi)容:
MOV AX,1234
MOV [1000],AX
MOV BX,1002
MOV BYTE PTR[BX],20
MOV DL,39
INC BX
MOV [BX],DL
DEC DL
MOV SI,3
MOV [BX+SI],DL
MOV [BX+SI+1],DL
MOV WORD PTR[BX+SI+2],2846
6
步驟:
1)用 A 命令鍵入上述程序,并用 T 命令逐條運(yùn)行。
2)每運(yùn)行一條有關(guān)內(nèi)存操作數(shù)的指令,要用 D 命令檢查并記錄有關(guān)內(nèi)存單元
的內(nèi)容并注明是什么尋址方式。
注意 D 命令顯示結(jié)果中右邊的 ASCII 字符及雙字節(jié)數(shù)存放法。
思考:有關(guān)指令中 BYTE PTR 及 WORD PTR 偽操作不加行不行?試一試。
二、求累加和程序:
程序:
MOV BX,1000
MOV CX,10
SUB AX,AX
LOP: ADD AL,[BX]
AD CAH,0
INC BX
J: LOOP LOP
INT 3
步驟:
1)用 A 命令將程序鍵入到 100H 開始的內(nèi)存中,在鍵入時(shí)記下標(biāo)號(hào) LOP和J的
實(shí)際地址,在鍵入 LOOP 指令時(shí) LOP 用實(shí)際地址值代替。
2)用命令 N AA 將此程序命名為文件 AA(文件名可任取)。
3)用 R 命令將 BX:CX 改為程序長(zhǎng)度值(即最后一條指令后面的地址減去開
始地址)
4)用命令 W 100 將此程序存到 AA 命名的磁盤文件中。
5)用命令 Q 退出 DEBUG。
7
6)用命令 DEBUG AA 再次調(diào)入 DEBUG 和文件 AA,可用 U 命令檢查調(diào)入程序。
若調(diào)入 DEBUG 時(shí)忘了加 AA 文件名,可用 N 命令和 L 命令將文件調(diào)入。
7)用 E 命令在內(nèi)存地址 1000H 處鍵入 16 個(gè)數(shù)字
8)用命令 G=100 J(J 用實(shí)際地址代替),使程序運(yùn)行并停在斷點(diǎn) J 上,檢查
AX,BX 的值是否符合你的預(yù)計(jì)值。
9)用 T 命令運(yùn)行一步,觀察程序方向(IP 值)和 CX 值是否與你的估計(jì)一樣,
若不一樣,檢查程序是否有錯(cuò)。
10)重復(fù) G J 與 T,再檢查 AX 是否正確。
11)用 G 命令使程序運(yùn)行到結(jié)束,檢查 AX 值是否正確。
三、多字節(jié)加法程序。
程序:
MOV DI,1000
MOV CX,8
MOV SI,2000
CLC
LOP: MOV AL,[SI]
ADC [DI],AL
INC SI
INC DI
LOOP LOP
INT 20
步驟:
1)用命令鍵入此程序
8
2)用E命令在1000H開始處鍵入一個(gè)8字節(jié)被加數(shù),在2000H開始處鍵入一個(gè)
8 字節(jié)加數(shù),均為低字節(jié)在前面。
3)。用 G 命令運(yùn)行此程序,并用 D 命令檢查其結(jié)果(存放在哪里?),是否正確?
4)將 INT 20H 指令改為 INT 3,有何區(qū)別?若這條指令不加,行不行?試一試。
四。自編程序:
用 16 位減法指令編一個(gè) 32 位(4 字節(jié))數(shù)減法程序,兩個(gè)源數(shù)及結(jié)果存放
地址同上題。調(diào)試并做記錄。
實(shí)驗(yàn)報(bào)告要求:
1、各項(xiàng)實(shí)驗(yàn)結(jié)果記錄。
2、自編程序原稿及調(diào)試后修正稿,寫出原稿錯(cuò)在那里。
9
實(shí)驗(yàn)三 80X86指令系統(tǒng)和尋址方式(二)
實(shí)驗(yàn)?zāi)康?
通過(guò)實(shí)驗(yàn)掌握下列知識(shí):
1、堆棧。堆棧指示器 SP 和堆棧操作指令 PUSH。POP。
2、段寄存器和物理地址計(jì)算。
3、查表法和查表指令 XLAT。
4、數(shù)據(jù)串傳送程序和數(shù)據(jù)串傳送指令 MOVS。STOS 及重復(fù)前輟 REP。
5、循環(huán)指令 ROL。邏輯與指令 AND 和清方向位指令 CLD。
6、偽操作指令 DB。
實(shí)驗(yàn)內(nèi)容及步驟:
一、利用查表方法把 DX 的內(nèi)容(16 進(jìn)制數(shù))轉(zhuǎn)換成 ASCII 碼:
1、用 A 命令鍵入下列程序:
MOV BX,1000
MOV DI,2000
MOV CX,4
LOP: PUSH CX
MOV CL,4
ROL DX,CL
POP CX
MOV AL,DL
AND AL,OF
XLAT
CLD
10
STOSB
LOOP LOP
INT 20
2、用 A 命令在 1000H 處鍵入下列 ASCII 碼并用 D 命令檢查之:
DB `0 1 2 3 4 5 6 7 8 9 A B C D E F'
用 D 命令檢查時(shí)注意左邊的 ASCII 碼值和右邊的字符。
3、用 R 命令給 DX 送一個(gè)四位的 16 進(jìn)制數(shù)(例 7F8E)。
4、用 T 命令逐條運(yùn)行這程序到 LOOP 指令處,觀察并記錄每次運(yùn)行結(jié)果,特別
是 SP 和堆棧內(nèi)容(用 D 命令檢查)
5、用 G 命令將此程序運(yùn)行到結(jié)束,并用 D 命令檢查 2000H 處所轉(zhuǎn)換的結(jié)果。
可注意屏幕右邊的 ASCII 字符與 DX 是否一致。
二、數(shù)據(jù)串搬家程序:
1、用 A 命令鍵入下列程序:
MOV SI,1000
MOV DI,1500
MOV CX,0F
LOP: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP LOP
INT 20
2、用 A 命令 DB 偽指令在 1000H 鍵入下列字符串:
11
‘IBM_PC COMPUTER'
3、用 G 命令運(yùn)行此程序,并用 D 命令檢查目的地址處的字符與源串是否一致。
4、若此程序中的目的地址改為 1002H,再運(yùn)行此程序,看能不能把 1000H 開始
的
字符串搬到 1002H 開始的地方去?修改程序以做到這一點(diǎn)。
三、段寄存器概念及字符串傳送指令練習(xí):
1、用 A 命令鍵入下列程序:
MOV SI,0
MOV DI,0
MOV AX,1000
MOV DS,AX
MOV AX,1500
MOV ES,AX
MOV CX,0F
CLD
REP MOVSB
INT 20
2、用 A 命令 DB 偽指令在 1000:0000 處鍵入字符串'IBM_PC COMPUTER',并用
D 命檢查之
3、用 D 命令檢查 0F00:1000 處內(nèi)容,看是否一樣。為什么?
4、用 G 命令運(yùn)行此程序,檢查目的地址 1500:0000 處內(nèi)容。并記下 DS 與 ES
值。
5、修改此程序,使 ES 與 DS 為同一值,以減少一條指令,而源物理地址和目的
物理地址(是多少?)仍和原來(lái)一樣。
實(shí)驗(yàn)報(bào)告要求:
12
1、各項(xiàng)實(shí)驗(yàn)記錄和思考題。
2、要求你修改的程序的清單(修改后)和調(diào)試記錄。
13
實(shí)驗(yàn)四 匯編語(yǔ)言程序格式、上機(jī)過(guò)程
實(shí)驗(yàn)?zāi)康?
1、掌握常用工具軟件 PE,MASM 和 LINK 的使用。
2、偽指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。
3、利用的 1 號(hào)功能實(shí)現(xiàn)鍵盤輸入的方法。
4、了解.EXE 文件和.COM 文件的區(qū)別及用 INT 21H 4C 號(hào)功能返回系統(tǒng)的方法。
程序:
data segment
message db 'This is a sample program of keyboard and disply'
db 0dh,0ah,'Please strike the key!',0dh,0ah,'$'
data ends
stack segment para stack 'stack'
db 50 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov dx,offset message
mov ah,9
int 21h
again: mov ah,1
int 21h
14
cmp al,1bh
je exit
cmp al,61h
jc nd
cmp al,7ah
ja nd
and al,11011111b
nd: mov dl,al
mov ah,2
int 21h
jmp again
exit: mov ah,4ch
int 21h
code ends
end start
實(shí)驗(yàn)步驟:
1、用用文字編輯工具(記事本或 EDIT)將源程序輸入,其擴(kuò)展名為.ASM。
2、用 MASM 對(duì)源文件進(jìn)行匯編,產(chǎn)生.OBJ 文件和.LST 文件。若匯編時(shí)提示
有錯(cuò),用文字編輯工具修改源程序后重新匯編,直至通過(guò)。
3、用 TYPE 命令顯示 1 產(chǎn)生的.LST 文件。
4、用 LINK 將.OBJ 文件連接成可執(zhí)行的.EXE 文件。
5、在 DOS 狀態(tài)下運(yùn)行 LINK 產(chǎn)生的。EXE 文件。即在屏幕上顯示標(biāo)題并提示
你按鍵。每按一鍵在屏幕上顯示二個(gè)相同的字符,但小寫字母被改成大寫。按 ESC
鍵可返回 DOS。若未出現(xiàn)預(yù)期結(jié)果,用 DEBUG 檢查程序。
實(shí)驗(yàn)報(bào)告:
15
1、匯編,連接及調(diào)試時(shí)產(chǎn)生的錯(cuò)誤,其原因及解決辦法。
2、思考:
1)若在源程序中把 INT 21H 的'H'省去,會(huì)產(chǎn)生什么現(xiàn)象?
2)把 INT 21H 4CH 號(hào)功能改為 INT 20H,行不行?
16
實(shí)驗(yàn)五 分支程序設(shè)計(jì)
實(shí)驗(yàn)?zāi)康?
1、掌握利用間接轉(zhuǎn)移指令 JMP BX 實(shí)現(xiàn)多岔分枝的方法。
2、宏替換指令 MACRO 及 ENDM。
3、符號(hào)擴(kuò)展指令 CBW。
實(shí)驗(yàn)程序:
disp macro msg
lea dx,msg
mov ah,9
int 21h
mov ah,4ch
int 21h
endm
stack segment stack
db 256 dup(0)
stack ends
data segment
parm db 16 dup(?)
brtable dw offset bra,offset brb,offset brc
dw offset brd,offset bre,offset brf
msga db 'I like my IBM-PC!$'
msgb db 'How are you!$'
msgc db 'Nibao College$'
17
msgd db 'This is a sample$'
msge db 'Wellcome use my coputer!$'
msgf db 'Theassemder language of 8088$'
errms db 'Error!! invalid parameter!!$'
data ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov es,ax
mov si,80h
lea di,parm
mov cx,16
cld
rep movsb
mov ds,ax
cmp parm,2
jc err
mov al,parm+2
sub al,30h
jc err
cmp al,6
jnc err
lea bx,brtable
cbw
18
add ax,ax
add bx,ax
jmp [bx]
err: disp errms
bra: disp msga
brb: disp msgb
brc: disp msgc
brd: disp msgd
bre: disp msge
brf: disp msgf
code ends
end start
實(shí)驗(yàn)步驟:
1、輸入并匯編此程序。要求生成一個(gè) .LST 文件。用 TYPE 命令檢查 .LST
文件,觀察宏替換命令產(chǎn)生的指令集。
2、將 OBJ 文件連接成 EXE 文件(假設(shè)為 AA。EXE)。
3、用命令 DEBUG AA.EXE XXX (XXX 為任意字符串)將 AA.EXE 帶參數(shù)調(diào)入 DEBUG
用 D 命令觀察 DS:0080 處的命令行,記錄 80H 處的內(nèi)容和字符個(gè)數(shù)的關(guān)糸。
4、退出 DEBUG。直接帶參數(shù)運(yùn)行此程序:
AA n(n=0--5)
依次觀察并記錄 n從0到5 時(shí)的運(yùn)行結(jié)果。
19
實(shí)驗(yàn)六 循環(huán)程序程序
實(shí)驗(yàn)?zāi)康?
1、掌握循環(huán)程序和排序程序設(shè)計(jì)方法。
2、掌握帶符號(hào)數(shù)的比較轉(zhuǎn)移指令:JL,JLE,JG,JGE
3、偽指令 EQU 及操作符 '$'的使用。
4、 COM 文件的要求和生成過(guò)程。
程序:
code segment
org 100h
assume cs:code,ds:code
main: jmp start
array dw 1234h,5673h,7fffh,8000h,0dffh
dw 0ab5h,0369h,005fh,5634h,9069h
count equ $-array
start: mov cx,count
shr cx,1
dec cx
mov bl,-1
again: mov dx,cx
and bl,bl
je exit
xor bl,bl
xor si,si
20
again1: mov ax,array[si]
cmp ax,array[si+2]
jle nchg
xchg array[si+2],ax
mov array[si],ax
mov bl,-1
nchg: inc si
inc si
dec dx
jnz again1
loop again
exit: int 20h
code ends
end main
實(shí)驗(yàn)步驟:
1、輸入,匯編并連接此程序。忽略連接時(shí)的無(wú)堆棧告警。
2、用 EXE2BIN 將 .exe 文件轉(zhuǎn)換為 。COM 文件,命令格式:
EXE2BIN? ???.EXE ????.COM
3、在 DEBUG 下運(yùn)行此程序,記錄運(yùn)行結(jié)果。
4、將轉(zhuǎn)移指令 JLE 改為 JBE,JGE 和 JAE,分別運(yùn)行并記錄排序結(jié)果。
21
實(shí)驗(yàn)七 子程序設(shè)計(jì)
實(shí)驗(yàn)?zāi)康?
1、掌握利用堆棧傳遞參數(shù)的子程序調(diào)用方法。
2、掌握子程序遞歸調(diào)用方法。
3、過(guò)程調(diào)用偽指令: PROC,ENDP,NEAR 和 FAR。
4、8088 指令: CALL,RET,RET n。
5、利用 RET 指令退出 EXE 文件的方法。
實(shí)驗(yàn)內(nèi)容及步驟:
一、利用堆棧傳遞參數(shù)的子程序調(diào)用。(求累加和)
程序:
stack segment stack
db 256 dup(0)
stack ends
data segment
ary1 db 1,2,3,4,5,6,7,8,9,10
count1 equ $-ary1
sum1 dw ?
ary2 db 10,11,12,13,14,15,16,17,18
count2 equ $-ary2
sum2 dw ?
data ends
main segment
assume cs:main,ds:data,ss:stack
22
start proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,count1
push ax
lea ax,ary1
push ax
call far ptr sum
mov ax,count2
push ax
lea ax,ary2
push ax
call far ptr sum
ret
start endp
main ends
proce segment
assume cs: proce
sum procfar
mov bp,sp
mov cx,[bp+6]
23
mov bx,[bp+4]
xor ax,ax
adn: add al,[bx]
adc ah,0
inc bx
loop adn
mov [bx],ax
ret 4
sum endp
proce ends
end star
步驟:
1、輸入,匯編并將此程序連接成 EXE 文件。
2、用 DEBUG 的斷點(diǎn)命令和 T 命令運(yùn)行此程序,觀察并記錄每次過(guò)程調(diào)用及進(jìn)
出
棧指令前后(帶';'的語(yǔ)句)的 SP 和堆棧內(nèi)容。
3、記錄最后結(jié)果:SUM1,SUM2 的段及偏移地址和它們的內(nèi)容。
二、子程序遞歸調(diào)用(求階乘)。
程序:
stack segment stack
db 100h dup(?)
stack ends
data segment
resul dw ?
24
data ends
code segment
main proc far
assume cs:code,ds:data,ss:stack
start: push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,5
call fact
mov resul,ax
ret
fact proc
and al,al
jne iia
mov al,1
ret
iia: push ax
dec al
call fact
x2: pop cx
mul cl
ret
25
fact endp
main endp
code ends
end start
步驟:
1、將程序輸入,匯編并連接成 EXE 文件。
2、用 DEBUG 的斷點(diǎn)和 T 命令檢查并記錄每層遞歸嵌套過(guò)程的堆棧和 AL 內(nèi)容。
3、修改源程序,將階乘數(shù) 3 改為本程序的最大允許值(是多少?),重新匯編連
接之。用 DEBUG 運(yùn)行并記錄 RESUL 單元內(nèi)容。
4、若要在 DOS 命令下直接運(yùn)行并顯示階乘結(jié)果(16 進(jìn)制形式),試修改程序并
調(diào)試運(yùn)行。(機(jī)動(dòng))
實(shí)驗(yàn)報(bào)告:
1、實(shí)驗(yàn)記錄。
2、自編程序。
3、體會(huì)和意見(jiàn)。
26
實(shí)驗(yàn)八 輸入輸出程序設(shè)計(jì)
實(shí)驗(yàn)?zāi)康?
通過(guò)實(shí)驗(yàn)掌握下列知識(shí):
1、利用 DOS 功能調(diào)用 INT21H的2號(hào)和9 號(hào)功能進(jìn)行屏幕顯示的方法。
2、直接向視頻 RAM(VRAM)送 ASCII 碼進(jìn)行屏幕顯示的方法。
3、掌握利用 FCB 進(jìn)行磁盤文件讀寫的方法。
4、掌握利用 HANDLE 進(jìn)行磁盤文件讀寫的方法。
5、INT 21H 0FH,10H,14H,15H,16H,1AH 號(hào)功能調(diào)用。
6、INT 21H 3CH,3DH,3FH,40H 號(hào)功能調(diào)用。
實(shí)驗(yàn)內(nèi)容及步驟:
一、利用 INT 21 0AH號(hào)功能調(diào)用顯示字符串。
1、用 A 命令在 100H 處鍵入下列程序:
MOV AH, 9
MOV DX,110
INT 21
INT 20
2、用 A 命令在 110H 處鍵入下列字符串的 ASCII 碼:
DB 'This is a sample!$'
3、用 N 命令和 W 命令將此程序(包括數(shù)據(jù)區(qū))存入文件名為 AA。COM 的磁盤文
件中。(存入前 BX:CX 必須置為文件長(zhǎng)度值)。
4、用 Q 命令退出 DEBUG。
5、在 DOS 命令下打 AA,運(yùn)行此程序,即在屏幕上顯示'This is a sample!'字
符串,若不出現(xiàn),用 DEBUG 檢查程序有無(wú)錯(cuò)誤。
二、利用 INT 21H 2號(hào)功能顯示字符:
27
1、用 A 命令在 100H 處鍵入下列程序:
XOR DL,DL
MOVCX,100
LOP:MOV AH,2
INT 21
INC DL
PUSH CX
MOV CX,8
DELY: PUSH CX
MOV CX,0
J: LOOP J
POP CX
LOOP DELY
POP CX
LOOP LOP
INT 20
2、用 G 命令運(yùn)行程序,即在屏幕上依次緩慢的顯示 256 個(gè) ASCII 字符。仔細(xì)
觀察每個(gè)字符,和 IBM-PC ASCII 碼表對(duì)照,看 07H-0DH 處控制字符顯示結(jié)果與表
上有何不同?
3、按 CTRL+BREAK 退出此程序,若一次不行可多做幾次。
三、文本文件內(nèi)容顯示程序:
stack segment stack
db 100h dup(?)
stack ends
28
data segment
fcb db 36 dup(0)
count db 0
char db 0
dta db 0
errmsg db 'file access error'
data ends
code segment
main proc far
assume cs:code,ss:stack
start: push ds
sub ax,ax
push ax
mov ax,data
mov es,ax
assume es:data
mov si,5ch
mov di,offset fcb
mov cx,12
cld
rep movsb
mov ds,ax
assume ds:data
mov dx,offset dta
29
mov ah,1ah
int 21h
mov dx,offset fcb
mov ah,0fh
int 21h
cmp al,0
jnz error
mov word ptr fcb+0ch,0
mov word ptr fcb+0eh,1
mov fcb+20h,0
again: lea dx,fcb
mov ah,14h
int 21h
cmp al,0
jnz error
mov al,dta
cmp al,1ah
jz eof
cmp al,9
jz tab
call dispchar
inc char
cmp dta,0ah
jnz again
30
mov char,0
inc count
cmp count,24
jnz again
mov ah,0
int 16h
mov count,0
jmp again
tab: mov al,' '
call dispchar
inc char
test char,7
jz again
jmp tab
eof: lea dx,fcb
mov ah,10h
int 21h
ret
error: lea bx,errmsg
call display
ret
display proc
mov cx,30
disp1: mov al,[bx]
31
call dispchar
inc bx
loop disp1
mov al,0dh
call dispchar
mov al,0ah
call dispchar
ret
display endp
dispchar proc
push bx
mov bx,0
mov ah,14
int 10h
pop bx
ret
dispchar endp
main endp
code ends
end start
1、輸入,匯編,連接此程序,用 DEBUG 將目的程序帶參數(shù)調(diào)入,用 D 命令觀看并
記錄
PSP 中的 FCB 內(nèi)容。
2、運(yùn)行此程序。
32
收藏