久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】答案

發(fā)布時(shí)間:2024/10/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】答案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(nèi)容修訂、解析、擴(kuò)展:

《IBM-PC匯編語言程序設(shè)計(jì)》(第2版)【沈美明 溫冬嬋】——自編解析與答案

第 一 章. 習(xí) 題
1.1 用降冪法和除法將下列十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)和十六進(jìn)制數(shù):
(1) 369 (2) 10000 (3) 4095
(4) 32767
答:(1) 369=1 0111 0001B=171H
(2) 10000=10 0111 0001 0000B=2710H
(3) 4095=1111 1111 1111B=FFFH
(4) 32767=111 1111 1111 1111B=7FFFH
1.2 將下列二進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)和十進(jìn)制數(shù):
(1) 10 1101 (2) 1000 0000 (3) 1111 1111 1111 1111 (4) 1111
1111
答:(1) 10 1101B=2DH=45
(2) 1000 0000B=80H=128
(3) 1111 1111 1111 1111B=FFFFH=65535
(4) 1111 1111B=FFH=255
1.3 將下列十六進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)和十進(jìn)制數(shù):
(1) FA (2) 5B (3) FFFE
(4) 1234
答:(1) FAH=1111 1010B=250
(2) 5BH=101 1011B=91
(3) FFFEH=1111 1111 1111 1110B=65534
(4) 1234H=1 0010 0011 0100B=4660
1.4 完成下列十六進(jìn)制數(shù)的運(yùn)算,并轉(zhuǎn)換為十進(jìn)制數(shù)進(jìn)行校核:
(1) 3A+B7 (2) 1234+AF (3) ABCD-FE
(4) 7AB×6F
答:(1) 3A+B7H=F1H=241
(2) 1234+AFH=12E3H=4835
(3) ABCD-FEH=AACFH=43727
(4) 7AB×6FH=35325H=217893

1.5 下列各數(shù)均為十進(jìn)制數(shù),請用8位二進(jìn)制補(bǔ)碼計(jì)算下列各題,并用十六進(jìn)制數(shù)表示其運(yùn)算結(jié)果。
(1) (-85)+76 (2) 85+(-76) (3) 85-76 (4) 85-(-76) (5) (-85)-76 (6) -85-(-76)
答:(1) (-85)+76=1010 1011B+0100 1100B=1111 0111B=0F7H;CF=0;OF=0
(2) 85+(-76)=0101 0101B+1011 0100B=0000 1001B=09H;CF=1;OF=0
(3) 85-76=0101 0101B-0100 1100B=0101 0101B+1011 0100B=0000 1001B=09H;CF=0;OF=0
(4) 85-(-76)=0101 0101B-1011 0100B=0101 0101B+0100 1100B=10100001B=0A1H;CF=0;OF=1
(5) (-85)-76=1010 1011B-0100 1100B=1010 1011B+1011 0100B=0101 1111B=5FH;CF=0;OF=1
(6) -85-(-76)=1010 1011B-1011 0100B=1010 1011B+0100 1100B=11110111B=0F7H;CF=0;OF=0
1.6 下列各數(shù)為十六進(jìn)制表示的8位二進(jìn)制數(shù),請說明當(dāng)它們分別被看作是用補(bǔ)碼表示的帶符號(hào)數(shù)或無符
號(hào)數(shù)時(shí),它們所表示的十進(jìn)制數(shù)是什么?
(1) D8 (2) FF
答:(1) D8H表示的帶符號(hào)數(shù)為 -40,D8H表示的無符號(hào)數(shù)為216;
(2) FFH表示的帶符號(hào)數(shù)為 -1, FFH表示的無符號(hào)數(shù)為255。
1.7 下列各數(shù)均為用十六進(jìn)制表示的8位二進(jìn)制數(shù),請說明當(dāng)它們分別被看作是用補(bǔ)碼表示的數(shù)或字符的
ASCII碼時(shí),它們所表示的十進(jìn)制數(shù)及字符是什么?
(1) 4F (2) 2B (3) 73
(4) 59
答:(1) 4FH表示的十進(jìn)制數(shù)為 79,4FH表示的字符為O;
(2) 2BH表示的十進(jìn)制數(shù)為 43,2BH表示的字符為 +;
(3) 73H表示的十進(jìn)制數(shù)為115,73H表示的字符為s;
(4) 59H表示的十進(jìn)制數(shù)為89,59H表示的字符為Y。
1.8 請寫出下列字符串的ASCII碼值。
For example,
This is a number 3692.
答:46H 6FH 72H 20H 65H 78H 61H 6DH 70H 6CH 65H 2CH 0AH 0DH
54H 68H 69H 73H 20H 69H 73H 20H 61H 20H 6EH 75H 6DH 62H 65H 72H 20H 33H 36H
39H 32H 2EH 0AH 0DH

第 二 章. 習(xí) 題
2.1 在80x86微機(jī)的輸入/輸出指令中,I/O端口號(hào)通常是由DX寄存器提供的,但有時(shí)也可以在指令中直接
指定00~FFH的端口號(hào)。試問可直接由指令指定的I/O端口數(shù)。
答:可直接由指令指定的I/O端口數(shù)為256個(gè)。
2.2 有兩個(gè)16位字1EE5H和2A3CH分別存放在80x86微機(jī)的存儲(chǔ)器的000B0H和000B3H單元中,請用圖表示出
它們在存儲(chǔ)器里的存放情況。
答:存儲(chǔ)器里的存放情況如右上圖所示。
2.3 在IBM PC機(jī)的存儲(chǔ)器中存放信息如右下圖所示。試讀出30022H和30024H字節(jié)單元的內(nèi)容,以及30021H
和30022H字單元的內(nèi)容。
答:30022H字節(jié)單元的內(nèi)容為ABH;30024H字節(jié)單元的內(nèi)容為EFH。30021H字單元的內(nèi)容為AB34H;30022H字單
元的內(nèi)容為CDABH。
2.4 在實(shí)模式下,段地址和偏移地址為3017:000A的存儲(chǔ)單元的物理地址是什么?如果段地址和偏移地址
是3015:002A和3010:007A呢?
答:3017:000A、3015:002A和3010:007A的存儲(chǔ)單元的物理地址都是3017AH。
2.5 如果在一個(gè)程序開始執(zhí)行以前(CS)=0A7F0H,(如16進(jìn)制數(shù)的最高位為字母,則應(yīng)在其前加一個(gè)0)
(IP)=2B40H,試問該程序的第一個(gè)字的物理地址是多少?
答:該程序的第一個(gè)字的物理地址是0AAA40H。
2.6 在實(shí)模式下,存儲(chǔ)器中每一段最多可有10000H個(gè)字節(jié)。如果用調(diào)試程序DEBUG的r命令在終端上顯示出
當(dāng)前各寄存器的內(nèi)容如下,請畫出此時(shí)存儲(chǔ)器分段的示意圖,以及條件標(biāo)志OF、SF、ZF、CF的值。
C>debug
-r
AX=0000 BX=0000 CX=0079 DX=0000 SP=FFEE BP=0000
SI=0000 DI=0000 DS=10E4 ES=10F4 SS=21F0 CS=31FF
IP=0100 NV UP DI PL NZ NA PO NC
答:此時(shí)存儲(chǔ)器分段的示意圖如右圖所示。OF、SF、ZF、CF的值都為0。
2.7 下列操作可使用那些寄存器?
(1) 加法和減法 數(shù)據(jù)寄存器等
(2) 循環(huán)計(jì)數(shù) CX
(3) 乘法和除法 AX、DX,乘數(shù)和除數(shù)用其他寄存器或存儲(chǔ)器

(4) 保存段地址 段寄存器
(5) 表示運(yùn)算結(jié)果為0 ZF=1
(6) 將要執(zhí)行的指令地址 CS:IP
(7) 將要從堆棧取出數(shù)據(jù)的地址 SS:SP
答:答案見題目的右邊。
2.8 那些寄存器可以用來指示存儲(chǔ)器地址?
答:BX、BP、SI、DI、堆棧操作時(shí)的SP、對應(yīng)的段地址、386及其后繼機(jī)型的Exx。
2.9 請將下列左邊的項(xiàng)和右邊的解釋聯(lián)系起來(把所選字母放在括號(hào)中):
(1) CPU (M) A.保存當(dāng)前棧頂?shù)刂返募拇嫫鳌?br /> (2) 存儲(chǔ)器 (C) B.指示下一條要執(zhí)行的指令的地址。
(3) 堆棧 (D) C.存儲(chǔ)程序、數(shù)據(jù)等信息的記憶裝置,微機(jī)有RAM和ROM兩種。
(4) IP (B) D.以后進(jìn)先出方式工作的存儲(chǔ)空間。
(5) SP (A) E.把匯編語言程序翻譯成機(jī)器語言程序的系統(tǒng)程序。
(6) 狀態(tài)標(biāo)志 (L) F.唯一代表存儲(chǔ)空間中每個(gè)字節(jié)單元的地址。
(7) 控制標(biāo)志 (K) G.能被計(jì)算機(jī)直接識(shí)別的語言。
(8) 段寄存器 (J) H.用指令的助記符、符號(hào)地址、標(biāo)號(hào)等符號(hào)書寫程序的語言。
(9) 物理地址 (F) I.把若干個(gè)模塊連接起來成為可執(zhí)行文件的系統(tǒng)程序。
(10) 匯編語言 (H) J.保存各邏輯段的起始地址的寄存器,8086/8088機(jī)有四個(gè):
CS、DS、
SS、ES。
(11) 機(jī)器語言 (G) K.控制操作的標(biāo)志,如DF位。
(12) 匯編程序 (E) L.記錄指令操作結(jié)果的標(biāo)志,共6位:OF、SF、ZF、AF、PF、CF。
(13) 連接程序 (I) M.分析、控制并執(zhí)行指令的部件,由算術(shù)邏輯部件ALU和寄存器等
組成。
(14) 指令 (O) N.由匯編程序在匯編過程中執(zhí)行的指令。
(15) 偽指令 (N) O.告訴CPU要執(zhí)行的操作(一般還要指出操作數(shù)地址),在程序
運(yùn)行時(shí)
執(zhí)行。
答:答案見題目的括號(hào)中。

第 三 章. 習(xí) 題
3.1 給定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,試確定在以下各種尋址方式下的有效地址是什么?
(1) 立即尋址
(2) 直接尋址
(3) 使用BX的寄存器尋址
(4) 使用BX的簡接尋址
(5) 使用BX的寄存器相對尋址
(6) 基址變址尋址
(7) 相對基址變址尋址
答:(1) 操作數(shù)在指令中,即立即數(shù);
(2) EA=D=7237H;
(3) 無EA,操作數(shù)為(BX)=637DH;
(4) EA=(BX)=637DH;
(5) EA=(BX)+D=0D5B4H;
(6) EA=(BX)+(SI)=8E18H;
(7) EA=(BX)+(SI)+D=1004FH;超過了段的邊界,最高進(jìn)位位丟失,因此EA=004FH。
3.2 試根據(jù)以下要求寫出相應(yīng)的匯編語言指令
(1) 把BX寄存器和DX寄存器的內(nèi)容相加,結(jié)果存入DX寄存器中。
(2) 用寄存器BX和SI的基址變址尋址方式把存儲(chǔ)器中的一個(gè)字節(jié)與AL寄存器的內(nèi)容相加,并把結(jié)果送到AL寄存
器中。
(3) 用寄存器BX和位移量0B2H的寄存器相對尋址方式把存儲(chǔ)器中的一個(gè)字和(CX)相加,并把結(jié)果送回存儲(chǔ)器
中。
(4) 用位移量為0524H的直接尋址方式把存儲(chǔ)器中的一個(gè)字與數(shù)2A59H相加,并把結(jié)果送回存儲(chǔ)單元中。
(5) 把數(shù)0B5H與(AL)相加,并把結(jié)果送回AL中。
答:(1) ADD DX, BX
(2) ADD AL, [BX][SI]
(3) ADD [BX+0B2H], CX

(4) ADD WORD PTR [0524H], 2A59H
(5) ADD AL, 0B5H
3.3 寫出把首地址為BLOCK的字?jǐn)?shù)組的第6個(gè)字送到DX寄存器的指令。要求使用以下幾種尋址方式:
(1) 寄存器間接尋址
(2) 寄存器相對尋址
(3) 基址變址尋址
答:(1) MOV BX, OFFSET BLOCK
ADD BX, (6–1)*2
MOV DX, [BX]
(2) MOV BX, OFFSET BLOCK 改為: MOV BX, (6-1)*2
MOV DX, [BX+(6–1)*2] 也可 MOV DX, BLOCK[BX]
(3) MOV BX, OFFSET BLOCK
MOV SI, (6–1)*2
MOV DX, [BX][SI]
3.4 現(xiàn)有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,
(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,試說明下列各條指令執(zhí)行完后
AX寄存器的內(nèi)容。
(1) MOV AX, 1200H
(2) MOV AX, BX
(3) MOV AX, [1200H]
(4) MOV AX, [BX]
(5) MOV AX, 1100[BX]
(6) MOV AX, [BX][SI]
(7) MOV AX, 1100[BX][SI]
答:(1) (AX)=1200H
(2) (AX)=0100H
(3) (AX)=4C2AH
(4) (AX)=3412H
(5) (AX)=4C2AH

(6) (AX)=7856H
(7) (AX)=65B7H
3.5 給定(IP)=2BC0H,(CS)=0200H,位移量D=5119H,(BX)=1200H,(DS)=212AH,(224A0H)=0600H,
(275B9H)=098AH,試為以下的轉(zhuǎn)移指令找出轉(zhuǎn)移的偏移地址。
(1) 段內(nèi)直接尋址
(2) 使用BX及寄存器間接尋址方式的段內(nèi)間接尋址
(3) 使用BX及寄存器相對尋址方式的段內(nèi)間接尋址
答:(1) JMP NEAR PTR 5119H ;(IP)=5119H+((IP)+03H)=7CDCH,物理地址PA=09CDCH
(IP)+03H是JMP NEAR PTR 5119H指令的下一條指令的首地址。
(2) JMP WORD PTR [BX] ;(IP)=((DS)*10H+(BX))=0600H,PA=02600H
(3) JMP D[BX] ;(IP)=((DS)*10H+(BX)+D)=098AH,PA=0298AH
3.6 設(shè)當(dāng)前數(shù)據(jù)段寄存器的內(nèi)容為1B00H,在數(shù)據(jù)段的偏移地址2000H單元內(nèi),含有一個(gè)內(nèi)容為0FF10H和
8000H的指針,它們是一個(gè)16位變量的偏移地址和段地址,試寫出把該變量裝入AX的指令序列,并畫圖表示出
來。
答:MOV BX, [2000H] ;圖示如上所示。
MOV AX, [2000H+2]
MOV ES, AX
MOV AX, ES:[BX]
3.7 在0624H單元內(nèi)有一條二字節(jié)JMP SHORT OBJ指令,如其中位移量為(1) 27H,(2) 6BH,(3) 0C6H,
試問轉(zhuǎn)向地址OBJ的值是多少?
答:(1) OBJ=0624H+02H+27H=064DH
(2) OBJ=0624H+02H+6BH=0691H
(3) OBJ=0624H+02H+0C6H=05ECH ;C6H對應(yīng)的負(fù)數(shù)為-3AH(向上轉(zhuǎn)移,負(fù)位移量)
3.8 假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,數(shù)據(jù)段中變量
名VAL的偏移地址為0050H,試指出下列源操作數(shù)字段的尋址方式是什么?其物理地址值是多少?
(1) MOV AX, 0ABH (2) MOV AX, BX
(3) MOV AX, [100H] (4) MOV AX, VAL
(5) MOV AX, [BX] (6) MOV AX,
ES:[BX]

(7) MOV AX, [BP] (8) MOV AX, [SI]
(9) MOV AX, [BX+10] (10) MOV AX, VAL[BX]
(11) MOV AX, [BX][SI] (12) MOV AX, VAL[BX][SI]
答:(1) 立即方式; 操作數(shù)在本條指令中
(2) 寄存器尋址方式; 操作數(shù)為 (BX)=0100H
(3) 直接尋址方式; PA=20100H
(4) 直接尋址方式; PA=20050H
(5) BX寄存器間接尋址方式; PA=20100H
(6) 附加段BX寄存器間接尋址方式; PA=21100H
(7) BP寄存器間接尋址方式; PA=15010H
(8) SI寄存器間接尋址方式; PA=200A0H
(9) BX寄存器相對尋址方式; PA=20110H
(10) BX寄存器相對尋址方式; PA=20150H
(11) BX和SI寄存器基址變址尋址方式; PA=201A0H
(12) BX和SI寄存器相對基址變址尋址方式; PA=201F0H
3.9 在ARRAY數(shù)組中依次存儲(chǔ)了七個(gè)字?jǐn)?shù)據(jù),緊接著是名為ZERO的字單元,表示如下:
ARRAY DW 23, 36, 2, 100, 32000, 54, 0
ZERO DW ?
(1) 如果BX包含數(shù)組ARRAY的初始地址,請編寫指令將數(shù)據(jù)0傳送給ZERO單元。
(2) 如果BX包含數(shù)據(jù)0在數(shù)組中的位移量,請編寫指令將數(shù)據(jù)0傳送給ZERO單元。
答:(1) MOV AX, [BX+(7-1)*2]
MOV [BX+(7)*2], AX
(2) MOV AX, ARRAY [BX]
MOV ARRAY [BX+2], AX
3.10 如TABLE為數(shù)據(jù)段中0032單元的符號(hào)名,其中存放的內(nèi)容為1234H,試問以下兩條指令有什么區(qū)別?指
令執(zhí)行完后AX寄存器的內(nèi)容是什么?
MOV AX, TABLE
LEA AX, TABLE
答:MOV AX, TABLE是將TABLE單元的內(nèi)容送到AX,(AX)=1234H

LEA AX,TABLE是將TABLE單元的有效地址送到AX,(AX)=0032H
3.11 執(zhí)行下列指令后AX寄存器中的內(nèi)容是什么?
TABLE DW 10, 20, 30, 40, 50 ;000AH, 0014H, 001EH, 0028H, 0032H
ENTRY DW 3

MOV BX, OFFSET TABLE
ADD BX, ENTRY
MOV AX, [BX]
答:(AX)=1E00H (TABLE的存儲(chǔ)方式如右圖所示)
3.12 下列ASCII碼串(包括空格符)依次存儲(chǔ)在起始地址為CSTRING的字節(jié)單元中:
CSTRING DB ‘BASED ADDRESSING’
請編寫指令將字符串中的第1個(gè)和第7個(gè)字符傳送給DX寄存器。
答:MOV DH, CSTRING
MOV DL, CSTRING+7-1
3.13 已知堆棧段寄存器SS的內(nèi)容是0FFA0H,堆棧指針寄存器SP的內(nèi)容是00B0H,先執(zhí)行兩條把8057H和
0F79H分別進(jìn)棧的PUSH指令,再執(zhí)行一條POP指令。試畫出堆棧區(qū)和SP的內(nèi)容變化過程示意圖(標(biāo)出存儲(chǔ)單元的
物理地址)。
答:堆棧區(qū)和SP的內(nèi)容變化過程示意圖如下左圖所示。
3.14 設(shè)(DS)=1B00H,(ES)=2B00H,有關(guān)存儲(chǔ)單元的內(nèi)容如上右圖所示。請寫出兩條指令把字變量X裝入AX
寄存器。
答:MOV BX, [2000H]
MOV AX, ES:[BX]
3.15 求出以下各十六進(jìn)制數(shù)與十六進(jìn)制數(shù)62A0H之和,并根據(jù)結(jié)果設(shè)置標(biāo)志位SF、ZF、CF和OF的值。
(1) 1234H (2) 4321H (3) CFA0H (4) 9D60H
答:(1) 和為74D4H;SF=0,ZF=0,CF=0,OF=0
(2) 和為A5C1H;SF=1,ZF=0,CF=0,OF=1
(3) 和為3240H;SF=0,ZF=0,CF=1,OF=0
(4) 和為0000H;SF=0,ZF=1,CF=1,OF=0
3.16 求出以下各十六進(jìn)制數(shù)與十六進(jìn)制數(shù)4AE0H的差值,并根據(jù)結(jié)果設(shè)置標(biāo)志位SF、ZF、CF和OF的值。

(1) 1234H (2) 5D90H (3) 9090H (4) EA04H
答:(1) 差為C754H;SF=1,ZF=0,CF=1,OF=0
(2) 差為12B0H;SF=0,ZF=0,CF=0,OF=0
(3) 差為45B0H;SF=0,ZF=0,CF=0,OF=1
(4) 差為9F24H;SF=1,ZF=0,CF=0,OF=0
3.17 寫出執(zhí)行以下計(jì)算的指令序列,其中X、Y、Z、R、W均為存放16位帶符號(hào)數(shù)單元的地址。
(1) Z←W+(Z-X) (2) Z←W-(X+6)-(R+9)
(3) Z←(W*X)/(Y+6),R←余數(shù) (4) Z←((W-X)/5*Y)*2
答:(1) MOV AX, Z ;以下程序都未考慮帶符號(hào)數(shù)的溢出
SUB AX, X
ADD AX, W
MOV Z, AX
(2) MOV BX, X
ADD BX, 6
MOV CX, R
ADD CR, 9
MOV AX, W
SUB AX, BX
SUB AX, CX
MOV Z, AX
(3) ADD Y, 6
MOV AX, W
IMUL X
IDIV Y
MOV Z, AX
MOV R, DX
(4) MOV AX, W
SUB AX, X
CWD

MOV BX, 5
IDIV BX
IMUL Y
SHL AX, 1 ;((DX),(AX))*2
RCL DX, 1
3.18 已知程序段如下:
MOV AX, 1234H ;(AX)=1234H,標(biāo)志位不變
MOV CL, 4 ;(AX)和標(biāo)志位都不變
ROL AX, CL ;(AX)=2341H,CF=1,SF和ZF不變
DEC AX ;(AX)=2340H,CF=1不變,SF=0,ZF=0
MOV CX, 4 ;(AX)和標(biāo)志位都不變
MUL CX ;(AX)=8D00H,CF=OF=0,其它標(biāo)志無定義
INT 20H
試問:
(1) 每條指令執(zhí)行完后,AX寄存器的內(nèi)容是什么?
(2) 每條指令執(zhí)行完后,進(jìn)位、符號(hào)和零標(biāo)志的值是什么?
(3) 程序結(jié)束時(shí),AX和DX的內(nèi)容是什么?
答:(1) 見注釋;
(2) 見注釋;
(3) (AX)=8D00H,(DX)=0
3.19 下列程序段中的每條指令執(zhí)行完后,AX寄存器及CF、SF、ZF和OF的內(nèi)容是什么?
MOV AX, 0 ;(AX)=0, 標(biāo)志位不變
DEC AX ;(AX)=0FFFFH, CF不變,SF=1,ZF=0,OF=0
ADD AX, 7FFFH ;(AX)=7FFEH, CF=1,SF=0,ZF=0,OF=0
ADD AX, 2 ;(AX)=8000H, CF=0,SF=1,ZF=0,OF=1
NOT AX ;(AX)=7FFFH, 標(biāo)志位不變
SUB AX, 0FFFFH ;(AX)=8000H, CF=1,SF=1,ZF=0,OF=1
ADD AX, 8000H ;(AX)=0, CF=1,SF=0,ZF=1,OF=1
SUB AX, 1 ;(AX)=0FFFFH, CF=1,SF=1,ZF=0,OF=0

AND AX, 58D1H ;(AX)=58D1H, CF=0,SF=0,ZF=0,OF=0
SAL AX, 1 ;(AX)=0B1A2H, CF=0,SF=1,ZF=0,OF=1
SAR AX, 1 ;(AX)=0D8D1H, CF=0,SF=1,ZF=0,OF=0
NEG AX ;(AX)= 272FH, CF=1,SF=0,ZF=0,OF=0
ROR AX, 1 ;(AX)= 9397H, CF=1,SF和ZF不變,OF=1
答:見注釋。
3.20 變量DATAX和變量DATAY的定義如下:
DATAX DW 0148H
DW 2316H
DATAY DW 0237H
DW 4052H
請按下列要求寫出指令序列:
(1) DATAX和DATAY兩個(gè)字?jǐn)?shù)據(jù)相加,和存放在DATAY中。
(2) DATAX和DATAY兩個(gè)雙字?jǐn)?shù)據(jù)相加,和存放在從DATAY開始的雙字單元中。
(3) 解釋下列指令的作用:
STC
MOV BX, DATAX
ADC BX, DATAY
(4) DATAX和DATAY兩個(gè)字?jǐn)?shù)據(jù)相乘(用MUL)。
(5) DATAX和DATAY兩個(gè)雙字?jǐn)?shù)據(jù)相乘(用MUL)。
(6) DATAX除以23(用DIV)。
(7) DATAX雙字除以字DATAY (用DIV)。
答:(1) MOV AX, DATAX
ADD DATAY, AX
MOV AX, DATAX+2
ADD DATAY+2, AX
(2) MOV AX, DATAX
ADD DATAY, AX
MOV AX, DATAX+2

ADC DATAY+2, AX
MOV DATAY+4, 0 ;用于存放進(jìn)位位
ADC DATAY+4, 0
(3) DATAX和DATAY兩個(gè)字?jǐn)?shù)據(jù)之和加1,結(jié)果存入BX寄存器。
(4) RESULT1 DW 0
DW 0
RESULT2 DW 0
DW 0

MOV AX, DATAX
MUL DATAY
MOV RESULT1 , AX
MOV RESULT1+2, DX
MOV AX, DATAX+2
MUL DATAY+2
MOV RESULT2 , AX
MOV RESULT2+2, DX
(5) AA DW 0
BB DW 0
CC DW 0
DD DW 0

MOV AX, DATAX
MUL DATAY
MOV AA , AX
MOV BB, DX
MOV AX, DATAX
MUL DATAY+2
ADD BB, AX

ADC CC, DX
MOV AX, DATAX+2
MUL DATAY
ADD BB, AX
ADC CC, DX
ADC DD, 0
MOV AX, DATAX+2
MUL DATAY+2
ADD CC, AX
ADC DD, DX
(6) MOV AX, DATAX
MOV BL, 23
DIV BL
(7) MOV DX, DATAX+2
MOV AX, DATAX
DIV DATAY
3.21 寫出對存放在DX和AX中的雙字長數(shù)求補(bǔ)的指令序列。
答:NEG DX 也可為: NOT DX
NEG AX NOT AX
SBB DX, 0 ADD AX, 1
ADC DX, 0
3.22 試編寫一程序求出雙字長數(shù)的絕對值。雙字長數(shù)在A和A+2單元中,結(jié)果存放在B和B+2單元中。
答:程序段如下:
MOV AX, A
MOV DX, A+2
CMP DX, 0
JNS ZHENSHU ;不是負(fù)數(shù)則轉(zhuǎn)走
NEG DX
NEG AX

SBB DX, 0
ZHENSHU: MOV B, AX
MOV B+2, DX
INT 20H
3.23 假設(shè)(BX)=0E3H,變量VALUE中存放的內(nèi)容為79H,確定下列各條指令單獨(dú)執(zhí)行后的結(jié)果。
(1) XOR BX, VALUE ;(BX)=9AH,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=1
(2) AND BX, VALUE ;(BX)=61H,CF、OF都為0,AF無定義,SF=0,ZF=0,PF=0
(3) OR BX, VALUE ;(BX)=0FBH,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=0
(4) XOR BX, 0FFH ;(BX)=1CH,CF、OF都為0,AF無定義,SF=0,ZF=0,PF=0
(5) AND BX, 0 ;(BX)=00H,CF、OF都為0,AF無定義,SF=0,ZF=1,PF=1
(6) TEST BX, 01H ;(BX)=0E3H,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=0
答:見注釋。
3.24 試寫出執(zhí)行下列指令序列后BX寄存器的內(nèi)容。執(zhí)行前(BX)=6D16H。
MOV CL, 7
SHR BX, CL
答:(BX)=00DAH。
3.25 試用移位指令把十進(jìn)制數(shù)+53和-49分別乘以2。它們應(yīng)該用什么指令?得到的結(jié)果是什么?如果要除
以2呢?
答:MOV AL, 53
SAL AL, 1 ;(AL)=(+53*2)=6AH
MOV AL, -49
SAL AL, 1 ;(AL)=(-49*2)=9EH
MOV AL, 53
SAR AL, 1 ;(AL)=(53/2)= 1AH
MOV AL, -49
SAR AL, 1 ;(AL)=(-49/2)=0E7H
3.26 試分析下面的程序段完成什么功能?
MOV CL, 04
SHL DX, CL

MOV BL, AH
SHL AX, CL
SHR BL, CL
OR DL, BL
答:本程序段將 ((DX),(AX)) 的雙字同時(shí)左移4位,即將此雙字乘以10H (16)。
3.27 假定(DX)=0B9H,(CL)=3,(CF)=1,確定下列各條指令單獨(dú)執(zhí)行后DX中的值。
(1) SHR DX, 1 ;(DX)=05CH
(2) SAR DX, CL ;(DX)=17H
(3) SHL DX, CL ;(DX)=5C8H
(4) SHL DL, 1 ;(DX)=72H
(5) ROR DX, CL ;(DX)=2017H
(6) ROL DL, CL ;(DX)=0CDH
(7) SAL DH, 1 ;(DX)=0B9H
(8) RCL DX, CL ;(DX)=2CCH
(4) RCR DL, 1 ;(DX)=0DCH
答:見注釋。
3.28 下列程序段執(zhí)行完后,BX寄存器的內(nèi)容是什么?
MOV CL, 3
MOV BX, 0B7H
ROL BX,1
ROR BX, CL
答:(BX)=0C02DH。
3.29 假設(shè)數(shù)據(jù)段定義如下:
CONAME DB ‘SPACE EXPLORERS INC.’
PRLINE DB 20 DUP (‘’)
用串指令編寫程序段分別完成以下功能:
(1) 從左到右把CONAME中的字符串傳送到PRLINE。
(2) 從右到左把CONAME中的字符串傳送到PRLINE。
(3) 把CONAME中的第3和第4個(gè)字節(jié)裝入AX。

(4) 把AX寄存器的內(nèi)容存入從PRLINE+5開始的字節(jié)中。
(5) 檢查CONAME字符串中有無空格字符,如有則把第一個(gè)空格字符的地址傳送給BX寄存器。
答:(1) MOV CX, 20
CLD
MOV SI, SEG CONAME
MOV DS, SI
MOV ES, SI
LEA SI, CONAME
LEA DI, PRLINE
REP MOVSB
(2) MOV CX, 20
STD
MOV SI, SEG CONAME
MOV DS, SI
MOV ES, SI
LEA SI, CONAME
ADD SI, 20-1
LEA DI, PRLINE
ADD DI, 20-1
REP MOVSB
(3) MOV AX, WORD PTR CONAME+3-1
(4) MOV WORD PTR PRLINE +5, AX
(5) MOV AL, ‘ ’ ;空格的ASCII碼送AL寄存器
CLD
MOV DI, SEG CONAME
MOV ES, DI
LEA DI, CONAME
REPNE SCASB
JNE NEXT

DEC DI
MOV BX, DI
NEXT: ┇
3.30 編寫程序段,把字符串STRING中的‘&’字符用空格符代替。
STRING DB ‘The date is FEB&03’
答:程序段如下:
MOV CX, 18
MOV AL, ‘&’
CLD
MOV DI, SEG STRING
MOV ES, DI
LEA DI, STRING
REPNE SCASB
JNE NEXT
DEC DI
MOV ES:BYTE PTR [DI], ‘ ’ ;送空格符
NEXT: ┇
3.31 假設(shè)數(shù)據(jù)段中數(shù)據(jù)定義如下:
STUDENT_NAME DB 30 DUP (?)
STUDENT_ADDR DB 9 DUP (?)
PRINT_LINE DB 132 DUP (?)
分別編寫下列程序段:
(1) 用空格符清除PRINT_LINE域。
(2) 在STUDENT_ADDR中查找第一個(gè)‘-’。
(3) 在STUDENT_ADDR中查找最后一個(gè)‘-’。
(4) 如果STUDENT_NAME域中全是空格符時(shí),填入‘*’。
(5) 把STUDENT_NAME移到PRINT_LINE的前30個(gè)字節(jié)中,把STUDENT_ ADDR移到PRINT_LINE的后9個(gè)字節(jié)中。
答:公共的程序段如下:
MOV DI, DS

MOV ES, DI
(1) MOV CX, 132
MOV AL., ‘ ’ ;空格的ASCII碼送AL寄存器
CLD
LEA DI, PRINT_LINE
REP STOSB
(2) MOV CX, 9
MOV AL., ‘-’
CLD
LEA DI, STUDENT_ ADDR
REPNE SCASB
JNE NO_DASH
DEC DI
NO_DASH: ┇
(3) MOV CX, 9
MOV AL., ‘-’
STD
LEA DI, STUDENT_ ADDR
ADD DI, 9-1
REPNE SCASB
JNE NO_DASH
INC DI
NO_DASH: ┇
(4) MOV CX, 30
MOV AL, ‘ ’ ;空格的ASCII碼送AL寄存器
CLD
LEA DI, STUDENT_NAME
REPE SCASB
JNE NEXT

