《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第十章——自编解析与答案
10.1 寫出指令,選擇顯示方式10H,并將背景設(shè)為綠色。
答: MOV AH, 00H
MOV AL, 10H ;選擇顯示方式10H(16色圖形)
INT 10H
MOV AH, 10H
MOV AL, 00H
MOV BH, 10H ;背景設(shè)為綠色(02H也可以,是用DEBUG調(diào)試出來的)
MOV BL, 0 ;選擇0號(hào)調(diào)色板
INT 10H
設(shè)置背景色也可用:
MOV AH, 0BH ;設(shè)置背景色和調(diào)色板
MOV BH, 0 ;設(shè)置背景色功能
MOV BL, 8 ;綠色背景
INT 10H
10.2 如何使用INT 10H的功能調(diào)用改變顯示方式?
答:在AH中設(shè)置功能號(hào)00H,在AL中設(shè)置顯示方式值,調(diào)用INT 10H即可。
10.3 VGA獨(dú)有的一種顯示方式是什么?
答:像素值為640×480,可同時(shí)顯示16種顏色,這種顯示方式(12H)是VGA獨(dú)有的。
10.4 對(duì)于EGA和VGA顯示適配器,使用顯示方式13H時(shí)(只有VGA有),顯示數(shù)據(jù)存在哪里?
答:顯示數(shù)據(jù)存在顯示存儲(chǔ)器里。
10.5 對(duì)于VGA的顯示方式13H時(shí)存放一屏信息需要多少字節(jié)的顯存?
答:需要64000個(gè)字節(jié)。
10.6 利用BIOS功能編寫圖形程序:設(shè)置圖形方式10H,選擇背景色為藍(lán)色,然后每行(水平方向)顯示一種
顏色,每4行重復(fù)一次,一直到整個(gè)屏幕都顯示出彩條。
答:程序如下:
TITLE GRAPHIX.COM
codeseg segment
assume cs:codeseg, ds:codeseg, ss:codeseg
org 100h
main proc far
mov ah, 00h
mov al, 10h ;選擇顯示方式10h(16色圖形)
int 10h
mov ah, 0bh
mov bh, 00h
mov bl, 01h ;背景設(shè)為藍(lán)色
int 10h
mov ah, 0bh
mov bh, 01h
mov bl, 00h ;設(shè)置調(diào)色板0#
int 10h
mov bx, 0 ;顯存的第0頁
mov cx, 0 ;起始列號(hào)為0列
mov dx, 0 ;起始行號(hào)為0行
line: mov ah, 0ch ;寫像素點(diǎn)
mov al, bl
int 10h
inc cx
cmp cx, 640
jne line
mov cx, 0 ;起始列號(hào)為0列
inc bl
and bl, 03h ;只顯示四種顏色(因此保留最低兩位)
inc dx
cmp dx, 350
jne line
int 20h
main endp
codeseg ends
end main
10.7 修改10.6題的程序,使整個(gè)屏幕都顯示出縱向的彩條。
答:程序如下:
TITLE GRAPHIX.COM
codeseg segment
assume cs:codeseg, ds:codeseg, ss:codeseg
org 100h
main proc far
mov ah, 00h
mov al, 10h ;選擇顯示方式10h(16色圖形)
int 10h
mov ah, 0bh
mov bh, 00h
mov bl, 01h ;背景設(shè)為藍(lán)色
int 10h
mov ah, 0bh
mov bh, 01h
mov bl, 00h ;設(shè)置調(diào)色板0#
int 10h
mov bx, 0 ;顯存的第0頁
mov cx, 0 ;起始列號(hào)為0列
mov dx, 0 ;起始行號(hào)為0行
line: mov ah, 0ch ;寫像素點(diǎn)
mov al, bl
int 10h
inc dx
cmp dx, 350
jne line
mov dx, 0 ;起始行號(hào)為0行
inc bl
and bl, 03h ;只顯示四種顏色(因此保留最低兩位)
inc cx
cmp cx, 640
jne line
int 20h
main endp
codeseg ends
end main
10.8 按動(dòng)鍵盤上的光標(biāo)控制鍵,在屏幕上下左右任一方向上繪圖,每畫一點(diǎn)之前,由數(shù)字鍵0~3指定該點(diǎn)
的顏色值,按動(dòng)ESC鍵,繪圖結(jié)束,返回DOS。
答:程序如下:
;DRAW—Program to draw on screen with sursor arrows
;For 640*350 color mode
up equ 48h ;向上鍵的掃描值
down equ 50h ;向下鍵的掃描值
left equ 4bh ;向左鍵的掃描值
right equ 4dh ;向右鍵的掃描值
escape equ 1bh ;“Esc” character
codeseg segment
main proc far
assume cs:codeseg
;clear screen by scrolling it, using ROM call
start: mov ah, 06h
mov al, 00h
mov cx, 00h
mov dl, 79
mov dh, 24
int 10h
;screen pointer will be in CX,DX registers;row number (0 to 350d) in DX
;coumn number (0 to 640d) in CX
mov ah, 00h
mov al, 10h ;選擇顯示方式10h(16色圖形)
int 10h
mov ah, 0bh
mov bh, 00h
mov bl, 01h ;背景設(shè)為藍(lán)色
int 10h
mov ah, 0bh
mov bh, 01h
mov bl, 00h ;設(shè)置調(diào)色板0#
int 10h
mov dx, 175 ;設(shè)在屏幕中心
mov cx, 320
;get character from keyboard
get_char: mov ah, 0 ;鍵盤輸入
int 16h
cmp al, escape
jz exit
cmp al, 33h ;>‘3’嗎?
jg plot
cmp al,30h ;<‘0’嗎?
jl plot
mov bl, al ;是‘0’~‘3’,設(shè)置顏色
and bl, 03
jmp get_char
;figure out which way to go, and draw new line
plot: mov al, ah
cmp al, up
jnz not_up
dec dx
not_up: cmp al, down
jnz not_down
inc dx
not_down: cmp al, right
jnz not_right
inc cx
not_ right: cmp al, left
jnz write
dec cx
;use ROM routine to write dot,reguires row# in DX,col in CX,color in AL
write: mov al, bl
mov ah, 0ch
int 10h
jmp get_char
exit: int 20h
main endp
codeseg ends
end start
10.9 位屏蔽寄存器的作用是什么?在16色,640×480顯示方式中如何使用位屏蔽寄存器?
答:位屏蔽寄存器的作用是決定了新的像素值產(chǎn)生的方法。當(dāng)位屏蔽寄存器的某位設(shè)為0時(shí),相對(duì)應(yīng)的像素值
直接由鎖存器寫入顯存;位屏蔽寄存器的某位為1時(shí),所對(duì)應(yīng)的像素值由鎖存器中的像素值與CPU數(shù)據(jù)或置位/
重置寄存器中相應(yīng)位合并之后產(chǎn)生。
10.10 讀映像選擇寄存器的作用是什么?如果4個(gè)位面的內(nèi)容都需要讀取,讀映像選擇寄存器應(yīng)如何設(shè)置?
答:讀映像選擇寄存器的作用是用于選擇哪一個(gè)位面的字節(jié)讀入CPU。讀映像選擇寄存器的0和1位,用來指定
哪個(gè)位面的鎖存器內(nèi)容讀到CPU。如果4個(gè)位面的內(nèi)容都需要讀取,則必須對(duì)同一地址執(zhí)行4次讀操作,在每次
讀之前,用指令分別設(shè)置讀映像選擇寄存器。
10.11 編寫程序使一只“鳥”飛過屏幕。飛鳥的動(dòng)作可由小寫字母v (ASCII碼76H)變?yōu)槠普厶?hào)(ASCII碼
0C4H)來模仿,這個(gè)字符先后交替在兩列顯示。鳥的開始位置是0列20行,每個(gè)字符顯示0.5秒,然后消失。
答:程序段如下:
TITLE Flier.EXE ;飛鳥程序
;******************************************
DSEG SEGMENT ;定義數(shù)據(jù)段
BIRD DB 76H, 07 ;小寫字母v及屬性
DB 0C4H, 07 ;破折號(hào)及屬性
DSEG ENDS ;以上定義數(shù)據(jù)段
;******************************************
CSEG SEGMENT ;定義代碼段
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
MOV AH, 0FH ;取當(dāng)前顯示方式
INT 10H
PUSH AX ;保存當(dāng)前顯示方式(AL)
MOV AH, 0 ;設(shè)置彩色80×25文本方式
MOV AL, 3
INT 10H
MOV DH, 20 ;20行
MOV DL, 0 ;0列
BEGIN: MOV SI, 2 ;字符v和破折號(hào)“-”交替顯示
MOV CX, 1 ;一次顯示一個(gè)字符及屬性
LEA DI, BIRD
DISP: CMP DL, 79 ;飛到79列就退出
JAE EXIT
MOV AH, 2 ;置光標(biāo)位置
INT 10H
MOV AH, 9 ;在光標(biāo)位置顯示字符及屬性
MOV AL, [DI] ;取顯示字符及屬性
MOV BL, [DI+1]
INT 10H
CALL DELAY ;延時(shí)0.5秒
MOV AH, 9 ;在光標(biāo)位置顯示字符及屬性
MOV AL, ‘ ’ ;顯示空格,擦除該位置的字符
MOV BL, 7
INT 10H
INC DL ;飛到下一列
ADD DI, 2
DEC SI
JNZ DISP
JMP BEGIN
EXIT: POP AX ;恢復(fù)當(dāng)前顯示方式(AL)
MOV AH, 0
INT 10H
RET ;返回DOS
MAIN ENDP
;----------------------------------------------------------------------------------
DELAY PROC NEAR ;延時(shí)0.5s子程序
PUSH CX
PUSH DX
MOV DX, 50 ;延時(shí)0.5s
DEL1: MOV CX, 2801 ;延時(shí)10ms
DEL2: LOOP DEL2
DEC DX
JNZ DEL1
POP DX
POP CX
RET
DELAY ENDP ;DELAY子程序結(jié)束
;----------------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START ;匯編語言源程序結(jié)束
10.12 用圖形文本的方法設(shè)計(jì)“Name=XXX”(X為你自己姓名的縮寫),并將其數(shù)據(jù)編碼定義在一個(gè)數(shù)組中。
答:用圖形文本的方法設(shè)計(jì)“NAME=YQS”的程序和數(shù)組如下:
顯示格式如下:
S h o o t i n g
TITLE NAME_YQS.EXE ;顯示“NAME=YQS”的程序
;******************************************
;Graphics block message for the words shooting NAME=YQS
;00H→end of massage,0FFH→end of screen line
DSEG SEGMENT ;定義數(shù)據(jù)段
NAME_YQS DB 2 ;Start row(開始行)
DB 2 ;Start column(開始列)
DB 1000 0011B ;Color attribute
DB ‘Shooting’,0FFH,0FFH ;顯示“Shooting”
DB 7 DUP(0DCH),0FFH,0FFH
;Graphics encoding of the word NAME=YQS using IBM character set
DB 0DEH, 0DBH, 4 DUP(20H), 0DBH, 0DDH, 20H, 0DBH, 0DFH, 0DBH
DB 20H, 20H, 0DBH, 5 DUP(20H), 0DBH, 20H, 2 DUP(0DFH, 0DBH)
DB 8 DUP(20H), 0DFH, 0DBH, 20H, 20H, 0DBH, 0DFH, 20H, 20H
DB 3 DUP(0DBH), 3 DUP(20H), 3 DUP(0DBH), 0DCH, 0FFH
DB 0DEH, 0DBH, 0DBH, 3 DUP(20H), 0DBH, 0DDH, 2 DUP(20H, 0DBH)
DB 20H, 20H, 0DBH, 0DBH, 3 DUP(20H), 0DBH, 0DBH, 20H, 20H, 0DBH
DB 11 DUP(20H), 3 DUP(0DBH, 20H, 20H), 20H, 0DBH, 20H, 0DBH
DB 3 DUP(20H), 0DFH, 0FFH
DB 0DEH, 0DBH, 20H, 0DBH, 20H, 20H, 0DBH, 0DDH, 2 DUP(20H, 0DBH)
DB 20H, 4 DUP(20H, 0DBH), 20H, 20H, 0DBH, 0DCH, 0DBH, 20H
DB 7 DUP(0DFH), 3 DUP(20H, 20H, 0DBH), 3 DUP(20H), 0DBH, 20H, 0DBH
DB 3 DUP(0DCH), 20H, 0FFH
DB 0DEH, 0DBH, 20H, 20H, 0DBH, 20H, 0DBH, 0DDH, 20H, 0DBH, 0DFH
DB 0DBH, 4 DUP(20H, 20H, 0DBH), 20H, 0DFH, 20H, 7 DUP(0DCH), 20H
DB 20H, 0DFH, 0DBH, 0DBH, 0DFH, 20H, 20H, 0DBH, 3 DUP(20H), 0DBH
DB 20H, 20H, 3 DUP(0DFH), 0DBH, 0FFH
DB 0DEH, 0DBH, 3 DUP(20H), 0DBH, 0DBH, 0DDH, 2 DUP(20H, 0DBH), 20H
DB 20H, 0DBH, 5 DUP(20H), 2 DUP(0DBH, 20H, 20H), 10 DUP(20H), 0DBH
DB 0DBH, 3 DUP(20H), 0DBH, 20H, 0DCH, 20H, 0DBH, 20H, 0DCH
DB 3 DUP(20H), 0DBH, 0FFH
DB 0DEH, 0DBH, 4 DUP(20H), 0DBH, 0DDH, 0DCH, 0DBH, 20H, 0DBH
DB 0DCH, 20H, 0DBH, 5 DUP(20H), 0DBH, 20H, 2 DUP(0DCH, 0DBH)
DB 9 DUP(20H), 0DCH, 0DBH, 0DBH, 0DCH, 3 DUP(20H), 0DFH, 0DFH
DB 0DBH, 20H, 20H, 0DFH, 3 DUP(0DBH), 20H, 0FFH
DB 00 ;結(jié)束顯示標(biāo)志
START_COL DB ?
DSEG ENDS ;以上定義數(shù)據(jù)段
;******************************************
;Text display procedures: display a message on the graphics screen
CSEG SEGMENT ;定義代碼段
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX
LEA DI, NAME_YQS
MOV DH, [DI] ;Get row into DH
INC DI ;Bump pointer
MOV DL, [DI] ;And column into DL
MOV START_COL, DL ;Store start column
MOV AH, 2 ;Set cursor position
MOV BH, 0 ;Page 0
INT 10H
INC DI ;Bump pointer to attribute
MOV BL, [DI] ;Get color code into BL
Char_write: INC DI ;Bump to message start
MOV AL, [DI] ;Get character
CMP AL, 0FFH ;End of line?
JE BUMP_ROW ;Next row
CMP AL, 0 ;Test for terminator
JE END_TEXT ;Exit routine
CALL SHOW_CHAR
JMP CHAR_WRITE
END_TEXT: RET ;返回DOS
Bump_row: INC DH ;Row control register
MOV DL, START_COL ;Column control to start column
MOV AH, 2 ;Set cursor position
MOV BH, 0 ;Page 0
INT 10H
JMP CHAR_WRITE
MAIN ENDP
;----------------------------------------------------------------------------------
;Display character in AL and using the color code in BL
Show_char PROC NEAR ;顯示字符子程序
MOV AH, 9 ;BIOS service request number
MOV BH, 0 ;Page 0
MOV CX, 1 ;No repeat
INT 10H
;Bump cursor
INC DL
MOV AH, 2 ;Set cursor position
MOV BH, 0 ;Page 0
INT 10H
RET
Show_char ENDP ;SHOW_CHAR子程序結(jié)束
;----------------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START ;匯編語言源程序結(jié)束
10.13 游戲程序常常用隨機(jī)數(shù)來控制其圖形在屏幕上移動(dòng)。請(qǐng)編寫一程序,用隨機(jī)數(shù)來控制笑臉符(ASCII碼
02H)顯示的位置。笑臉符每次顯示的列號(hào)總是遞增1。而行的位置可能是前次的上一行,下一行或同一行,這
根據(jù)隨機(jī)數(shù)是0、1或2來決定,當(dāng)行號(hào)變?yōu)?、24或列號(hào)變?yōu)?9時(shí)顯示結(jié)束。笑臉在每個(gè)位置上顯示0.25s。(提
示:INT 1AH的AH=0是讀當(dāng)前時(shí)間的功能調(diào)用,利用該功能返回的隨時(shí)都在變化的時(shí)間值作為產(chǎn)生隨機(jī)數(shù)的基
數(shù)。)
答:程序段如下:
TITLE Disp_Laugh.EXE ;笑臉顯示程序
;******************************************
CSEG SEGMENT ;定義代碼段
MAIN PROC FAR
ASSUME CS: CSEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AH, 0FH ;取當(dāng)前顯示方式
INT 10H
PUSH AX ;保存當(dāng)前顯示方式(AL)
MOV AH, 0 ;設(shè)置彩色80×25文本方式
MOV AL, 3
INT 10H
MOV CX, 1 ;一次顯示一個(gè)笑臉字符及屬性
MOV DH, 12H ;12行,從屏幕左邊的中間開始
MOV DL, 0 ;0列
BEGIN: CMP DL, 79 ;移到79列就退出
JAE EXIT
CMP DH, 0 ;移到第0行就退出
JBE EXIT
CMP DH, 24 ;移到第24行就退出
JAE EXIT
MOV AH, 2 ;置光標(biāo)位置
INT 10H
MOV AH, 9 ;在光標(biāo)位置顯示字符及屬性
MOV AL, 02H ;取笑字符及屬性
MOV BL, 7
INT 10H
CALL DELAY ;延時(shí)0.25秒
MOV AH, 9 ;在光標(biāo)位置顯示字符及屬性
MOV AL, ‘ ’ ;顯示空格,擦除該位置的字符
MOV BL, 7
INT 10H
INC DL ;移到下一列
PUSH DX
MOV AH, 0 ;讀當(dāng)前時(shí)間, CH:CL=時(shí):分,DH:DL=秒:1/100秒
;產(chǎn)生隨機(jī)數(shù)基數(shù)
INT 1AH
MOV AX, DX
POP DX
AND AL, 03H ;隨機(jī)數(shù)為1/100秒的最低兩位
JZ DOWN ;隨機(jī)數(shù)的最低兩位為0則下降一行
CMP AL, 1
JNZ LEVEL ;隨機(jī)數(shù)的最低兩位為≥2則水平移動(dòng)
DEC DH ;隨機(jī)數(shù)的最低位為1則上跳一行
JMP BEGIN
DOWN: INC DH
LEVEL: JMP BEGIN
EXIT: POP AX ;恢復(fù)當(dāng)前顯示方式(AL)
MOV AH, 0
INT 10H
RET ;返回DOS
MAIN ENDP
;----------------------------------------------------------------------------------
DELAY PROC NEAR ;延時(shí)0.25s子程序
PUSH CX
PUSH DX
MOV DX, 25 ;延時(shí)0.25s
DEL1: MOV CX, 2801 ;延時(shí)10ms
DEL2: LOOP DEL2
DEC DX
JNZ DEL1
POP DX
POP CX
RET
DELAY ENDP ;DELAY子程序結(jié)束
;----------------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START ;匯編語言源程序結(jié)束
10.14 分配給PC機(jī)主板上的8253/54定時(shí)器的端口地址是什么?
答:8253/54定時(shí)器的3個(gè)獨(dú)立計(jì)數(shù)器Counter0、Counter1和Counter2的端口地址分別為40H、41H和
42H。8253/54內(nèi)部還有一個(gè)公用的控制寄存器,端口地址為43H。
10.15 8253/54定時(shí)器的三個(gè)計(jì)數(shù)器,哪一個(gè)用于揚(yáng)聲器?它的端口地址是什么?
答:8253/54定時(shí)器的計(jì)數(shù)器Counter2用于揚(yáng)聲器,它的端口地址為42H。
10.16 下面的代碼是利用監(jiān)控端口61H的PB4來產(chǎn)生延遲時(shí)間的,它適用于所有的286、386、Pentium PC及兼
容機(jī)。請(qǐng)指出該程序的延遲時(shí)間是多少?
MOV DL, 200
BACK: MOV CX, 16572
WAIT: IN AL, 61H
AND AL, 10H
CMP AL, AH
JE WAIT
MOV AH, AL
LOOP WAIT
DEC DL
JNZ BACK
答:該程序的延遲時(shí)間是200×16572×15.08μs=49981152μs≈50s。
10.17 在PC機(jī)上編寫樂曲程序“Happy Birthday”,樂曲的音符及音頻如下:
歌詞 音符 音頻 節(jié)拍 歌詞 音符 音頻 節(jié)拍 歌詞 音符
音頻 節(jié)拍
hap C 262 1/2 day C 262 1 so D 294 3
py C 262 1/2 to G 392 1 hap Bb 466 1/2
birth D 294 1 you F 349 2 py Bb 466 1/2
day C 262 1 hap C 262 1/2 birth A 440 1
to F 349 1 py C 262 1/2 day C 262 1
you E 330 2 birth D 294 1 to G 392 1
hap C 262 1/2 day A 440 1 you F 349 2
py C 262 1/2 dear F 349 1
birth D 294 1 so E 330 1
答:程序如下:
TITLE MUSIC — A music of ‘Happy Birthday’ ;連接時(shí)需加上GENSOUND程序
EXTRN SOUNDF: FAR ;SOUNDF是外部過程——通用發(fā)聲程序
;******************************************
STACK SEGMENT PARA STACK ‘STACK’ ;定義堆棧段
DB 64 DUP (‘STACK.’)
STACK ENDS ;以上定義堆棧段
;******************************************
DSEG SEGMENT PARA ‘DATA’ ;定義數(shù)據(jù)段
MUS_FREQ DW 262, 262, 294, 262, 349, 330, 262, 262, 294, 262,392, 349, 262, 262
DW 294, 440, 349, 330, 294, 466, 466,440,262, 392, 349, -1
MUS_TIME DW 25, 25, 50, 50, 50, 100
DW 25, 25, 50, 50, 50, 100
DW 25, 25, 50, 50, 50, 50, 150
DW 25, 25, 50, 50, 50, 100
DSEG ENDS ;以上定義數(shù)據(jù)段
;******************************************
CSEG SEGMENT PARA ‘CODE’ ;定義代碼段
ASSUME CS: CSEG, DS: DSEG, SS: STACK
MUSIC PROC FAR
PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
LEA SI, MUS_FREQ ;取發(fā)聲的頻率(音階)表首地址
LEA BP, MUS_TIME ;取發(fā)聲的節(jié)拍(時(shí)間)表首地址
FREQ: MOV DI, [SI] ;讀取頻率值
CMP DI, -1 ;歌曲結(jié)束了嗎?
JE END_MUS
MOV BX, DS:[BP] ;讀取節(jié)拍
CALL SOUNDF ;調(diào)通用發(fā)聲子程序
ADD SI, 2
ADD BP, 2
JMP FREQ
END_MUS: RET ;返回DOS
MUSIC ENDP
CSEG ENDS ;以上定義代碼段
;******************************************
END MUSIC ;匯編語言源程序結(jié)束
以下是SOUNDF ——外部的通用發(fā)聲子程序(教材392頁)
TITLE SOUNDF —— 通用發(fā)聲子程序
;******************************************
PUBLIC SOUNDF ;定義為公共過程
;******************************************
CSEG1 SEGMENT PARA ‘CODE’ ;定義代碼段
ASSUME CS: CSEG1
SOUNDF PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL, 0B6H ;寫定時(shí)器8253的工作方式
OUT 43H, AL
MOV DX, 12H ;根據(jù)頻率求8253的計(jì)數(shù)值,即533H*896/freq
MOV AX, 533H*896 ;(DX),(AX)=123280H=533H*896
DIV DI ;(DI) = freq
OUT 42H, AL ;向8253送計(jì)數(shù)值
MOV AL, AH
OUT 42H, AL
IN AL, 61H ;取8255的PB口當(dāng)前內(nèi)容,并保護(hù)
MOV AH, AL
OR AL, 3 ;開始發(fā)聲,PB1=1,PB0=1
OUT 61H, AL
WAIT1: MOV CX, 663 ;延時(shí)(BX)×10ms
CALL WAITF
MOV AL, AH
AND AL, 0FCH ;停止發(fā)聲,PB1=0,PB0=0
OUT 61H, AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
SOUNDF ENDP
;******************************************
WAITF PROC NEAR
PUSH AX
WAITF1: IN AL, 61H
AND AL, 10H
CMP AL, AH
JE WAITF1
MOV AH, AL
LOOP WAITF1
POP AX
RET
WAITF ENDP
CSEG1 ENDS ;以上定義代碼段
;******************************************
END
10.18 編寫用鍵盤選擇計(jì)算機(jī)演奏歌曲的程序。首先在屏幕上顯示出歌曲名單如下:
A MUSIC 1
B MUSIC 2
C MUSIC 3
當(dāng)從鍵盤上輸入歌曲序號(hào)A,B或C時(shí),計(jì)算機(jī)則演奏所選擇的歌曲,當(dāng)在鍵盤上按下0鍵時(shí),演奏結(jié)束。
答:程序段如下:
MUS_LST DB ‘A MUSIC 1’, 0DH, 0AH
DB ‘B MUSIC 2’, 0DH, 0AH
DB ‘C MUSIC 3’, 0DH, 0AH
DB ‘0 END’, 0DH, 0AH, ‘$’
┇
MOV AH, 09 ;顯示字符串的DOS功能調(diào)用
LEA DX, MUS_LIST
INT 21H
INPUT: MOV AH, 1 ;鍵盤輸入一個(gè)字符的DOS功能調(diào)用
INT 21H
CMP AL, ‘0’ ;結(jié)束演奏嗎?
JE EXIT
OR AL, 0010 0000B ;變?yōu)樾懽帜?br /> CMP AL, ‘a(chǎn)’ ;演奏歌曲a嗎?
JNZ B0
CALL MUSIC1 ;去演奏歌曲A
JMP INPUT
B0: CMP AL, ‘b’ ;演奏歌曲b嗎?
JNZ C0
CALL MUSIC2 ;去演奏歌曲B
JMP INPUT
C0: CMP AL, ‘c’ ;演奏歌曲c嗎?
JNZ INPUT
CALL MUSIC3 ;去演奏歌曲C
JMP INPUT
EXIT: RET ;返回
?
參考文章
http://blog.sina.com.cn/s/blog_77f58b350100q4dv.html
https://wenku.baidu.com/view/303e0e114431b90d6c85c720.html
https://shentuzhigang.blog.csdn.net/article/details/106560578
總結(jié)
以上是生活随笔為你收集整理的《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第十章——自编解析与答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《IBM-PC汇编语言程序设计》(第2版
- 下一篇: 《IBM-PC汇编语言程序设计》(第2版