基于UCOS的紅外通信設計
基于UCOS的紅外通信設計,基于,ucos,紅外,通信,通訊,設計
實驗一 學習使用DEBUG 主要命令 -----------------------1
實驗二 80X86指令系統(tǒng)和尋址方式(一) -----------------6
實驗三 80X86指令系統(tǒng)和尋址方式(二) -----------------10
實驗四 匯編語言程序格式、上機過程 -------------------14
實驗五 分支程序設計 ---------------------------------17
實驗六 循環(huán)程序程序 ---------------------------------20
實驗七 子程序設計 -----------------------------------22
實驗八 輸入輸出程序設計 -----------------------------27
2
1
實驗一 學習使用 DEBUG 主要命令
實驗目的:
通過實驗掌握下列知識:
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 進制數(shù)表示二進制碼的方法。
5、8088 寄存器: AX,BX,CX,DX,F,IP。
內(nèi)容及步驟:
一、DOS 常用命令練習:
1、 將機房提供的系統(tǒng)盤插入A驅(qū)動器中,開機,出現(xiàn)提示符后打入命令FORMAT
B:/S。等屏幕上出現(xiàn)提示后將新盤插入 B 驅(qū)動器并打回車。PC 機即對新盤格式
化并將糸統(tǒng)拷入。
2、打命令 COPY A:*。* B 將糸統(tǒng)盤上全部文件拷到你的盤上。
3、將新盤插到 A 驅(qū)動器中,用 DIR 命令查看盤上文件。
4、用命令 COPY DEBUG。COM BUG 復制一個文件。
5、用命令 RENAME BUG BG 將 BUG 文件改為 BG。
6、用命令 DEL BG 將文件 BG 刪除。
在操作時要注意提示信息,并按提示操作。
二、DEBUG 命令使用:
1、打 DEBUG 進入 DEBUG 控制,顯示提示苻 '_ '。
2、用命令 F100 10F 'A' 將'A'的 ASCII 碼填入內(nèi)存。
3、用命令 D100 10F 觀察內(nèi)存中的 16 進制碼及屏幕右邊的 ASCII 字符。
4、用命令 F110 11F 41 重復上二項實驗,觀察結(jié)果并比較。
1
5、用命令 E100 30 31 32 …… 3F 將 30H-3FH 寫入地址為 100 開始的內(nèi)存
單元中,再用 D 命令觀察結(jié)果,看鍵入的 16 進制數(shù)是什么字符的 ASCII 碼?
6、用 H 命令檢查下列各組 16 進制數(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 及標志位中 ZF,CF
和 AF 的內(nèi)容。
8、用 R 命令將 AX,BX 內(nèi)容改寫為 1050H 及 23A8H。
三、8088常用指令練習
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 命令檢查鍵入的程序并記錄,特別注意左邊的機器碼。
3)用 T 命令逐條運行這些指令,每運行一行檢查并記錄有關寄存器及 IP 的變
化情況。并注意標志位有無變化。
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 命令檢查鍵入的程序及對應的機器碼。
3)用 T 命令逐條運行這些指令,檢查并記錄有關寄存器及 ZF 情況。
思考:這次運行還是打入 T,行不行?怎么辦?用 R 命令檢查一下 IP 的內(nèi)容。注
意 T 命令與 IP 的關系。
3、帶進位加減法:
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 命令逐條運行這些指令,檢查并記錄有寄存器及 CF 內(nèi)容。
3
3)上面這段程序若改用 16 位操作指令達到同樣結(jié)果,怎么改?試修改并運 行
之。
4、BCD 碼加減法
1)內(nèi)容:
MOV AL,58
ADD AL,25
DAA
2)要求:用 A 命令鍵入,U 命令檢查,T 命令逐條運行并記錄有關寄存器及 AF
內(nèi)容。
實驗報告要求:
1、16 進制數(shù)加減法手算結(jié)果及實驗結(jié)果
2、8088 常用指令練習部分的逐條運行記錄,思考結(jié)果及自編程序運行記錄
(列出自編程序)。
附:
DEBUG 使用:
1、打 DEBUG 進入 DEBUG,顯示提示苻 '_ '。
2、退出 DEBUG 命令:Q
3、顯示內(nèi)存命令:D 起始地址 結(jié)束地址
4、修改內(nèi)存命令:E 起始地址,連續(xù)修改打空格鍵。打回車鍵退出 E 命令。
5、檢查寄存器命令:R
標志位顯示 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 盤號:文件名
10、讀文件命令:L 內(nèi)存地址
11、寫文件命令:W 內(nèi)存地址
10、讀扇區(qū)命令:L 內(nèi)存地址 盤號(0--A:,1--B:) 扇區(qū)號 扇區(qū)數(shù)
11、寫扇區(qū)命令:W 內(nèi)存地址 盤號 扇區(qū)號 扇區(qū)數(shù)
12、運行命令:G=起始地址 結(jié)束(斷點)地址
13、單步命令:T=起始地址 運行指令數(shù),進入子程序內(nèi)部。
14、單步命令:P=起始地址 運行指令數(shù),不進入子程序內(nèi)部。
15、內(nèi)存搬家命令:M 起始地址 結(jié)束地址 目的地址
5
實驗二 80X86指令系統(tǒng)和尋址方式(一)
實驗目的:
通過實驗掌握下列知識:
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 匯編語言偽操作:BYTE PTR,WORD PTR。
5、求累加和程序和多字節(jié)加減法程序。
實驗內(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 命令逐條運行。
2)每運行一條有關內(nèi)存操作數(shù)的指令,要用 D 命令檢查并記錄有關內(nèi)存單元
的內(nèi)容并注明是什么尋址方式。
注意 D 命令顯示結(jié)果中右邊的 ASCII 字符及雙字節(jié)數(shù)存放法。
思考:有關指令中 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)存中,在鍵入時記下標號 LOP和J的
實際地址,在鍵入 LOOP 指令時 LOP 用實際地址值代替。
2)用命令 N AA 將此程序命名為文件 AA(文件名可任取)。
3)用 R 命令將 BX:CX 改為程序長度值(即最后一條指令后面的地址減去開
始地址)
4)用命令 W 100 將此程序存到 AA 命名的磁盤文件中。
5)用命令 Q 退出 DEBUG。
7
6)用命令 DEBUG AA 再次調(diào)入 DEBUG 和文件 AA,可用 U 命令檢查調(diào)入程序。
若調(diào)入 DEBUG 時忘了加 AA 文件名,可用 N 命令和 L 命令將文件調(diào)入。
7)用 E 命令在內(nèi)存地址 1000H 處鍵入 16 個數(shù)字
8)用命令 G=100 J(J 用實際地址代替),使程序運行并停在斷點 J 上,檢查
AX,BX 的值是否符合你的預計值。
9)用 T 命令運行一步,觀察程序方向(IP 值)和 CX 值是否與你的估計一樣,
若不一樣,檢查程序是否有錯。
10)重復 G J 與 T,再檢查 AX 是否正確。
11)用 G 命令使程序運行到結(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開始處鍵入一個8字節(jié)被加數(shù),在2000H開始處鍵入一個
8 字節(jié)加數(shù),均為低字節(jié)在前面。
3)。用 G 命令運行此程序,并用 D 命令檢查其結(jié)果(存放在哪里?),是否正確?
4)將 INT 20H 指令改為 INT 3,有何區(qū)別?若這條指令不加,行不行?試一試。
四。自編程序:
用 16 位減法指令編一個 32 位(4 字節(jié))數(shù)減法程序,兩個源數(shù)及結(jié)果存放
地址同上題。調(diào)試并做記錄。
實驗報告要求:
1、各項實驗結(jié)果記錄。
2、自編程序原稿及調(diào)試后修正稿,寫出原稿錯在那里。
9
實驗三 80X86指令系統(tǒng)和尋址方式(二)
實驗目的:
通過實驗掌握下列知識:
1、堆棧。堆棧指示器 SP 和堆棧操作指令 PUSH。POP。
2、段寄存器和物理地址計算。
3、查表法和查表指令 XLAT。
4、數(shù)據(jù)串傳送程序和數(shù)據(jù)串傳送指令 MOVS。STOS 及重復前輟 REP。
5、循環(huán)指令 ROL。邏輯與指令 AND 和清方向位指令 CLD。
6、偽操作指令 DB。
實驗內(nèi)容及步驟:
一、利用查表方法把 DX 的內(nèi)容(16 進制數(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 命令檢查時注意左邊的 ASCII 碼值和右邊的字符。
3、用 R 命令給 DX 送一個四位的 16 進制數(shù)(例 7F8E)。
4、用 T 命令逐條運行這程序到 LOOP 指令處,觀察并記錄每次運行結(jié)果,特別
是 SP 和堆棧內(nèi)容(用 D 命令檢查)
5、用 G 命令將此程序運行到結(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 命令運行此程序,并用 D 命令檢查目的地址處的字符與源串是否一致。
4、若此程序中的目的地址改為 1002H,再運行此程序,看能不能把 1000H 開始
的
字符串搬到 1002H 開始的地方去?修改程序以做到這一點。
三、段寄存器概念及字符串傳送指令練習:
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 命令運行此程序,檢查目的地址 1500:0000 處內(nèi)容。并記下 DS 與 ES
值。
5、修改此程序,使 ES 與 DS 為同一值,以減少一條指令,而源物理地址和目的
物理地址(是多少?)仍和原來一樣。
實驗報告要求:
12
1、各項實驗記錄和思考題。
2、要求你修改的程序的清單(修改后)和調(diào)試記錄。
13
實驗四 匯編語言程序格式、上機過程
實驗目的:
1、掌握常用工具軟件 PE,MASM 和 LINK 的使用。
2、偽指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。
3、利用的 1 號功能實現(xiàn)鍵盤輸入的方法。
4、了解.EXE 文件和.COM 文件的區(qū)別及用 INT 21H 4C 號功能返回系統(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
實驗步驟:
1、用用文字編輯工具(記事本或 EDIT)將源程序輸入,其擴展名為.ASM。
2、用 MASM 對源文件進行匯編,產(chǎn)生.OBJ 文件和.LST 文件。若匯編時提示
有錯,用文字編輯工具修改源程序后重新匯編,直至通過。
3、用 TYPE 命令顯示 1 產(chǎn)生的.LST 文件。
4、用 LINK 將.OBJ 文件連接成可執(zhí)行的.EXE 文件。
5、在 DOS 狀態(tài)下運行 LINK 產(chǎn)生的。EXE 文件。即在屏幕上顯示標題并提示
你按鍵。每按一鍵在屏幕上顯示二個相同的字符,但小寫字母被改成大寫。按 ESC
鍵可返回 DOS。若未出現(xiàn)預期結(jié)果,用 DEBUG 檢查程序。
實驗報告:
15
1、匯編,連接及調(diào)試時產(chǎn)生的錯誤,其原因及解決辦法。
2、思考:
1)若在源程序中把 INT 21H 的'H'省去,會產(chǎn)生什么現(xiàn)象?
2)把 INT 21H 4CH 號功能改為 INT 20H,行不行?
16
實驗五 分支程序設計
實驗目的:
1、掌握利用間接轉(zhuǎn)移指令 JMP BX 實現(xiàn)多岔分枝的方法。
2、宏替換指令 MACRO 及 ENDM。
3、符號擴展指令 CBW。
實驗程序:
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
實驗步驟:
1、輸入并匯編此程序。要求生成一個 .LST 文件。用 TYPE 命令檢查 .LST
文件,觀察宏替換命令產(chǎn)生的指令集。
2、將 OBJ 文件連接成 EXE 文件(假設為 AA。EXE)。
3、用命令 DEBUG AA.EXE XXX (XXX 為任意字符串)將 AA.EXE 帶參數(shù)調(diào)入 DEBUG
用 D 命令觀察 DS:0080 處的命令行,記錄 80H 處的內(nèi)容和字符個數(shù)的關糸。
4、退出 DEBUG。直接帶參數(shù)運行此程序:
AA n(n=0--5)
依次觀察并記錄 n從0到5 時的運行結(jié)果。
19
實驗六 循環(huán)程序程序
實驗目的:
1、掌握循環(huán)程序和排序程序設計方法。
2、掌握帶符號數(shù)的比較轉(zhuǎn)移指令:JL,JLE,JG,JGE
3、偽指令 EQU 及操作符 '$'的使用。
4、 COM 文件的要求和生成過程。
程序:
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
實驗步驟:
1、輸入,匯編并連接此程序。忽略連接時的無堆棧告警。
2、用 EXE2BIN 將 .exe 文件轉(zhuǎn)換為 。COM 文件,命令格式:
EXE2BIN? ???.EXE ????.COM
3、在 DEBUG 下運行此程序,記錄運行結(jié)果。
4、將轉(zhuǎn)移指令 JLE 改為 JBE,JGE 和 JAE,分別運行并記錄排序結(jié)果。
21
實驗七 子程序設計
實驗目的:
1、掌握利用堆棧傳遞參數(shù)的子程序調(diào)用方法。
2、掌握子程序遞歸調(diào)用方法。
3、過程調(diào)用偽指令: PROC,ENDP,NEAR 和 FAR。
4、8088 指令: CALL,RET,RET n。
5、利用 RET 指令退出 EXE 文件的方法。
實驗內(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 的斷點命令和 T 命令運行此程序,觀察并記錄每次過程調(diào)用及進
出
棧指令前后(帶';'的語句)的 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 的斷點和 T 命令檢查并記錄每層遞歸嵌套過程的堆棧和 AL 內(nèi)容。
3、修改源程序,將階乘數(shù) 3 改為本程序的最大允許值(是多少?),重新匯編連
接之。用 DEBUG 運行并記錄 RESUL 單元內(nèi)容。
4、若要在 DOS 命令下直接運行并顯示階乘結(jié)果(16 進制形式),試修改程序并
調(diào)試運行。(機動)
實驗報告:
1、實驗記錄。
2、自編程序。
3、體會和意見。
26
實驗八 輸入輸出程序設計
實驗目的:
通過實驗掌握下列知識:
1、利用 DOS 功能調(diào)用 INT21H的2號和9 號功能進行屏幕顯示的方法。
2、直接向視頻 RAM(VRAM)送 ASCII 碼進行屏幕顯示的方法。
3、掌握利用 FCB 進行磁盤文件讀寫的方法。
4、掌握利用 HANDLE 進行磁盤文件讀寫的方法。
5、INT 21H 0FH,10H,14H,15H,16H,1AH 號功能調(diào)用。
6、INT 21H 3CH,3DH,3FH,40H 號功能調(diào)用。
實驗內(nèi)容及步驟:
一、利用 INT 21 0AH號功能調(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 必須置為文件長度值)。
4、用 Q 命令退出 DEBUG。
5、在 DOS 命令下打 AA,運行此程序,即在屏幕上顯示'This is a sample!'字
符串,若不出現(xiàn),用 DEBUG 檢查程序有無錯誤。
二、利用 INT 21H 2號功能顯示字符:
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 命令運行程序,即在屏幕上依次緩慢的顯示 256 個 ASCII 字符。仔細
觀察每個字符,和 IBM-PC ASCII 碼表對照,看 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、運行此程序。
32
收藏