MOV CX, 30
MOV AL, ‘*’ ;“*”的ASCII碼送AL寄存器
LEA DI, STUDENT_NAME
REP STOSB
NEXT: ┇
(5) MOV CX, 30
CLD
LEA SI, STUDENT_NAME
LEA DI, PRINT_LINE
REP MOVSB
MOV CX, 9
STD
LEA SI, STUDENT_ADDR+9-1
LEA DI, PRINT_LINE+132-1
REP MOVSB
3.32 編寫一程序段:比較兩個(gè)5字節(jié)的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串則執(zhí)行
NEW_LESS;否則順序執(zhí)行程序。
答:程序段如下:
MOV CX, 5
CLD
MOV DI, SEG OLDS
MOV DS, DI
MOV ES, DI
LEA SI, OLDS
LEA DI, NEWS
REPE CMPSB
JNE NEW_LESS

NEW_LESS: ┇

3.33 假定AX和BX中的內(nèi)容為帶符號(hào)數(shù),CX和DX中的內(nèi)容為無符號(hào)數(shù),請用比較指令和條件轉(zhuǎn)移指令實(shí)現(xiàn)以
下判斷:
(1) 若DX的內(nèi)容超過CX的內(nèi)容,則轉(zhuǎn)去執(zhí)行EXCEED。
(2) 若BX的內(nèi)容大于AX的內(nèi)容,則轉(zhuǎn)去執(zhí)行EXCEED。
(3) 若CX的內(nèi)容等于0,則轉(zhuǎn)去執(zhí)行ZERO。
(4) BX與AX的內(nèi)容相比較是否產(chǎn)生溢出?若溢出則轉(zhuǎn)OVERFLOW。
(5) 若BX的內(nèi)容小于等于AX的內(nèi)容,則轉(zhuǎn)EQ_SMA。
(6) 若DX的內(nèi)容低于等于CX的內(nèi)容,則轉(zhuǎn)EQ_SMA。
答:(1) CMP DX, CX
JA EXCEED
(2) CMP BX, AX
JG EXCEED
(3) JCXZ ZERO
(4) CMP BX, AX
JO OVERFLOW
(5) CMP BX, AX
JLE EQ_SMA
(6) CMP DX, CX
JBE EQ_SMA
3.34 試分析下列程序段:
ADD AX, BX
JNO L1
JNC L2
SUB AX, BX
JNC L3
JNO L4
JMP SHORT L5
如果AX和BX的內(nèi)容給定如下:
AX BX

(1) 147BH 80DCH
(2) B568H 42C8H
(3) 42C8H 608DH
(4) D023H 9FD0H
(5) 94B7H B568H
問該程序分別在上面5種情況下執(zhí)行后,程序轉(zhuǎn)向哪里?
答:(1) 轉(zhuǎn)向L1
(2) 轉(zhuǎn)向L1
(3) 轉(zhuǎn)向L2
(4) 轉(zhuǎn)向L5 ;因?yàn)榧臃ㄖ噶詈驛X中已經(jīng)是6FF3H
(5) 轉(zhuǎn)向L5 ;因?yàn)榧臃ㄖ噶詈驛X中已經(jīng)是4A14H
3.35 指令CMP AX, BX后面跟著一條格式為J. L1的條件轉(zhuǎn)移指令,其中.可以是
B、NB、BE、NBE、L、NL、LE、NLE中的任意一個(gè)。如果AX和BX的內(nèi)容給定如下:
AX BX
(1) 1F52H 1F52H
(2) 88C9H 88C9H
(3) FF82H 007EH
(4) 58BAH 020EH
(5) FFC5H FF8BH
(6) 09A0H 1E97H
(7) 8AEAH FC29H
(8) D367H 32A6H
問以上8條轉(zhuǎn)移指令中的哪幾條將引起轉(zhuǎn)移到L1?
答:(1) JNB、JBE、JNL、JLE
(2) JNB、JBE、JNL、JLE
(3) JNB、JNBE、JL、JLE
(4) JNB、JNBE、JNL、JNLE
(5) JNB、JNBE、JL、JLE
(6) JB、JBE、JL、JLE

(7) JB、JBE、JNL、JNLE
(8) JNB、JNBE、JL、JLE
3.36 假設(shè)X和X+2單元的內(nèi)容為雙精度數(shù)p,Y和Y+2單元的內(nèi)容為雙精度數(shù)q,(X和Y為低位字)試說明下列程
序段做什么工作?
MOV DX, X+2
MOV AX, X
ADD AX, X
ADC DX, X+2
CMP DX, Y+2
JL L2
JG L1
CMP AX, Y
JBE L2
L1: MOV AX, 1
JMP SHORT EXIT
L2: MOV AX, 2
EXIT:INT 20H
答:此程序段判斷p*2>q,則使(AX)=1后退出;p*2≤q,則使(AX)=2后退出。
3.37 要求測試在STATUS中的一個(gè)字節(jié),如果第1、3、5位均為1則轉(zhuǎn)移到ROUTINE_1;如果此三位中有兩位
為1則轉(zhuǎn)移到ROUTINE_2;如果此三位中只有一位為1則轉(zhuǎn)移到ROUTINE_3;如果此三位全為0則轉(zhuǎn)移到
ROUTINE_4。試畫出流程圖,并編制相應(yīng)的程序段。
答:程序段如下:
MOV AL, STATUS
AND AL, 00010101B ;只保留第1、3、5位
JZ ROUTINE_4 ;3位全為0轉(zhuǎn)ROUTINE_4
JPE ROUTINE_2 ;兩位為1轉(zhuǎn)ROUTINE_2
CMP AL, 00010101B
JZ ROUTINE_1 ;3位全為1轉(zhuǎn)ROUTINE_1
ROUTINE_3: ┇ ;僅一位為1執(zhí)行ROUTINE_3

JMP EXIT
ROUTINE_1: ┇
JMP EXIT
ROUTINE_2: ┇
JMP EXIT
ROUTINE_4: ┇
EXIT: INT 20H
3.38 在下列程序的括號(hào)中分別填入如下指令:
(1) LOOP L20
(2) LOOPE L20
(3) LOOPNE L20
試說明在三種情況下,當(dāng)程序執(zhí)行完后,AX、BX、
CX、DX四個(gè)寄存器的內(nèi)容分別是什么?
TITLE EXLOOP.COM
CODESG SEGMENT
ASSUME CS:CODESG, DS: CODSEG, SS: CODSEG
ORG 100H
BEGIN: MOV AX, 01
MOV BX, 02
MOV DX, 03
MOV CX, 04
L20:
INC AX
ADD BX, AX
SHR DX, 1
( )
RET
CODESG ENDS
END BEGIN

答:(1) (AX)=5H,(BX)=10H,(CX)=0H,(DX)=0H
(2) (AX)=2H,(BX)=4H,(CX)=3H,(DX)=1H
(3) (AX)=3H,(BX)=7H,(CX)=2H,(DX)=0H
3.39 考慮以下的調(diào)用序列:
(1) MAIN調(diào)用NEAR的SUBA過程(返回的偏移地址為0400);
(2) SUBA調(diào)用NEAR的SUBB過程(返回的偏移地址為0A00);
(3) SUBB調(diào)用FAR的SUBC過程(返回的段地址為B200,返回的偏移地址為0100);
(4) 從SUBC返回SUBB;
(5) SUBB調(diào)用NEAR的SUBD過程(返回的偏移地址為0C00);
(6) 從SUBD返回SUBB;
(7) 從SUBB返回SUBA;
(8) 從SUBA返回MAIN;
(9) 從MAIN調(diào)用SUBC(返回的段地址為1000,返回的偏移地址為0600);
請畫出每次調(diào)用及返回時(shí)的堆棧狀態(tài)。
答:每次調(diào)用及返回時(shí)的堆棧狀態(tài)圖如下所示:
3.40 假設(shè)(EAX)=00001000H,(EBX)=00002000H,(DS)=0010H,試問下列指令訪問內(nèi)存的物理地址是什么?
(1) MOV ECX,[EAX+EBX]
(2) MOV [EAX+2*EBX],CL
(3) MOV DH,[EBX+4*EAX+1000H]
答:(1) PA=(DS)*10H+EA=00100H+00001000H+00002000H=00003100H
(2) PA=(DS)*10H+EA=00100H+00001000H+2*00002000H=00005100H
(3) PA=(DS)*10H+EA=00100H+00002000H+4*00001000H+1000H=00007100H
3.41 假設(shè)(EAX)=9823F456H,(ECX)=1F23491H,(BX)=348CH,(SI)=2000H,(DI)=4044H。在DS段中從偏移
地址4044H單元開始的4個(gè)字節(jié)單元中,依次存放的內(nèi)容為92H,6DH,0A2H和4CH,試問下列各條指令執(zhí)行完后
的目的地址及其中的內(nèi)容是什么?
(1) MOV [SI],EAX
(2) MOV [BX],ECX
(3) MOV EBX,[DI]
答:(1) 目的地址為DS:2000H,內(nèi)容依次為:56H,0F4H,23H和98H

(2) 目的地址為DS:348CH,內(nèi)容依次為:91H,34H,0F2H和01H
(3) 目的操作數(shù)為EBX寄存器,(EBX)=4CA26D92H
3.42 說明下列指令的操作
(1) PUSH AX ;將(AX)壓入堆棧
(2) POP ESI ;將堆棧中的雙字彈出到ESI寄存器

(3) PUSH [BX] ;將((BX))對應(yīng)存儲(chǔ)單元中的字壓入堆棧
(4) PUSHAD ;32位通用寄存器依次進(jìn)棧
(5) POP DS ;將堆棧中的字彈出到DS寄存器中
(6) PUSH 4 ;將立即數(shù)4以字的方式壓入堆棧
答:見注釋。
3.43 請給出下列各指令序列執(zhí)行完后目的寄存器的內(nèi)容。
(1) MOV EAX,299FF94H
ADD EAX,34FFFFH ;(EAX)= 2CEFF93H
(2) MOV EBX,40000000
SUB EBX,1500000 ;(EBX)= 3EB00000H
(3) MOV EAX,39393834H
AND EAX,0F0F0F0FH ;(EAX)= 09090804H
(4) MOV EDX,9FE35DH
XOR EDX,0F0F0F0H ;(EDX)= 6F13ADH
答:見注釋。
3.44 請給出下列各指令序列執(zhí)行完后目的寄存器的內(nèi)容。
(1) MOV BX,-12
MOVSX EBX,BX ;(EBX)= 0FFFF FFF4H
(2) MOV CL,-8
MOVSX EDX,CL ;(EDX)= 0FFFF FFF8H
(3) MOV AH,7
MOVZX ECX,AH ;(ECX)= 0000 0007H
(4) MOV AX,99H

MOVZX EBX,AX ;(EBX)= 0000 0099H
答:見注釋。
3.45 請給出下列指令序列執(zhí)行完后EAX和EBX的內(nèi)容。
MOV ECX,307 F455H
BSF EAX,ECX ;(EAX)= 0D
BSR EBX,ECX ;(EBX)= 25D
答:見注釋。
3.46 請給出下列指令序列執(zhí)行完后AX和DX的內(nèi)容。
MOV BX,98H
BSF AX,BX ;(AX)= 3D
BSR DX,BX ;(DX)= 7D
答:見注釋。
3.47 請編寫一程序段,要求把ECX、EDX和ESI的內(nèi)容相加,其和存入EDI寄存器中(不考慮溢出)。
答:MOV EDI,0 也可為: MOV EDI,ECX
ADD EDI,ECX ADD EDI,EDX
ADD EDI,EDX ADD EDI,ESI
ADD EDI,ESI
3.48 請說明IMUL BX,DX,100H指令的操作。
答:(BX)←(DX)*100H
3.49 試編寫一程序段,要求把BL中的數(shù)除以CL中的數(shù),并把其商乘以2,最后的結(jié)果存入DX寄存器中。
答:MOV AL,BL
MOV AH,0 ;假定為無符號(hào)數(shù),否則用CBW指令即可
DIV CL
MOV AH,0
SHL AX,1
MOV DX,AX
3.50 請說明JMP DI和JMP [DI]指令的區(qū)別。
答:JMP DI是轉(zhuǎn)移到以(DI)內(nèi)容為偏移地址的單元去執(zhí)行指令;JMP [DI]是轉(zhuǎn)移到以(DI)間接尋址的內(nèi)存單
元內(nèi)容為偏移地址的單元去執(zhí)行指令。

3.51 試編寫一程序段,要求在長度為100H字節(jié)的數(shù)組中,找出大于42H的無符號(hào)數(shù)的個(gè)數(shù)并存入字節(jié)單元
UP中;找出小于42H的無符號(hào)數(shù)的個(gè)數(shù)并存入字節(jié)單元DOWN中。
答:JMP BEGIN
UP DB 0
DOWN DB 0
TABLE DB 100H DUP (?) ;數(shù)組
BEGIN:
MOV CX,100H
MOV BX,-1
MOV SI,0
MOV DI,0
L1:INC BX
CMP TABLE[BX],42H
JA L2
JB L3
JMP L4
L2:INC SI
JMP L4
L3:INC DI
L4:LOOP L1
MOV UP,SI
MOV DOWN,DI
3.52 請用圖表示ENTER 16,0所生成的堆棧幀的情況。
第 四 章. 習(xí) 題
4.1 指出下列指令的錯(cuò)誤:
(1) MOV AH, BX ;寄存器類型不匹配

(2) MOV [BX], [SI] ;不能都是存儲(chǔ)器操作數(shù)
(3) MOV AX, [SI][DI] ;[SI]和[DI]不能一起使用
(4) MOV MYDAT [BX][SI], ES:AX ;AX寄存器不能使用段超越
(5) MOV BYTE PTR [BX], 1000 ;1000超過了一個(gè)字節(jié)的范圍
(6) MOV BX, OFFSET MYDAT [SI] ;MYDAT [SI]已經(jīng)是偏移地址,不能再使用OFFSET
(7) MOV CS, AX ;CS不能用作目的寄存器
(8) MOV ECX, AX ;兩個(gè)操作數(shù)的數(shù)據(jù)類型不同
答:見注釋。
4.2 下面哪些指令是非法的?(假設(shè)OP1,OP2是已經(jīng)用DB定義的變量)
(1) CMP 15, BX ;錯(cuò),立即數(shù)不能作為目的操作數(shù)
(2) CMP OP1, 25
(3) CMP OP1, OP2 ;錯(cuò),不能都是存儲(chǔ)器操作數(shù)
(4) CMP AX, OP1 ;錯(cuò),類型不匹配,應(yīng)為CMP ax,
word ptr op1
答:見注釋。
4.3 假設(shè)下列指令中的所有標(biāo)識(shí)符均為類型屬性為字的變量,請指出下列哪些指令是非法的?它們的錯(cuò)誤
是什么?
(1) MOV BP, AL ;錯(cuò),寄存器類型不匹配
(2) MOV WORD_OP [BX+4*3][DI], SP
(3) MOV WORD_OP1, WORD_OP2 ;錯(cuò),不能都是存儲(chǔ)器操作數(shù)
(4) MOV AX, WORD_OP1[DX] ;錯(cuò),DX不能用于存儲(chǔ)器尋址
(5) MOV SAVE_WORD, DS
(6) MOV SP, SS:DATA_WORD [BX][SI]
(7) MOV [BX][SI], 2 ;錯(cuò),[BX][SI]未指出數(shù)據(jù)類型
(8) MOV AX, WORD_OP1+WORD_OP2
(9) MOV AX, WORD_OP1-WORD_OP2+100
(10) MOV WORD_OP1, WORD_OP1-WORD_OP2
答:見注釋。
4.4 假設(shè)VAR1和VAR2為字變量,LAB為標(biāo)號(hào),試指出下列指令的錯(cuò)誤之處:

(1) ADD VAR1, VAR2 ;不能都是存儲(chǔ)器操作數(shù)
(2) SUB AL, VAR1 ;數(shù)據(jù)類型不匹配
(3) JMP LAB [SI] ;LAB是標(biāo)號(hào)而不
是變量名,后面不能加[SI]
(4) JNZ VAR1 ;VAR1是變量而不是標(biāo)號(hào)
(5) JMP NEAR LAB ;應(yīng)使用NEAR PTR
答:見注釋。
4.5 畫圖說明下列語句所分配的存儲(chǔ)空間及初始化的數(shù)據(jù)值。
(1) BYTE_VAR DB ‘BYTE’,12,-12H,3 DUP(0,?,2 DUP(1,2),?)
(2) WORD_VAR DW 5 DUP(0,1,2),?,-5,‘BY’,‘TE’,256H
答:答案如下圖所示。
4.6 試列出各種方法,使匯編程序把5150H存入一個(gè)存儲(chǔ)器字中(如:DW 5150H)。
答:DW 5150H
DB 50H, 51H
DB ‘PQ’
DW ‘QP’
ORG 5150H
DW $
4.7 請?jiān)O(shè)置一個(gè)數(shù)據(jù)段DATASG,其中定義以下字符變量或數(shù)據(jù)變量。
(1) FLD1B為字符串變量:‘personal computer’;
(2) FLD2B為十進(jìn)制數(shù)字節(jié)變量:32;
(3) FLD3B為十六進(jìn)制數(shù)字節(jié)變量:20;
(4) FLD4B為二進(jìn)制數(shù)字節(jié)變量:01011001;
(5) FLD5B為數(shù)字的ASCII字符字節(jié)變量:32654;
(6) FLD6B為10個(gè)零的字節(jié)變量;

(7) FLD7B為零件名(ASCII碼)及其數(shù)量(十進(jìn)制數(shù))的表格:
PART1 20
PART2 50
PART3 14
(8) FLD1W為十六進(jìn)制數(shù)字變量:FFF0;
(9) FLD2W為二進(jìn)制數(shù)的字變量:01011001;
(10) FLD3W為(7)零件表的地址變量;
(11) FLD4W為包括5個(gè)十進(jìn)制數(shù)的字變量:5,6,7,8,9;
(12) FLD5W為5個(gè)零的字變量;
(13) FLD6W為本段中字?jǐn)?shù)據(jù)變量和字節(jié)數(shù)據(jù)變量之間的地址差。
答:DATASG SEGMENT
FLD1B DB ‘personal computer’
FLD2B DB 32
FLD3B DB 20H
FLD4B DB 01011001B
FLD5B DB ‘32654’
FLD6B DB 10 DUP (0)
FLD7B DB ‘PART1’, 20
DB ‘PART2’, 50
DB ‘PART3’, 14
FLD1W DW 0FFF0H
FLD2W DW 01011001B
FLD3W DW FLD7B
FLD4W DW 5, 6, 7, 8, 9
FLD5W DW 5 DUP (0)
FLD6W DW FLD1W-FLD1B
DATASG ENDS
4.8 假設(shè)程序中的數(shù)據(jù)定義如下:
PARTNO DW ?

PNAME DB 16 DUP (?)
COUNT DD ?
PLENTH EQU $-PARTNO
問PLENTH的值為多少?它表示什么意義?
答:PLENTH=22=16H,它表示變量PARTNO、PNAME、COUNT總共占用的存儲(chǔ)單元數(shù)(字節(jié)數(shù))。
4.9 有符號(hào)定義語句如下:
BUFF DB 1, 2, 3, ‘123’
EBUFF DB 0
L EQU EBUFF - BUFF
問L的值是多少?
答:L=6。
4.10 假設(shè)程序中的數(shù)據(jù)定義如下:
LNAME DB 30 DUP (?)
ADDRESS DB 30 DUP (?)
CITY DB 15 DUP (?)
CODE_LIST DB 1, 7, 8, 3, 2
(1) 用一條MOV指令將LNAME的偏移地址放入AX。
(2) 用一條指令將CODE_LIST的頭兩個(gè)字節(jié)的內(nèi)容放入SI。
(3) 用一條偽操作使CODE_LENGTH的值等于CODE_LIST域的實(shí)際長度。
答:(1) MOV AX, OFFSET LNAME
(2) MOV SI, WORD PTR CODE_LIST
(3) CODE_LENGTH EQU $ - CODE_LIST ;此語句必須放在CODE_LIST語句之后
4.11 試寫出一個(gè)完整的數(shù)據(jù)段DATA_SEG,它把整數(shù)5賦予一個(gè)字節(jié),并把整數(shù)-1,0,2,5和4放在10字?jǐn)?shù)
組DATA_LIST的頭5個(gè)單元中。然后,寫出完整的代碼段,其功能為:把DATA_LIST中頭5個(gè)數(shù)中的最大值和最小
值分別存入MAX和MIN單元中。
答:DATA_SEG SEGMENT
NUM DB 5
DATA_LIST DW -1, 0, 2, 5, 4, 5 DUP (?)
MAX DW ?

MIN DW ?
DATA_SEG ENDS
;----------------------------------------------------------------
CODE_SEG SEGMENT
MAIN PROC FAR
ASSUME CS: CODE_SEG, DS: DATA_SEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DATA_SEG ;給DS賦值
MOV DS, AX

MOV CX, 4 ;程序段開始
LEA BX, DATA_LIST
MOV AX, [BX]
MOV MAX, AX
MOV MIN, AX
ROUT1: ADD BX, 2
MOV AX, [BX]
CMP AX, MAX
JNGE ROUT2
MOV MAX, AX
ROUT2: CMP AX, MIN
JNLE ROUT3
MOV MIN, AX
ROUT3: LOOP ROUT1 ;程序段結(jié)束
RET
MAIN ENDP
CODE_SEG ENDS

;----------------------------------------------------------------
END START
4.12 給出等值語句如下:
ALPHA EQU 100
BETA EQU 25
GAMMA EQU 2
下列表達(dá)式的值是多少?
(1) ALPHA * 100 + BETA ;=2729H
(2) ALPHA MOD GAMMA + BETA ;=19H
(3) (ALPHA +2) * BETA – 2 ;=9F4H
(4) (BETA / 3) MOD 5 ;=3H
(5) (ALPHA +3) * (BETA MOD GAMMA) ;=67H
(6) ALPHA GE GAMMA ;=0FFFFH
(7) BETA AND 7 ;=01H
(8) GAMMA OR 3 ;=03H
答:見注釋。
4.13 對于下面的數(shù)據(jù)定義,三條MOV指令分別匯編成什么?(可用立即數(shù)方式表示)
TABLEA DW 10 DUP (?)
TABLEB DB 10 DUP (?)
TABLEC DB ‘1234’

MOV AX, LENGTH TABLEA ;匯編成MOV AX, 000AH
MOV BL, LENGTH TABLEB ;匯編成MOV BL, 000AH
MOV CL, LENGTH TABLEC ;匯編成MOV CL, 0001H
答:見注釋。
4.14 對于下面的數(shù)據(jù)定義,各條MOV指令單獨(dú)執(zhí)行后,有關(guān)寄存器的內(nèi)容是什么?
FLDB DB ?
TABLEA DW 20 DUP (?)
TABLEB DB ‘ABCD’

(1) MOV AX, TYPE FLDB ;(AX)=0001H
(2) MOV AX, TYPE TABLEA ;(AX)=0002H
(3) MOV CX, LENGTH TABLEA ;(CX)=0014H
(4) MOV DX, SIZE TABLEA ;(DX)=0028H
(5) MOV CX, LENGTH TABLEB ;(CX)=0001H
答:見注釋。
4.15 指出下列偽操作表達(dá)方式的錯(cuò)誤,并改正之。
(1) DATA_SEG SEG ;DATA_SEG SEGMENT(偽操作
錯(cuò))
(2) SEGMENT ‘CODE’ ;SEGNAME SEGMENT ‘CODE’(缺
少段名字)
(3) MYDATA SEGMENT/DATA ;MYDATA SEGMENT

ENDS ;MYDATA ENDS(缺少段名字)
(4) MAIN_PROC PROC FAR ;刪除END MAIN_PROC也可以

END MAIN_PROC ;MAIN_PROC ENDP ;上下兩句交換位置
MAIN_PROC ENDP ; END
MAIN_PROC
答:見注釋。
4.16 按下面的要求寫出程序的框架
(1) 數(shù)據(jù)段的位置從0E000H開始,數(shù)據(jù)段中定義一個(gè)100字節(jié)的數(shù)組,其類型屬性既是字又是字節(jié);
(2) 堆棧段從小段開始,段組名為STACK;
(3) 代碼段中指定段寄存器,指定主程序從1000H開始,給有關(guān)段寄存器賦值;
(4) 程序結(jié)束。
答:程序的框架如下:
DATA_SEG SEGMENT AT 0E000H
ARRAY_B LABEL BYTE
ARRAY_W DW 50 DUP (?)

DATA_SEG ENDS ;以上定義數(shù)據(jù)段
;----------------------------------------------------------------
STACK_SEG SEGMENT PARA STACK ‘STACK’
DW 100H DUP (?)
TOS LABEL WORD
STACK_SEG ENDS ;以上定義堆棧段
;----------------------------------------------------------------
CODE_SEG SEGMENT
MAIN PROC FAR
ASSUME CS: CODE_SEG, DS: DATA_SEG, SS: STACK_SEG
ORG 1000H
START: MOV AX, STACK_SEG
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DATA_SEG
MOV DS, AX ;給DS賦值
┇ ;程序段部分
RET
MAIN ENDP
CODE_SEG ENDS ;以上定義代碼段
;----------------------------------------------------------------
END START
4.17 寫一個(gè)完整的程序放在代碼段C_SEG中,要求把數(shù)據(jù)段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相
加,并把結(jié)果存放在D_SEG 段中的SUM中。其中AUGEND、ADDEND和SUM均為雙精度數(shù),AUGEND賦值為
99251,ADDEND賦值為 -15962。
答:程序如下:

D_SEG SEGMENT
AUGW LABEL WORD
AUGEND DD 99251
SUM DD ?
D_SEG ENDS ;以上定義數(shù)據(jù)段
;----------------------------------------------------------------
E_SEG SEGMENT
ADDW LABEL WORD
ADDEND DD -15962
E_SEG ENDS ;以上定義附加段
;----------------------------------------------------------------
C_SEG SEGMENT
MAIN PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, D_SEG
MOV DS, AX ;給DS賦值
MOV AX, E_SEG
MOV ES, AX ;給ES賦值

MOV AX, AUGW ;以下6條指令進(jìn)行加法計(jì)算
MOV BX, AUGW+2
ADD AX, ES: ADDW
ADC BX, ES: ADDW+2 ;不考慮有符號(hào)數(shù)溢出
MOV WORD PTR SUM, AX
MOV WORD PTR [SUM+2], BX
RET

MAIN ENDP
C_SEG ENDS ;以上定義代碼段
;----------------------------------------------------------------
END START
4.18 請說明表示程序結(jié)束的微操作和結(jié)束程序執(zhí)行的語句之間的差別。它們在源程序中應(yīng)如何表示?
答:表示程序結(jié)束的微操作是指示匯編程序MASM結(jié)束匯編的標(biāo)志,在源程序中用END表示;結(jié)束程序執(zhí)行的語
句是結(jié)束程序運(yùn)行而返回操作系統(tǒng)的指令,在源程序中有多種表示方法,比如INT 20H或MOV AX, 4C00H
INT 21H以及RET等。
4.19 試說明下述指令中哪些需要加上PTR操作符:
BVAL DB 10H,20H
WVAL DW 1000H
(1) MOV AL,BVAL ;不需要
(2) MOV DL,[BX] ;不需要
(3) SUB [BX],2 ;需要,如SUB BYTE PTR [BX],2
(4) MOV CL,WVAL ;需要,如MOV CL,BYTE PTR WVAL
(5) ADD AL,BVAL+1 ;不需要
答:見注釋。
第 五 章. 習(xí) 題
5.1 試編寫一個(gè)匯編語言程序,要求對鍵盤輸入的小寫字母用大寫字母顯示出來。
答:程序段如下:
BEGIN: MOV AH, 1 ;從鍵盤輸入一個(gè)字符的DOS調(diào)用
INT 21H
CMP AL, ‘a(chǎn)’ ;輸入字符<‘a(chǎn)’嗎?
JB STOP
CMP AL, ‘z’ ;輸入字符>‘z’嗎?
JA STOP
SUB AL, 20H ;轉(zhuǎn)換為大寫字母,用AND AL, 1101 1111B也可

MOV DL, AL ;顯示一個(gè)字符的DOS調(diào)用
MOV AH, 2
INT 21H
JMP BEGIN
STOP: RET
5.2 編寫程序,從鍵盤接收一個(gè)小寫字母,然后找出它的前導(dǎo)字符和后續(xù)字符,再按順序顯示這三個(gè)字
符。
答:程序段如下:
BEGIN: MOV AH, 1 ;從鍵盤輸入一個(gè)字符的DOS調(diào)用
INT 21H
CMP AL, ‘a(chǎn)’ ;輸入字符<‘a(chǎn)’嗎?
JB STOP
CMP AL, ‘z’ ;輸入字符>‘z’嗎?
JA STOP
DEC AL ;得到前導(dǎo)字符
MOV DL, AL ;準(zhǔn)備顯示三個(gè)字符
MOV CX, 3
DISPLAY: MOV AH, 2 ;顯示一個(gè)字符的DOS調(diào)用
INT 21H
INC DL
LOOP DISPLAY
STOP: RET
5.3 將AX寄存器中的16位數(shù)分成4組,每組4位,然后把這四組數(shù)分別放在AL、BL、CL和DL中。
答:程序段如下:
DSEG SEGMENT
STORE DB 4 DUP (?)
DSEG ENDS

BEGIN: MOV CL, 4 ;右移四次

MOV CH, 4 ;循環(huán)四次
LEA BX, STORE
A10: MOV DX, AX
AND DX, 0FH ;取AX的低四位
MOV [BX], DL ;低四位存入STORE中
INC BX
SHR AX, CL ;右移四次
DEC CH
JNZ A10 ;循環(huán)四次完了碼?
B10: MOV DL, STORE ;四組數(shù)分別放在AL、BL、CL和DL中
MOV CL, STORE+1
MOV BL, STORE+2
MOV AL, STORE+3
STOP: RET
5.4 試編寫一程序,要求比較兩個(gè)字符串STRING1和STRING2所含字符是否完全相同,若相同則顯
示‘MATCH’, 若不相同則顯示‘NO MATCH’。
答:程序如下:
DSEG SEGMENT
STRING1 DB ‘I am a student.’
STRING2 DB ‘I am a student!’
YES DB ‘MATCH’, 0DH, 0AH, ‘$’
NO DB ‘NO MATCH’, 0DH, 0AH, ‘$’
DSEG ENDS
;--------------------------------------------------------------------------
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, ES: DSEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX

PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
MOV ES, AX ;給ES賦值

BEGIN: LEA SI, STRING1 ;設(shè)置串比較指令的初值
LEA DI, STRING2
CLD
MOV CX, STRING2 - STRING1
REPE CMPSB ;串比較
JNE DISPNO
LEA DX, YES ;顯示MATCH
JMP DISPLAY
DISPNO: LEA DX, NO ;顯示NO MATCH
DISPLAY: MOV AH, 9 ;顯示一個(gè)字符串的DOS調(diào)用
INT 21H
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.5 試編寫一程序,要求能從鍵盤接收一個(gè)個(gè)位數(shù)N,然后響鈴N次(響鈴的ASCII碼為07)。
答:程序段如下:
BEGIN: MOV AH, 1 ;從鍵盤輸入一個(gè)字符的DOS調(diào)用
INT 21H
SUB AL, ‘0’
JB STOP ;輸入字符<‘0’嗎?
CMP AL, 9 ;輸入字符>‘9’嗎?
JA STOP

CBW
MOV CX, AX ;響鈴次數(shù)N
JCXZ STOP
BELL: MOV DL, 07H ;準(zhǔn)備響鈴
MOV AH, 2 ;顯示一個(gè)字符的DOS調(diào)用,實(shí)際為響鈴
INT 21H
CALL DELAY100ms ;延時(shí)100ms
LOOP BELL
STOP: RET
5.6 編寫程序,將一個(gè)包含有20個(gè)數(shù)據(jù)的數(shù)組M分成兩個(gè)數(shù)組:正數(shù)數(shù)組P和負(fù)數(shù)數(shù)組N,并分別把這兩個(gè)
數(shù)組中數(shù)據(jù)的個(gè)數(shù)顯示出來。
答:程序如下:
DSEG SEGMENT
COUNT EQU 20
ARRAY DW 20 DUP (?) ;存放數(shù)組
COUNT1 DB 0 ;存放正數(shù)的個(gè)數(shù)
ARRAY1 DW 20 DUP (?) ;存放正數(shù)
COUNT2 DB 0 ;存放負(fù)數(shù)的個(gè)數(shù)
ARRAY2 DW 20 DUP (?) ;存放負(fù)數(shù)
ZHEN DB 0DH, 0AH, ‘The positive number is:’, ‘$’ ;正數(shù)的個(gè)數(shù)是:
FU DB 0DH, 0AH, ‘The negative number is:’, ‘$’ ;負(fù)數(shù)的個(gè)數(shù)是:
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV CX, COUNT
LEA BX, ARRAY
LEA SI, ARRAY1
LEA DI, ARRAY2
BEGIN1: MOV AX, [BX]
CMP AX, 0 ;是負(fù)數(shù)碼?
JS FUSHU
MOV [SI], AX ;是正數(shù),存入正數(shù)數(shù)組
INC COUNT1 ;正數(shù)個(gè)數(shù)+1
ADD SI, 2
JMP SHORT NEXT
FUSHU: MOV [DI], AX ;是負(fù)數(shù),存入負(fù)數(shù)數(shù)組
INC COUNT2 ;負(fù)數(shù)個(gè)數(shù)+1
ADD DI, 2
NEXT: ADD BX, 2
LOOP BEGIN1
LEA DX, ZHEN ;顯示正數(shù)個(gè)數(shù)
MOV AL, COUNT1
CALL DISPLAY ;調(diào)顯示子程序
LEA DX, FU ;顯示負(fù)數(shù)個(gè)數(shù)
MOV AL, COUNT2
CALL DISPLAY ;調(diào)顯示子程序
RET
MAIN ENDP
;--------------------------------------------------------------------------

DISPLAY PROC NEAR ;顯示子程序
MOV AH, 9 ;顯示一個(gè)字符串的DOS調(diào)用
INT 21H
AAM ;將(AL)中的二進(jìn)制數(shù)轉(zhuǎn)換為二個(gè)非壓縮BCD碼
ADD AH, ‘0’ ;變?yōu)?~9的ASCII碼
MOV DL, AH
MOV AH, 2 ;顯示一個(gè)字符的DOS調(diào)用
INT 21H
ADD AL, ‘0’ ;變?yōu)?~9的ASCII碼
MOV DL, AL
MOV AH, 2 ;顯示一個(gè)字符的DOS調(diào)用
INT 21H
LEA DX, CRLF ;顯示回車換行
MOV AH, 9 ;顯示一個(gè)字符串的DOS調(diào)用
INT 21H
RET
DISPLAY ENDP ;顯示子程序結(jié)束
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.7 試編寫一個(gè)匯編語言程序,求出首地址為DATA的100D字?jǐn)?shù)組中的最小偶數(shù),并把它存放在AX中。
答:程序段如下:
BEGIN: MOV BX, 0
MOV CX, 100
COMPARE: MOV AX, DATA[BX] ;取數(shù)組的第一個(gè)偶數(shù)
ADD BX, 2
TEST AX, 01H ;是偶數(shù)嗎?
LOOPNZ COMPARE ;不是,比較下一個(gè)數(shù)
JNZ STOP ;沒有偶數(shù),退出

JCXZ STOP ;最后一個(gè)數(shù)是偶數(shù),即為最小偶數(shù),退出
COMPARE1: MOV DX, DATA[BX] ;取數(shù)組的下一個(gè)偶數(shù)
ADD BX, 2
TEST DX, 01H ;是偶數(shù)嗎?
JNZ NEXT ;不是,比較下一個(gè)數(shù)
CMP AX, DX ;(AX)<(DX)嗎?
JLE NEXT
MOV AX, DX ;(AX)<(DX),則置換(AX)為最小偶數(shù)
NEXT: LOOP COMPARE1
STOP: RET
5.8 把AX中存放的16位二進(jìn)制數(shù)K看作是8個(gè)二進(jìn)制的“四分之一字節(jié)”。試編寫程序要求數(shù)一下值為3(即
11B)的四分之一字節(jié)數(shù),并將該數(shù)(即11B的個(gè)數(shù))在終端上顯示出來。
答:程序段如下:
BEGIN: MOV DL, 0 ;計(jì)數(shù)初始值
MOV CX, 8
COMPARE: TEST AX, 03H ;是數(shù)03嗎?
JNZ NOEQUAL ;不是,轉(zhuǎn)走
INC DL ;是,計(jì)數(shù)
NOEQUAL: ROR AX, 1 ;準(zhǔn)備判斷下一個(gè)數(shù)
ROR AX, 1
LOOP COMPARE
ADD DL, ‘0’ ;將計(jì)數(shù)值轉(zhuǎn)換為ASCII碼
MOV AH, 2 ;進(jìn)行顯示
INT 21H
STOP: RET
5.9 試編寫一個(gè)匯編語言程序,要求從鍵盤接收一個(gè)四位的16進(jìn)制數(shù),并在終端上顯示與它等值的二進(jìn)制
數(shù)。
答:程序段如下:
BEGIN: MOV BX, 0 ;用于存放四位的16進(jìn)制數(shù)

MOV CH, 4
MOV CL, 4
INPUT: SHL BX, CL ;將前面輸入的數(shù)左移4位
MOV AH, 1 ;從鍵盤取數(shù)
INT 21H
CMP AL, 30H ;<0嗎?
JB INPUT ;不是‘0~F’的數(shù)重新輸入
CMP AL, 39H ;是‘0~9’嗎?
JA AF ;不是,轉(zhuǎn)‘A~F’的處理
AND AL, 0FH ;轉(zhuǎn)換為:0000B~1001B
JMP BINARY
AF: AND AL, 1101 1111B ;轉(zhuǎn)換為大寫字母
CMP AL, 41H ;又<A嗎?
JB INPUT ;不是‘A~F’的數(shù)重新輸入
CMP AL, 46H ;>F嗎?
JA INPUT ;不是‘A~F’的數(shù)重新輸入
AND AL, 0FH ;轉(zhuǎn)換為:1010B~1111B
ADD AL, 9
BINARY: OR BL, AL ;將鍵盤輸入的數(shù)進(jìn)行組合
DEL CH
JNZ INPUT
DISPN: MOV CX, 16 ;將16位二進(jìn)制數(shù)一位位地轉(zhuǎn)換成ASCII碼顯示
DISP: MOV DL, 0
ROL BX, 1
RCL DL, 1
OR DL, 30H
MOV AH, 2 ;進(jìn)行顯示
INT 21H
LOOP DISP

STOP: RET
5.10 設(shè)有一段英文,其字符變量名為ENG,并以$字符結(jié)束。試編寫一程序,查對單詞SUN在該文中的出現(xiàn)
次數(shù),并以格式“SUN:xxxx”顯示出次數(shù)。
答:程序如下:
DSEG SEGMENT
ENG DB ‘Here is sun, sun ,.,$’
DISP DB ‘SUN:’
DAT DB ‘0000’ , 0DH, 0AH, ‘$’
KEYWORD DB ‘sun’
DSEG ENDS
;--------------------------------------------------------------------------
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, ES: DSEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
MOV ES, AX ;給ES賦值
BEGIN: MOV AX, 0
MOV DX, DISP-ENG-2 ;計(jì)算ENG的長度(每次比較sun,因此比較次數(shù)-2)
LEA BX, ENG
COMP: MOV DI, BX
LEA SI, KEYWORD
MOV CX, 3
REPE CMPSB ;串比較
JNZ NOMATCH
INC AX ;是,SUN的個(gè)數(shù)加1

ADD BX, 2
NOMATCH: INC BX ;指向ENG的下一個(gè)字母
DEC DX
JNZ COMP
DONE: MOV CH, 4 ;將次數(shù)轉(zhuǎn)換為16進(jìn)制數(shù)的ASCII碼
MOV CL, 4
LEA BX, DAT ;轉(zhuǎn)換結(jié)果存入DAT單元中
DONE1: ROL AX, CL
MOV DX, AX
AND DL, 0FH ;取一位16進(jìn)制數(shù)
ADD DL, 30H
CMP DL, 39H
JLE STORE
ADD DL, 07H ;是“A~F”所以要加7
STORE: MOV [BX], DL ;轉(zhuǎn)換結(jié)果存入DAT單元中
INC BX
DEC CH
JNZ DONE1
DISPLAY: LEA DX, DISP ;顯示字符串程序(將DISP和DAT一起顯示)
MOV AH, 09H
INT 21H
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.11 從鍵盤輸入一系列以$為結(jié)束符的字符串,然后對其中的非數(shù)字字符計(jì)數(shù),并顯示出計(jì)數(shù)結(jié)果。
答:程序段如下:
DSEG SEGMENT

BUFF DB 50 DUP (‘ ’)
COUNT DW 0
DSEG ENDS

BEGIN: LEA BX, BUFF
MOV COUNT, 0
INPUT: MOV AH, 01 ;從鍵盤輸入一個(gè)字符的功能調(diào)用
INT 21H
MOV [BX], AL
INC BX
CMP AL, ‘$’ ;是$結(jié)束符嗎?
JNZ INPUT ;不是,繼續(xù)輸入
LEA BX, BUFF ;對非數(shù)字字符進(jìn)行計(jì)數(shù)
NEXT: MOV CL, [BX]
INC BX
CMP CL, ‘$’ ;是$結(jié)束符,則轉(zhuǎn)去顯示
JZ DISP
CMP CL, 30H ;小于0是非數(shù)字字符
JB NEXT
CMP CL, 39H ;大于9是非數(shù)字字符
JA NEXT
INC COUNT ;個(gè)數(shù)+1
JMP NEXT
DISP: ┇ ;16進(jìn)制數(shù)顯示程序段(省略)
5.12 有一個(gè)首地址為MEM的100D字?jǐn)?shù)組,試編制程序刪除數(shù)組中所有為0的項(xiàng),并將后續(xù)項(xiàng)向前壓縮,最后
將數(shù)組的剩余部分補(bǔ)上0。
答:程序如下:
DSEG SEGMENT
MEM DW 100 DUP (?)

DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV SI, (100-1)*2 ;(SI)指向MEM的末元素的首地址
MOV BX, -2 ;地址指針的初值
MOV CX, 100
COMP: ADD BX, 2
CMP MEM [BX], 0
JZ CONS
LOOP COMP
JMP FINISH ;比較完了,已無0則結(jié)束
CONS: MOV DI, BX
CONS1: CMP DI, SI ;到了最后單元碼?
JAE NOMOV
MOV AX, MEM [DI+2] ;后面的元素向前移位
MOV MEM [DI], AX
ADD DI, 2
JMP CONS1
NOMOV: MOV WORD PTR [SI], 0 ;最后單元補(bǔ)0
LOOP COMP
FINISH: RET

MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.13 在STRING到STRING+99單元中存放著一個(gè)字符串,試編制一個(gè)程序測試該字符串中是否存在數(shù)字,如
有則把CL的第5位置1,否則將該位置0。
答:程序如下:
DSEG SEGMENT
STRING DB 100 DUP (?)
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV SI, 0 ;(SI)作為地址指針的變化值
MOV CX, 100
REPEAT: MOV AL, STRING [SI]
CMP AL, 30H
JB GO_ON
CMP AL, 39H
JA GO_ON
OR CL, 20H ;存在數(shù)字把CL的第5位置1
JMP EXIT

GO_ON: INC SI
LOOP REPEAT
AND CL, 0DFH ;不存在數(shù)字把CL的第5位置0
EXIT: RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.14 在首地址為TABLE的數(shù)組中按遞增次序存放著100H個(gè)16位補(bǔ)碼數(shù),試編寫一個(gè)程序把出現(xiàn)次數(shù)最多的
數(shù)及其出現(xiàn)次數(shù)分別存放于AX和CX中。
答:程序如下:
DSEG SEGMENT
TABLE DW 100H DUP (?) ;數(shù)組中的數(shù)據(jù)是按增序排列的
DATA DW ?
COUNT DW 0
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV CX, 100H ;循環(huán)計(jì)數(shù)器
MOV SI, 0
NEXT: MOV DX, 0

MOV AX, TABLE [SI]
COMP: CMP TABLE [SI], AX ;計(jì)算一個(gè)數(shù)的出現(xiàn)次數(shù)
JNE ADDR
INC DX
ADD SI, 2
LOOP COMP
ADDR: CMP DX, COUNT ;此數(shù)出現(xiàn)的次數(shù)最多嗎?
JLE DONE
MOV COUNT, DX ;目前此數(shù)出現(xiàn)的次數(shù)最多,記下次數(shù)
MOV DATA, AX ;記下此數(shù)
DONE: LOOP NEXT ;準(zhǔn)備取下一個(gè)數(shù)
MOV CX, COUNT ;出現(xiàn)最多的次數(shù)存入(CX)
MOV AX, DATA ;出現(xiàn)最多的數(shù)存入(AX)
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.15 數(shù)據(jù)段中已定義了一個(gè)有n個(gè)字?jǐn)?shù)據(jù)的數(shù)組M,試編寫一程序求出M中絕對值最大的數(shù),把它放在數(shù)據(jù)
段的M+2n單元中,并將該數(shù)的偏移地址存放在M+2(n+1)單元中。
答:程序如下:
DSEG SEGMENT
n EQU 100H ;假設(shè)n=100H
M DW n DUP (?)
DATA DW ? ;M+2n單元
ADDR DW ? ;M+2(n+1)單元
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV CX, n ;循環(huán)計(jì)數(shù)器
LEA DI, M
MOV AX, [DI] ;取第一個(gè)數(shù)
MOV ADDR, DI ;記下絕對值最大的數(shù)的地址
CMP AX, 0 ;此數(shù)是正數(shù)嗎?
JNS ZHEN ;是正數(shù),即為絕對值,轉(zhuǎn)去判斷下一個(gè)數(shù)
NEG AX ;不是正數(shù),變?yōu)槠浣^對值
ZHEN: MOV BX, [DI]
CMP BX, 0 ;此數(shù)是正數(shù)嗎?
JNS COMP ;是正數(shù),即為絕對值,轉(zhuǎn)去比較絕對值大小
NEG BX ;不是正數(shù),變?yōu)槠浣^對值
COMP: CMP AX, BX ;判斷絕對值大小
JAE ADDRESS
MOV AX, BX ;(AX)<(BX),使(AX)中為絕對值最大的數(shù)
MOV ADDR, DI ;記下絕對值最大的數(shù)的地址
ADDRESS: ADD DI, 2
LOOP ZHEN
MOV DATA, AX ;記下此數(shù)
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段

;--------------------------------------------------------------------------
END START
5.16 在首地址為DATA的字?jǐn)?shù)組中存放著100H個(gè)16位補(bǔ)碼數(shù),試編寫一個(gè)程序求出它們的平均值放在AX寄存
器中;并求出數(shù)組中有多少個(gè)數(shù)小于此平均值,將結(jié)果放在BX寄存器中。
答:程序如下:
DSEG SEGMENT
DATA DW 100H DUP (?)
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV CX, 100H ;循環(huán)計(jì)數(shù)器
MOV SI, 0
MOV BX, 0 ;和((DI),(BX))的初始值
MOV DI, 0
NEXT: MOV AX, DATA [SI]
CWD
ADD BX, AX ;求和
ADC DI, DX ;加上進(jìn)位位
ADD SI, 2
LOOP NEXT
MOV DX, DI ;將((DI),(BX))中的累加和放入((DX),(AX))中

MOV AX, BX
MOV CX, 100H
IDIV CX ;帶符號(hào)數(shù)求平均值,放入(AX)中
MOV BX, 0
MOV SI, 0
COMP: CMP AX, DATA [SI] ;尋找小于平均值的數(shù)
JLE NO
INC BX ;小于平均值數(shù)的個(gè)數(shù)+1
NO: ADD SI, 2
LOOP COMP
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.17 試編制一個(gè)程序把AX中的16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,并將對應(yīng)的ASCII碼依次存放到MEM數(shù)組中的四個(gè)
字節(jié)中。例如,當(dāng)(AX)=2A49H時(shí),程序執(zhí)行完后,MEM中的4個(gè)字節(jié)內(nèi)容為39H,34H,41H,32H。
答:程序如下:
DSEG SEGMENT
MEM DB 4 DUP (?)
N DW 2A49H
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV CH, 4 ;循環(huán)計(jì)數(shù)器
MOV CL, 4
MOV AX, N
LEA BX, MEM
ROTATE: MOV DL, AL ;從最低四位開始轉(zhuǎn)換為ASCII碼
AND DL, 0FH
ADD DL, 30H
CMP DL, 3AH ;是0~9嗎?
JL NEXT
ADD DL, 07H ;是A~F
NEXT: MOV [BX], DL ;轉(zhuǎn)換的ASCII碼送入MEM中
INC BX
ROR AX, CL ;準(zhǔn)備轉(zhuǎn)換下一位
DEC CH
JNZ ROTATE
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.18 把0~100D之間的30個(gè)數(shù)存入以GRADE為首地址的30字?jǐn)?shù)組中,GRADE+i表示學(xué)號(hào)為i+1的學(xué)生的成績。
另一個(gè)數(shù)組RANK為30個(gè)學(xué)生的名次表,其中RANK+i的內(nèi)容是學(xué)號(hào)為i+1的學(xué)生的名次。編寫一程序,根據(jù)GRADE
中的學(xué)生成績,將學(xué)生名次填入RANK數(shù)組中。(提示:一個(gè)學(xué)生的名次等于成績高于這個(gè)學(xué)生的人數(shù)加1。)
答:程序如下:
DSEG SEGMENT
GRADE DW 30 DUP (?) ;假設(shè)已預(yù)先存好30名學(xué)生的成績

RANK DW 30 DUP (?)
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV DI, 0
MOV CX, 30 ;外循環(huán)計(jì)數(shù)器
LOOP1: PUSH CX
MOV CX, 30 ;內(nèi)循環(huán)計(jì)數(shù)器
MOV SI, 0
MOV AX, GRADE [DI]
MOV DX, 1 ;起始名次為第1名
LOOP2: CMP GRADE [SI], AX ;成績比較
JBE GO_ON
INC DX ;名次+1
GO_ON: ADD SI, 2
LOOP LOOP2
POP CX
MOV RNAK [DI], DX ;名次存入RANK數(shù)組
ADD DI, 2
LOOP LOOP1
RET

MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.19 已知數(shù)組A包含15個(gè)互不相等的整數(shù),數(shù)組B包含20個(gè)互不相等的整數(shù)。試編制一程序把既在A中又在B
中出現(xiàn)的整數(shù)存放于數(shù)組C中。
答:程序如下:
DSEG SEGMENT
A DW 15 DUP (?)
B DW 20 DUP (?)
C DW 15 DUP (‘ ’)
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV SI, 0
MOV BX, 0
MOV CX, 15 ;外循環(huán)計(jì)數(shù)器
LOOP1: PUSH CX
MOV CX, 20 ;內(nèi)循環(huán)計(jì)數(shù)器
MOV DI, 0
MOV AX, A [SI] ;取A數(shù)組中的一個(gè)數(shù)

LOOP2: CMP B [DI], AX ;和B數(shù)組中的數(shù)相等嗎?
JNE NO
MOV C [BX], AX ;相等存入C數(shù)組中
ADD BX, 2
NO: ADD DI, 2
LOOP LOOP2
ADD SI, 2
POP CX
LOOP LOOP1
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.20 設(shè)在A、B和C單元中分別存放著三個(gè)數(shù)。若三個(gè)數(shù)都不是0,則求出三數(shù)之和存放在D單元中;若其中
有一個(gè)數(shù)為0,則把其它兩單元也清0。請編寫此程序。
答:程序如下:
DSEG SEGMENT
A DW ?
B DW ?
C DW ?
D DW 0
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: CMP A, 0
JE NEXT
CMP B, 0
JE NEXT
CMP C, 0
JE NEXT
MOV AX, A
ADD AX, B
ADD AX, C
MOV D, AX
JMP SHORT EXIT
NEXT: MOV A, 0
MOV B, 0
MOV C, 0
EXIT: RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.21 試編寫一程序,要求比較數(shù)組ARRAY中的三個(gè)16位補(bǔ)碼數(shù),并根據(jù)比較結(jié)果在終端上顯示如下信息:
(1) 如果三個(gè)數(shù)都不相等則顯示0;
(2) 如果三個(gè)數(shù)有二個(gè)數(shù)相等則顯示1;
(3) 如果三個(gè)數(shù)都相等則顯示2。
答:程序如下:
DSEG SEGMENT

ARRAY DW 3 DUP (?)
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: LEA SI, ARRAY
MOV DX, 0 ;(DX)用于存放所求的結(jié)果
MOV AX, [SI]
MOV BX, [SI+2]
CMP AX, BX ;比較第一和第二兩個(gè)數(shù)是否相等
JNE NEXT1
INC DX
NEXT1: CMP [SI+4], AX ;比較第一和第三兩個(gè)數(shù)是否相等
JNE NEXT2
INC DX
NEXT2: CMP [SI+4], BX ;比較第二和第三兩個(gè)數(shù)是否相等
JNE NUM
INC DX
NUM: CMP DX, 3
JL DISP
DEC DX
DISP: ADD DL, 30H ;轉(zhuǎn)換為ASCII碼

MOV AH, 2 ;顯示一個(gè)字符
INT 21H
RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.22 從鍵盤輸入一系列字符(以回車符結(jié)束),并按字母、數(shù)字、及其它字符分類計(jì)數(shù),最后顯示出這三類
的計(jì)數(shù)結(jié)果。
答:程序如下:
DSEG SEGMENT
ALPHABET DB ‘輸入的字母字符個(gè)數(shù)為:’, ‘$’
NUMBER DB ‘輸入的數(shù)字字符個(gè)數(shù)為:’, ‘$’
OTHER DB ‘輸入的其它字符個(gè)數(shù)為:’, ‘$’
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV BX, 0 ;字母字符計(jì)數(shù)器
MOV SI, 0 ;數(shù)字字符計(jì)數(shù)器
MOV DI, 0 ;其它字符計(jì)數(shù)器

INPUT: MOV AH, 1 ;輸入一個(gè)字符
INT 21H
CMP AL, 0DH ;是回車符嗎?
JE DISP
CMP AL, 30H ;<數(shù)字0嗎?
JAE NEXT1
OTHER: INC DI ;是其它字符
JMP SHORT INPUT
NEXT1: CMP AL, 39H ;>數(shù)字9嗎?
JA NEXT2
INC SI ;是數(shù)字字符
JMP SHORT INPUT
NEXT2: CMP AL, 41H ;<字母A嗎?
JAE NEXT3
JMP SHORT OTHER ;是其它字符
NEXT3: CMP AL, 5AH ;>字母Z嗎?
JA NEXT4
INC BX ;是字母字符A~Z
JMP SHORT INPUT
NEXT4: CMP AL, 61H ;<字母a嗎?
JAE NEXT5
JMP SHORT OTHER ;是其它字符
NEXT5: CMP AL, 7AH ;>字母z嗎?
JA SHORT OTHER ;是其它字符
INC BX ;是字母字符a~z
JMP SHORT INPUT
DISP: LEA DX, ALPHABET
CALL DISPLAY

LEA DX, NUMBER
MOV BX, SI
CALL DISPLAY
LEA DX, OTHER
MOV BX, DI
CALL DISPLAY
RET
MAIN ENDP
;--------------------------------------------------------------------------
DISPLAY PROC NEAR
MOV AH, 09H ;顯示字符串功能調(diào)用
INT 21H
CALL BINIHEX ;調(diào)把BX中二進(jìn)制數(shù)轉(zhuǎn)換為16進(jìn)制顯示子程序
LEA DX, CRLF
MOV AH, 09H ;顯示回車換行
INT 21H
RET
DISPLAY ENDP
;--------------------------------------------------------------------------
BINIHEX PROC NEAR ;將BX中二進(jìn)制數(shù)轉(zhuǎn)換為16進(jìn)制數(shù)顯示子程序
MOV CH, 4
ROTATE: MOV CL, 4
ROL BX, CL
MOV DL, BL
AND DL, 0FH
ADD DL, 30H
CMP DL, 3AH ;是A~F嗎?
JL PRINT_IT
ADD DL, 07H

PRINT_IT: MOV AH, 02H ;顯示一個(gè)字符
INT 21H
DEC CH
JNZ ROTATE
RET
BINIHEX ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.23 已定義了兩個(gè)整數(shù)變量A和B,試編寫程序完成下列功能:
(1) 若兩個(gè)數(shù)中有一個(gè)是奇數(shù),則將奇數(shù)存入A中,偶數(shù)存入B中;
(2) 若兩個(gè)數(shù)中均為奇數(shù),則將兩數(shù)加1后存回原變量;
(3) 若兩個(gè)數(shù)中均為偶數(shù),則兩個(gè)變量均不改變。
答:程序如下:
DSEG SEGMENT
A DW ?
B DW ?
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOV AX, A

MOV BX, B
XOR AX, BX
TEST AX, 0001H ;A和B同為奇數(shù)或偶數(shù)嗎?
JZ CLASS ;A和B都為奇數(shù)或偶數(shù),轉(zhuǎn)走
TEST BX, 0001H
JZ EXIT ;B為偶數(shù),轉(zhuǎn)走
XCHG BX, A ;A為偶數(shù),將奇數(shù)存入A中
MOV B, BX ;將偶數(shù)存入B中
JMP EXIT
CLASS: TEST BX, 0001H ;A和B都為奇數(shù)嗎?
JZ EXIT ;A和B同為偶數(shù),轉(zhuǎn)走
INC B
INC A
EXIT: RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.24 假設(shè)已編制好5個(gè)歌曲程序,它們的段地址和偏移地址存放在數(shù)據(jù)段的跳躍表SINGLIST中。試編制一
程序,根據(jù)從鍵盤輸入的歌曲編號(hào)1~5,轉(zhuǎn)去執(zhí)行五個(gè)歌曲程序中的某一個(gè)。
答:程序如下:
DSEG SEGMENT
SINGLIST DD SING1
DD SING2
DD SING3
DD SING4
DD SING5
ERRMSG DB ‘Error! Invalid parameter!’, 0DH, 0AH, ‘$’
DSEG ENDS

;--------------------------------------------------------------------------
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賦值
BEGIN: MOV AH, 1 ;從鍵盤輸入的歌曲編號(hào)1~5
INT 21H
CMP AL, 0DH
JZ EXIT ;是回車符,則結(jié)束
SUB AL, ‘1’ ;是1~5嗎?
JB ERROR ;小于1,錯(cuò)誤
CMP AL, 4
JA ERROR ;大于5,錯(cuò)誤
MOV BX, OFFSET SINGLIST
MUL AX, 4 ;(AX)=(AL)*4,每個(gè)歌曲程序的首地址占4個(gè)字節(jié)
ADD BX, AX
JMP DWORD PTR[BX] ;轉(zhuǎn)去執(zhí)行歌曲程序
ERROR: MOV DX, OFFSET ERRMSG
MOV AH, 09H
INT 21H ;顯示錯(cuò)誤信息
JMP BEGIN
SING1: ┇
JMP BEGIN
SING2: ┇

JMP BEGIN
SING3: ┇
JMP BEGIN
SING4: ┇
JMP BEGIN
SING5: ┇
JMP BEGIN
EXIT: RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
5.25 試用8086的乘法指令編制一個(gè)32位數(shù)和16位數(shù)相乘的程序;再用80386的乘法指令編制一個(gè)32位數(shù)和
16位數(shù)相乘的程序,并定性比較兩個(gè)程序的效率。
答:8086的程序如下(假設(shè)為無符號(hào)數(shù)):
DSEG SEGMENT
MUL1 DD ? ;32位被乘數(shù)
MUL2 DW ? ;16位乘數(shù)
MUL0 DW 0,0 ,0 ,0 ;乘積用64位單元存放
DSEG ENDS
;--------------------------------------------------------------------------
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賦值

BEGIN: MOV BX, MUL2 ;取乘數(shù)
MOV AX, WORD PTR MUL1 ;取被乘數(shù)低位字
MUL BX
MOV MUL0, AX ;保存部分積低位
MOV MUL0+2, DX ;保存部分積高位
MOV AX, WORD PTR[MUL1+2] ;取被乘數(shù)高位字
MUL BX
ADD MUL0+2, AX ;部分積低位和原部分積高位相加
ADC MUL0+4, DX ;保存部分積最高位,并加上進(jìn)位
EXIT: RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
80386的程序如下(假設(shè)為無符號(hào)數(shù)):
.386
DSEG SEGMENT
MUL1 DD ? ;32位被乘數(shù)
MUL2 DW ? ;16位乘數(shù)
MUL0 DD 0,0 ;乘積用64位單元存放
DSEG ENDS
;--------------------------------------------------------------------------
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賦值
BEGIN: MOVZX EBX, MUL2 ;取乘數(shù),并0擴(kuò)展成32位
MOV EAX, MUL1 ;取被乘數(shù)
MUL EBX
MOV DWORD PTR MUL0, EAX ;保存積的低位雙字
MOV DWORD PTR[MUL0+4], EDX ;保存積的高位雙字
EXIT: RET
MAIN ENDP
CSEG ENDS ;以上定義代碼段
;--------------------------------------------------------------------------
END START
80386作32位乘法運(yùn)算用一條指令即可完成,而8086則需用部分積作兩次完成。
5.26 如數(shù)據(jù)段中在首地址為MESS1的數(shù)據(jù)區(qū)內(nèi)存放著一個(gè)長度為35的字符串,要求把它們傳送到附加段中
的緩沖區(qū)MESS2中去。為提高程序執(zhí)行效率,希望主要采用MOVSD指令來實(shí)現(xiàn)。試編寫這一程序。
答:80386的程序如下:
.386
.MODEL SMALL
.STACK 100H
.DATA
MESS1 DB ‘123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’,? ;長度為35的字符串
.FARDATA
MESS2 DB 36 DUP (?)
.CODE
START: MOV AX, @DATA
MOV DS, AX ;給DS賦值
MOV AX, @FARDATA
MOV ES, AX ;給ES賦值

ASSUME ES:@FARDATA
BEGIN: LEA ESI, MESS1
LEA EDI, MESS2
CLD
MOV ECX, (35+1)/4 ;取傳送的次數(shù)
REP MOVSD
;--------------------------------------------------------------------------
MOV AX, 4C00H ;返回DOS
INT 21H
END START
5.27 試用比例變址尋址方式編寫一386程序,要求把兩個(gè)64位整數(shù)相加并保存結(jié)果。
答:80386的程序如下:
.386
.MODEL SMALL
.STACK 100H
.DATA
DATA1 DQ ?
DATA2 DQ ?
.CODE
START: MOV AX, @DATA
MOV DS, AX ;給DS賦值
BEGIN: MOV ESI, 0
MOV EAX, DWORD PTR DATA2[ESI*4]
ADD DWORD PTR DATA1[ESI*4], EAX
INC ESI
MOV EAX, DWORD PTR DATA2[ESI*4]
ADC DWORD PTR DATA1[ESI*4], EAX

;--------------------------------------------------------------------------
MOV AX, 4C00H ;返回DOS
INT 21H
END START
第 六 章. 習(xí) 題
6.1 下面的程序段有錯(cuò)嗎?若有,請指出錯(cuò)誤。
CRAY PROC
PUSH AX
ADD AX, BX
RET
ENDP CRAY
答:程序有錯(cuò)。改正如下:
CRAY PROC
ADD AX, BX
RET
CRAY ENDP ;CRAY是過程名,應(yīng)放在ENDP的前面
6.2 已知堆棧寄存器SS的內(nèi)容是0F0A0H,堆棧指示器SP的內(nèi)容是00B0H,先執(zhí)行兩條把8057H和0F79BH分別
入棧的PUSH指令,然后執(zhí)行一條POP指令。試畫出示意圖說明堆棧及SP內(nèi)容的變化過程。
答:變化過程如右圖所示:
6.3 分析下面的程序,畫出堆棧最滿時(shí)各單元的地址及內(nèi)容。
;********************************************
S_SEG SEGMENT AT 1000H ;定義堆棧段
DW 200 DUP (?) ;200*2=190H
TOS LABEL WORD
S_SEG ENDS

;********************************************
C_SEG SEGMENT ;定義代碼段
ASSUME CS: C_SEG, SS: S_SEG
START: MOV AX, S_SEG
MOV SS, AX
MOV SP, OFFSET TOS
PUSH DS
MOV AX, 0
PUSH AX

PUSH T_ADDR
PUSH AX
PUSHF

POPF
POP AX
POP T_ADDR
RET
;--------------------------------------------------------------------------
C_SEG ENDS ;代碼段結(jié)束
;******************************************
END START ;程序結(jié)束
答:堆棧最滿時(shí)各單元的地址及內(nèi)容如右圖所示:
6.4 分析下面的程序,寫出堆棧最滿時(shí)各單元的地址及內(nèi)容。
;********************************************
STACK SEGMENT AT 500H ;定義堆棧段
DW 128 DUP (?)
TOS LABEL WORD

STACK ENDS
;********************************************
CODE SEGMENT ;定義代碼段
MAIN PROC FAR ;主程序部分
ASSUME CS: CODE, SS: STACK
START: MOV AX, STACK
MOV SS, AX
MOV SP, OFFSET TOS
PUSH DS
SUB AX, AX
PUSH AX
;MAIN PART OF PROGRAM GOES HERE
MOV AX, 4321H
CALL HTOA
RET
MAIN ENDP ;主程序部分結(jié)束
;--------------------------------------------------------------------
HTOA PROC NEAR ;HTOA子程序
CMP AX, 15
JLE B1
PUSH AX
PUSH BP
MOV BP, SP
MOV BX, [BP+2]
AND BX, 000FH
MOV [BP+2], BX
POP BP
MOV CL, 4
SHR AX, CL

CALL HTOA
POP BP
B1: ADD AL, 30H
CMP AL, 3AH
JL PRINTIT
ADD AL, 7H
PRINTIT: MOV DL, AL
MOV AH, 2
INT 21H
RET
HOTA ENDP ;HOTA子程序結(jié)束
;--------------------------------------------------------------------
CODE ENDS ;代碼段結(jié)束
;******************************************
END START ;程序結(jié)束
答:堆棧最滿時(shí)各單元的地址及內(nèi)容如右上圖所示:
6.5 下面是一個(gè)程序清單,請?jiān)谙旅娴膱D中填入此程序執(zhí)行過程中的堆棧變化。
;*************************
0000 STACKSG SEGMENT
0000 20 [. DW 32 DUP (?)
? ? ? ?
]
0040 STACKSG ENDS
;*************************
0000 CODESG SEGMENT PARA ‘CODE’
;--------------------------------------
0000 BEGIN PROC FAR
ASSUME CS: CODESG, SS: STACKSG
0000 1E PUSH DS

0001 2B C0 SUB AX, AX
0003 50 PUSH AX
0004 E8 0008 R CALL B10
;--------------------------------------
0007 CB RET
0008 BEGIN ENDP
;--------------------------------------
0008 B10 PROC
0008 E8 000C R CALL C10
;--------------------------------------
000B C3 RET
000C B10 ENDP
;--------------------------------------
000C C10 PROC
;--------------------------------------
000C C3 RET
000D C10 ENDP
;--------------------------------------
000D CODESG ENDS
;*************************
END BEGIN
答:程序執(zhí)行過程中的堆棧變化如下圖所示。
6.6 寫一段子程序SKIPLINES,完成輸出空行的功能。空出的行數(shù)在AX寄存器中。
答:程序如下:
CSEG SEGMENT
SKIPLINES PROC FAR
ASSUME CS: CSEG
BEGIN: PUSH CX
PUSH DX

MOV CX, AX
DISP: MOV DL, 0DH ;顯示回車換行,即輸出空行
MOV AH, 2 ;顯示一個(gè)字符的DOS調(diào)用
INT 21H
MOV DL, 0AH
MOV AH, 2 ;顯示一個(gè)字符的DOS調(diào)用
INT 21H
LOOP DISP
POP DX
POP CX
RET
SKIPLINES ENDP
END
6.7 設(shè)有10個(gè)學(xué)生的成績分別是76,69,84,90,73,88,99,63,100和80分。試編制一個(gè)子程序統(tǒng)計(jì)
60~69分,70~79分,80~89分,90~99分和100分的人數(shù),分別存放到S6,S7,S8,S9和S10單元中。
答:程序如下:
DSEG SEGMENT
RECORD DW 76,69,84,90,73,88,99,63,100,80
S6 DW 0
S7 DW 0
S8 DW 0
S9 DW 0
S10 DW 0
DSEG ENDS
;******************************************
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賦值
BEGIN: MOV CX, 10
CALL COUNT
┇ ;后續(xù)程序
RET
MAIN ENDP
;--------------------------------------------------------------------------
COUNT PROC NEAR ;成績統(tǒng)計(jì)子程序
MOV SI, 0
NEXT: MOV AX, RECORD[SI]
MOV BX, 10 ;以下5句是根據(jù)成績計(jì)算相對S6的地址變化量
DIV BL ;計(jì)算公式為:((成績)/10-6)*2送(BX)
MOV BL, AL ;此時(shí)(BH)保持為0不變
SUB BX, 6 ;應(yīng)為只統(tǒng)計(jì)60分以上成績
SAL BX, 1 ;(BX)*2
INC S6[BX] ;S6是S6,S7,S8,S9和S10單元的首地址
ADD SI, 2
LOOP NEXT
RET
COUNT ENDP ;COUNT子程序結(jié)束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START
6.8 編寫一個(gè)有主程序和子程序結(jié)構(gòu)的程序模塊。子程序的參數(shù)是一個(gè)N字節(jié)數(shù)組的首地址TABLE,數(shù)N及

字符CHAR。要求在N字節(jié)數(shù)組中查找字符CHAR,并記錄該字符出現(xiàn)的次數(shù)。主程序則要求從鍵盤接收一串字符
以建立字節(jié)數(shù)組TABLE,并逐個(gè)顯示從鍵盤輸入的每個(gè)字符CHAR以及它在TABLE數(shù)組中出現(xiàn)的次數(shù)。(為簡化起
見,假設(shè)出現(xiàn)次數(shù)≤15,可以用16進(jìn)制形式把它顯示出來。)
答:程序如下:
DSEG SEGMENT
TABLE DB 255 DUP (?)
N DW 255
CHAR DB ?
CHAR_N DB 0 ;用于記錄CHAR出現(xiàn)的次數(shù)
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS ;以上定義數(shù)據(jù)段
;******************************************
STACK SEGMENT
DW 100 DUP (?)
TOS LABEL WORD
STACK ENDS ;以上定義堆棧段
;******************************************
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, SS: STACK
START: MOV AX, STACK
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值

BEGIN: MOV BX, 0
MOV CX, 255 ;最多輸入255個(gè)字符
INPUT: MOV AH, 1 ;從鍵盤接收一個(gè)字符的DOS功能調(diào)用
INT 21H
CMP AL, 0DH ;輸入回車符結(jié)束輸入
JZ IN_N
MOV TABLE [BX], AL
INC BX
LOOP INPUT
IN_N: MOV N, BX ;TABLE數(shù)組中的字符個(gè)數(shù)送N
CALL DISP_CRLF
IN_CHAR: MOV AH, 1 ;從鍵盤接收一個(gè)字符并回顯的DOS功能調(diào)用
INT 21H
CMP AL, 0DH ;輸入回車符結(jié)束
JZ EXIT
MOV CHAR, AL ;輸入的字符存入CHAR單元
CALL SEARCH ;調(diào)搜索字符子程序
MOV DL, ‘:’ ;顯示“:”,在字符CHAR(輸入時(shí)回顯)的后面
MOV AH, 2 ;顯示一個(gè)字符
INT 21H
MOV DL, CHAR_N ;再顯示CHAR出現(xiàn)的次數(shù)(次數(shù)≤15)
AND DL, 0FH
ADD DL, 30H
CMP DL, 39H
JBE NEXT
ADD DL, 07H ;是A~F
NEXT: MOV AH, 2 ;顯示一個(gè)字符
INT 21H
CALL DISP_CRLF

JMP SHORT IN_CHAR
EXIT: RET
MAIN ENDP
;--------------------------------------------------------------------------
SEARCH PROC NEAR ;搜索字符子程序
MOV SI, 0
MOV CX, N
MOV CHAR_N, 0
MOV AL, CHAR
ROTATE: CMP AL, TABLE [SI]
JNZ ROTATE1
INC CHAR_N ;搜索到字符,則出現(xiàn)次數(shù)+1
ROTATE1: INC SI
LOOP ROTATE
RET
SEARCH ENDP ;SEARCH子程序結(jié)束
;--------------------------------------------------------------------------
DISP_CRLF PROC NEAR ;顯示回車換行符子程序
LEA DX, CRLF
MOV AH, 09H
INT 21H
RET
DISP_CRLF ENDP ;DISP_CRLF子程序結(jié)束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START
6.9 編寫一個(gè)子程序嵌套結(jié)構(gòu)的程序模塊,分別從鍵盤輸入姓名及8個(gè)字符的電話號(hào)碼,并以一定的格式
顯示出來。

主程序TELIST:
? 顯示提示符“INPUT NAME:”;
? 調(diào)用子程序INPUT_NAME輸入姓名;
? 顯示提示符“INPUT A TELEPHONE NUMBER:”;
? 調(diào)用子程序INPHONE輸入電話號(hào)碼;
? 調(diào)用子程序PRINTLINE顯示姓名及電話號(hào)碼。
子程序INPUT_NAME:
? 調(diào)用鍵盤輸入子程序GETCHAR,把輸入的姓名存放在INBUF緩沖區(qū)中;
? 把INBUF中的姓名移入輸出行OUTNAME。
子程序INPHONE:
? 調(diào)用鍵盤輸入子程序GETCHAR,把輸入的8位電話號(hào)碼存放在INBUF緩沖區(qū)中;
? 把INBUF中的號(hào)碼移入輸出行OUTPHONE。
子程序PRINTLINE:
顯示姓名及電話號(hào)碼,格式為:
NAME TEL.
X X X XXXXXXXX
答:程序如下:
DSEG SEGMENT
INBUF DB 12 DUP (‘ ’) ;輸入緩沖區(qū),初始值為空格
OUTNAME DB 16 DUP (‘ ’), ;姓名輸出行,初始值為空格
OUTPHONE DB 12 DUP (‘ ’), 0DH, 0AH, ‘$’ ;號(hào)碼輸出行,初始值為空格
MESG1 DB ‘INPUT NAME:’, ‘$’
MESG2 DB ‘INPUT A TELEPHONE NUMBER:’, ‘$’
MESG3 DB ‘NAME’, 12 DUP (‘ ’), ‘TEL.’, 0DH, 0AH, ‘$’
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS ;以上定義數(shù)據(jù)段
;******************************************
STACK SEGMENT
DW 100 DUP (?)

TOS LABEL WORD
STACK ENDS ;以上定義堆棧段
;******************************************
CSEG SEGMENT
TELIST PROC FAR ;主程序TELIST
ASSUME CS: CSEG, DS: DSEG, ES: DSEG, SS: STACK
START: MOV AX, STACK
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
MOV ES, AX ;給ES賦值
BEGIN: LEA DX, MESG1
MOV AH, 09H ;顯示字符串功能調(diào)用
INT 21H
CALL INPUT_NAME ;輸入姓名
LEA DX, MESG2
MOV AH, 09H ;顯示字符串功能調(diào)用
INT 21H
CALL INPHONE ;輸入電話號(hào)碼
CALL PRINTLINE ;顯示姓名及電話號(hào)碼
RET
TELIST ENDP
;--------------------------------------------------------------------------
INPUT_NAME PROC NEAR ;輸入姓名子程序

CALL GETCHAR ;調(diào)輸入字符子程序輸入姓名
LEA SI, INBUF ;把INBUF中的姓名移入輸出行OUTNAME
LEA DI, OUTNAME
MOV CX, 12
CLD
REP MOVSB
RET
INPUT_NAME ENDP ;INPUT_NAME子程序結(jié)束
;--------------------------------------------------------------------------
INPHONE PROC NEAR ;輸入電話號(hào)碼子程序
CALL GETCHAR ;調(diào)輸入字符子程序輸入電話號(hào)碼
LEA SI, INBUF ;把INBUF中的電話號(hào)碼移入輸出行OUTPHONE
LEA DI, OUTPHONE
MOV CX, 12
CLD
REP MOVSB
RET
INPHONE ENDP ;INPHONE子程序結(jié)束
;--------------------------------------------------------------------------
GETCHAR PROC NEAR ;鍵盤輸入子程序
MOV AL, 20H ;先將INBUF中填滿空格字符
MOV CX, 12
LEA DI, INBUF
CLD
REP STOSB
MOV CX, 12 ;向INBUF輸入字符
MOV DI, 0
INPUT: MOV AH, 1 ;從鍵盤接收一個(gè)字符并回顯的DOS功能調(diào)用
INT 21H

CMP AL, 0DH ;輸入回車符返回
JZ QUIT
MOV INBUF[DI], AL
INC DI
LOOP INPUT
QUIT: CALL DISP_CRLF
RET
GETCHAR ENDP ;GETCHAR子程序結(jié)束
;--------------------------------------------------------------------------
PRINTLINE PROC NEAR ;顯示姓名及電話號(hào)碼子程序
LEA DX, MESG3
MOV AH, 09H ;顯示字符串功能調(diào)用
INT 21H
LEA DX, OUTNAME ;顯示姓名及電話號(hào)碼
MOV AH, 09H ;顯示字符串功能調(diào)用
INT 21H
RET
PRINTLINE ENDP ;PRINTLINE子程序結(jié)束
;--------------------------------------------------------------------------
DISP_CRLF PROC NEAR ;顯示回車換行符子程序
LEA DX, CRLF
MOV AH, 09H
INT 21H
RET
DISP_CRLF ENDP ;DISP_CRLF子程序結(jié)束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START

6.10 編寫子程序嵌套結(jié)構(gòu)的程序,把整數(shù)分別用二進(jìn)制和八進(jìn)制形式顯示出來。
主程序BANDO:把整數(shù)字變量VAL1存入堆棧,并調(diào)用子程序PAIRS;
子程序PAIRS:從堆棧中取出VAL1;調(diào)用二進(jìn)制顯示程序OUTBIN顯示出與其等效的二進(jìn)制數(shù);輸出8個(gè)空格;調(diào)
用八進(jìn)制顯示程序OUTOCT顯示出與其等效的八進(jìn)制數(shù);調(diào)用輸出回車及換行符子程序。
答:程序如下:
DSEG SEGMENT
VAL1 DW ?
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS ;以上定義數(shù)據(jù)段
;******************************************
CSEG SEGMENT
BANDO PROC FAR ;主程序BANDO
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;設(shè)置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
PUSH VAL1
CALL PAIRS
RET
BANDO ENDP
;--------------------------------------------------------------------------
PAIRS PROC NEAR ;PAIRS子程序
PUSH BP
MOV BP, SP
PUSH BX
MOV BX, [BP+4] ;從堆棧中取出VAL1

CALL OUTBIN ;調(diào)用二進(jìn)制顯示子程序
MOV CX, 8 ;顯示8個(gè)空格符
SPACE: MOV DL, ‘ ’
MOV AH, 2
INT 21H
LOOP SPACE
CALL OUTOCT ;調(diào)用八進(jìn)制顯示子程序
CALL DISP_CRLF
POP BX
POP BP
RET 2
PAIRS ENDP ;PAIRS子程序結(jié)束
;--------------------------------------------------------------------------
OUTBIN PROC NEAR ;二進(jìn)制顯示子程序
PUSH BX
MOV CX, 16
ONEBIT: ROL BX, 1
MOV DX, BX
AND DX, 1
OR DL, 30H ;轉(zhuǎn)換為ASCII碼
MOV AH, 2
INT 21H
LOOP ONEBIT
POP BX
RET
OUTBIN ENDP ;OUTBIN子程序結(jié)束
;--------------------------------------------------------------------------
OUTOCT PROC NEAR ;八進(jìn)制顯示子程序
ROL BX, 1 ;16位二進(jìn)制數(shù)包含6位八進(jìn)制數(shù),最高位僅1位

MOV DX, BX
AND DX, 1
OR DL, 30H ;轉(zhuǎn)換為ASCII碼
MOV AH, 2
INT 21H
MOV CX, 5 ;余下還有5位八進(jìn)制數(shù)
NEXT: PUSH CX
MOV CL, 3 ;1位八進(jìn)制數(shù)包含3位二進(jìn)制數(shù)
ROL BX, CL
MOV DX, BX
AND DX, 07H
OR DL, 30H ;轉(zhuǎn)換為ASCII碼
MOV AH, 2
INT 21H
POP CX
LOOP NEXT
RET
OUTOCT ENDP ;OUTOCT子程序結(jié)束
;--------------------------------------------------------------------------
DISP_CRLF PROC NEAR ;顯示回車換行符子程序
LEA DX, CRLF
MOV AH, 09H
INT 21H
RET
DISP_CRLF ENDP ;DISP_CRLF子程序結(jié)束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START

6.11 假定一個(gè)名為MAINPRO的程序要調(diào)用子程序SUBPRO,試問:
(1) MAINPRO中的什么指令告訴匯編程序SUBPRO是在外部定義的?
(2) SUBPRO怎么知道MAINPRO要調(diào)用它?
答:(1) EXTRN SUBPRO:FAR
(2) PUBLIC SUBPRO
6.12 假定程序MAINPRO和SUBPRO不在同一模塊中,MAINPRO中定義字節(jié)變量QTY和字變量VALUE和
PRICE。SUBPRO程序要把VALUE除以QTY,并把商存在PRICE中。試問:
(1) MAINPRO怎么告訴匯編程序外部子程序要調(diào)用這三個(gè)變量?
(2) SUBPRO怎么告訴匯編程序這三個(gè)變量是在另一個(gè)匯編語言程序定義的?
答:(1) PUBLIC QTY, VALUE, PRICE
(2) EXTRN QTY:BYTE, VALUE:WORD, PRICE:WORD
6.13 假設(shè):
(1) 在模塊1中定義了雙字變量VAR1,首地址為VAR2的字節(jié)數(shù)據(jù)和NEAR標(biāo)號(hào)LAB1,它們將由模塊2和模塊3所使
用;
(2) 在模塊2中定義了字變量VAR3和FAR標(biāo)號(hào)LAB2,而模塊1中要用到VAR3,模塊3中要用到LAB2;
(3) 在模塊3中定義了FAR標(biāo)號(hào)LAB3,而模塊2中要用到它。
試對每個(gè)源模塊給出必要的EXTRN和PUBLIC說明。
答:模塊1:
EXTRN VAR3: WORD
PUBLIC VAR1,VAR2,LAB1
模塊2:
EXTRN VAR1: DWORD,VAR2: BYTE,LAB1: NEAR,LAB3: FAR
PUBLIC VAR3,LAB2
模塊3:
EXTRN VAR1: DWORD,VAR2: BYTE,LAB1: NEAR,LAB2: FAR
PUBLIC LAB3
6.14 主程序CALLMUL定義堆棧段、數(shù)據(jù)段和代碼段,并把段寄存器初始化,數(shù)據(jù)段中定義變量QTY和
PRICE;代碼段中將PRICE裝入AX,QTY裝入BX,然后調(diào)用子程序SUBMUL。程序SUBMUL沒有定義任何數(shù)據(jù),它只
簡單地把AX中的內(nèi)容(PRICE)乘以BX中的內(nèi)容(QTY),乘積放在DX: AX中。請編制這兩個(gè)要連接起來的程序。

答:程序如下:
TITLE CALLMUL ;主程序
EXTRN SUBMUL: FAR
;-----------------------------------------------------------------
STACK SEGMENT PARA STACK ‘STACK’
DW 64 DUP (?)
TOS LABEL WORD
STACK ENDS
;--------------------------------------------------------------
DATASG SEGMENT PARA ‘DATA’
QTY DW 0140H
PRICE DW 2500H
DATASG ENDS
;--------------------------------------------------------------
CODESG SEGMENT PARA ‘CODE’
CALLMUL PROC FAR
ASSUME CS: CODESG, DS: DATASG, SS: STACK
START: MOV AX, STACK
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS
SUB AX, AX
POP AX
MOV AX, DATASG
MOV DS, AX
MOV AX, PRICE
MOV BX, QTY
CALL SUBMUL

RET
CALLMUL ENDP
CODESG ENDS
;-----------------------------------------------------------------
END CALLMUL
;***************************************************************
TITLE SUBMUL ;子程序
PUBLIC SUBMUL
;-----------------------------------------------------------------
CODESG1 SEGMENT PARA ‘CODE’
ASSUME CS: CODESG1
SUBMUL PROC FAR
ASSUME CS: CODESG1
MUL BX
RET
SUBMUL ENDP
CODESG1 ENDS
;-----------------------------------------------------------------
END
6.15 試編寫一個(gè)執(zhí)行以下計(jì)算的子程序COMPUTE:
R ← X + Y - 3
其中X,Y及R均為字?jǐn)?shù)組。假設(shè)COMPUTE與其調(diào)用程序都在同一代碼段中,數(shù)據(jù)段D_SEG中包含X和Y數(shù)組,數(shù)據(jù)
段E_SEG中包含R數(shù)組,同時(shí)寫出主程序調(diào)用COMPUTE過程的部分。
如果主程序和COMPUTE在同一程序模塊中,但不在同一代碼段中,程序應(yīng)如何修改?
如果主程序和COMPUTE不在同一程序模塊中,程序應(yīng)如何修改?
答:(1) 主程序和COMPUTE在同一代碼段中的程序如下:
TITLE ADDITION ;主程序
;--------------------------------------------------------------
D_SEG SEGMENT PARA ‘DATA’

COUNT EQU 10H
X DW COUNT DUP (?)
Y DW COUNT DUP (?)
D_SEG ENDS
;--------------------------------------------------------------
E_SEG SEGMENT PARA ‘DATA’
R DW COUNT DUP (?)
E_SEG ENDS
;--------------------------------------------------------------
C_SEG SEGMENT PARA ‘CODE’
ADDITION PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS
SUB AX, AX
PUSH AX
MOV AX, D_SEG
MOV DS, AX
MOV AX, E_SEG
MOV ES, AX
CALL COMPUTE ;調(diào)用求和子程序
RET
ADDITION ENDP
;********************************************
COMPUTE PROC NEAR ;同一段的求和子程序
MOV CX, COUNT
MOV BX, 0
REPEAT: MOV AX, X[BX]
ADD AX, Y[BX]
SUB AX, 3

MOV ES: R[BX], AX
RET
COMPUTE ENDP
;-----------------------------------------------------------------
C_SEG ENDS
;*******************************************
END START
(2) 主程序和COMPUTE在同一程序模塊中,但不在同一代碼段中的程序如下:
TITLE ADDITION ;主程序
;--------------------------------------------------------------
D_SEG SEGMENT PARA ‘DATA’
COUNT EQU 10H
X DW COUNT DUP (?)
Y DW COUNT DUP (?)
D_SEG ENDS
;--------------------------------------------------------------
E_SEG SEGMENT PARA ‘DATA’
R DW COUNT DUP (?)
E_SEG ENDS
;--------------------------------------------------------------
C_SEG SEGMENT PARA ‘CODE’
ADDITION PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS
SUB AX, AX
POP AX
MOV AX, D_SEG
MOV DS, AX
MOV AX, E_SEG

MOV ES, AX
CALL FAR PTR COMPUTE ;調(diào)用求和子程序
RET
ADDITION ENDP
C_SEG ENDS
;********************************************
CODESG SEGMENT PARA ‘CODE’
ASSUME CS: CODESG
COMPUTE PROC FAR ;不同段的求和子程序
MOV CX, COUNT
MOV BX, 0
REPEAT: MOV AX, X[BX]
ADD AX, Y[BX]
SUB AX, 3
MOV ES: R[BX], AX
RET
COMPUTE ENDP
;-----------------------------------------------------------------
CODESG ENDS
;********************************************
END START
(3) 主程序和COMPUTE不在同一程序模塊中的程序如下:
TITLE ADDITION ;主程序
EXTRN COMPUTE: FAR
PUBLIC COUNT, X, Y, R
;--------------------------------------------------------------
D_SEG SEGMENT PARA ‘DATA’
COUNT DW 10H
X DW 10H DUP (?)

Y DW 10H DUP (?)
D_SEG ENDS
;--------------------------------------------------------------
E_SEG SEGMENT PARA ‘DATA’
R DW 10H DUP (?)
E_SEG ENDS
;--------------------------------------------------------------
C_SEG SEGMENT PARA ‘CODE’
ADDITION PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS
SUB AX, AX
POP AX
MOV AX, D_SEG
MOV DS, AX
MOV AX, E_SEG
MOV ES, AX
CALL FAR PTR COMPUTE ;調(diào)用求和子程序
RET
ADDITION ENDP
C_SEG ENDS
;-----------------------------------------------------------------
END START
;***************************************************************
TITLE COMPUTE ;求和子程序
EXTRN COUNT:WORD, X:WORD, Y:WORD, R:WORD
PUBLIC COMPUTE
;-----------------------------------------------------------------

CODESG SEGMENT PARA ‘CODE’
ASSUME CS: CODESG
COMPUTE PROC FAR ;不同模塊的求和子程序
MOV CX, COUNT
MOV BX, 0
REPEAT: MOV AX, X[BX]
ADD AX, Y[BX]
SUB AX, 3
MOV ES: R[BX], AX
RET
COMPUTE ENDP
;-----------------------------------------------------------------
CODESG ENDS
;********************************************
END
7.1 編寫一條宏指令CLRB,完成用空格符將一字符區(qū)中的字符取代的工作。字符區(qū)首地址及其長度為變
元。
答:宏定義如下:
CLRB MACRO N, CFIL
MOV CX, N
CLD
MOV AL, ‘ ’ ;;取空格符的ASCII碼
LEA DI, CFIL
REP STOSB
ENDM
7.2 某工廠計(jì)算周工資的方法是每小時(shí)的工資率RATE乘以工作時(shí)間HOUR,另外每工作滿10小時(shí)加獎(jiǎng)金3

元,工資總數(shù)存放在WAG中。請將周工資的計(jì)算編寫成一條宏指令WAGES,并展開宏調(diào)用:
WAGES R1, 42, SUM
答:宏定義如下:
WAGES MACRO RATE, HOUR, WAG
MOV AL, HOUR ;;計(jì)算周工資(WAG),公式為:HOUR* RATE
MOV BL, RATE
MUL BL
MOV WAG, AX
MOV AL, HOUR ;;計(jì)算獎(jiǎng)金存入(AX),公式為:HOUR/10的商*3
MOV AH, 0
MOV BL, 10
DIV BL
MOV BL, 3
MUL BL
ADD WAG, AX ;;計(jì)算周工資總數(shù)
ENDM
宏調(diào)用:
WAGES R1, 42, SUM
宏展開:
1 MOV AL, 42
1 MOV BL, R1
1 MUL BL
1 MOV SUM, AX
1 MOV AL, 42
1 MOV AH, 0
1 MOV BL, 10
1 DIV BL
1 MOV BL, 3
1 MUL BL

1 ADD SUM, AX
7.3 給定宏定義如下:(注意:此宏指令的功能是V3←|V1-V2|)
DIF MACRO X, Y
MOV AX, X
SUB AX, Y
ENDM
ABSDIF MACRO V1, V2, V3
LOCAL CONT
PUSH AX
DIF V1, V2
CMP AX, 0
JGE CONT
NEG AX
CONT: MOV V3, AX
POP AX
ENDM
試展開以下調(diào)用,并判定調(diào)用是否有效。
(1) ABSDIF P1, P2, DISTANCE
(2) ABSDIF [BX], [SI], X[DI], CX
(3) ABSDIF [BX][SI], X[BX][SI], 240H
(4) ABSDIF AX, AX, AX
答:(1) 宏調(diào)用 ABSDIF P1, P2, DISTANCE 的宏展開如下:此宏調(diào)用有效。
1 PUSH AX
1 DIF P1, P2
1 MOV AX, P1
1 SUB AX, P2
1 CMP AX, 0
1 JGE ??0000
1 NEG AX

1 ??0000: MOV DISTANCE, AX
1 POP AX
(2) 宏調(diào)用 ABSDIF [BX], [SI], X[DI], CX 的宏展開如下:此宏調(diào)用有效。
1 PUSH AX
1 DIF [BX], [SI]
1 MOV AX, [BX]
1 SUB AX, [SI]
1 CMP AX, 0
1 JGE ??0001
1 NEG AX
1 ??0001: MOV X[DI], AX
1 POP AX
(3) 宏調(diào)用 ABSDIF [BX][SI], X[BX][SI], 240H 的宏展開如下:此宏調(diào)用無效。
1 PUSH AX
1 DIF [BX][SI], X[BX][SI]
1 MOV AX, [BX][SI]
1 SUB AX, X[BX][SI]
1 CMP AX, 0
1 JGE ??0002
1 NEG AX
1 ??0002: MOV 240H, AX
1 POP AX
(4) 宏調(diào)用 ABSDIF AX, AX, AX 的宏展開如下:此宏調(diào)用有效但無多大意義。
1 PUSH AX
1 DIF AX, AX
1 MOV AX, AX
1 SUB AX, AX
1 CMP AX, 0
1 JGE ??0003

1 NEG AX
1 ??0003: MOV AX, AX
1 POP AX
7.4 試編制宏定義,要求把存儲(chǔ)器中的一個(gè)用EOT(ASCII碼04H)字符結(jié)尾的字符串傳送到另一個(gè)存儲(chǔ)區(qū)
去。
答:宏定義如下:
SEND MACRO SCHARS, DCHARS
LOCAL NEXT, EXIT
PUSH AX
PUSH SI
MOV SI, 0
NEXT: MOV AL, SCHARS[SI]
MOV DCHARS[SI], AL
CMP AL, 04H ;;是EOT字符嗎?
JZ EXIT
INC SI
JMP NEXT
EXIT: POP SI
POP AX
ENDM
7.5 宏指令BIN_SUB完成多個(gè)字節(jié)數(shù)據(jù)連減的功能:
RESULT←(A-B-C-D-.)
要相減的字節(jié)數(shù)據(jù)順序存放在首地址為OPERAND的數(shù)據(jù)區(qū)中,減數(shù)的個(gè)數(shù)存放在COUNT單元中,最后結(jié)果存入
RESULT單元。請編寫此宏指令。
答:宏定義如下:
BIN_SUB MACRO RESULT, A, OPERAND, COUNT
LOCAL NEXT_SUB
PUSH CX
PUSH BX

PUSH AX
MOV CX, COUNT
MOV AL, A
LEA BX, OPERAND
CLC
NEXT_SUB: SBB AL, [BX]
INC BX
LOOP NEXT_SUB
MOV RESULT, AL
POP AX
POP BX
POP CX
ENDM
7.6 請用宏指令定義一個(gè)可顯示字符串GOOD: ‘GOOD STUDENTS: CLASSX NAME’,其中X和NAME在宏調(diào)用
時(shí)給出。
答:宏定義如下:
DISP_GOOD MACRO X, NAME
GOOD DB ‘GOOD STUDENTS: CLASS&X &NAME’, 0DH, 0AH, ‘$’
ENDM
7.7 下面的宏指令CNT和INC1完成相繼字存儲(chǔ)。
CNT MACRO A, B
A&B DW ?
ENDM
INC1 MACRO A, B
CNT A, %B
B=B+1
ENDM
請展開下列宏調(diào)用:
C=0

INC1 DATA, C
INC1 DATA, C
答:宏展開如下:
C=0
INC1 DATA, C
1 DATA0 DW ?
INC1 DATA, C
1 DATA0 DW ? (注意:C為0沒有變)
7.8 定義宏指令并展開宏調(diào)用。宏指令JOE把一串信息‘MESSAGE NO. K’存入數(shù)據(jù)存儲(chǔ)區(qū)XK中。宏調(diào)用
為:
I=0
JOE TEXT, I

JOE TEXT, I

JOE TEXT, I

答:宏定義如下:
MARY MACRO X, K
X&K DB ‘MESSAGE NO. &K’
ENDM
JOE MACRO A, I
MARY A, %I
I=I+1
ENDM
宏調(diào)用和宏展開:
I=0
JOE TEXT, I
1 TEXT0 DB ‘MESSAGE NO. 0’


JOE TEXT, I
1 TEXT1 DB ‘MESSAGE NO. 1’

JOE TEXT, I
1 TEXT2 DB ‘MESSAGE NO. 2’
7.9 宏指令STORE定義如下:
STORE MACRO X, N
MOV X+I, I
I=I+1
IF I-N
STORE X, N
ENDIF
ENDM
試展開下列宏調(diào)用:
I=0
STORE TAB, 7
答:宏展開如下:
I=0
STORE TAB, 7
1 MOV TAB+0, 0
1 MOV TAB+1, 1
1 MOV TAB+2, 2
1 MOV TAB+3, 3
1 MOV TAB+4, 4
1 MOV TAB+5, 5
1 MOV TAB+6, 6
7.10 試編寫非遞歸的宏指令,使其完成的工作與7.9題的STORE相同。
答:宏定義如下:

STORE MACRO K
MOV TAB+K, K
ENDM
宏調(diào)用:
I=0
REPT 7
STORE %I
I=I+1
ENDM
7.11 試編寫一段程序完成以下功能,如給定名為X的字符串長度大于5時(shí),下列指令將匯編10次。
ADD AX, AX
答:程序段如下:
X DB ‘ABCDEFG’
IF ($-X) GT 5
REPT 10
ADD AX, AX
ENDM
ENDIF
7.12 定義宏指令FINSUM:比較兩個(gè)數(shù)X和Y(X、Y為數(shù),而不是地址),若X>Y則執(zhí)行SUM←X+2*Y;否則執(zhí)行
SUM←2*X+Y。
答:宏定義如下:
CALCULATE MACRO A, B, RESULT ;;計(jì)算RESULT←2*A+B
MOV AX, A
SHL AX, 1
ADD AX, B
MOV RESULT, AX
ENDM
FINSUM MACRO X, Y, SUM
IF X GT Y

CALCULATE Y, X, SUM
ELSE
CALCULATE X, Y, SUM
ENDIF
ENDM
7.13 試編寫一段程序完成以下功能:如變元X=‘VT55’,則匯編MOV TERMINAL, 0;否則匯編
MOV TERMINAL, 1。
答:宏定義如下:
BRANCH MACRO X
IFIDN <X>, <VT55>
MOV TERMINAL, 0
ELSE
MOV TERMINAL, 1
ENDIF
ENDM
7.14 對于DOS功能調(diào)用,所有的功能調(diào)用都需要在AH寄存器中存放功能碼,而其中有一些功能需要在DX中
放一個(gè)值。試定義宏指令DOS21,要求只有在程序中定義了緩沖區(qū)時(shí),匯編為:
MOV AH, DOSFUNC
MOV DX, OFFSET BUFF
INT 21H
否則,無MOV DX, OFFSET BUFF指令。并展開以下宏調(diào)用:
DOS21 01
DOS21 0AH, IPFIELD
答:宏定義如下:
DOS21 MACRO DOSFUNC, BUFF
MOV AH, DOSFUNC
IFDEF BUFF
MOV DX, OFFSET BUFF
ENDIF

INT 21H
ENDM
宏展開:
DOS21 01
1 MOV AH, 01
1 INT 21H
DOS21 0AH, IPFIELD
1 MOV AH, 0AH
1 MOV DX, OFFSET IPFIELD
1 INT 21H
7.15 編寫一段程序,使匯編程序根據(jù)SIGN中的內(nèi)容分別產(chǎn)生不同的指令。如果(SIGN)=0,則用字節(jié)變量
DIVD中的無符號(hào)數(shù)除以字節(jié)變量SCALE;如果(SIGN)=1,則用字節(jié)變量DIVD中的帶符號(hào)數(shù)除以字節(jié)變量SCALE,
結(jié)果都存放在字節(jié)變量RESULT中。
答:程序段如下:
MOV AL, DIVD
IF SIGN
MOV AH, 0
DIV SCALE
ELSE
CBW
IDIV SCALE
ENDIF
MOV RESULT, AL
7.16 試編寫宏定義SUMMING,要求求出雙字?jǐn)?shù)組中所有元素之和,并把結(jié)果保存下來。該宏定義的啞元應(yīng)
為數(shù)組首址ARRAY,數(shù)組長度COUNT和結(jié)果存放單元RESULT。
答:宏定義如下:
SUMMING MACRO ARRAY,COUNT,RESULT
LOCAL ADDITION
MOV ESI, 0

MOV ECX, COUNT
ADDITION: MOV EAX, ARRAY[ESI*4] ;;雙字為4字節(jié)
ADD RESULT, EAX
ADC RESULT+4, 0 ;;將進(jìn)位加到結(jié)果的高位雙字中
INC ESI
LOOP ADDITION
ENDM
7.17 為下列數(shù)據(jù)段中的數(shù)組編制一程序,調(diào)用題7.16的宏定義SUMMING,求出該數(shù)組中各元素之和。
DATA DD 101246,274365,843250,475536
SUM DQ ?
答:程序如下:
SUMMING MACRO ARRAY,COUNT,RESULT
LOCAL ADDITION
MOV ESI, 0
MOV ECX, COUNT
ADDITION: MOV EAX, ARRAY[ESI*4] ;;雙字為4字節(jié)
ADD RESULT, EAX
ADC RESULT+4, 0 ;;將進(jìn)位加到結(jié)果的高位雙字中
INC ESI
LOOP ADDITION
ENDM
.MODEL SMALL
.386
.DATA
DATA DD 101246,274365,843250,475536
SUM DQ ?
.CODE
START: MOV AX, @DATA

MOV DS, AX
SUMMING DATA, 4, SUM
MOV AX, 4C00H
INT 21H
END START
7.18 如把題7.16中的宏定義存放在一個(gè)宏庫中,則題7.17的程序應(yīng)如何修改?
答:程序修改如下:
INCLUDE MACRO.MAC ;假設(shè)存放的宏庫名為MACRO.MAC
.MODEL SMALL
.386
.DATA
DATA DD 101246,274365,843250,475536
SUM DQ ?
.CODE
START: MOV AX, @DATA
MOV DS, AX
SUMMING DATA, 4, SUM
MOV AX, 4C00H
INT 21H
END START
第 八 章. 習(xí) 題
8.1 寫出分配給下列中斷類型號(hào)在中斷向量表中的物理地址。
(1) INT 12H (2) INT 8
答:(1) 中斷類型號(hào)12H在中斷向量表中的物理地址為00048H、00049H、0004AH、0004BH;
(2) 中斷類型號(hào)8在中斷向量表中的物理地址為00020H、00021H、00022H、00023H。
8.2 用CALL指令來模擬實(shí)現(xiàn)INT 21H顯示字符T的功能。
答:MOV AH, 2

MOV DL, ‘T’
PUSH DS
PUSHF ;因中斷服務(wù)程序的返回指令是IRET,而不是
RET
MOV BX, 0
MOV DS, BX
CALL DWORD PTR[21H*4] ;用CALL指令調(diào)用21H的中斷服務(wù)程序
POP DS
8.3 寫出指令將一個(gè)字節(jié)數(shù)據(jù)輸出到端口25H。
答:指令為:OUT 25H, AL
8.4 寫出指令將一個(gè)字?jǐn)?shù)據(jù)從端口1000H輸入。
答:指令為: MOV DX, 1000H
IN AX, DX
8.5 假定串行通訊口的輸入數(shù)據(jù)寄存器的端口地址為50H,狀態(tài)寄存器的端口地址為51H,狀態(tài)寄存器各位
為1時(shí)含義如右圖所示,請編寫一程序:輸入一串字符并存入緩沖區(qū)BUFF,同時(shí)檢驗(yàn)輸入的正確性,如有錯(cuò)則
轉(zhuǎn)出錯(cuò)處理程序ERROR_OUT。
答:程序段如下:
MOV DI, 0
MOV CX, 80 ;最多輸入80個(gè)字符
BEGIN: IN AL, 51H ;查詢輸入是否準(zhǔn)備好?
TEST AL, 02H
JZ BEGIN
IN AL, 50H ;輸入數(shù)據(jù)并存入緩沖區(qū)BUFF
MOV BUFF[DI], AL
INC DI
IN AL, 51H ;判斷是否有錯(cuò)?
TEST AL, 00111000B
JNZ ERROR_OUT
LOOP BEGIN


8.6 試編寫程序,它輪流測試兩個(gè)設(shè)備的狀態(tài)寄存器,只要一個(gè)狀態(tài)寄存器的第0位為1,則就與其相應(yīng)的
設(shè)備輸入一個(gè)字符;如果其中任一狀態(tài)寄存器的第3位為1,則整個(gè)輸入過程結(jié)束。兩個(gè)狀態(tài)寄存器的端口地址
分別是0024H和0036H,與其相應(yīng)的數(shù)據(jù)輸入寄存器的端口地址則為0026H和0038H,輸入字符分別存入首地址為
BUFF1和BUFF2的存儲(chǔ)區(qū)中。
答:程序段如下:
MOV DI, 0
MOV SI, 0
BEGIN: IN AL, 24H
TEST AL, 08H ;查詢第一個(gè)設(shè)備的輸入是否結(jié)束?
JNZ EXIT
TEST AL, 01H ;查詢第一個(gè)設(shè)備的輸入是否準(zhǔn)備好?
JZ BEGIN1
IN AL, 26H ;輸入數(shù)據(jù)并存入緩沖區(qū)BUFF1
MOV BUFF1[DI], AL
INC DI
BEGIN1: IN AL, 36H
TEST AL, 08H ;查詢第二個(gè)設(shè)備的輸入是否結(jié)束
JNZ EXIT
TEST AL, 01H ;查詢第二個(gè)設(shè)備的輸入是否準(zhǔn)備好?
JZ BEGIN
IN AL, 38H ;輸入數(shù)據(jù)并存入緩沖區(qū)BUFF2
MOV BUFF2[SI], AL
INC SI
JMP BEGIN
EXIT: ┇
8.7 假定外部設(shè)備有一臺(tái)硬幣兌換器,其狀態(tài)寄存器的端口地址為0006H,數(shù)據(jù)輸入寄存器的端口地址為
0005H,數(shù)據(jù)輸出寄存器的端口地址為0007H。試用查詢方式編制一程序,該程序作空閑循環(huán)等待紙幣輸入,當(dāng)
狀態(tài)寄存器第2位為1時(shí),表示有紙幣輸入,此時(shí)可從數(shù)據(jù)輸入寄存器輸入的代碼中測出紙幣的品種,一角紙幣

的代碼為01,二角紙幣為02,五角紙幣則為03。然后程序在等待狀態(tài)寄存器的第3位變?yōu)?后,把應(yīng)兌換的五分
硬幣數(shù)(用16進(jìn)制表示)從數(shù)據(jù)輸出寄存器輸出。
答:程序段如下:
BEGIN: IN AL, 06H ;查詢是否有紙幣輸入?
TEST AL, 04H
JZ BEGIN
IN AL, 05H ;測試紙幣的品種
CMP AL, 01H ;是一角紙幣嗎?
JNE NEXT1
MOV AH, 02 ;是一角紙幣,輸出2個(gè)5分硬幣
JMP NEXT
NEXT1: CMP AL, 02H ;是二角紙幣嗎?
JNE NEXT2
MOV AH, 04 ;是二角紙幣,輸出4個(gè)5分硬幣
JMP NEXT
NEXT2: CMP AL, 03H ;是五角紙幣嗎?
JNE BEGIN
MOV AH, 10 ;是五角紙幣,輸出10個(gè)5分硬幣
NEXT: IN AL, 06H ;查詢是否允許輸出5分硬幣?
TEST AL, 08H
JZ NEXT
MOV AL, AH ;輸出5分硬幣
OUT 07H, AL
JMP BEGIN
8.8 給定(SP)=0100H,(SS)=0300H,(FLAGS)=0240H,以下存儲(chǔ)單元的內(nèi)容為(00020)=0040H,
(00022)=0100H,在段地址為0900及偏移地址為00A0H的單元中有一條中斷指令I(lǐng)NT 8,試問執(zhí)行INT 8指令
后,SP,SS,IP,FLAGS的內(nèi)容是什么?棧頂?shù)娜齻€(gè)字是什么?
答:執(zhí)行INT 8指令后,(SP)=00FAH,(SS)=0300H,(CS)=0100H,(IP)=0040H,(FLAGS)=0040H
棧頂?shù)娜齻€(gè)字是:原(IP)=00A2H,原(CS)=0900H,原(FLAGS)=0240H

8.9 類型14H的中斷向量在存儲(chǔ)器的哪些單元里?
答:在0000:0050H,0000:0051H,0000:0052H,0000:0053H四個(gè)字節(jié)中。
8.10 假定中斷類型9H的中斷處理程序的首地址為INT_ROUT,試寫出主程序中為建立這一中斷向量而編制的
程序段。
答:程序段如下:

MOV AL, 1CH ;取原中斷向量,并保護(hù)起來
MOV AH, 35H
INT 21H
PUSH ES
PUSH BX
PUSH DS
MOV AX, SEG INT_ROUT
MOV DS, AX
MOV DX, OFFSET INT_ROUT
MOV AL, 09H
MOV AH, 25H ;設(shè)置中斷向量功能調(diào)用
INT 21H
POP DS

POP DX ;還原原中斷向量
POP DS
MOV AL, 1CH
MOV AH, 25H
INT 21H
8.11 編寫指令序列,使類型1CH的中斷向量指向中斷處理程序SHOW_CLOCK。
答:程序段如下:

MOV AL, 1CH
MOV AH, 35H ;取中斷向量功能調(diào)用,取原中斷向量
INT 21H
PUSH ES
PUSH BX
PUSH DS
MOV AX, SEG SHOW_CLOCK
MOV DS, AX
MOV DX, OFFSET SHOW_CLOCK
MOV AL, 1CH
MOV AH, 25H ;設(shè)置中斷向量功能調(diào)用
INT 21H
POP DS

POP DX
POP DS
MOV AL, 1CH
MOV AH, 25H ;設(shè)置中斷向量功能調(diào)用,還原原中斷向量
INT 21H

8.12 如設(shè)備D1,D2,D3,D4,D5是按優(yōu)先級(jí)次序排列的,設(shè)備D1的優(yōu)先級(jí)最高。而中斷請求的次序如下所
示,試給出各設(shè)備的中斷處理程序的運(yùn)行次序。假設(shè)所有的中斷處理程序開始后就有STI指令。
(1) 設(shè)備D3和D4同時(shí)發(fā)出中斷請求。
(2) 在設(shè)備D3的中斷處理程序完成之前,設(shè)備D2發(fā)出中斷請求。
(3) 在設(shè)備D4的中斷處理程序未發(fā)出中斷結(jié)束命令(EOI)之前,設(shè)備D5發(fā)出中斷請求。
(4) 以上所有中斷處理程序完成并返回主程序,設(shè)備D1,D3,D5同時(shí)發(fā)出中斷請求。
答:各設(shè)備的中斷處理程序的運(yùn)行次序是:INT_D3,INT_D2嵌套INT_D3,INT_D4,INT_D5;
INT_D1,INT_D3,INT_D5。
8.13 在8.12題中假設(shè)所有的中斷處理程序中都沒有STI指令,而它們的IRET指令都可以由于FLAGS出棧而使

IF置1,則各設(shè)備的中斷處理程序的運(yùn)行次序應(yīng)是怎樣的?
答:各設(shè)備的中斷處理程序的運(yùn)行次序是:INT_D3,INT_D2,INT_D4,INT_D5;
INT_D1,INT_D3,INT_D5。
8.14 試編制一程序,要求測出任一程序的運(yùn)行時(shí)間,并把結(jié)果打印出來。
答:程序段如下:
TITLE TEST_TIME.EXE ;測試程序運(yùn)行時(shí)間程序
;******************************************
DSEG SEGMENT ;定義數(shù)據(jù)段
COUNT DW 0 ;記錄系統(tǒng)時(shí)鐘(18.2次中斷/秒)的中斷次數(shù)
SEC DW 0 ;存放秒鐘數(shù)
MIN DW 0 ;存放分鐘數(shù)
HOURS DW 0 ;存放小時(shí)數(shù)
PRINTTIME DB 0DH, 0AH, ‘The time of exection program is:’
CHAR_NO EQU $- PRINTTIME
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 AL, 1CH ;取原來的1CH中斷向量
MOV AH, 35H
INT 21H
PUSH ES ;保存原來的1CH中斷向量

PUSH BX
PUSH DS ;設(shè)置新的1CH中斷向量
MOV AX, SEG CLINT
MOV DS, AX
MOV DX, OFFSET CLINT
MOV AL, 1CH
MOV AH, 25H
INT 21H
POP DS
IN AL, 21H ;清除時(shí)間中斷屏蔽位并開中斷
AND AL, 0FEH
OUT 21H, AL
STI
┇ ;要求測試時(shí)間的程序段
POP DX ;恢復(fù)原來的1CH中斷向量
POP DS
MOV AL, 1CH
MOV AH, 25H
INT 21H
CALL PRINT ;打印輸出測試時(shí)間
RET ;返回DOS
MAIN ENDP
;----------------------------------------------------------------------------------
CLINT PROC NEAR ;中斷服務(wù)子程序

PUSH DS
PUSH BX
MOV BX, SEG COUNT
MOV DS, BX
LEA BX, COUNT
INC WORD PTR [BX] ;記錄系統(tǒng)時(shí)鐘的中斷次數(shù)單元+1
CMP WORD PTR [BX],18 ;有1秒鐘嗎?
JNE TIMEOK
CALL INCTEST ;有1秒鐘,轉(zhuǎn)去修改時(shí)間
ADJ: CMP HOURS, 12 ;有12小時(shí)嗎?
JLE TIMEOK
SUB HOURS, 12 ;有12小時(shí),將小時(shí)數(shù)減去12
TIMEOK: MOV AL, 20H ;發(fā)中斷結(jié)束命令
OUT 20H, AL
POP BX
POP DS
IRET
CLINT ENDP ;CLINT中斷服務(wù)子程序結(jié)束
;----------------------------------------------------------------------------------
INCTEST PROC NEAR ;修改時(shí)間子程序
MOV WORD PTR [BX], 0 ;中斷次數(shù)單元或秒單元或分單元清0
ADD BX, 2
INC WORD PTR [BX] ;秒單元或分單元或時(shí)單元+1
CMP WORD PTR [BX],60 ;有60秒或60分嗎?
JLE RETURN
CALL INCTEST ;先修改秒單元,再修改分單元,再修改時(shí)單元
RETURN: RET
INCTEST ENDP ;INCTEST子程序結(jié)束
;----------------------------------------------------------------------------------

PRINT PROC NEAR ;打印輸出子程序
LEA BX, PRINTTIME ;打印輸出PRINTTIME信息
MOV CX, CHAR_NO
ROTATE: MOV DL, [BX]
MOV AH, 05H
INT 21H
INC BX
LOOP ROTATE
MOV BX, HOURS ;打印時(shí)間的小時(shí)數(shù)
CALL BINIDEC ;調(diào)二進(jìn)制轉(zhuǎn)換為10進(jìn)制并打印輸出子程序
MOV DL, ‘:’ ;打印輸出冒號(hào) ‘:’
MOV AH, 05H
INT 21H
MOV BX, MIN ;打印時(shí)間的分鐘數(shù)
CALL BINIDEC
MOV DL, ‘:’
MOV AH, 05H
INT 21H
MOV BX, SEC ;打印時(shí)間的秒鐘數(shù)
CALL BINIDEC
RET
PRINT ENDP ;PRINT子程序結(jié)束
;----------------------------------------------------------------------------------
BINIDEC PROC NEAR ;二進(jìn)制轉(zhuǎn)換為10進(jìn)制子程序
MOV CX, 10000D
CALL DEC _DIV ;調(diào)除法并打印輸出子程序
MOV CX, 1000D
CALL DEC _DIV
MOV CX, 100D

CALL DEC _DIV
MOV CX, 10D
CALL DEC _DIV
MOV CX, 1D
CALL DEC _DIV
RET
BINIDEC ENDP ;BINIDEC子程序結(jié)束
;----------------------------------------------------------------------------------
DEC_DIV PROC NEAR ;除法并打印輸出子程序
MOV AX, BX
MOV DX, 0
DIV CX
MOV BX, DX ;余數(shù)保存在(BX)中作下一次的除法
MOV DL, AL ;商(在00H~09H范圍內(nèi))送(DL)
ADD DL, 30H ;轉(zhuǎn)換為0~9的ASCII碼
MOV AH, 05H ;打印輸出
INT 21H
RET
DEC_DIV ENDP ;DEC_DIV子程序結(jié)束
;----------------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START ;匯編語言源程序結(jié)束
第 九 章. 習(xí) 題
9.1 INT 21H的鍵盤輸入功能1和功能8有什么區(qū)別?
答:鍵盤輸入功能1:輸入字符并回顯(回送顯示器顯示) (檢測Ctrl_Break);
鍵盤輸入功能8:輸入字符但不回顯(也檢測Ctrl_Break)。

9.2 編寫一個(gè)程序,接受從鍵盤輸入的10個(gè)十進(jìn)制數(shù)字,輸入回車符則停止輸入,然后將這些數(shù)字加密后
(用XLAT指令變換)存入內(nèi)存緩沖區(qū)BUFFER。加密表為:
輸入數(shù)字:0,1,2,3,4,5,6,7,8,9
密碼數(shù)字:7,5,9,1,3,6,8,0,2,4
答:程序段如下:
SCODE DB 7, 5, 9, 1, 3, 6, 8, 0, 2, 4 ;密碼數(shù)字
BUFFER DB 10 DUP (?)
; ┇
MOV SI, 0
MOV CX, 10
LEA BX, SCODE
INPUT: MOV AH, 1 ;從鍵盤輸入一個(gè)字符的功能調(diào)用
INT 21H
CMP AL, 0DH ;輸入回車符則停止輸入
JZ EXIT
SUB AL, 30H ;是0~9嗎?
JB INPUT
CMP AL, 09H
JA INPUT
XLAT ;換為密碼
MOV BUFFER[SI], AL ;保存密碼
INC SI
LOOP INPUT
EXIT: RET
9.3 對應(yīng)黑白顯示器屏幕上40列最下邊一個(gè)象素的存儲(chǔ)單元地址是什么?
答:對應(yīng)黑白顯示器屏幕上40列最下邊一個(gè)象素的存儲(chǔ)單元地址是:B000:0F78H
9.4 寫出把光標(biāo)置在第12行,第8列的指令。
答:指令如下:
MOV DH, 0BH ;0BH=12-1

MOV DL, 07H ;07H=8-1
MOV BH, 0
MOV AH, 2 ;置光標(biāo)功能調(diào)用
INT 10H
9.5 編寫指令把12行0列到22行79列的屏幕清除。
答:指令如下:
MOV AL, 0 ;清除屏幕
MOV BH, 07
MOV CH, 12 ;左上角行號(hào)
MOV CL, 0 ;左上角列號(hào)
MOV DH, 22 ;右下角行號(hào)
MOV DL, 79 ;右下角列號(hào)
MOV AH, 6 ;屏幕上滾功能調(diào)用
INT 10H
9.6 編寫指令使其完成下列要求。
(1) 讀當(dāng)前光標(biāo)位置
(2) 把光標(biāo)移至屏底一行的開始
(3) 在屏幕的左上角以正常屬性顯示一個(gè)字母M
答:指令序列如下:
(1) MOV AH, 3 ;讀當(dāng)前光標(biāo)位置,返回DH/DL=光標(biāo)所在的
行/列
MOV BH, 0
INT 10H
(2) MOV DH, 24 ;設(shè)置光標(biāo)位置
MOV DL, 0
MOV BH, 0
MOV AH, 2
INT 10H
(3) MOV AH, 2 ;設(shè)置光標(biāo)位置

MOV DX, 0
MOV BH, 0
INT 10H
MOV AH, 9 ;在當(dāng)前光標(biāo)位置顯示一個(gè)字符
MOV AL, ‘M’
MOV BH, 0
MOV BL, 7
MOV CX, 1
INT 10H
9.7 寫一段程序,顯示如下格式的信息:
Try again, you have n starfighters left.
其中n為CX寄存器中的1~9之間的二進(jìn)制數(shù)。
答:程序段如下:
MESSAGE DB ‘Try again, you have ’
CONT DB n
DB ‘ starfighters left.$’
; ┇
ADD CL, 30H
MOV CONT, CL ;保存ASCII碼
LEA DX, MESSAGE
MOV AH, 9 ;顯示一個(gè)字符串的DOS調(diào)用
INT 21H
9.8 從鍵盤上輸入一行字符,如果這行字符比前一次輸入的一行字符長度長,則保存該行字符,然后繼續(xù)
輸入另一行字符;如果它比前一次輸入的行短,則不保存這行字符。按下‘$’輸入結(jié)束,最后將最長的一行
字符顯示出來。
答:程序段如下:
STRING DB 0 ;存放字符的個(gè)數(shù)
DB 80 DUP (?), 0DH,0AH,‘$’ ;存放前一次輸入的字符串,兼作顯示緩沖區(qū)
BUFFER DB 80 ;輸入字符串的緩沖區(qū),最多輸入80個(gè)字符

DB ?
DB 80 DUP (20H)
; ┇
INPUT: LEA DX, BUFFER ;輸入字符串
MOV AH, 0AH ;輸入字符串的DOS調(diào)用
INT 21H
LEA SI, BUFFER+1 ;比較字符串長度
LES DI, STRING
MOV AL, [SI]
CMP AL, [DI]
JBE NEXT
MOV CX, 80+1 ;大于前次輸入的字符串,更換前次的字符串
CLD
REP MOVSB
NEXT: MOV AH, 1 ;輸入結(jié)束符嗎?
INT 21H
CMP AL, ‘$’ ;是結(jié)束符嗎?
JNE INPUT ;不是則繼續(xù)輸入
LEA DX, STRING+1 ;顯示字符串
MOV AH, 9 ;顯示一個(gè)字符串的DOS調(diào)用
INT 21H
9.9 編寫程序,讓屏幕上顯示出信息“What is the date (mm/dd/yy)?”并響鈴(響鈴符為07),然后從鍵
盤接收數(shù)據(jù),并按要求的格式保存在date存儲(chǔ)區(qū)中。
答:程序段如下:
MESSAGE DB ‘What is the date (mm/dd/yy)?’, 07H, ‘$’
DATAFLD DB 10, 0
DATE DB 10 DUP (‘ ’)
; ┇
MOV AH, 9 ;顯示一個(gè)字符串的DOS調(diào)用

LEA DX, MESSAGE ;顯示字符串
INT 21H
MOV AH, 0AH ;輸入字符串的DOS調(diào)用
LEA DX, DATAFLD
INT 21H
9.10 用戶從鍵盤輸入一文件并在屏幕上回顯出來。每輸入一行(≤80字符),用戶檢查一遍, 如果用戶認(rèn)為
無需修改,則鍵入回車鍵,此時(shí)這行字符存入BUFFER緩沖區(qū)保存,同時(shí)打印機(jī)把這行字符打印出來并回車換
行。
答:程序段如下:
INAREA DB 80 ;輸入字符串的緩沖區(qū),最多輸入80個(gè)字符
ACTLEN DB ?
BUFFER DB 80 DUP (?)
; ┇
INPUT: LEA DX, INAREA ;輸入字符串
MOV AH, 0AH ;輸入字符串的DOS調(diào)用
INT 21H
CMP ACTLEN, 0
JE EXIT
MOV BX, 0
MOV CH, 0
MOV CL, ACTLEN
PRINT: MOV AH, 5 ;打印輸出
MOV DL, BUFFER[BX]
INT 21H
INC BX
LOOP PRINT
MOV AH, 5 ;打印輸出回車換行
MOV DL, 0AH
INT 21H

MOV DL, 0DH
INT 21H
JMP INPUT
EXIT: RET
9.11 使用MODE命令,設(shè)置COM2端口的通信數(shù)據(jù)格式為:每字8位,無校驗(yàn),1位終止位,波特率為
1200b/s。
答:命令格式如下:
MODE COM2:12,N,8,1
第 十 章. 習(xí) 題
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 對于EGA和VGA顯示適配器,使用顯示方式13H時(shí)(只有VGA有),顯示數(shù)據(jù)存在哪里?
答:顯示數(shù)據(jù)存在顯示存儲(chǔ)器里。
10.5 對于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í),相對應(yīng)的像素值
直接由鎖存器寫入顯存;位屏蔽寄存器的某位為1時(shí),所對應(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)容都需要讀取,則必須對同一地址執(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)。請編寫一程序,用隨機(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ī)。請指出該程序的延遲時(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 ;返回
第 十一 章. 習(xí) 題
11.1 寫出文件代號(hào)式磁盤存取操作的錯(cuò)誤代碼:
(1) 非法文件代號(hào) (2) 路徑未發(fā)現(xiàn) (3) 寫保護(hù)磁盤
答:錯(cuò)誤代碼為:
(1) 06 (2) 03 (4) 19
11.2 使用3CH功能建立一文件,而該文件已經(jīng)存在,這時(shí)會(huì)發(fā)生什么情況?
答:此操作將文件長度置為0,寫新文件,原文件內(nèi)容被清除。

11.3 從緩沖區(qū)寫信息到一個(gè)文件,如果沒有關(guān)閉文件,可能會(huì)出現(xiàn)什么問題?
答:文件結(jié)尾的部分信息就沒有被寫入磁盤,從而造成寫入的文件不完整。
11.4 下面的ASCIZ串有什么錯(cuò)誤?
PATH_NAME DB ‘C:\PROGRAMS\TEST.DAT’
答:此ASCIZ串的最后少了一個(gè)全0字節(jié),應(yīng)改為:
PATH_NAME DB ‘C:\PROGRAMS\TEST.DAT’, 0
11.5 下面為保存文件代號(hào)定義的變量有什么錯(cuò)誤?
FILE_HNDL DB ?
答:文件代號(hào)是字類型,因此應(yīng)改為:
FILE_HNDL DW ?
11.6 在ASCPATH字節(jié)變量中為驅(qū)動(dòng)器D的文件PATIENT.LST,請定義ASCIZ串。
答:ASCPATH DB ‘D:\PATIENT.LST’, 0
11.7 對11.6題中的文件,它的每個(gè)記錄包含:
病例號(hào)(patient number): 5字符, 姓名(name): 20字符,
城市(city): 20字符, 街道(street address): 20字符,
出生年月(mmddyy): 6字符, 性別(M/Fcode): 1字符,
病房號(hào)(room number): 2字符, 床號(hào)(bed number): 2字符,
(1) 定義病人記錄的各個(gè)域 (2) 定義保存文件代號(hào)的變量FHANDLE
(3) 建文件 (4) 把PATNTOUT中的記錄寫入
(5) 關(guān)文件 (6) 以上文件操作包括測試錯(cuò)誤
答:(1) PATNTOUT EQU THIS BYTE
patient DB 5 DUP (?)
name DB 20 DUP (?)
city DB 20 DUP (?)
street DB 20 DUP (?)
mmddyy DB 6 DUP (?)
M_Fcode DB ?
room DB 2 DUP (?)
bed DB 2 DUP (?), 0AH, 0DH

COUNT = $-PATNTOUT ;記錄長度
(2) FHANDLE DW ?
(3) MOV AH, 3CH ;建文件功能
MOV CX, 00 ;普通文件屬性
LEA DX, ASCPATH
INT 21H
JC ERROR
MOV FHANDLE, AX ;保存文件代號(hào)
(4) MOV AH, 40H ;寫文件功能
MOV BX, FHANDLE ;取文件代號(hào)
MOV CX, COUNT ;記錄長度
LEA DX, PATNTOUT ;記錄的首地址
INT 21H
JC ERROR
CMP AX, COUNT ;所有的字節(jié)都寫入了嗎?
JNE ERROR1
(5) MOV AH, 3EH ;關(guān)閉文件功能
MOV BX, FHANDLE ;取文件代號(hào)
INT 21H
JC ERROR
(6) 文件操作的測試錯(cuò)誤已包括在(3)、(4)、(5)的操作中。
11.8 對11.7題的文件,用文件代號(hào)式編寫一個(gè)完整的讀文件程序,讀出的每個(gè)記錄存入PATNTIN并在屏幕
上顯示。
答:程序如下:
TITLE READDISP.EXE ;利用文件代號(hào)式順序讀文件程序
;Read disk records created by hancreat
;-------------------------------------------------------------
.model small
.stack 100h

.data
endcde db 0 ;結(jié)束處理指示
fhandle dw ?
patntin db 80 DUP(‘ ’) ;DTA
ascpath db ‘d:\patient.lst’, 0
openmsg db ‘***open error***’, 0dh, 0ah
readmsg db ‘***read error***’, 0dh, 0ah
row db 0
;-------------------------------------------------------------
.code
begin proc far
mov ax, @data
mov ds, ax
mov es, ax
mov ax, 0600h
call screen ;清屏
call curs ;設(shè)置光標(biāo)
call openh ;打開文件,設(shè)置DTA
cmp endcde, 0 ;打開錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
contin: call readh ;讀磁盤記錄
cmp endcde, 0 ;讀錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
call disph ;沒錯(cuò),顯示記錄
jmp contin
a0: mov ax, 4c00h ;退出程序,返回DOS
int 21h
begin endp

;-------------------------------------------------------------
;打開文件
openh proc near
mov ah, 3dh
mov al, 0
lea dx, ascpath
int 21h
jc b1 ;打開錯(cuò)誤嗎?
mov fhandle, ax ;沒有錯(cuò),保存文件代號(hào)
ret
b1: mov endcde, 01 ;打開錯(cuò)誤,指示結(jié)束處理
lea dx, openmsg
call errm ;顯示出錯(cuò)信息
ret
openh endp
;-------------------------------------------------------------
;讀磁盤記錄
readh proc near
mov ah, 3fh
mov bx, fhandle
mov cx, 80
lea dx, patntin
int 21h
jc c1 ;讀錯(cuò)誤嗎?
cmp ax, 0 ;文件已讀完嗎?
je c2 ;讀完,退出
ret
c1: lea dx, openmsg ;讀錯(cuò)誤
call errm ;顯示出錯(cuò)信息

c2: mov endcde, 01 ;讀錯(cuò)誤或文件讀完,指示結(jié)束處理
ret
readh endp
;-------------------------------------------------------------
;顯示記錄
disph proc near
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 80
lea dx, patntin
int 21h
cmp row, 24 ;已到屏幕底部嗎?
jae d1 ;已到屏幕底部,退出
inc row
ret
d1: mov ax, 0601h
call screen ;屏幕上卷一行
call curs ;設(shè)置光標(biāo)
ret
disph endp
;-------------------------------------------------------------
;屏幕上卷
screen proc near ;入口參數(shù)為ax
mov bh, 1eh ;設(shè)置顏色
mov cx, 0 ;屏幕左上角
mov dx, 184fh ;屏幕右下角
int 10h
ret
screen endp

;-------------------------------------------------------------
;設(shè)置光標(biāo)
curs proc near
mov ah, 2 ;設(shè)置光標(biāo)
mov bh, 0
mov dh, row ;行號(hào)
mov dl, 0 ;列號(hào)
int 10h
ret
curs endp
;-------------------------------------------------------------
;顯示出錯(cuò)信息
errm proc near
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 20
int 21h
ret
errm endp
;-------------------------------------------------------------
end begin
11.9 編寫建立并寫入磁盤文件的程序。允許用戶從鍵盤鍵入零件號(hào)(3字符),零(配)件名稱(12字符),單
價(jià)(1個(gè)字)。程序使用文件代號(hào)式建立含有這些信息的文件。注意要把單價(jià)從ASCII碼轉(zhuǎn)換為二進(jìn)制數(shù)。下面是
輸入的例子:
part# Description price part# Description price
023 Assemblers 00315
024 Linkages 00430
027 Compilers 00525
049 Compressors 00920

114 Extractors 11250
117 Haulers 00630 122 Lifters
10520
124 Processors 21335
127 Labtlers 00960
232 Bailers 05635
237 Grinders 08250
999 000
答:程序如下:
TITLE HANCREAT.EXE ;利用文件代號(hào)式建立文件程序
;-------------------------------------------------------------
.model small
.stack 100h
.data
prompt1 db 'Please input Part#: $' ;提示輸入零件號(hào)
prompt2 db 'Please input Description: $' ;提示輸入零件名稱
prompt3 db 'Please input Price: $' ;提示輸入單價(jià)
maxlen db 13 ;最大輸入長度,輸入字符串功能的緩沖區(qū)
actlen db ? ;實(shí)際輸入長度
buffer db 13 DUP (' ') ;輸入字符串緩沖區(qū)
crlf db 0dh, 0ah, '$'
pathname db 'filename.lst', 0
handle dw ?
dta db 19 DUP (' ') ;DTA
errcde db 0 ;錯(cuò)誤處理指示
opnmsg db '***open error***', 0dh, 0ah
wrtmsg db '***write error***', 0dh, 0ah
;-------------------------------------------------------------
.code

begin proc far
mov ax, @data
mov ds, ax
mov es, ax
mov ax, 0600h
call scren ;清屏
call curs ;設(shè)置光標(biāo)
call creath ;建立文件
cmp errcde, 0 ;建立錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
contin: call proch ;記錄處理
cmp actlen, 0 ;輸入的字符串長度為0,結(jié)束輸入嗎?
jne contin ;不結(jié)束,繼續(xù)
call clseh ;結(jié)束輸入,關(guān)閉文件
a0: mov ax, 4c00h ;退出程序,返回DOS
int 21h
begin endp
;-------------------------------------------------------------
;建立文件
creath proc near
mov ah, 3ch
mov cx, 0 ;普通屬性
lea dx, pathname
int 21h
jc bbb ;建立文件錯(cuò)誤嗎?
mov handle, ax ;沒有錯(cuò),保存文件代號(hào)
ret
bbb: lea dx, opnmsg ;建立文件錯(cuò)誤

call errm ;顯示出錯(cuò)信息
ret
creath endp
;-------------------------------------------------------------
;接收輸入
proch proc near
cld
lea di, dta ;在di中設(shè)置dta的首地址
lea dx, prompt1 ;輸入零件號(hào)
mov bx, 3 ;零件號(hào)最多3個(gè)字符
call in_proc
jc exit ;沒有輸入,結(jié)束
lea dx, prompt2 ;輸入零件名稱
mov bx, 12 ;零件名稱最多12個(gè)字符
call in_proc
jc exit ;沒有輸入,結(jié)束
lea dx, prompt3 ;輸入單價(jià)
mov bx, 5 ;零件單價(jià)最多5個(gè)十進(jìn)制字符(相當(dāng)于一個(gè)二進(jìn)制字)
call in_proc
call dec_bin ;將十進(jìn)制的單價(jià)轉(zhuǎn)換為二進(jìn)制的單價(jià)
mov word ptr [dta+17], 0a0dh ;在DTA的最后插入回車換行符
call writh ;用文件代號(hào)法寫記錄
exit: ret
proch endp
;-----------------------------------------------------------------
;輸入字符串子程序
in_proc proc near
mov ah, 09h ;顯示提示信息
int 21h

push di
lea di, buffer ;在buffer中填入空格符
mov cl, maxlen
mov ch, 0
mov al, ' '
rep stosb
pop di
mov ah, 0ah ;輸入字符串
lea dx, maxlen
int 21h
call disp_crlf
cmp actlen, 0 ;實(shí)際輸入字符數(shù)=0,則沒有輸入,結(jié)束
je end_in
push di
lea di, buffer ;在buffer的后面填入空格符
mov al, actlen
mov ah, 0
add di, ax
mov cl, maxlen
mov ch, 0
mov al, actlen
sub cl, al
mov al, ' '
rep stosb
pop di
lea si, buffer ;將buffer緩沖區(qū)內(nèi)容送入dta
mov cx, bx
rep movsb ;將輸入內(nèi)容送入dta
clc ;有輸入字符,返回(cf)=0

jmp in_end
end_in: stc ;沒有輸入字符,返回(cf)=1
in_end: ret
in_proc endp
;-----------------------------------------------------------------
;將十進(jìn)制的單價(jià)轉(zhuǎn)換為二進(jìn)制的單價(jià)子程序
dec_bin proc near
mov bx, 0
mov si, 0
mov cx, 5
transfer: mov al, buffer[si] ;從十進(jìn)制的高位到低位取數(shù)
cmp al, 0dh ;是回車嗎?
je dec_bin1
cmp al, ' ' ;是空格嗎?
je dec_bin1
and al, 0fh ;將ascii碼轉(zhuǎn)換為十進(jìn)制數(shù)
mov ah, 0
push cx
xchg ax, bx ;十進(jìn)制數(shù)高位×10+低位 = 二進(jìn)制數(shù)
mov cx, 10
mul cx
xchg ax, bx
add bx, ax ;轉(zhuǎn)換的二進(jìn)制數(shù)在(bx)中
pop cx
inc si
loop transfer
dec_bin1: mov word ptr [dta+15], bx ;存入單價(jià)到dta中的單價(jià)位置
ret
dec_bin endp

;-----------------------------------------------------------------
;用文件代號(hào)法寫記錄
writh proc near
mov ah, 40h
mov bx, handle
mov cx, 19
lea dx, dta
int 21h
jnc ddd ;寫文件錯(cuò)誤嗎?
lea dx, wrtmsg
call errm ;顯示出錯(cuò)信息
mov actlen, 0
ddd: ret
writh endp
;-----------------------------------------------------------------
;用文件代號(hào)法關(guān)閉文件
clseh proc near
mov dta, 1ah ;寫文件結(jié)束符1ah
call writh
mov ah, 3eh
mov bx, handle
int 21h
ret
clseh endp
;-------------------------------------------------------------
;屏幕上卷
scren proc near ;入口參數(shù)為ax
mov bh, 1eh ;設(shè)置顏色
mov cx, 0 ;屏幕左上角

mov dx, 184fh ;屏幕右下角
int 10h
ret
scren endp
;-------------------------------------------------------------
;設(shè)置光標(biāo)
curs proc near
mov ah, 2 ;設(shè)置光標(biāo)
mov bh, 0
mov dh, 0 ;行號(hào)
mov dl, 0 ;列號(hào)
int 10h
ret
curs endp
;-------------------------------------------------------------
;顯示出錯(cuò)信息
errm proc near
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 20
int 21h
mov errcde, 01 ;錯(cuò)誤代碼置1
ret
errm endp
;-------------------------------------------------------------
disp_crlf proc near ; 顯示回車換行符子程序
lea dx, crlf
mov ah, 09h
int 21h

ret
disp_crlf endp ; disp_crlf子程序結(jié)束
; -----------------------------------------------------------
end begin ;匯編語言源程序結(jié)束
11.10 編寫一個(gè)程序使用文件代號(hào)式讀出并顯示11.9題建立的文件。注意,要把二進(jìn)制數(shù)表示的單價(jià)轉(zhuǎn)換為
ASCII碼。
答:用文件代號(hào)式讀出并顯示文件,程序如下:
TITLE HANDREAD.EXE ;利用文件代號(hào)式順序讀并顯示文件程序
;Read disk records created by hancreat
;-------------------------------------------------------------
.model small
.stack 100h
.data
endcde db 0 ;結(jié)束處理指示
crlf db 0dh, 0ah, '$'
pathname db 'filename.lst', 0
message db ' Part# Description Price',0dh,0ah,'$'
handle dw ?
tackline db ' | $'
dta db 19 DUP (' ') ;DTA
errcde db 0 ;錯(cuò)誤處理指示
opnmsg db '***open error***', 0dh, 0ah
readmsg db '***read error***', 0dh, 0ah
row db 0
;-------------------------------------------------------------
.code
begin proc far
mov ax, @data

mov ds, ax
mov es, ax
mov ax, 0600h
call screen ;清屏
call curs ;設(shè)置光標(biāo)
lea dx, message ;顯示標(biāo)題
mov ah, 09h
int 21h
inc row
call openh ;打開文件,設(shè)置DTA
cmp endcde, 0 ;打開錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
contin: call readh ;讀磁盤記錄
cmp endcde, 0 ;讀錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
call disph ;沒錯(cuò),顯示記錄
jmp contin
a0: mov ax, 4c00h ;退出程序,返回DOS
int 21h
begin endp
;-------------------------------------------------------------
;打開文件
openh proc near
mov ah, 3dh
mov al, 0
lea dx, pathname
int 21h
jc bbb ;打開錯(cuò)誤嗎?

mov handle, ax ;沒有錯(cuò),保存文件代號(hào)
ret
bbb: mov endcde, 01 ;打開錯(cuò)誤,指示結(jié)束處理
lea dx, readmsg
call errm ;顯示出錯(cuò)信息
ret
openh endp
;-------------------------------------------------------------
;讀磁盤記錄
readh proc near
mov ah, 3fh
mov bx, handle
mov cx, 19
lea dx, dta
int 21h
jc c1 ;讀錯(cuò)誤嗎?
cmp ax, 0 ;文件已讀完嗎?
je c2 ;讀完,退出
cmp dta, 1ah ;文件結(jié)束符嗎?
Je c2
ret
c1: lea dx, opnmsg ;讀錯(cuò)誤
call errm ;顯示出錯(cuò)信息
c2: mov endcde, 01 ;讀錯(cuò)誤或文件讀完,指示結(jié)束處理
ret
readh endp
;-------------------------------------------------------------
;顯示記錄
disph proc near

lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 3
lea dx, dta
int 21h
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 12
lea dx, dta+3
int 21h
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
mov si, word ptr [dta+15]
call bin_dec ;轉(zhuǎn)換為十進(jìn)制數(shù)顯示
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
call disp_crlf
cmp row, 24 ;已到屏幕底部嗎?
jae ddd ;已到屏幕底部,退出
inc row
ret

ddd: mov ax, 0601h
call screen ;屏幕上卷一行
call curs ;設(shè)置光標(biāo)
ret
disph endp
;-----------------------------------------------------------------
;將二進(jìn)制的單價(jià)轉(zhuǎn)換為十進(jìn)制的單價(jià)并顯示子程序
bin_dec proc near
push cx
mov cx, 10000d
call dec_div ;調(diào)除法并顯示輸出子程序
mov cx, 1000d
call dec_div
mov cx, 100d
call dec_div
mov cx, 10d
call dec_div
mov cx, 1d
call dec_div
pop cx
ret
bin_dec endp
;--------------------------------------------------------------------------
;除法并顯示輸出子程序
dec_div proc near
mov ax, si
mov dx, 0
div cx
mov si, dx ;余數(shù)保存在(si)中作下一次的除法

mov dl, al ;商(在00h~09h范圍內(nèi))送(dl)
add dl, 30h ;轉(zhuǎn)換為0~9的ascii碼
mov ah, 02h ;顯示輸出
int 21h
ret
dec_div endp
;-----------------------------------------------------------------
;屏幕上卷
screen proc near ;入口參數(shù)為ax
mov bh, 1eh ;設(shè)置顏色
mov cx, 0 ;屏幕左上角
mov dx, 184fh ;屏幕右下角
int 10h
ret
screen endp
;-------------------------------------------------------------
;設(shè)置光標(biāo)
curs proc near
mov ah, 2 ;設(shè)置光標(biāo)
mov bh, 0
mov dh, row ;行號(hào)
mov dl, 0 ;列號(hào)
int 10h
ret
curs endp
;-------------------------------------------------------------
;顯示出錯(cuò)信息
errm proc near
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件

mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 20
int 21h
ret
errm endp
;-------------------------------------------------------------
disp_crlf proc near ;顯示回車換行符子程序
lea dx, crlf
mov ah, 09h
int 21h
ret
disp_crlf endp ; disp_crlf子程序結(jié)束
; -----------------------------------------------------------
end begin
11.11 對11.9題建立的文件按下面的要求編寫程序:
(1) 把所有的記錄讀入內(nèi)存的數(shù)據(jù)緩沖區(qū)TABLE;
(2) 顯示字符串提示用戶輸入零(配)件號(hào)及其數(shù)量;
(3) 按零件搜索TABLE;
(4) 如果發(fā)現(xiàn)所要求的零件,用它的單價(jià)計(jì)算出總價(jià)(單價(jià)×數(shù)量);
(5) 顯示零(配)件說明及總價(jià)值。
答:程序如下:
TITLE READ11.EXE ;利用文件代號(hào)式讀并計(jì)算顯示程序
;Read disk records created by hancreat
;-------------------------------------------------------------
.model small
.stack 100h
.data
endcde db 0 ;結(jié)束處理指示
pathname db 'filename.lst', 0

in_mes1 db '請輸入3位數(shù)的零件號(hào)Part#:', '$'
in_mes2 db '請輸入該零件的數(shù)量:', '$'
out_mes1 db '輸入的不是數(shù)字!請重新輸入數(shù)字:’, '$'
out_mes2 db '輸入的零件號(hào)不存在!請重新輸入3位數(shù)的零件號(hào)Part#:', '$'
in_buffer db 6, ?, 6 dup(20h) ;輸入緩沖區(qū)
message db ' Part# Description Sum_Price', 0dh, 0ah,'$'
tackline db ' | $'
sum_price dw 0, 0
decimal db 10 DUP(0), ‘$’
crlf db 0dh, 0ah, '$'
handle dw ?
table db 19*100 DUP(' ') ;table,足夠大
errcde db 0 ;錯(cuò)誤處理指示
opnmsg db '***open error***', 0dh, 0ah
readmsg db '***read error***', 0dh, 0ah
;-------------------------------------------------------------
.code
begin proc far
mov ax, @data
mov ds, ax
mov es, ax
mov ax, 0600h
call screen ;清屏
call curs ;設(shè)置光標(biāo)
call openh ;打開文件,設(shè)置TABLE
cmp endcde, 0 ;打開錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
call readh ;讀磁盤記錄

cmp endcde, 0 ;讀錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
call in_Part ;沒錯(cuò),輸入零件號(hào)和零件數(shù)量
a0: mov ax, 4c00h ;退出程序,返回DOS
int 21h
begin endp
;-------------------------------------------------------------
;打開文件
openh proc near
mov ah, 3dh
mov al, 0
lea dx, pathname
int 21h
jc bbb ;打開錯(cuò)誤嗎?
mov handle, ax ;沒有錯(cuò),保存文件代號(hào)
ret
bbb: mov endcde, 01 ;打開錯(cuò)誤,指示結(jié)束處理
lea dx, opnmsg
call errm ;顯示出錯(cuò)信息
ret
openh endp
;-------------------------------------------------------------
;讀磁盤記錄
readh proc near
mov ah, 3fh
mov bx, handle
mov cx, 19*100 ;準(zhǔn)備讀入的字節(jié)數(shù)
lea dx, table
int 21h

jc c1 ;讀錯(cuò)誤嗎?
cmp ax, 0 ;文件已讀完嗎?
je c2 ;讀完,退出
cmp table, 1ah ;文件結(jié)束符嗎?
Je c2
mov bp, ax ;讀成功則在AX中返回實(shí)際讀入的字節(jié)數(shù)存入bp
ret
c1: lea dx, readmsg ;讀錯(cuò)誤
call errm ;顯示出錯(cuò)信息
c2: mov endcde, 01 ;讀錯(cuò)誤或文件讀完,指示結(jié)束處理
ret
readh endp
;-------------------------------------------------------------
;輸入零件號(hào)和零件數(shù)量
in_Part proc near
lea dx, in_mes1 ;顯示提示信息,提示輸入零件號(hào)
in_Part1: call input ;輸入數(shù)據(jù)
cmp in_buffer+1, 3 ;輸入的零件號(hào)個(gè)數(shù)是3位嗎?
lea dx, out_mes2 ;顯示提示信息,提示重新輸入零件號(hào)
jne in_Part1
cld
mov ax, bp ;取實(shí)際讀入文件的字節(jié)數(shù)
mov cl, 19 ;每個(gè)記錄的長度為19個(gè)字符
div cl ;計(jì)算實(shí)際讀取的記錄數(shù)在al中
mov bl, al
mov bh, 0 ;從第0個(gè)記錄開始順序查找
in_Part2: lea si, in_buffer+2 ;查找零件號(hào)對應(yīng)的零件
lea di, table
mov al, 19

mul bh
add di, ax ;計(jì)算某個(gè)記錄的首地址
mov word ptr decimal, di ;保存首地址
mov cx, 3
repe cmpsb
je in_Part3 ;找到對應(yīng)的零件
inc bh ;找下一個(gè)記錄
cmp bh, bl
jb in_Part2
jmp in_Part1 ;未找到對應(yīng)的零件重新輸入
in_Part3: lea dx, in_mes2 ;顯示提示信息,提示輸入零件數(shù)量
call input ;輸入數(shù)據(jù)
call dec_bin ;將輸入數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù),在bx中
mov di, word ptr decima ;di指向該記錄的首地址
mov ax, [di+15] ;取單價(jià)
mul bx ;總價(jià)格在(dx),(ax)中
mov sum_price, ax
mov sum_price+2, dx
call disp_rec ;顯示信息
ret
in_Part endp
;-------------------------------------------------------------
;輸入數(shù)據(jù)
input proc near
input1: mov ah, 09h ;顯示字符串
int 21h
mov ah, 0ah ;輸入字符串
lea dx, in_buffer
int 21h

lea dx, out_mes1 ;顯示提示信息
mov cl, in_buffer+1
cmp cl, 0 ;輸入的數(shù)字個(gè)數(shù)為0嗎?
jz input1
mov ch, 0
mov bx, 2
input2: mov al, in_buffer[bx] ;輸入的是數(shù)字0~9嗎?
cmp al, ‘0’
jb input1
cmp al, ‘9’
ja input1
inc bx
loop input2
ret
input endp
;-------------------------------------------------------------
;將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)子程序
dec_bin proc near
mov bx, 0
mov si, 2
mov cl, in_buffer+1
mov ch, 0
transfer: mov al, in_buffer[si] ;從十進(jìn)制的高位到低位取數(shù)
and al, 0fh ;將ascii碼轉(zhuǎn)換為十進(jìn)制數(shù)
mov ah, 0
push cx
xchg ax, bx ;十進(jìn)制數(shù)高位×10+低位 = 二進(jìn)制數(shù)
mov cx, 10
mul cx

add bx, ax ;轉(zhuǎn)換的二進(jìn)制數(shù)在(bx)中
pop cx
inc si
loop transfer
ret
dec_bin endp
;-----------------------------------------------------------------
;顯示記錄
disp_rec proc near
call disp_crlf
lea dx, message ;顯示標(biāo)題
mov ah, 09h
int 21h
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 3 ;顯示3位數(shù)的零件號(hào)
mov dx, word ptr decima ;dx指向該記錄的首地址
int 21h
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 12 ;顯示12位的零件說明
mov dx, word ptr decima ;dx指向該記錄的首地址
add dx, 3

int 21h
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
call bin_dec ;總價(jià)格轉(zhuǎn)換為十進(jìn)制數(shù)顯示
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
call disp_crlf
ret
disp_rec endp
;-----------------------------------------------------------------
;4字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換為10進(jìn)制子程序
bin_dec proc near
mov bx, 0 ;10字節(jié)的bcd碼單元清0
mov cx, 10
bin_dec1: mov decimal[bx], 0
inc bx
loop bin_dec1
mov cx, 4*8 ;4字節(jié)二進(jìn)制數(shù)共4*8=32位
bin_dec2: mov bx, 10-1 ;計(jì)算
(((a31*2+a30)*2+a29)...)*2+a0
shl word ptr [sum_price],1 ;4字節(jié)二進(jìn)制數(shù)左移1位
rcl word ptr [sum_price +2],1
push cx
mov cx, 10
bin_dec3: mov al, decimal[bx] ;計(jì)算(...)*2+ai,ai由進(jìn)位位帶入
adc al, al
aaa ;非壓縮bcd碼加法調(diào)整

mov decimal[bx], al
dec bx
loop bin_dec3
pop cx
loop bin_dec2
call disp
ret
bin_dec endp
;--------------------------------------------------------------------------
disp proc near ;顯示輸出子程序
mov cx, 10
mov bx, 0
disp1: add decimal[bx], 30h ;變?yōu)閍scii碼
inc bx
loop disp1
mov cx, 10 ;下面5條指令是為了不顯示數(shù)據(jù)左邊的“0”
cld
lea di, decimal
mov al, 30h ;30h為“0”的ascii碼
repe scasb
dec di
mov dx, di
mov ah, 09h
int 21h
ret
disp endp ;disp子程序結(jié)束
;---------------------------------------------------------------------------
;屏幕上卷
screen proc near ;入口參數(shù)為ax

mov bh, 1eh ;設(shè)置顏色
mov cx, 0 ;屏幕左上角
mov dx, 184fh ;屏幕右下角
int 10h
ret
screen endp
;-------------------------------------------------------------
;設(shè)置光標(biāo)
curs proc near
mov ah, 2 ;設(shè)置光標(biāo)
mov bh, 0
mov dh, 0 ;行號(hào)
mov dl, 0 ;列號(hào)
int 10h
ret
curs endp
;-------------------------------------------------------------
;顯示出錯(cuò)信息
errm proc near
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 20
int 21h
ret
errm endp
;-------------------------------------------------------------
disp_crlf proc near ;顯示回車換行符子程序
lea dx, crlf
mov ah, 09h

int 21h
ret
disp_crlf endp ; disp_crlf子程序結(jié)束
; -----------------------------------------------------------
end begin
11.12 用隨機(jī)處理記錄的方式編寫程序,將用戶需要的零(配)件記錄讀取到TABLE,并根據(jù)鍵入的數(shù)量,計(jì)
算出總價(jià)值,然后顯示出零(配)件說明及總價(jià)值。
答:程序如下:
TITLE READ_RAN.EXE ;利用文件代號(hào)式隨機(jī)讀并計(jì)算顯示程序
;Read disk records created by hancreat
;-------------------------------------------------------------
.model small
.stack 100h
.data
endcde db 0 ;結(jié)束處理指示
pathname db 'filename.lst', 0
in_mes1 db '請輸入3位數(shù)的零件號(hào)Part#:', '$'
in_mes2 db '請輸入該零件的數(shù)量:', '$'
out_mes1 db '輸入的不是數(shù)字!請重新輸入數(shù)字:’, '$'
out_mes2 db '輸入的零件號(hào)不存在!請重新輸入3位數(shù)的零件號(hào)Part#:', '$'
in_buffer db 6, ?, 6 dup(20h) ;輸入緩沖區(qū)
message db ' Part# Description Sum_Price', 0dh, 0ah,'$'
tackline db ' | $'
sum_price dw 0, 0
decimal db 10 DUP(0), ‘$’
crlf db 0dh, 0ah, '$'
handle dw ?
table db 19 DUP(' ') ;table
errcde db 0 ;錯(cuò)誤處理指示

opnmsg db '***open error***', 0dh, 0ah
readmsg db '***read error***', 0dh, 0ah
movmsg db '***move error***', 0dh, 0ah
;-------------------------------------------------------------
.code
begin proc far
mov ax, @data
mov ds, ax
mov es, ax
mov ax, 0600h
call screen ;清屏
call curs ;設(shè)置光標(biāo)
call openh ;打開文件,設(shè)置TABLE
cmp endcde, 0 ;打開錯(cuò)誤嗎?
jnz a0 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
call in_Part ;沒錯(cuò),輸入零件號(hào)和零件數(shù)量
a0: mov ax, 4c00h ;退出程序,返回DOS
int 21h
begin endp
;-------------------------------------------------------------
;打開文件
openh proc near
mov ah, 3dh
mov al, 0
lea dx, pathname
int 21h
jc bbb ;打開錯(cuò)誤嗎?
mov handle, ax ;沒有錯(cuò),保存文件代號(hào)

ret
bbb: mov endcde, 01 ;打開錯(cuò)誤,指示結(jié)束處理
lea dx, opnmsg
call errm ;顯示出錯(cuò)信息
ret
openh endp
;-------------------------------------------------------------
;讀磁盤記錄
readh proc near
mov ah, 3fh
mov bx, handle
mov cx, 19 ;準(zhǔn)備讀入的字節(jié)數(shù)
lea dx, table
int 21h
jc c1 ;讀錯(cuò)誤嗎?
cmp ax, 0 ;文件已讀完嗎?
je c2 ;讀完,退出
cmp table, 1ah ;文件結(jié)束符嗎?
Je c2
mov bp, ax ;讀成功則在AX中返回實(shí)際讀入的字節(jié)數(shù)存入bp
ret
c1: mov endcde, 01 ;讀錯(cuò)誤或文件讀完,指示結(jié)束處理
lea dx, readmsg ;讀錯(cuò)誤
call errm ;顯示出錯(cuò)信息
jmp c3
c2: mov endcde, 02 ;讀錯(cuò)誤或文件讀完,指示結(jié)束處理
c3: ret
readh endp
;-------------------------------------------------------------

;絕對移動(dòng)文件讀寫指針
mov_pointer proc near
mov ah, 42h
mov al, 0
mov bx, handle
int 21h
jc d1 ;錯(cuò)誤嗎?
ret
d1: lea dx, movmsg ;錯(cuò)誤
call errm ;顯示出錯(cuò)信息
mov endcde, 01 ;錯(cuò)誤,指示結(jié)束處理
ret
mov_pointer endp
;-------------------------------------------------------------
;輸入零件號(hào)和零件數(shù)量
in_Part proc near
lea dx, in_mes1 ;顯示提示信息,提示輸入零件號(hào)
in_Part1: call input ;輸入數(shù)據(jù)
cmp in_buffer+1, 3 ;輸入的零件號(hào)個(gè)數(shù)是3位嗎?
lea dx, out_mes2 ;顯示提示信息,提示重新輸入零件號(hào)
jne in_Part1
cld
mov cx, 0 ;位移量的高位字
mov dx, 0 ;位移量的低位字
call mov_pointer ;絕對移動(dòng)文件讀寫指針到文件首
in_Part2: call readh ;讀磁盤記錄
cmp endcde, 2 ;讀文件結(jié)束嗎?
je in_Part1 ;結(jié)束,未找到對應(yīng)的零件重新輸入
cmp endcde, 1 ;讀錯(cuò)誤嗎?

je in_Part4 ;錯(cuò)誤,轉(zhuǎn)結(jié)束
lea si, in_buffer+2 ;查找零件號(hào)對應(yīng)的零件
lea di, table
mov cx, 3
repe cmpsb
je in_Part3 ;找到對應(yīng)的零件
jmp in_Part2 ;找下一個(gè)零件
in_Part3: lea dx, in_mes2 ;顯示提示信息,提示輸入零件數(shù)量
call input ;輸入數(shù)據(jù)
call dec_bin ;將輸入數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù),在bx中
lea di, table ;di指向該記錄的首地址
mov ax, [di+15] ;取單價(jià)
mul bx ;總價(jià)格在(dx),(ax)中
mov sum_price, ax
mov sum_price+2, dx
call disp_rec ;顯示信息
in_Part4: ret
in_Part endp
;-------------------------------------------------------------
;輸入數(shù)據(jù)
input proc near
input1: mov ah, 09h ;顯示字符串
int 21h
mov ah, 0ah ;輸入字符串
lea dx, in_buffer
int 21h
lea dx, out_mes1 ;顯示提示信息
mov cl, in_buffer+1

cmp cl, 0 ;輸入的數(shù)字個(gè)數(shù)為0嗎?
jz input1
mov ch, 0
mov bx, 2
input2: mov al, in_buffer[bx] ;輸入的是數(shù)字0~9嗎?
cmp al, ‘0’
jb input1
cmp al, ‘9’
ja input1
inc bx
loop input2
ret
input endp
;-------------------------------------------------------------
;將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)子程序
dec_bin proc near
mov bx, 0
mov si, 2
mov cl, in_buffer+1
mov ch, 0
transfer: mov al, in_buffer[si] ;從十進(jìn)制的高位到低位取數(shù)
and al, 0fh ;將ascii碼轉(zhuǎn)換為十進(jìn)制數(shù)
mov ah, 0
push cx
xchg ax, bx ;十進(jìn)制數(shù)高位×10+低位 = 二進(jìn)制數(shù)
mov cx, 10
mul cx
add bx, ax ;轉(zhuǎn)換的二進(jìn)制數(shù)在(bx)中
pop cx

inc si
loop transfer
ret
dec_bin endp
;-----------------------------------------------------------------
;顯示記錄
disp_rec proc near
call disp_crlf
lea dx, message ;顯示標(biāo)題
mov ah, 09h
int 21h
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 3 ;顯示3位數(shù)的零件號(hào)
lea dx, table ;dx指向該記錄的首地址
int 21h
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 12 ;顯示12位的零件說明
lea dx, table ;dx指向該記錄的首地址
add dx, 3
int 21h
lea dx, tackline ;顯示輸出“ | ”

mov ah, 09h
int 21h
call bin_dec ;總價(jià)格轉(zhuǎn)換為十進(jìn)制數(shù)顯示
lea dx, tackline ;顯示輸出“ | ”
mov ah, 09h
int 21h
call disp_crlf
ret
disp_rec endp
;-----------------------------------------------------------------
;4字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換為10進(jìn)制子程序
bin_dec proc near
mov bx, 0 ;10字節(jié)的bcd碼單元清0
mov cx, 10
bin_dec1: mov decimal[bx], 0
inc bx
loop bin_dec1
mov cx, 4*8 ;4字節(jié)二進(jìn)制數(shù)共4*8=32位
bin_dec2: mov bx, 10-1 ;計(jì)算
(((a31*2+a30)*2+a29)...)*2+a0
shl word ptr [sum_price],1 ;4字節(jié)二進(jìn)制數(shù)左移1位
rcl word ptr [sum_price +2],1
push cx
mov cx, 10
bin_dec3: mov al, decimal[bx] ;計(jì)算(...)*2+ai,ai由進(jìn)位位帶入
adc al, al
aaa ;非壓縮bcd碼加法調(diào)整
mov decimal[bx], al
dec bx

loop bin_dec3
pop cx
loop bin_dec2
call disp
ret
bin_dec endp
;--------------------------------------------------------------------------
disp proc near ;顯示輸出子程序
mov cx, 10
mov bx, 0
disp1: add decimal[bx], 30h ;變?yōu)閍scii碼
inc bx
loop disp1
mov cx, 10 ;下面5條指令是為了不顯示數(shù)據(jù)左邊的“0”
cld
lea di, decimal
mov al, 30h ;30h為“0”的ascii碼
repe scasb
dec di
mov dx, di
mov ah, 09h
int 21h
ret
disp endp ;disp子程序結(jié)束
;---------------------------------------------------------------------------
;屏幕上卷
screen proc near ;入口參數(shù)為ax
mov bh, 1eh ;設(shè)置顏色
mov cx, 0 ;屏幕左上角

mov dx, 184fh ;屏幕右下角
int 10h
ret
screen endp
;-------------------------------------------------------------
;設(shè)置光標(biāo)
curs proc near
mov ah, 2 ;設(shè)置光標(biāo)
mov bh, 0
mov dh, 0 ;行號(hào)
mov dl, 0 ;列號(hào)
int 10h
ret
curs endp
;-------------------------------------------------------------
;顯示出錯(cuò)信息
errm proc near
mov ah, 40h ;向標(biāo)準(zhǔn)輸出設(shè)備(文件代號(hào)=01)寫文件
mov bx, 01 ;標(biāo)準(zhǔn)輸出設(shè)備的文件代號(hào)=01
mov cx, 20
int 21h
ret
errm endp
;-------------------------------------------------------------
disp_crlf proc near ;顯示回車換行符子程序
lea dx, crlf
mov ah, 09h
int 21h
ret

disp_crlf endp ; disp_crlf子程序結(jié)束
; -----------------------------------------------------------
end begin

?

參考文章

http://blog.sina.com.cn/s/blog_77f58b350100q4dv.html

https://wenku.baidu.com/view/303e0e114431b90d6c85c720.html

總結(jié)

以上是生活随笔為你收集整理的《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久无码专区国产精品s | 国产成人精品必看 | 无码人妻丰满熟妇区五十路百度 | 捆绑白丝粉色jk震动捧喷白浆 | 国产人妻久久精品二区三区老狼 | 亚洲爆乳大丰满无码专区 | 亚洲男人av天堂午夜在 | 精品国产福利一区二区 | www一区二区www免费 | 免费无码一区二区三区蜜桃大 | 欧美日本免费一区二区三区 | 97资源共享在线视频 | 久久天天躁狠狠躁夜夜免费观看 | 全球成人中文在线 | 四虎4hu永久免费 | 动漫av一区二区在线观看 | 国产人成高清在线视频99最全资源 | 熟女俱乐部五十路六十路av | 狠狠综合久久久久综合网 | 亚洲色大成网站www | 4hu四虎永久在线观看 | 亚洲中文字幕无码中字 | 无码乱肉视频免费大全合集 | 国产成人人人97超碰超爽8 | 一本久久a久久精品vr综合 | 人人妻人人澡人人爽欧美精品 | 国产免费无码一区二区视频 | 樱花草在线社区www | 久久久久久国产精品无码下载 | 女人和拘做爰正片视频 | 图片小说视频一区二区 | 国产无遮挡吃胸膜奶免费看 | 亚洲综合伊人久久大杳蕉 | 美女毛片一区二区三区四区 | 亚洲色欲色欲欲www在线 | 中文字幕乱妇无码av在线 | 久久久久国色av免费观看性色 | 亚洲日韩一区二区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产成人精品三级麻豆 | 日本www一道久久久免费榴莲 | 99国产欧美久久久精品 | 精品少妇爆乳无码av无码专区 | 一区二区传媒有限公司 | 亚洲国精产品一二二线 | 欧美肥老太牲交大战 | 亚洲中文字幕无码中文字在线 | 激情内射亚州一区二区三区爱妻 | 国产凸凹视频一区二区 | 欧美一区二区三区视频在线观看 | 中文亚洲成a人片在线观看 | 鲁大师影院在线观看 | 久久亚洲中文字幕无码 | 国产人妻大战黑人第1集 | 成人一在线视频日韩国产 | 捆绑白丝粉色jk震动捧喷白浆 | 四十如虎的丰满熟妇啪啪 | 最近的中文字幕在线看视频 | av香港经典三级级 在线 | 国产熟妇高潮叫床视频播放 | 巨爆乳无码视频在线观看 | 国产在线无码精品电影网 | www国产亚洲精品久久网站 | 女人高潮内射99精品 | 久久精品一区二区三区四区 | 免费视频欧美无人区码 | 人人爽人人澡人人高潮 | 国产乱码精品一品二品 | 久久精品一区二区三区四区 | 亚洲精品欧美二区三区中文字幕 | 精品偷拍一区二区三区在线看 | 2019nv天堂香蕉在线观看 | 人人澡人摸人人添 | 日韩精品久久久肉伦网站 | 欧洲美熟女乱又伦 | 国产av剧情md精品麻豆 | 日日天日日夜日日摸 | 欧美精品免费观看二区 | 乱人伦中文视频在线观看 | 男人和女人高潮免费网站 | 人妻少妇被猛烈进入中文字幕 | 久久午夜夜伦鲁鲁片无码免费 | 国产激情一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲精品一区二区三区婷婷月 | 日日碰狠狠躁久久躁蜜桃 | 青草青草久热国产精品 | 国产精品亚洲а∨无码播放麻豆 | 一本久久a久久精品亚洲 | 天堂久久天堂av色综合 | 人人超人人超碰超国产 | 亚洲精品国产品国语在线观看 | 台湾无码一区二区 | 免费无码的av片在线观看 | 啦啦啦www在线观看免费视频 | 天天躁夜夜躁狠狠是什么心态 | 麻豆国产人妻欲求不满谁演的 | 亚洲成色www久久网站 | 99视频精品全部免费免费观看 | 久久99精品国产麻豆 | 亚洲狠狠色丁香婷婷综合 | 无码帝国www无码专区色综合 | 精品久久综合1区2区3区激情 | 欧美日韩一区二区三区自拍 | 午夜精品久久久内射近拍高清 | 狠狠色欧美亚洲狠狠色www | 国产精品久久久久久久9999 | a国产一区二区免费入口 | 女人色极品影院 | 性史性农村dvd毛片 | 国内精品一区二区三区不卡 | 熟妇人妻无乱码中文字幕 | 精品无码av一区二区三区 | 精品无码国产一区二区三区av | 国产成人精品三级麻豆 | 少妇性荡欲午夜性开放视频剧场 | 99久久人妻精品免费二区 | 免费人成网站视频在线观看 | 亚洲成a人一区二区三区 | 国产精品手机免费 | 正在播放老肥熟妇露脸 | 高中生自慰www网站 | 小泽玛莉亚一区二区视频在线 | 国内精品九九久久久精品 | 无码人妻精品一区二区三区不卡 | 人人妻人人澡人人爽精品欧美 | 大胆欧美熟妇xx | 午夜丰满少妇性开放视频 | 国产精品久久国产精品99 | 亚洲精品鲁一鲁一区二区三区 | 一本久久伊人热热精品中文字幕 | 国产在线aaa片一区二区99 | 无码国内精品人妻少妇 | 一区二区传媒有限公司 | 国产成人精品必看 | 天天av天天av天天透 | 亚洲男人av香蕉爽爽爽爽 | 亚洲日韩精品欧美一区二区 | 97精品国产97久久久久久免费 | 国产亚洲精品久久久久久久久动漫 | aⅴ在线视频男人的天堂 | 日本一卡二卡不卡视频查询 | 国产区女主播在线观看 | 国产亚av手机在线观看 | 久久人人爽人人爽人人片ⅴ | 无码成人精品区在线观看 | 男人扒开女人内裤强吻桶进去 | 大胆欧美熟妇xx | 97人妻精品一区二区三区 | 男女下面进入的视频免费午夜 | 精品一区二区三区无码免费视频 | 四虎影视成人永久免费观看视频 | 无码人妻丰满熟妇区毛片18 | 丰满人妻精品国产99aⅴ | 成 人影片 免费观看 | 国产成人综合在线女婷五月99播放 | 巨爆乳无码视频在线观看 | 国产精品久久福利网站 | 99在线 | 亚洲 | 在线а√天堂中文官网 | 2020久久超碰国产精品最新 | 日本饥渴人妻欲求不满 | 日韩av激情在线观看 | 丰满少妇人妻久久久久久 | 无码毛片视频一区二区本码 | 1000部啪啪未满十八勿入下载 | 人人妻人人澡人人爽人人精品 | 性啪啪chinese东北女人 | 人妻体内射精一区二区三四 | √天堂资源地址中文在线 | 成人欧美一区二区三区黑人免费 | 欧美成人高清在线播放 | 亚洲国产欧美在线成人 | 久久亚洲精品成人无码 | 美女极度色诱视频国产 | 国产偷抇久久精品a片69 | 四虎影视成人永久免费观看视频 | 国産精品久久久久久久 | 日日夜夜撸啊撸 | 人妻插b视频一区二区三区 | 1000部啪啪未满十八勿入下载 | 天天躁夜夜躁狠狠是什么心态 | 水蜜桃色314在线观看 | 综合激情五月综合激情五月激情1 | 亚洲 a v无 码免 费 成 人 a v | 俄罗斯老熟妇色xxxx | 少妇被粗大的猛进出69影院 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产精品久久久久久无码 | 国产九九九九九九九a片 | 欧美野外疯狂做受xxxx高潮 | 亚洲乱码中文字幕在线 | 亚洲精品无码人妻无码 | 日韩欧美中文字幕公布 | 日日摸天天摸爽爽狠狠97 | 无码国产激情在线观看 | 中文字幕+乱码+中文字幕一区 | 狂野欧美激情性xxxx | 天天摸天天透天天添 | 免费人成在线观看网站 | 欧美日韩精品 | 亚洲成a人片在线观看无码 | 精品国产av色一区二区深夜久久 | 99久久久无码国产aaa精品 | 无码人妻久久一区二区三区不卡 | 国产无遮挡又黄又爽又色 | 窝窝午夜理论片影院 | 欧美人与牲动交xxxx | 中文无码精品a∨在线观看不卡 | 丰满少妇高潮惨叫视频 | 午夜无码人妻av大片色欲 | a国产一区二区免费入口 | 女人和拘做爰正片视频 | 久久久久久九九精品久 | 欧美黑人性暴力猛交喷水 | 无码人妻av免费一区二区三区 | 亚洲成熟女人毛毛耸耸多 | 99精品国产综合久久久久五月天 | 国产综合久久久久鬼色 | 久久精品国产日本波多野结衣 | 在线播放无码字幕亚洲 | 99er热精品视频 | 久久综合香蕉国产蜜臀av | 少妇高潮一区二区三区99 | 久久无码人妻影院 | 鲁鲁鲁爽爽爽在线视频观看 | 精品偷自拍另类在线观看 | 亚洲精品欧美二区三区中文字幕 | 久久久久久九九精品久 | 鲁一鲁av2019在线 | 2020久久超碰国产精品最新 | 鲁鲁鲁爽爽爽在线视频观看 | 日本一区二区三区免费高清 | 国产成人无码av在线影院 | 97久久精品无码一区二区 | 好男人社区资源 | 日日摸夜夜摸狠狠摸婷婷 | 日本一卡二卡不卡视频查询 | 99精品无人区乱码1区2区3区 | 国产亚洲精品久久久久久久 | 精品国产福利一区二区 | 奇米影视888欧美在线观看 | 国产舌乚八伦偷品w中 | 中文字幕无码av波多野吉衣 | 老太婆性杂交欧美肥老太 | 99精品无人区乱码1区2区3区 | 国产高清不卡无码视频 | 2020久久香蕉国产线看观看 | 国产成人无码av片在线观看不卡 | 欧美阿v高清资源不卡在线播放 | 伦伦影院午夜理论片 | 亚洲区欧美区综合区自拍区 | 一本大道伊人av久久综合 | 欧美黑人巨大xxxxx | 亚洲人成影院在线无码按摩店 | 超碰97人人射妻 | 国产麻豆精品精东影业av网站 | 九九久久精品国产免费看小说 | 男人和女人高潮免费网站 | 亚洲va欧美va天堂v国产综合 | 午夜无码人妻av大片色欲 | 天堂а√在线地址中文在线 | 激情国产av做激情国产爱 | 国产av无码专区亚洲awww | 无码人妻丰满熟妇区五十路百度 | 精品厕所偷拍各类美女tp嘘嘘 | 国产口爆吞精在线视频 | 中国女人内谢69xxxx | 奇米影视7777久久精品 | 国产精品沙发午睡系列 | 精品乱子伦一区二区三区 | 无码国产乱人伦偷精品视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 一本久久伊人热热精品中文字幕 | 人人妻人人澡人人爽欧美一区九九 | 日韩精品a片一区二区三区妖精 | 国产suv精品一区二区五 | 野狼第一精品社区 | 天堂无码人妻精品一区二区三区 | 内射巨臀欧美在线视频 | 国产午夜无码精品免费看 | 国精品人妻无码一区二区三区蜜柚 | 在线观看国产一区二区三区 | 国产偷抇久久精品a片69 | 玩弄少妇高潮ⅹxxxyw | 成 人 网 站国产免费观看 | 久久久中文字幕日本无吗 | 无码乱肉视频免费大全合集 | 牲欲强的熟妇农村老妇女 | 中文无码精品a∨在线观看不卡 | 伊人久久大香线蕉午夜 | 狠狠亚洲超碰狼人久久 | 欧美怡红院免费全部视频 | 性色欲情网站iwww九文堂 | 2019nv天堂香蕉在线观看 | 人人澡人摸人人添 | 亚洲の无码国产の无码影院 | 国产无遮挡又黄又爽免费视频 | 亚洲精品一区二区三区在线观看 | 欧美成人午夜精品久久久 | 999久久久国产精品消防器材 | 亚洲天堂2017无码 | 无码av岛国片在线播放 | 熟女少妇在线视频播放 | 精品熟女少妇av免费观看 | 久久精品人妻少妇一区二区三区 | 亚洲综合色区中文字幕 | 国产成人精品优优av | 男女超爽视频免费播放 | 国产精品办公室沙发 | 亚洲码国产精品高潮在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧美喷潮久久久xxxxx | av人摸人人人澡人人超碰下载 | 内射巨臀欧美在线视频 | 国产精品igao视频网 | 天堂一区人妻无码 | 国产精品人人爽人人做我的可爱 | 中文字幕无码日韩欧毛 | 最近中文2019字幕第二页 | 国产艳妇av在线观看果冻传媒 | 动漫av一区二区在线观看 | 性色欲网站人妻丰满中文久久不卡 | 国产特级毛片aaaaaa高潮流水 | 久久久久亚洲精品男人的天堂 | 欧美人与善在线com | 无码免费一区二区三区 | 国产人妖乱国产精品人妖 | 亚洲区欧美区综合区自拍区 | 国产av人人夜夜澡人人爽麻豆 | 久久99精品久久久久久 | 日韩人妻无码中文字幕视频 | 18精品久久久无码午夜福利 | 精品国产一区av天美传媒 | 国内精品九九久久久精品 | 亚洲无人区午夜福利码高清完整版 | 亚洲精品国产a久久久久久 | 亚洲国产成人av在线观看 | 国产乱人无码伦av在线a | 亚洲国产精品久久久天堂 | 天堂а√在线地址中文在线 | 狂野欧美激情性xxxx | 国产手机在线αⅴ片无码观看 | 亚洲人成影院在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲最大成人网站 | 久久精品国产99精品亚洲 | 秋霞特色aa大片 | 人妻插b视频一区二区三区 | 无码av最新清无码专区吞精 | 天天拍夜夜添久久精品 | 人人妻人人澡人人爽欧美精品 | 国产又爽又黄又刺激的视频 | 少妇无套内谢久久久久 | 欧美精品免费观看二区 | 日韩 欧美 动漫 国产 制服 | 99久久久无码国产aaa精品 | 黑人玩弄人妻中文在线 | 老熟女乱子伦 | 亚洲人成影院在线无码按摩店 | 久久精品人人做人人综合 | 精品一区二区不卡无码av | 亚欧洲精品在线视频免费观看 | 国产在热线精品视频 | 色一情一乱一伦一区二区三欧美 | 亚洲 日韩 欧美 成人 在线观看 | 无码人妻黑人中文字幕 | 色综合久久网 | 老熟妇乱子伦牲交视频 | 成 人 网 站国产免费观看 | 国精产品一品二品国精品69xx | 少妇无套内谢久久久久 | 久久国产精品精品国产色婷婷 | 日韩精品无码一区二区中文字幕 | 国产精品人妻一区二区三区四 | 好爽又高潮了毛片免费下载 | 国产乱人无码伦av在线a | 亚洲中文字幕va福利 | 亚洲乱码国产乱码精品精 | 精品偷拍一区二区三区在线看 | 国产成人精品一区二区在线小狼 | 国产精品va在线播放 | 国产精品手机免费 | 亚洲国产精品无码久久久久高潮 | 欧美丰满熟妇xxxx性ppx人交 | 黑人巨大精品欧美一区二区 | 男女下面进入的视频免费午夜 | 久久精品人人做人人综合试看 | 日韩无套无码精品 | 东京无码熟妇人妻av在线网址 | 久久综合香蕉国产蜜臀av | 熟妇人妻中文av无码 | 国产超级va在线观看视频 | 在线欧美精品一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 露脸叫床粗话东北少妇 | 亚洲精品国偷拍自产在线观看蜜桃 | 波多野结衣aⅴ在线 | 三上悠亚人妻中文字幕在线 | 国产一区二区不卡老阿姨 | 极品嫩模高潮叫床 | 国产凸凹视频一区二区 | 草草网站影院白丝内射 | 成人欧美一区二区三区 | 中文字幕无码日韩专区 | 久久亚洲日韩精品一区二区三区 | 扒开双腿疯狂进出爽爽爽视频 | 中文字幕精品av一区二区五区 | 欧美自拍另类欧美综合图片区 | 日本精品久久久久中文字幕 | 久久国产自偷自偷免费一区调 | 无码国产色欲xxxxx视频 | 青草青草久热国产精品 | 亚洲啪av永久无码精品放毛片 | 爆乳一区二区三区无码 | 欧美兽交xxxx×视频 | 国产成人无码专区 | 亚洲娇小与黑人巨大交 | 成人三级无码视频在线观看 | 国产亚洲精品久久久闺蜜 | 美女张开腿让人桶 | 亚洲综合精品香蕉久久网 | 亚洲国产精品一区二区第一页 | 免费观看激色视频网站 | 欧美黑人乱大交 | 久久精品中文字幕大胸 | 久久综合久久自在自线精品自 | 久久久久久a亚洲欧洲av冫 | 国产精品自产拍在线观看 | 狂野欧美性猛xxxx乱大交 | 国产精品国产自线拍免费软件 | 中文无码伦av中文字幕 | 欧美国产亚洲日韩在线二区 | 少妇被黑人到高潮喷出白浆 | 欧洲欧美人成视频在线 | 欧美丰满老熟妇xxxxx性 | 波多野结衣av在线观看 | 香蕉久久久久久av成人 | 亚洲一区二区三区四区 | 久久精品一区二区三区四区 | 激情五月综合色婷婷一区二区 | 亚洲精品综合一区二区三区在线 | 中文字幕中文有码在线 | 中文字幕久久久久人妻 | 日本精品久久久久中文字幕 | 久在线观看福利视频 | 久久亚洲中文字幕精品一区 | aa片在线观看视频在线播放 | 美女毛片一区二区三区四区 | 亚洲 另类 在线 欧美 制服 | 国产97在线 | 亚洲 | 亚洲色欲色欲欲www在线 | 欧美老妇与禽交 | 中文字幕日产无线码一区 | 国色天香社区在线视频 | 日韩av激情在线观看 | 欧美xxxxx精品 | 无码国产乱人伦偷精品视频 | 国产成人综合美国十次 | 日日天干夜夜狠狠爱 | 无遮挡啪啪摇乳动态图 | 人妻插b视频一区二区三区 | 久久精品中文字幕大胸 | 日日碰狠狠丁香久燥 | 7777奇米四色成人眼影 | 一本久久a久久精品vr综合 | 中文字幕av日韩精品一区二区 | 久久99精品国产.久久久久 | 九九久久精品国产免费看小说 | 男女作爱免费网站 | 欧美人与牲动交xxxx | 精品久久综合1区2区3区激情 | 国产亚洲精品久久久久久国模美 | 天天拍夜夜添久久精品大 | 99久久精品无码一区二区毛片 | 激情综合激情五月俺也去 | 中文字幕日产无线码一区 | 亚洲精品无码国产 | 无码av岛国片在线播放 | 国产两女互慰高潮视频在线观看 | 色 综合 欧美 亚洲 国产 | 亚洲精品国产品国语在线观看 | 99久久99久久免费精品蜜桃 | 国产成人综合美国十次 | 人人爽人人爽人人片av亚洲 | 丰满肥臀大屁股熟妇激情视频 | 无码成人精品区在线观看 | 久久久亚洲欧洲日产国码αv | 欧美亚洲国产一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 久久综合九色综合欧美狠狠 | 久久久久久亚洲精品a片成人 | 97久久国产亚洲精品超碰热 | 青青青爽视频在线观看 | 国产精品久久精品三级 | 露脸叫床粗话东北少妇 | 亚洲中文字幕无码中文字在线 | 国产乱人伦偷精品视频 | 少妇性荡欲午夜性开放视频剧场 | 亚洲七七久久桃花影院 | 无码中文字幕色专区 | 熟妇激情内射com | 亚洲人成影院在线无码按摩店 | 国产成人无码区免费内射一片色欲 | 国产成人综合在线女婷五月99播放 | www成人国产高清内射 | 国产热a欧美热a在线视频 | 欧美乱妇无乱码大黄a片 | 高清国产亚洲精品自在久久 | 亚洲一区二区观看播放 | 亚洲精品www久久久 | 国产超碰人人爽人人做人人添 | 精品 日韩 国产 欧美 视频 | 精品人妻人人做人人爽夜夜爽 | 久久久国产一区二区三区 | 午夜成人1000部免费视频 | 成人无码影片精品久久久 | 亚洲天堂2017无码中文 | 狠狠躁日日躁夜夜躁2020 | 一区二区三区乱码在线 | 欧洲 | 美女张开腿让人桶 | 免费国产成人高清在线观看网站 | 欧美猛少妇色xxxxx | 99精品久久毛片a片 | 国产成人精品优优av | 亚洲精品成人福利网站 | 无码人中文字幕 | 久久国内精品自在自线 | 久久久国产精品无码免费专区 | 亚洲欧美国产精品久久 | 玩弄少妇高潮ⅹxxxyw | 呦交小u女精品视频 | 亚洲成av人在线观看网址 | 日韩av无码一区二区三区不卡 | 婷婷六月久久综合丁香 | 成人欧美一区二区三区 | 国产精华av午夜在线观看 | 日日天干夜夜狠狠爱 | 狠狠色噜噜狠狠狠7777奇米 | 久久久久久亚洲精品a片成人 | 中国大陆精品视频xxxx | 老熟女乱子伦 | 亚洲aⅴ无码成人网站国产app | 国产精品理论片在线观看 | 少妇被黑人到高潮喷出白浆 | 精品久久久无码中文字幕 | 波多野结衣av在线观看 | 国产精品高潮呻吟av久久4虎 | 久久久av男人的天堂 | 日本xxxx色视频在线观看免费 | 在线天堂新版最新版在线8 | 中文毛片无遮挡高清免费 | 亚洲一区二区三区含羞草 | 日本丰满护士爆乳xxxx | 亚洲精品午夜国产va久久成人 | 动漫av一区二区在线观看 | 欧美人与牲动交xxxx | 少妇太爽了在线观看 | 色婷婷av一区二区三区之红樱桃 | 东北女人啪啪对白 | 欧美野外疯狂做受xxxx高潮 | 99国产精品白浆在线观看免费 | 日韩亚洲欧美中文高清在线 | 亚洲日韩av片在线观看 | 波多野结衣av在线观看 | 日本欧美一区二区三区乱码 | 色婷婷av一区二区三区之红樱桃 | 精品少妇爆乳无码av无码专区 | 国产精品人人妻人人爽 | 天天燥日日燥 | 婷婷色婷婷开心五月四房播播 | 久精品国产欧美亚洲色aⅴ大片 | 四虎永久在线精品免费网址 | 日产精品高潮呻吟av久久 | 波多野结衣一区二区三区av免费 | 99久久久无码国产aaa精品 | 精品一二三区久久aaa片 | 亚洲无人区午夜福利码高清完整版 | 亚洲精品久久久久中文第一幕 | 精品久久久久久亚洲精品 | 久久综合激激的五月天 | 99久久人妻精品免费二区 | 激情内射亚州一区二区三区爱妻 | 中文字幕人妻无码一区二区三区 | 欧美激情内射喷水高潮 | 欧美自拍另类欧美综合图片区 | 欧美黑人巨大xxxxx | 久久久国产一区二区三区 | 国产精品美女久久久久av爽李琼 | 国内精品人妻无码久久久影院 | 精品偷拍一区二区三区在线看 | 麻豆国产人妻欲求不满 | 免费无码午夜福利片69 | 狠狠色噜噜狠狠狠狠7777米奇 | 一本久久a久久精品vr综合 | 水蜜桃亚洲一二三四在线 | 亚洲一区av无码专区在线观看 | 红桃av一区二区三区在线无码av | 国产人妻久久精品二区三区老狼 | 成人aaa片一区国产精品 | 亚洲第一无码av无码专区 | 亚洲精品国偷拍自产在线麻豆 | 久久久成人毛片无码 | www国产亚洲精品久久久日本 | 熟女少妇在线视频播放 | 国产成人人人97超碰超爽8 | 精品久久久久久亚洲精品 | 国产精品免费大片 | 国产精品99爱免费视频 | 亚洲中文字幕av在天堂 | 婷婷丁香六月激情综合啪 | 性啪啪chinese东北女人 | 久久人人爽人人爽人人片av高清 | 午夜理论片yy44880影院 | 女高中生第一次破苞av | 精品 日韩 国产 欧美 视频 | 国产xxx69麻豆国语对白 | 国产舌乚八伦偷品w中 | 国产亚洲精品久久久久久大师 | 无人区乱码一区二区三区 | 一本久道久久综合狠狠爱 | 色欲综合久久中文字幕网 | 麻豆精品国产精华精华液好用吗 | 中文字幕无码日韩欧毛 | 精品国产国产综合精品 | 亚洲欧洲中文日韩av乱码 | 日本欧美一区二区三区乱码 | 精品乱码久久久久久久 | 久青草影院在线观看国产 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产猛烈高潮尖叫视频免费 | 波多野结衣一区二区三区av免费 | 性做久久久久久久久 | 亚洲色欲色欲欲www在线 | 久久99精品久久久久婷婷 | 亚洲一区二区观看播放 | 国产精品美女久久久久av爽李琼 | 欧美怡红院免费全部视频 | 中文精品无码中文字幕无码专区 | 3d动漫精品啪啪一区二区中 | 无码一区二区三区在线观看 | 国产精品无码一区二区三区不卡 | 扒开双腿吃奶呻吟做受视频 | 天海翼激烈高潮到腰振不止 | 在线成人www免费观看视频 | 两性色午夜视频免费播放 | 久久国产精品萌白酱免费 | 亚洲天堂2017无码中文 | 免费人成网站视频在线观看 | 日日摸天天摸爽爽狠狠97 | 国产午夜视频在线观看 | 久久99精品久久久久婷婷 | 免费人成网站视频在线观看 | 高清不卡一区二区三区 | 亚洲中文字幕在线无码一区二区 | 久久国产自偷自偷免费一区调 | 成熟女人特级毛片www免费 | 全球成人中文在线 | 中文字幕无码乱人伦 | 激情内射亚州一区二区三区爱妻 | 国产成人一区二区三区在线观看 | 无码国产激情在线观看 | 日日麻批免费40分钟无码 | 中文字幕乱码亚洲无线三区 | 中文无码成人免费视频在线观看 | 国产激情一区二区三区 | 少女韩国电视剧在线观看完整 | 国产一区二区三区四区五区加勒比 | 日产国产精品亚洲系列 | 内射白嫩少妇超碰 | 呦交小u女精品视频 | 夜夜躁日日躁狠狠久久av | 国产精品多人p群无码 | 野外少妇愉情中文字幕 | 国产午夜福利100集发布 | 99久久人妻精品免费二区 | 麻豆人妻少妇精品无码专区 | 久久久久久久久888 | 色一情一乱一伦一区二区三欧美 | 中文字幕乱码中文乱码51精品 | 又大又硬又黄的免费视频 | 婷婷丁香五月天综合东京热 | 国产性生交xxxxx无码 | 国产成人久久精品流白浆 | 精品人妻中文字幕有码在线 | 国内精品人妻无码久久久影院蜜桃 | 精品偷自拍另类在线观看 | 精品国产一区av天美传媒 | 亚拍精品一区二区三区探花 | 野外少妇愉情中文字幕 | 综合人妻久久一区二区精品 | 激情内射日本一区二区三区 | 欧洲美熟女乱又伦 | 久久国产36精品色熟妇 | 亚洲一区二区三区国产精华液 | 又黄又爽又色的视频 | 成年女人永久免费看片 | 日日天日日夜日日摸 | 在线播放免费人成毛片乱码 | 欧美亚洲日韩国产人成在线播放 | 欧美性猛交内射兽交老熟妇 | 人妻与老人中文字幕 | 免费乱码人妻系列无码专区 | 无码国内精品人妻少妇 | 老司机亚洲精品影院无码 | 国产卡一卡二卡三 | 日产精品高潮呻吟av久久 | 婷婷色婷婷开心五月四房播播 | 久久亚洲中文字幕无码 | 精品人妻av区 | 午夜精品一区二区三区的区别 | 国产精品久久国产精品99 | 乱人伦人妻中文字幕无码 | 一本色道久久综合亚洲精品不卡 | 国产精品久久久一区二区三区 | 成在人线av无码免观看麻豆 | 蜜桃视频插满18在线观看 | 亚洲国产精品无码一区二区三区 | 荫蒂添的好舒服视频囗交 | 亚洲成a人片在线观看无码3d | 无码人妻丰满熟妇区五十路百度 | 亚洲国产精品毛片av不卡在线 | 成人欧美一区二区三区黑人 | 亚洲另类伦春色综合小说 | 麻花豆传媒剧国产免费mv在线 | 国产综合久久久久鬼色 | 国产成人av免费观看 | 欧美日韩综合一区二区三区 | 人人妻人人澡人人爽人人精品 | 扒开双腿疯狂进出爽爽爽视频 | 欧美三级不卡在线观看 | ass日本丰满熟妇pics | 成人精品天堂一区二区三区 | 日本丰满护士爆乳xxxx | 日本一区二区三区免费高清 | 青青青手机频在线观看 | 国产精品人人妻人人爽 | 久久五月精品中文字幕 | 久久精品视频在线看15 | 西西人体www44rt大胆高清 | 漂亮人妻洗澡被公强 日日躁 | 亚洲人成人无码网www国产 | 中文字幕无线码 | 日韩 欧美 动漫 国产 制服 | 欧美日韩久久久精品a片 | 色诱久久久久综合网ywww | 天天做天天爱天天爽综合网 | 精品国产青草久久久久福利 | 精品一区二区三区无码免费视频 | 午夜精品久久久久久久久 | 久久久久久国产精品无码下载 | 国产精品国产自线拍免费软件 | 久久综合香蕉国产蜜臀av | 亚洲国产精华液网站w | 少妇厨房愉情理9仑片视频 | 亚洲日韩一区二区 | 国产精品无码久久av | 久久zyz资源站无码中文动漫 | 自拍偷自拍亚洲精品10p | 亚洲精品综合一区二区三区在线 | 综合激情五月综合激情五月激情1 | 欧美 丝袜 自拍 制服 另类 | 国产激情无码一区二区 | 老熟女重囗味hdxx69 | 亚洲另类伦春色综合小说 | 国产热a欧美热a在线视频 | 国产亚洲人成在线播放 | 亚洲一区二区三区香蕉 | 55夜色66夜色国产精品视频 | 夜夜高潮次次欢爽av女 | √天堂中文官网8在线 | 欧美乱妇无乱码大黄a片 | 国产午夜手机精彩视频 | 激情爆乳一区二区三区 | 日本xxxx色视频在线观看免费 | 丰满肥臀大屁股熟妇激情视频 | 乱码午夜-极国产极内射 | 丰满少妇高潮惨叫视频 | 未满小14洗澡无码视频网站 | 任你躁在线精品免费 | 午夜福利一区二区三区在线观看 | 婷婷综合久久中文字幕蜜桃三电影 | 国产成人精品必看 | 麻豆精品国产精华精华液好用吗 | 色五月五月丁香亚洲综合网 | 日韩精品无码一区二区中文字幕 | 亚洲第一无码av无码专区 | 亚洲日韩精品欧美一区二区 | 国产午夜无码精品免费看 | 97精品国产97久久久久久免费 | 图片区 小说区 区 亚洲五月 | 熟女少妇在线视频播放 | 婷婷六月久久综合丁香 | www国产精品内射老师 | 亚洲精品一区二区三区四区五区 | 亚洲综合另类小说色区 | 99国产精品白浆在线观看免费 | 午夜精品久久久久久久 | а√天堂www在线天堂小说 | 永久免费观看美女裸体的网站 | 久久精品女人的天堂av | 精品一二三区久久aaa片 | 又粗又大又硬又长又爽 | 麻豆成人精品国产免费 | 18精品久久久无码午夜福利 | 97久久国产亚洲精品超碰热 | 午夜福利试看120秒体验区 | 中文精品无码中文字幕无码专区 | 一本久久a久久精品亚洲 | 久久99久久99精品中文字幕 | 97无码免费人妻超级碰碰夜夜 | 久久视频在线观看精品 | 精品偷拍一区二区三区在线看 | 国产精品无码一区二区三区不卡 | 国产特级毛片aaaaaaa高清 | 国产精品爱久久久久久久 | 青青久在线视频免费观看 | 四虎永久在线精品免费网址 | 欧美激情综合亚洲一二区 | 正在播放老肥熟妇露脸 | 国产亚洲美女精品久久久2020 | 99精品国产综合久久久久五月天 | 久久成人a毛片免费观看网站 | 高清国产亚洲精品自在久久 | 免费人成网站视频在线观看 | 国产农村妇女高潮大叫 | 欧美变态另类xxxx | 东京热无码av男人的天堂 | 丰满人妻一区二区三区免费视频 | 人妻夜夜爽天天爽三区 | 人人澡人人透人人爽 | 国产又粗又硬又大爽黄老大爷视 | 午夜成人1000部免费视频 | 人妻少妇精品久久 | 午夜无码区在线观看 | 久久久久成人精品免费播放动漫 | 成人无码影片精品久久久 | 亚洲国产av美女网站 | 日韩av无码一区二区三区不卡 | 无套内谢老熟女 | 激情五月综合色婷婷一区二区 | 小鲜肉自慰网站xnxx | 国产成人无码区免费内射一片色欲 | 免费看少妇作爱视频 | 亚洲色成人中文字幕网站 | 成年美女黄网站色大免费全看 | 国产亚洲精品久久久久久久久动漫 | 免费无码的av片在线观看 | 免费中文字幕日韩欧美 | 亚洲色欲色欲天天天www | 免费人成网站视频在线观看 | 亚洲国产精品久久久天堂 | 久久久久99精品成人片 | 欧美亚洲国产一区二区三区 | 亚洲日本一区二区三区在线 | 丰满人妻翻云覆雨呻吟视频 | 无套内射视频囯产 | 任你躁在线精品免费 | 国产va免费精品观看 | 久久久久成人精品免费播放动漫 | 国产办公室秘书无码精品99 | 国产又爽又猛又粗的视频a片 | 欧美日韩精品 | 在线播放亚洲第一字幕 | 高清不卡一区二区三区 | 国产精品久久福利网站 | 日本丰满护士爆乳xxxx | 国产精品欧美成人 | 在线 国产 欧美 亚洲 天堂 | 国产乱子伦视频在线播放 | 无码人妻精品一区二区三区下载 | 久久久精品456亚洲影院 | 波多野结衣av在线观看 | 久久久中文久久久无码 | 在线播放亚洲第一字幕 | 久久精品中文闷骚内射 | 日产精品高潮呻吟av久久 | 人人妻人人澡人人爽欧美精品 | 性色欲网站人妻丰满中文久久不卡 | 妺妺窝人体色www在线小说 | а天堂中文在线官网 | 超碰97人人射妻 | 午夜肉伦伦影院 | 久久精品国产一区二区三区 | 亚洲精品鲁一鲁一区二区三区 | 麻豆精品国产精华精华液好用吗 | 2019午夜福利不卡片在线 | 国产精品亚洲综合色区韩国 | 99国产欧美久久久精品 | 丰满少妇人妻久久久久久 | 亚洲中文字幕久久无码 | 国精产品一区二区三区 | 亚洲精品一区二区三区在线 | 蜜臀aⅴ国产精品久久久国产老师 | 香蕉久久久久久av成人 | 99国产精品白浆在线观看免费 | 2020久久香蕉国产线看观看 | 欧美人与禽猛交狂配 | 色婷婷欧美在线播放内射 | 精品无码一区二区三区爱欲 | 久久精品一区二区三区四区 | 久久国产自偷自偷免费一区调 | 国产黄在线观看免费观看不卡 | 亚洲狠狠色丁香婷婷综合 | 亚洲欧美综合区丁香五月小说 | 国产午夜亚洲精品不卡 | 欧美阿v高清资源不卡在线播放 | 人人妻人人澡人人爽欧美精品 | 蜜臀av无码人妻精品 | 日本爽爽爽爽爽爽在线观看免 | 欧美人妻一区二区三区 | 真人与拘做受免费视频一 | 亚洲国产精品久久久天堂 | 精品一区二区三区无码免费视频 | 福利一区二区三区视频在线观看 | 国产精品亚洲五月天高清 | 久久久久亚洲精品男人的天堂 | 漂亮人妻洗澡被公强 日日躁 | 欧美亚洲国产一区二区三区 | 一本久久a久久精品亚洲 | 日韩在线不卡免费视频一区 | 国产sm调教视频在线观看 | 内射爽无广熟女亚洲 | 中文字幕无码人妻少妇免费 | 在线观看免费人成视频 | 又大又硬又黄的免费视频 | 无码吃奶揉捏奶头高潮视频 | 正在播放老肥熟妇露脸 | 国产无套内射久久久国产 | 亚洲国产精品一区二区第一页 | 成人精品视频一区二区三区尤物 | 精品久久8x国产免费观看 | 欧美日韩视频无码一区二区三 | 初尝人妻少妇中文字幕 | 国产人妻久久精品二区三区老狼 | 乱码午夜-极国产极内射 | 日韩在线不卡免费视频一区 | 中文毛片无遮挡高清免费 | 亚洲成av人综合在线观看 | 国产精品福利视频导航 | 九九综合va免费看 | 国产午夜亚洲精品不卡下载 | 亚洲а∨天堂久久精品2021 | 无人区乱码一区二区三区 | 欧美国产日韩亚洲中文 | 麻豆人妻少妇精品无码专区 | 精品水蜜桃久久久久久久 | 亚洲成av人综合在线观看 | 99re在线播放 | 亚洲成熟女人毛毛耸耸多 | 中文精品无码中文字幕无码专区 | 六月丁香婷婷色狠狠久久 | 未满小14洗澡无码视频网站 | 黑人玩弄人妻中文在线 | 内射后入在线观看一区 | 色综合久久久无码中文字幕 | 少妇激情av一区二区 | 激情亚洲一区国产精品 | 狠狠亚洲超碰狼人久久 | 无码中文字幕色专区 | 国产精品久久久久久久9999 | 中文字幕人妻无码一区二区三区 | 中文字幕av日韩精品一区二区 | 夜精品a片一区二区三区无码白浆 | 欧美xxxx黑人又粗又长 | 久9re热视频这里只有精品 | 无码纯肉视频在线观看 | 亚洲国产高清在线观看视频 | 欧美兽交xxxx×视频 | 欧美自拍另类欧美综合图片区 | 午夜精品一区二区三区的区别 | 日韩精品无码一区二区中文字幕 | 亚洲综合无码久久精品综合 | 欧美丰满熟妇xxxx | 欧美 日韩 人妻 高清 中文 | av无码电影一区二区三区 | 奇米影视888欧美在线观看 | www国产亚洲精品久久网站 | 中文字幕无码视频专区 | 精品成在人线av无码免费看 | 国産精品久久久久久久 | 亚洲人成无码网www | 久久亚洲精品中文字幕无男同 | 欧美精品在线观看 | 午夜成人1000部免费视频 | 久久久成人毛片无码 | 任你躁在线精品免费 | 亚洲男人av天堂午夜在 | 久久精品人妻少妇一区二区三区 | 日本一本二本三区免费 | 亚洲区欧美区综合区自拍区 | 黑人粗大猛烈进出高潮视频 | 久久精品99久久香蕉国产色戒 | 动漫av一区二区在线观看 | 国产美女极度色诱视频www | 国产成人综合色在线观看网站 | 日韩欧美中文字幕公布 | 久久国产劲爆∧v内射 | 天堂无码人妻精品一区二区三区 | 老司机亚洲精品影院无码 | 熟妇人妻无码xxx视频 | 亚洲综合在线一区二区三区 | 人妻互换免费中文字幕 | 亚洲色在线无码国产精品不卡 | 亚洲成av人综合在线观看 | 人人妻人人澡人人爽欧美一区 | 牛和人交xxxx欧美 | 性欧美疯狂xxxxbbbb | 无遮挡啪啪摇乳动态图 | 天天躁日日躁狠狠躁免费麻豆 | 久久久久久a亚洲欧洲av冫 | 无码精品人妻一区二区三区av | 亚洲 日韩 欧美 成人 在线观看 | 色婷婷综合中文久久一本 | 国产亚洲欧美日韩亚洲中文色 | 国产av无码专区亚洲awww | 国产乱人偷精品人妻a片 | 中国大陆精品视频xxxx | 免费观看的无遮挡av | 欧美老妇与禽交 | 樱花草在线播放免费中文 | ass日本丰满熟妇pics | 婷婷五月综合缴情在线视频 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲 日韩 欧美 成人 在线观看 | 天堂无码人妻精品一区二区三区 | 亚洲理论电影在线观看 | 欧美真人作爱免费视频 | 精品久久久久久人妻无码中文字幕 | 2020久久香蕉国产线看观看 | 国产性生大片免费观看性 | 人妻少妇精品久久 | 精品少妇爆乳无码av无码专区 | 好屌草这里只有精品 | 少妇被粗大的猛进出69影院 | 成人精品天堂一区二区三区 | 久久久无码中文字幕久... | 免费观看激色视频网站 | 亚洲国产精品久久人人爱 | 国色天香社区在线视频 | 亚洲成av人片在线观看无码不卡 | 激情亚洲一区国产精品 | 中文字幕人妻无码一夲道 | 国产乱人无码伦av在线a | 在线播放免费人成毛片乱码 | 秋霞特色aa大片 | 51国偷自产一区二区三区 | 久久国产劲爆∧v内射 | 中文字幕 亚洲精品 第1页 | 日本丰满熟妇videos | 精品国产精品久久一区免费式 | 国产精品无码成人午夜电影 | 欧美老人巨大xxxx做受 | 精品aⅴ一区二区三区 | 人人妻在人人 | 国产成人精品久久亚洲高清不卡 | 人妻有码中文字幕在线 | 天天拍夜夜添久久精品大 | 未满小14洗澡无码视频网站 | 亚洲中文字幕va福利 | 亚洲日本一区二区三区在线 | 国产精品自产拍在线观看 | 女人被男人爽到呻吟的视频 | 荫蒂被男人添的好舒服爽免费视频 | 国产美女精品一区二区三区 | 色狠狠av一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲成a人片在线观看无码 | 伊人久久婷婷五月综合97色 | 国产成人精品三级麻豆 | 伦伦影院午夜理论片 | 性生交片免费无码看人 | 国产精品办公室沙发 | 99久久人妻精品免费二区 | 亚洲の无码国产の无码影院 | 免费国产成人高清在线观看网站 | 日韩人妻少妇一区二区三区 | 国内精品人妻无码久久久影院 | 国产午夜亚洲精品不卡下载 | 亚洲一区二区观看播放 | 免费观看黄网站 | www国产亚洲精品久久久日本 | 中文字幕久久久久人妻 | 欧洲精品码一区二区三区免费看 | 久久人人爽人人人人片 | 亚洲成色www久久网站 | 国产精品丝袜黑色高跟鞋 | 特黄特色大片免费播放器图片 | 四虎国产精品免费久久 | 无码国产色欲xxxxx视频 | a片在线免费观看 | 亚洲中文字幕无码中文字在线 | 国内老熟妇对白xxxxhd | 免费无码肉片在线观看 | 国产高潮视频在线观看 | 亚洲啪av永久无码精品放毛片 | 日韩精品久久久肉伦网站 | 日本一区二区更新不卡 | 国产亚洲欧美日韩亚洲中文色 | 午夜不卡av免费 一本久久a久久精品vr综合 | 日本大香伊一区二区三区 | 午夜福利一区二区三区在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品久久久久久亚洲影视内衣 | 免费播放一区二区三区 | 久久亚洲精品中文字幕无男同 | 国产猛烈高潮尖叫视频免费 | 亚洲人成无码网www | 台湾无码一区二区 | 欧美日韩久久久精品a片 | 成 人 网 站国产免费观看 | 正在播放东北夫妻内射 | 男女超爽视频免费播放 | 欧美第一黄网免费网站 | 精品国产av色一区二区深夜久久 | 亚洲欧洲中文日韩av乱码 | 亚洲成在人网站无码天堂 | 亚洲国产精品无码一区二区三区 | 又大又硬又爽免费视频 | 性欧美videos高清精品 | 欧洲极品少妇 | 欧美xxxx黑人又粗又长 | 蜜桃视频韩日免费播放 | 欧美人与牲动交xxxx | 少妇邻居内射在线 | 内射爽无广熟女亚洲 | 99精品视频在线观看免费 | 久久精品中文字幕一区 | 99精品国产综合久久久久五月天 | 伊人久久大香线焦av综合影院 | 日本熟妇浓毛 | 国产办公室秘书无码精品99 | 成人av无码一区二区三区 | 亚洲精品久久久久久一区二区 | 国产成人无码av在线影院 | 国产人妻久久精品二区三区老狼 | 一本一道久久综合久久 | 少妇厨房愉情理9仑片视频 | 377p欧洲日本亚洲大胆 | 亚洲国产成人a精品不卡在线 | 日本乱偷人妻中文字幕 | 欧美精品一区二区精品久久 | 欧美精品一区二区精品久久 | 女人被男人爽到呻吟的视频 | 亚洲熟妇色xxxxx欧美老妇 | 久久99精品久久久久久动态图 | 未满小14洗澡无码视频网站 | 麻豆国产丝袜白领秘书在线观看 | 亚洲码国产精品高潮在线 | 亚无码乱人伦一区二区 | 97夜夜澡人人双人人人喊 | 亚洲午夜久久久影院 | 久久精品国产99久久6动漫 | 久久人人爽人人爽人人片av高清 | 男女下面进入的视频免费午夜 | 欧美野外疯狂做受xxxx高潮 | 精品乱码久久久久久久 | 免费国产黄网站在线观看 | 亚洲狠狠婷婷综合久久 | 美女毛片一区二区三区四区 | 日日天日日夜日日摸 | 性生交大片免费看l | 亚洲国产av精品一区二区蜜芽 | 大地资源网第二页免费观看 | 男女超爽视频免费播放 | 亚洲色欲久久久综合网东京热 | 欧美精品国产综合久久 | 久久综合给久久狠狠97色 | 欧美国产日韩亚洲中文 | 精品无码一区二区三区爱欲 | 亚洲一区二区三区含羞草 | 久激情内射婷内射蜜桃人妖 | 麻豆精产国品 | 国产无遮挡又黄又爽又色 | 亚洲娇小与黑人巨大交 | 日韩av无码一区二区三区 | 日本一区二区三区免费播放 | 性开放的女人aaa片 | 国产农村乱对白刺激视频 | 久久99精品久久久久久动态图 | 夜精品a片一区二区三区无码白浆 | 两性色午夜免费视频 | 极品嫩模高潮叫床 | 在线天堂新版最新版在线8 | 无码国模国产在线观看 | 国产真人无遮挡作爱免费视频 | 成 人 免费观看网站 | 亚洲精品久久久久久久久久久 | 欧美大屁股xxxxhd黑色 | 5858s亚洲色大成网站www | 亚洲精品午夜无码电影网 | 精品久久久久久亚洲精品 | 久久亚洲精品成人无码 | 亚洲精品鲁一鲁一区二区三区 | 男女爱爱好爽视频免费看 | 精品熟女少妇av免费观看 | 激情综合激情五月俺也去 | 麻豆人妻少妇精品无码专区 | 99久久婷婷国产综合精品青草免费 | 亚洲gv猛男gv无码男同 | 狠狠色噜噜狠狠狠狠7777米奇 | 国内少妇偷人精品视频免费 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 久久久久久a亚洲欧洲av冫 | 97精品人妻一区二区三区香蕉 | 18无码粉嫩小泬无套在线观看 | 天天摸天天透天天添 | √天堂中文官网8在线 | 帮老师解开蕾丝奶罩吸乳网站 | 成人免费无码大片a毛片 | 精品少妇爆乳无码av无码专区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日韩在线不卡免费视频一区 | 丰满少妇弄高潮了www | 老太婆性杂交欧美肥老太 | 樱花草在线社区www | 亚洲精品国产品国语在线观看 | 东京热一精品无码av | 国产精品无码永久免费888 | 亚洲人成影院在线无码按摩店 | 国产av久久久久精东av | 亚洲日本va午夜在线电影 | 日本乱人伦片中文三区 | 国产午夜无码视频在线观看 | 亚洲呦女专区 | 国产成人av免费观看 | 在线成人www免费观看视频 | 2019nv天堂香蕉在线观看 | 日本xxxx色视频在线观看免费 | a片在线免费观看 | 久久精品视频在线看15 | 亚洲精品久久久久久久久久久 | 色欲人妻aaaaaaa无码 | 图片区 小说区 区 亚洲五月 | 成人精品视频一区二区三区尤物 | 国产乡下妇女做爰 | yw尤物av无码国产在线观看 | 久久亚洲中文字幕无码 | 色综合久久88色综合天天 | 18黄暴禁片在线观看 | 人妻无码αv中文字幕久久琪琪布 | 成人女人看片免费视频放人 | 久热国产vs视频在线观看 | 国产色在线 | 国产 | 欧美激情综合亚洲一二区 | 乱人伦人妻中文字幕无码久久网 | 亚洲色偷偷偷综合网 | 一区二区三区高清视频一 | 强辱丰满人妻hd中文字幕 | 欧美三级a做爰在线观看 | 欧美性色19p | 麻豆成人精品国产免费 | 久久亚洲精品中文字幕无男同 | 六月丁香婷婷色狠狠久久 | 久久国产36精品色熟妇 | 色一情一乱一伦一视频免费看 | 少妇厨房愉情理9仑片视频 | 国产精品理论片在线观看 | 久久久av男人的天堂 | 色噜噜亚洲男人的天堂 | 欧美放荡的少妇 | 午夜理论片yy44880影院 | 国产av无码专区亚洲awww | 亚洲熟妇色xxxxx欧美老妇 | 日本高清一区免费中文视频 | 中文字幕无码av激情不卡 | 精品人妻人人做人人爽夜夜爽 | 国产精品对白交换视频 | 国产美女极度色诱视频www | 人妻人人添人妻人人爱 | 精品国精品国产自在久国产87 | 欧美老妇交乱视频在线观看 | 欧美性生交xxxxx久久久 | 成人一区二区免费视频 | 特黄特色大片免费播放器图片 | 亚洲国产精品久久久天堂 | 人人澡人人透人人爽 | 日韩人妻系列无码专区 | 国产激情无码一区二区 | 中文字幕无码免费久久9一区9 | 亚洲热妇无码av在线播放 | 2020久久超碰国产精品最新 | 日韩欧美中文字幕公布 | 日韩少妇白浆无码系列 | 人人妻人人澡人人爽欧美一区九九 | 亚洲成a人片在线观看无码 | 欧美乱妇无乱码大黄a片 | av在线亚洲欧洲日产一区二区 | 女人被爽到呻吟gif动态图视看 | 国精品人妻无码一区二区三区蜜柚 | 中文字幕无码热在线视频 | 极品嫩模高潮叫床 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 中文字幕无线码 | 欧美性猛交内射兽交老熟妇 | 美女黄网站人色视频免费国产 | 丰满少妇熟乱xxxxx视频 | 国产又粗又硬又大爽黄老大爷视 | 天堂久久天堂av色综合 | 免费无码av一区二区 | 国产成人综合色在线观看网站 | 免费网站看v片在线18禁无码 | 无码av最新清无码专区吞精 | 成人免费视频视频在线观看 免费 | 国产精品美女久久久久av爽李琼 | 亚洲精品久久久久中文第一幕 | 色综合视频一区二区三区 | 欧美精品一区二区精品久久 | 亚洲gv猛男gv无码男同 | 麻豆人妻少妇精品无码专区 | 精品厕所偷拍各类美女tp嘘嘘 | 国产成人无码区免费内射一片色欲 | 中文字幕无码日韩专区 | 国产莉萝无码av在线播放 | 亚洲欧美国产精品久久 | 久久国产36精品色熟妇 | 久久国产36精品色熟妇 | 国产av无码专区亚洲a∨毛片 | 天堂无码人妻精品一区二区三区 | 成人亚洲精品久久久久 | 狠狠噜狠狠狠狠丁香五月 | 色窝窝无码一区二区三区色欲 | 亚洲日韩中文字幕在线播放 | 久久久亚洲欧洲日产国码αv | 国产精品无码一区二区桃花视频 | 欧美真人作爱免费视频 | 牲欲强的熟妇农村老妇女视频 | 亚洲色在线无码国产精品不卡 | 中国女人内谢69xxxxxa片 | 老熟妇乱子伦牲交视频 | 欧美放荡的少妇 | 欧美日韩色另类综合 | 亚洲人成人无码网www国产 | 高清无码午夜福利视频 | 偷窥日本少妇撒尿chinese | 亚洲一区av无码专区在线观看 | 国产午夜视频在线观看 | 日本欧美一区二区三区乱码 | 亚洲熟妇色xxxxx亚洲 | 色爱情人网站 | 国产区女主播在线观看 | 亚洲一区二区三区国产精华液 | 国产成人无码av在线影院 | 综合激情五月综合激情五月激情1 | 国产精品久久久久无码av色戒 | 国产精品办公室沙发 | 午夜性刺激在线视频免费 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 一本大道伊人av久久综合 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲精品一区二区三区四区五区 | 欧美肥老太牲交大战 | 欧美激情内射喷水高潮 | 亚洲狠狠婷婷综合久久 | 一本大道伊人av久久综合 | 国产真实夫妇视频 | 亚洲一区av无码专区在线观看 | 国产成人精品无码播放 | 亚洲第一网站男人都懂 | 国产精品亚洲综合色区韩国 | 撕开奶罩揉吮奶头视频 | 好屌草这里只有精品 | 国产口爆吞精在线视频 | 欧美高清在线精品一区 | 高清国产亚洲精品自在久久 | 少妇太爽了在线观看 | 亚洲一区二区三区含羞草 | 亚洲人成影院在线观看 | 人妻少妇被猛烈进入中文字幕 | 亚洲经典千人经典日产 | 亚洲欧美中文字幕5发布 | 少妇一晚三次一区二区三区 | 欧美日韩精品 | 亚洲国产欧美在线成人 | 中文精品久久久久人妻不卡 | 沈阳熟女露脸对白视频 | 久久无码中文字幕免费影院蜜桃 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 麻豆国产人妻欲求不满 | 少妇性l交大片欧洲热妇乱xxx | 亚洲一区二区三区无码久久 | 国产精品人人妻人人爽 | 国产亚洲美女精品久久久2020 | 女人被男人躁得好爽免费视频 | 天堂久久天堂av色综合 | 久久精品女人天堂av免费观看 | 性生交片免费无码看人 | 丰满人妻翻云覆雨呻吟视频 | 欧美熟妇另类久久久久久多毛 | 搡女人真爽免费视频大全 | 色窝窝无码一区二区三区色欲 | 一本一道久久综合久久 | 97精品国产97久久久久久免费 | 国产人妻精品一区二区三区不卡 | 国产欧美亚洲精品a | 午夜不卡av免费 一本久久a久久精品vr综合 | 色婷婷欧美在线播放内射 | 俺去俺来也www色官网 | 人妻尝试又大又粗久久 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲人成人无码网www国产 | 男女爱爱好爽视频免费看 | 精品国偷自产在线视频 | 骚片av蜜桃精品一区 | 久久国产精品二国产精品 | 波多野结衣av一区二区全免费观看 | 欧美精品一区二区精品久久 | 国产精品丝袜黑色高跟鞋 | 亚洲综合另类小说色区 | 国产精品怡红院永久免费 | 亚洲精品国产精品乱码视色 | 国产精品办公室沙发 | 亚洲精品久久久久avwww潮水 | 亚洲成av人片在线观看无码不卡 | 色五月五月丁香亚洲综合网 | 在线 国产 欧美 亚洲 天堂 | 99久久精品国产一区二区蜜芽 | 欧美怡红院免费全部视频 | 国产性生大片免费观看性 | 欧美怡红院免费全部视频 | www国产亚洲精品久久网站 | 国产精品va在线观看无码 | 激情综合激情五月俺也去 | 东京热无码av男人的天堂 | 欧美激情综合亚洲一二区 | 精品国产av色一区二区深夜久久 | 亚洲爆乳大丰满无码专区 | 中文字幕日产无线码一区 | 又大又硬又黄的免费视频 | 久久综合给久久狠狠97色 | 激情国产av做激情国产爱 | 国产精品视频免费播放 | 女人被男人爽到呻吟的视频 | 中文字幕精品av一区二区五区 | 婷婷五月综合缴情在线视频 | 狠狠躁日日躁夜夜躁2020 | 又粗又大又硬又长又爽 | 丰满诱人的人妻3 | 国产综合久久久久鬼色 | 蜜臀aⅴ国产精品久久久国产老师 | 鲁大师影院在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 强伦人妻一区二区三区视频18 | 亚洲欧美中文字幕5发布 | 日本一卡2卡3卡四卡精品网站 | 亚洲码国产精品高潮在线 | 性欧美大战久久久久久久 | 国内综合精品午夜久久资源 | 377p欧洲日本亚洲大胆 | 日本精品人妻无码免费大全 | 亚洲成av人影院在线观看 | 全黄性性激高免费视频 | 亚洲欧美精品aaaaaa片 | 精品久久久久久亚洲精品 | 强伦人妻一区二区三区视频18 | 国产香蕉尹人综合在线观看 | 午夜精品一区二区三区的区别 | 国产国语老龄妇女a片 | av无码久久久久不卡免费网站 | 亚洲人成网站免费播放 | 乱码午夜-极国产极内射 | 国产亚洲精品久久久久久久 | 欧美人与禽猛交狂配 | 久久精品丝袜高跟鞋 | aa片在线观看视频在线播放 | 亚洲日韩中文字幕在线播放 | 国产美女极度色诱视频www | 久久 国产 尿 小便 嘘嘘 | 欧美成人家庭影院 | 亚洲中文字幕无码中文字在线 | 中文精品无码中文字幕无码专区 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国产亚洲精品久久久久久国模美 | 成人亚洲精品久久久久软件 | 激情亚洲一区国产精品 | 亚洲一区二区观看播放 | 国产乱人偷精品人妻a片 | 国产成人综合在线女婷五月99播放 | 亚洲码国产精品高潮在线 | 在线视频网站www色 | 亚洲综合色区中文字幕 | 又黄又爽又色的视频 | 少妇人妻偷人精品无码视频 | 亚洲理论电影在线观看 | 国产日产欧产精品精品app | 国产午夜福利100集发布 | 日韩精品无码一区二区中文字幕 | 国产精品自产拍在线观看 | 国产精品人妻一区二区三区四 | 亚洲毛片av日韩av无码 | 久久99精品久久久久久 | 亚洲精品一区三区三区在线观看 | 色婷婷综合激情综在线播放 | 午夜福利不卡在线视频 | 亚洲精品久久久久中文第一幕 | 亚洲日本va午夜在线电影 | 亚洲国产精品毛片av不卡在线 | 国产精品久久久久久久影院 | 少妇无码一区二区二三区 | 九九综合va免费看 | 久久99热只有频精品8 | 欧美日韩在线亚洲综合国产人 | 欧美日韩一区二区免费视频 | 国产99久久精品一区二区 | 成人动漫在线观看 | 亚洲精品久久久久中文第一幕 | 天堂亚洲免费视频 | 日本一卡二卡不卡视频查询 | 最近免费中文字幕中文高清百度 | 红桃av一区二区三区在线无码av | 老子影院午夜精品无码 | 日韩亚洲欧美精品综合 | 无码吃奶揉捏奶头高潮视频 | 色欲av亚洲一区无码少妇 | 日日天干夜夜狠狠爱 | 亚洲国产高清在线观看视频 | 婷婷五月综合缴情在线视频 | 又色又爽又黄的美女裸体网站 | 亚洲狠狠婷婷综合久久 | 久久久久久国产精品无码下载 | 亚洲综合精品香蕉久久网 | 2019nv天堂香蕉在线观看 | 国产av久久久久精东av | 亚洲精品中文字幕久久久久 | 免费视频欧美无人区码 | 色婷婷综合激情综在线播放 | 久久精品国产99久久6动漫 | 久久97精品久久久久久久不卡 | 一区二区三区高清视频一 | 大胆欧美熟妇xx | 欧美熟妇另类久久久久久多毛 | 精品无人区无码乱码毛片国产 | 久久综合九色综合欧美狠狠 | 亚洲自偷自偷在线制服 | 免费乱码人妻系列无码专区 | 无码人妻av免费一区二区三区 | 在线看片无码永久免费视频 | 亚洲午夜久久久影院 | 亚洲午夜福利在线观看 | 免费中文字幕日韩欧美 | 久久久久久亚洲精品a片成人 | 欧美日韩在线亚洲综合国产人 | 人妻中文无码久热丝袜 | 一二三四在线观看免费视频 | 三上悠亚人妻中文字幕在线 | 日韩av无码一区二区三区不卡 | 国产精品无码一区二区桃花视频 | 亚洲欧洲日本综合aⅴ在线 | 欧美freesex黑人又粗又大 | 搡女人真爽免费视频大全 | 中文字幕人妻无码一区二区三区 | 夫妻免费无码v看片 | 久久国产精品二国产精品 | 一个人免费观看的www视频 | 精品偷自拍另类在线观看 | 亚洲小说图区综合在线 | 国产九九九九九九九a片 | 国产人妻久久精品二区三区老狼 | 日韩无套无码精品 | 国产高清av在线播放 | 性生交大片免费看l | 成在人线av无码免费 | 亚洲精品欧美二区三区中文字幕 | 少妇的肉体aa片免费 | 国产一区二区三区影院 | 日产精品99久久久久久 | 久久亚洲a片com人成 | 国产精品无码一区二区三区不卡 | 亚洲国产精品一区二区美利坚 | 一区二区三区乱码在线 | 欧洲 | 亚洲伊人久久精品影院 | 久久精品99久久香蕉国产色戒 | 无码人妻久久一区二区三区不卡 | 欧美丰满熟妇xxxx | 夫妻免费无码v看片 | 国产成人精品优优av | 日本丰满护士爆乳xxxx | 午夜免费福利小电影 | 日日躁夜夜躁狠狠躁 | 精品水蜜桃久久久久久久 | 国产成人无码区免费内射一片色欲 | 牲欲强的熟妇农村老妇女视频 | 久久精品人妻少妇一区二区三区 | 免费观看黄网站 | 国产绳艺sm调教室论坛 | 美女扒开屁股让男人桶 | 天堂亚洲免费视频 | 丰满少妇人妻久久久久久 | 亚洲精品国产精品乱码不卡 | 九九热爱视频精品 | 丰满少妇熟乱xxxxx视频 | 欧美人与善在线com | 欧美日韩人成综合在线播放 | 国产精品久久久久久久影院 | 无套内射视频囯产 | 国产精品无码一区二区桃花视频 | 中文字幕av无码一区二区三区电影 | 中文字幕日韩精品一区二区三区 | 亚洲欧洲无卡二区视頻 | 国产真实夫妇视频 | 久久久精品成人免费观看 | 中文字幕人妻丝袜二区 | 亚洲成a人片在线观看日本 | 亚洲aⅴ无码成人网站国产app | 国产亚洲精品久久久久久大师 | 任你躁在线精品免费 | 亚洲色在线无码国产精品不卡 | 红桃av一区二区三区在线无码av | 人人超人人超碰超国产 | 最新版天堂资源中文官网 | 亚拍精品一区二区三区探花 | 熟女少妇人妻中文字幕 | 高清不卡一区二区三区 | 国产九九九九九九九a片 | 女人色极品影院 | 国产sm调教视频在线观看 | 无码精品国产va在线观看dvd | 中文字幕无码免费久久9一区9 | 性生交大片免费看l | 麻豆av传媒蜜桃天美传媒 | 国产色视频一区二区三区 | 婷婷综合久久中文字幕蜜桃三电影 | 领导边摸边吃奶边做爽在线观看 | 亚洲国产综合无码一区 | 欧洲美熟女乱又伦 | 日韩成人一区二区三区在线观看 | 欧美午夜特黄aaaaaa片 | 国产情侣作爱视频免费观看 | 久久精品无码一区二区三区 | 国产精品va在线播放 | 日本欧美一区二区三区乱码 | 日韩精品乱码av一区二区 | 欧美激情综合亚洲一二区 | 亚洲色无码一区二区三区 | 天天摸天天碰天天添 | 亚洲熟女一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 欧美三级不卡在线观看 | 欧美第一黄网免费网站 | 综合网日日天干夜夜久久 | 精品国精品国产自在久国产87 | 网友自拍区视频精品 | 国产精品第一国产精品 | 成年女人永久免费看片 | 国产成人精品三级麻豆 | 99er热精品视频 | 中文字幕av日韩精品一区二区 | 99久久亚洲精品无码毛片 | 欧洲熟妇色 欧美 | 国产精品爱久久久久久久 | 国产国语老龄妇女a片 | 亚洲中文字幕久久无码 | 久久精品成人欧美大片 | 亚洲成a人片在线观看无码 | 日日碰狠狠丁香久燥 | 国产一区二区三区精品视频 | 亚洲乱码日产精品bd | 小sao货水好多真紧h无码视频 | 国产精品久久久久影院嫩草 | 无码人妻丰满熟妇区毛片18 | 亚洲gv猛男gv无码男同 | 无码人妻丰满熟妇区毛片18 | 久久国产自偷自偷免费一区调 | 东京无码熟妇人妻av在线网址 | 少妇被黑人到高潮喷出白浆 | 久久精品国产99久久6动漫 | 东京无码熟妇人妻av在线网址 | 成 人影片 免费观看 | 国产亚洲人成a在线v网站 | 日韩精品无码一区二区中文字幕 | 亚洲国产欧美在线成人 | 国产女主播喷水视频在线观看 | 亚洲毛片av日韩av无码 | 国产在线精品一区二区三区直播 | 午夜免费福利小电影 | 国产午夜亚洲精品不卡 |