资源描述
第三章
1. 分别说明下列指令的源操作数和目的操作数各采用什么寻址方式。
(1)MOV AX,2408H (2)MOV CL,0FFH (3)MOV BX,[SI]
(4)MOV 5[BX],BL (5)MOV [BP+100H],AX (6)MOV [BX+DI],’$’
(7)MOV DX,ES:[BX+SI] (8)MOV VAL[BP+DI],DX
(9)IN AL,05H (10)MOV DS,AX
答:(1)立即数,寄存器 (2)立即数,寄存器 (3)寄存器间接,寄存器
(4)寄存器,寄存器相对 (5)寄存器,寄存器相对 (6)立即数,基址变址
(7)基址变址,寄存器 (8)寄存器,相对基址变址
(9)直接端口寻址,寄存器 (10)寄存器,寄存器
2. 已知:DS=1000H,BX=0200H,SI=02H,内存10200H~10205H 单元的内容分别为10H,
2AH,3CH,46H,59H,6BH。下列每条指令执行完后AX 寄存器的内容各是什么?
(1)MOV AX,0200H (2)MOV AX,[200H] (3)MOV AX,BX
(4)MOV AX,3[BX] (5)MOV AX,[BX+SI] (6)MOV AX,2[BX+SI]
答:(1)0200H (2)2A10H (3)0200H
(4)5946H (5)463CH (6)6B59H
3. 设DS=1000H,ES=2000H,SS=3500H,SI=00A0H,DI=0024H,BX=0100H,BP=0200H,
数据段中变量名为VAL 的偏移地址值为0030H,试说明下列源操作数字段的寻址方式是什
么?物理地址值是多少?
(1)MOV AX,[100H] (2)MOV AX,VAL (3)MOV AX,[BX]
(4)MOV AX,ES:[BX] (5)MOV AX,[SI] (6)MOV AX,[BX+10H]
(7)MOV AX,[BP] (8)MOV AX,VAL[BP][SI]
(9)MOV AX,VAL[BX][DI] (10)MOV AX,[BP][DI]
答:(1)直接,10100H (2)直接,10030H (3)寄存器间接,10100H
(4)寄存器间接,20100H (5)寄存器间接,100A0H (6)寄存器相对,10110H
(7)寄存器间接,35200H (8)相对基址变址,352D0H
(9)相对基址变址,10154H (10)基址变址,35224H
4. 写出下列指令的机器码
(1)MOV AL,CL (2)MOV DX,CX (3)MOV [BX+100H],3150H
答:(1)10001010 11000001B
(2)10001011 11010001B
(3)11000111 10000111 00000000 00000001 01010000 00110001B
5. 已知程序的数据段为:
DATA SEGMENT
A DB ‘$’,10H
B DB ‘COMPUTER’
C DW 1234H, 0FFH
D DB 5 DUP(?)
E DD 1200459AH
DATA ENDS
求下列程序段执行后的结果是什么。
MOV AL, A
MOV DX, C
XCHG DL, A
MOV BX, OFFSET B
MOV CX, 3[BX]
LEA BX, D
LDS SI, E
LES DI, E
答:MOV AL, A AL=24H
MOV DX, C DX=1234H
XCHG DL, A DL=24H, A=34H
MOV BX, OFFSET B BX=2
MOV CX, 3[BX] CX=5550H
LEA BX, D BX=000EH
LDS SI, E DS=1200H, SI=459AH
LES DI, E ES=1200H, DI=459AH
6. 指出下列指令中哪些是错误的,错在什么地方。
(1)MOV DL,AX (2)MOV 8650H,AX (3)MOV DS,0200H
(4)MOV [BX],[1200H] (5)MOV IP,0FFH (6)MOV [BX+SI+3],IP
(7)MOV AX,[BX][BP] (8)MOV AL,ES:[BP] (9)MOV DL,[SI][DI]
(10)MOV AX,OFFSET 0A20H (11)MOV AL,OFFSET TABLE
(12)XCHG AL,50H (13)IN BL,05H (14)OUT AL,0FFEH
答:(1)长度不匹配 (2)立即数不能做目的操作数
(3)段寄存器不能用立即数赋值 (4)两个内存单元不能直接传送数据
(5)IP 不能用指令直接修改 (6)指令中不能出现 IP
(7)BX/BP 应与 SI/DI 搭配 (8)正确
(9)SI/DI 应与 BX/BP 搭配 (10)OFFSET 后应跟内存单元
(11)偏移地址为16 位,AL 长度不够 (12)立即数不能用于XCHG
(13)IN 必须用 AL/AX (14)操作数顺序反向;地址应为 8 位
7. 已知当前数据段中有一个十进制数字0~9 的7 段代码表,其数值依次为40H,79H,24H,
30H,19H,12H,02H,78H,00H,18H。要求用XLAT 指令将十进制数57 转换成相应的
7 段代码值,存到BX 寄存器中,试写出相应的程序段。
答: DATA SEGMENT
TABLE DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,18H
DATA ENDS
……
MOV AL,5
MOV BX,OFFSET TABLE
XLAT TABLE
MOV CL,AL
MOV AL,7
XLAT TABLE
MOV BL,AL
MOV BH,CL
8. 已知当前SS=1050H,SP=0100H,AX=4860H,BX=1287H,试用示意图表示执行下列指
令过程中,堆栈中的内容和堆栈指针SP 是怎样变化的。
PUSH AX
PUSH BX
POP BX
POP AX
(1)指
9. 下列指令完成什么功能?
(1)ADD AL,DH (2)ADC BX,CX (3)SUB AX,2710H
(4)DEC BX (5)NEG CX (6)INC BL
(7)MUL BX (8)DIV CL
答:(1)AL+DH→AL (2)BX+CX+CF→BX (3)AX-2710H→AX
(__________4)BX-1→BX (5)0-CX→CX (6)BL+1→BL
(7)AX*BX→DX,AX (8)AX/CL 商→AL,余数→AH
10. 已知AX=2508H,BX=0F36H,CX=0004H,DX=1864H,求下列每条指令执行后的结果
是什么?标志位CF 等于什么?
(1)AND AH,CL (2)OR BL,30H (3)NOT AX
(4)XOR CX,0FFF0H (5)TEST DH,0FH (6)CMP CX,00H
(7)SHR DX,CL (8)SAR AL,1 (9)SHL BH,CL
(10)SAL AX,1 (11)RCL BX,1 (12)ROR DX,CL
答:(1)AX=0408H,CF=0 (2)BX=0F36H,CF=0
(3)AX=0DAF7H,CF 不变 (4)CX=0FFF4H,CF=0
(5)DX=01864H,CF=0 (6)CX=0004H,CF=0
(7)DX=0186H,CF=0 (8)AX=2504H,CF=0
(9)BX=0F036H,CF=0 (10)AX=4A10H,CF=0
(11)BX=1E6C/1E6DH,CF=0 (12)DX=4186H,CF=0
11. 假设数据段定义如下:
DATA SEGMENT
STRING DB ‘The Personal Computer & TV’
DATA ENDS
试用字符串操作等指令编程完成以下功能:
(1)把该字符串传送到附加段中偏移量为GET_CHAR 开始的内存单元中。
(2)比较该字符串是否与’The Computer’相同,若相同则将AL 寄存器的内容置1,否则置
0。并要求将比较次数送到BL 寄存器中。
(3)检查该字符串是否有’&’,若有则用空格字符将其替换。
(4)把字符串大写字母传送到附加段中以CAPS 开始的单元中,其余字符传到以CHART
开始的单元中。然后将数据段中存储上述字符串的单元清0。
答:(1) CLD
LEA SI,STRING
LEA DI,GET_CHAR
MOV CX,26
REP MOVSB
(2)补充在附加段定义
STRING1 DB ‘The computer’
MOV AL,1
CLD
LEA SI,STRING
LEA DI,STRING1
MOV CX,12
REPZ CMPSB
JZ SKIP
MOV AL,0
SKIP: MOV BX,12
SUB BX,CX
(3) MOV AX, DATA
MOV ES, AX
CLD
MOV AL,'&'
LEA DI,STRING
MOV CX,26
NEXT: REPNE SCASB
JZ FIND
JMP EXIT
FIND: MOV BYTE PTR [DI-1], ' '
JCXZ EXIT
JMP NEXT
EXIT:
(4) LEA SI,STRING
LEA DI,CAPS
LEA BX,CHART
MOV CX,26
NEXT: MOV AL, [SI]
CMP AL,’A’
JB OTHER
CMP AL,’Z’
JA OTHER
MOV ES:[DI],AL
INC DI
JMP SKIP
OTHER: MOV ES:[BX],AL
INC BX
SKIP: MOV BYTE PTR[SI],0
INC SI
LOOP NEXT
12. 编程将AX 寄存器中的内容以相反的顺序传送到DX 寄存器中,并要求AX 中的内容不
被破坏,然后统计DX 寄存器中‘1’的个数是多少。
答:: MOV BL,0
PUSH AX
MOV DX,0
MOV CX,16
NEXT: SHL AX,1
JNC SKIP
INC BL
SKIP: RCR DX,1
LOOP NEXT
STOP: POP AX
13. 设CS=1200H,IP=0100H,SS=5000H,SP=0400H,DS=2000H,SI=3000H,BX=0300H,
(20300H)=4800H,(20302H)=00FFH,TABLE=0500H,PROG_N 标号的地址为1200:
0278H,PROG_F 标号的地址为3400H:0ABCH。说明下列每条指令执行完后,程序将分别
转移到何处执行?
(1)JMP PROG_N
(2)JMP BX
(3)JMP [BX]
(4)JMP FAR PROG_F
(5)JMP DWORD PTR [BX]
如将上述指令中的操作码JMP 改成CALL,则每条指令执行完后,程序转向何处执行?并
请画图说明堆栈中的内容和堆栈指针如何变化。
答:(1)1200H:0278H
(2)1200H:0300H
(3)1200H:4800H
(4)3400H:0ABCH
(5)00FFH:4800H
将操作码JMP 改成CALL 后:
(1)1200H:0278H
指令长度为3,则IP=0100H+3=0103H,入栈
(5)00FFH:4800H
指令长度为2,则IP=0100H+2=0102H,入栈
14. 在下列程序段括号中分别填入以下指令
(1)LOOP NEXT (2) LOOPE NEXT (3) LOOPNE NEXT
试说明在这三种情况下,程序段执行完后,AX,BX,CX,DX 的内容分别是什么。
START: MOV AX,01H
MOV BX,02H
MOV DX,03H
MOV CX,04H
NEXT: INC AX
ADD BX,AX
SHR DX,1
( )
答:(1) AX=05H BX=10H CX=0 DX=0
(2) AX=02H BX=04H CX=03H DX=01H
(3) AX=03H BX=07H CX=02H DX=0
15. 某班有7 个同学英语成绩低于80 分,分数存在ARRAY 数组中,试编程完成以下工作:
(1)给每人加 5 分,结果存到 NEW 数组中
(2)把总分存到SUM 单元中
答: DATA SEGMENT
ARRAY DB ?,?,?,?,?,?,?
NEW DB 7 DUP(?)
SUM DW 0
DATA ENDS
MOV AX,DATA
MOV DS, AX
(1) LEA SI,ARRAY
LEA DI,NEW
MOV CX,7
NEXT: MOV AL,[SI]
ADD AL, 5
MOV [DI], AL
INC SI
INC DI
LOOP NEXT
(2) LEA SI,ARRAY
CLC
SP
5000H:0000H
5000H:03FCH
5000H:03FEH
5000H:0400H
MOV CX, 7
NEXT1:MOV AL,[SI]
MOV AH, 0
ADC SUM, AX
INC SI
LOOP NEXT1
16. 中断向量表的作用是什么?它放在内存的什么区域内?中断向量表中的什么地址用于
类型3 的中断?
答:中断向量表用来存放中断服务程序的入口地址。8086 的256 类中断的入口地址要占用
1K 字节,位于内存00000H~003FFH 的区域内。中断向量表中0000CH~0000FH 用于类型
3 的中断。
17. 设类型2 的中断服务程序的起始地址为0485:0016H,它在中断向量表中如何存放?
答:物理地址 内容
00008H 16H
00009H 00H
0000AH 85H
0000BH 04H
18. 若中断向量表中地址为0040H 中存放240BH,0042H 单元里存放的是D169H,试问:
(1)这些单元对应的中断类型是什么?
(2)该中断服务程序的起始地址是什么?
答:(1)10H
(2)D169H:240BH
19. 简要说明8086 响应类型0~4 中断的条件是什么?
答:类型0:除法错中断
执行除法指令时,若除数为0 或所得商超过寄存器能容纳的范围,则自动产生类型0
中断。
类型1:单步中断
若CPU 的单步标志TF=1,则每执行完一条指令后,自动产生类型1 中断。
类型2:不可屏蔽中断NMI
当8086 的NMI 引脚上接收到由低变高的电平变化时,将自动产生类型2 中断。
类型3:断点中断
若在程序中某位置设置断点,当程序执行到该断点时,则产生类型3 中断。
类型4:溢出中断
若溢出标志OF=1,则可由溢出中断指令INTO 产生类型4 中断。
第四章
1. 下列变量各占多少字节?
A1 DW 23H,5876H
A2 DB 3 DUP(?),0AH,0DH, ‘$’
A3 DD 5 DUP(1234H, 567890H)
A4 DB 4 DUP(3 DUP(1, 2,’ABC’))
答:A1 占4 个字节
A2 占6 个字节
A3 占40 个字节
A4 占60 个字节
2. 下列指令完成什么功能?
MOV AX,00FFH AND 1122H+3344H
MOV AL,15 GE 1111B
MOV AX,00FFH LE 255+6/5
AND AL, 50 MOD 4
OR AX, 0F00FH AND 1234 OR 00FFH
答:(1)将0066H 传送给AX
(2)将0FFH 传送给AL
(3)将0FFFFH 传送给AX
(4)AND AL,02H
(5)OR AX,00FFH
3. 有符号定义语句如下:
BUF DB 3,4,5,’123’
ABUF DB 0
L EQU ABUF-BUF
求L 的值为多少?
答:L=6
4. 假设程序中的数据定义如下:
PAR DW ?
PNAME DB 16 DUP(?)
COUNT DD ?
PLENTH EQU $-PAR
求PLENTH 的值为多少?表示什么意义?
答:PAR 的偏移地址为0,PLENTH 当前偏移地址$=2+16+4=22, $-PAR=22,故PLENTH
的值为22。
若在PLENTH 所在行有变量定义,则$表示该变量的偏移地址,即$表示PLENTH 所在
行的当前偏移地址。故PLENTH 表示从当前行到PAR 之间定义的变量所占的字节个数。
5. 对于下面的数据定义,各条MOV 指令执行后,有关寄存器的内容是什么?
DA1 DB ?
DA2 DW 10 DUP(?)
DA3 DB ‘ABCD’
MOV AX, TYPE DA1
MOV BX, SIZE DA2
MOV CX, LENGTH DA3
答:AX=1,BX=20,CX=1
6. 下段程序完成后,AH 等于什么?
IN AL, 5FH
TEST AL, 80H
JZ L1
MOV AH, 0
JMP STOP
L1: MOV AH, 0FFH
STOP: HLT
答:讨论从端口5FH 输入的数据最高位的情况。若最高位为1,则AH=0;若最高位为0,
则AH=0FFH。
7. 编程序完成下列功能:
(1)利用中断调用产生5 秒延时。
(2)利用中断调用,在屏幕上显示1~9 之间随机数。
答:(1)可以利用中断类型1CH 来处理,因为在系统时钟的中断处理程序中,时钟中断一
次要调用一次INT 1CH,即每隔55ms,产生一次1CH 中断,要产生5 秒延时,只要中断
5s/55ms=91 次即可。又因1CH 中断处理程序中只有一条IRET 指令,故可将用户的程序代
替原有的INT 1CH 程序。
DATA SEGMENT
COUNT DW 91 ;计数器
MESS DB ‘5 s delayed!’,0AH,0DH,’$’
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,ES:DATA
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AL,1CH ;得到原中断向量
MOV AH,35H
INT 21H
PUSH ES ;存储原中断向量
PUSH BX
PUSH DS
MOV DX,OFFSET DELAY ;DELAY 的偏移地址和段地址
MOV AX,SEG DELAY
MOV DS,AX
MOV AL,1CH ;设置中断向量
MOV AH,25H
INT 21H
POP DS
IN AL,21H ;设置中断屏蔽位
AND AL,0FEH
OUT 21H,AL
STI
MOV DI,2000H ;主程序延迟,在执行此段程序期间
A1: MOV SI,3000H ;产生中断
A2: DEC SI
JNZ A2
DEC DI
JNZ A1
POP DX ;取原中断向量
POP DS
MOV AL,1CH
MOV AH,25H
INT 21H
RET
MAIN ENDP
DELAY PROC NEAR
PUSH DS
PUSH AX
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
STI
DEC COUNT ;5 秒计数
JNZ EXIT
MOV DX,OFFSET MESS ;显示信息
MOV AH,09H
INT 21H
MOV COUNT,91 ;5 秒的值
EXIT: CLI
POP DX
POP CX
POP AX
POP DS
IRET
DELAY ENDP
CODE ENDS
END START
(2)可以利用INT 1AH,读取当前时间的1/100 秒为随机数。
CODE SEGMENT
ASSUME CS:CODE
START:MOV AH,0
INT 1AH ;读取当前时间CH:CL=时:分
MOV AL,DL ;DH:DL=秒:1/100 秒
MOV AH,0
MOV BL,9
DIV BL
INC AH
MOV DL,AH
ADD DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
8. 编两个通过过程完成将AX 中存放的二进制数转换成压缩型BCD 码以及将BCD 码转换
成二进制数。
答:(1)将AX 中的二进制数先后除以1000,100 和10,每次除法所得的商,即是BCD 数
的千位、百位和十位数,余数是个位数。
子程序名:B2TOBCD
输入参数:AX=十六位二进制数
输出参数:CF=0,则AX=4 位压缩型BCD 码。CF=1,则要转换的数大于9999,AX 不
变。
使用寄存器:CX:存放除数,DX:存放中间结果。
B2TOBCD PROC FAR
CMP AX,9999 ;AX>9999,则CF 置1
JBE TRAN
STC
JMP EXIT
TRAN: PUSH CX
PUSH DX
SUB DX,DX ;DX 清0
MOV CX,1000 ;计算千位数
DIV CX
XCHG AX,DX ;商在DX 中,余数在AX 中
MOV CL,4
SHL DX,CL ;DX 左移4 位
MOV CL,100 ;计算百位数
DIV CL
ADD DL,AL ;百位数加到DL 中,DX 左移4 位
MOV CL,4
SHL DX,CL
XCHG AL,AH ;余数保留在AL 中
SUB AH,AH
MOV CL,10 ;计算十位数
DIV CL
ADD DL,AL ;十位数加到DL 中,DX 左移4 位
MOV CL,4
SHL DX,CL
ADD DL,AH ;加个位数
MOV AX,DX ;结果送到AX 中
POP DX
POP CX
EXIT: RET
B2TOBCD ENDP
(2)将AX 中4 位BCD 码顺序乘以1000,100,10 和1,然后求和即得。
子程序名:BCDTOB2
输入参数:AX=4 位压缩BCD 码
输出参数:AX=十六位二进制数
使用寄存器:BX:暂存数据,CX:存放乘数,DX:存放中间结果
BCDTOB2 PROC FAR
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX
MOV CL,4
ROL AX,CL
AND AX,000FH
MOV CX,1000 ;乘以1000
MUL CX
MOV DX,AX
MOV AX,BX
MOV CL,8
ROL AX,CL
AND AX,000FH
MOV CL,100 ;乘以100
MUL CL
ADD DX,AX
MOV AX,BX
MOV CL,4
SHR AX,CL
AND AX,000FH
MOV CL,10 ;乘以10
MUL CL
ADD DX,AX
AND BX,000FH
ADD DX,BX
MOV AX,DX
POP DX
POP CX
POP BX
RET
BCDTOB2 ENDP
9. 编写两个通用过程,一个完成ASCII 码转换成二进制数功能,另一个完成ASCII 字符显
示输出功能。
答:(1)将AX 中两位ASCII 码先转化成数字,然后AH*10+AL。
子程序名:ASCIITOB2
输入参数:AX=2 位ASCII 码
输出参数:AX=转换后二进制数
使用寄存器:BX,CX,DX
ASCIITOB2 PROC FAR
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX
SUB AH,30H
MOV AL,AH
MOV CL,10 ;乘以10
MUL CL
MOV DX,AX
MOV AX,BX
SUB AL,30H
MOV AH,0
ADD AX,DX
POP DX
POP CX
POP BX
RET
ASCIITOB2 ENDP
(2)使用2 号DOS 功能调用显示字符。
子程序名:DISPLAY
输入参数:AX=2 位ASCII 码
输出参数:无
使用寄存器:BX,DX
DISPLAY PROC FAR
PUSH BX
PUSH DX
MOV BX,AX
MOV DL,AH
MOV AH,2
INT 21H
MOV AX,BX
MOV DL,AL
MOV AH,2
INT 21H
POP DX
POP BX
RET
DISPLAY ENDP
10. 编制两个通用过程,完成十六进制数转换成ASCII 码并将ASCII 码字符显示。
答:(1)子程序名:HEXTOASC
输入参数:AX:4 位十六进制数
输出参数:DX,AX:4 位ASCII 码,DX 高2 位,AX 低2 位
使用寄存器:BX,CX,DX
HEXTOASC PROC FAR
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX
MOV CL,4 ;转换AH 高4 位
SHR AX,CL
AND AX,0F00H
ADD AH,30H
CMP AH,3AH
JB A1
ADD AH,7
A1: MOV DH,AH
MOV AX,BX ;转换AH 低4 位
AND AX,0F00H
ADD AH,30H
CMP AH,3AH
JB A2
ADD AH,7
A2: MOV DL,AH
MOV BH,BL ;转换AL 高4 位
MOV CL,4
SHR BL,CL
ADD BL,30H
CMP BL,3AH
JB A3
ADD BL,7
A3: MOV AH,BL
AND BH,0FH ;转换AL 低4 位
ADD BH,30H
CMP BH,3AH
JB A4
ADD BH,7
A4: MOV AL,BH
POP DX
POP CX
POP BX
RET
HEXTOASC ENDP
(2)子程序名:DISPLAYASC
输入参数:DX,AX:4 位ASCII 码
输出参数:无
使用寄存器:BX,CX
DISPLAYASC PROC FAR
PUSH BX
PUSH CX
MOV BX,DX
MOV CX,AX
MOV DL,BH
MOV AH,02H
INT 21H
MOV DL,BL
INT 21H
MOV DL,CH
INT 21H
MOV DL,CL
INT 21H
MOV DL,’H’
INT 21H
POP CX
POP BX
RET
DISPLAYASC ENDP
11. 某程序可从键盘接收命令(0~5),分别转向6 个子程序,子程序入口地址分别为P0~
P5,编制程序,用跳转表实现分支结构。
答: DATA SEGMENT
TABLE DW 6 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA SI, TABLE
MOV WORD PTR[SI],OFFSET P0
MOV WORD PTR[SI+2],OFFSET P1
MOV WORD PTR[SI+4],OFFSET P2
MOV WORD PTR[SI+6],OFFSET P3
MOV WORD PTR[SI+8],OFFSET P4
MOV WORD PTR[SI+10],OFFSET P5
MOV AH,1
INT 21H
SUB AL,30H
SHL AL,1
MOV AH,0
MOV SI,AX
JMP TABLE[SI]
P0:
P1:
P2:
P3:
P4:
P5:
MOV AH,4CH
INT 21H
CODE ENDS
END START
12. 在首地址为TABLE 的数组中按递增次序存放着100 个16 位补码数,编写一个程序,把
出现次数最多的数及其出现次数分别存放于AX 和BL 中。
答: DATA SEGMENT
TABLE DW 100 DUP (?) ;数组中的数据是按增序排列的
NUM DW ?
COUNT DW 0
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS: CODE, DS: DATA
START: PUSH DS ;设置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DATA
MOV DS, AX ;给DS 赋值
BEGIN: MOV CX, 100 ;循环计数器
MOV SI, 0
NEXT: MOV DX, 0
MOV AX, TABLE[SI]
COMP: CMP TABLE [SI], AX ;计算一个数的出现次数
JNE ADDR
INC DX
ADD SI, 2
LOOP COMP
ADDR: CMP DX, COUNT ;此数出现的次数最多吗?
JLE DONE
MOV COUNT, DX ;目前此数出现的次数最多,记下次数
MOV NUM, AX ;记下此数
DONE: LOOP NEXT ;准备取下一个数
MOV CX, COUNT ;出现最多的次数存入(CX)
MOV AX, NUM ;出现最多的数存入(AX)
RET
MAIN ENDP
CODE ENDS ;以上定义代码段
END START
13. 将键盘上输入的十六进制数转换成十进制数,在屏幕上显示。
答:DATA SEGMENT
STRING DB 'INPUT 4 HEX NUM:',0AH,0DH,'$'
NUM DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA DX,STRING ;显示提示信息
MOV AH,9
INT 21H
MOV BP,4
MOV DX,0
CONT: MOV CL,4 ;输入4 位十六进制数DX
SHL DX,CL
D1: MOV AH,1
INT 21H
CMP AL,'0'
JB D1
CMP AL,'F'
JA D1
CMP AL,'A'
JB A1
SUB AL,7
A1: SUB AL,30H
MOV AH,0
ADD DX,AX
DEC BP
JNZ CONT
MOV SI,0 ;将DX 转换成十进制数,再转换成ASCII 码—>NUM
MOV AX,DX
MOV DX,0
MOV BX,10
D2: DIV BX
ADD DL,30H
MOV NUM[SI],DL
INC SI
CMP AX,0
JZ EXIT
MOV DX,0
JMP D2
EXIT: MOV DL,0AH ;显示十进制数
MOV AH,2
INT 21H
MOV DL,0DH
INT 21H
D3: DEC SI
MOV DL,NUM[SI]
MOV AH,2
INT 21H
JNZ D3
MOV AH,4CH
INT 21H
CODE ENDS
END START
14. 将AX 中的无符号二进制数转换成ASCII 字符串表示的十进制数。
答:将13 题输入过程和输出过程去掉即得。
DATA SEGMENT
NUM DB 10 DUP(?) ;转换后ASCII 码按倒序存放于NUM
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX, ×××× ;无符号二进制数
MOV SI,0 ;将AX 转换成十进制数,再转换成ASCII 码—>NUM
MOV DX,0
MOV BX,10
D2: DIV BX
ADD DL,30H
MOV NUM[SI],DL
INC SI
CMP AX,0
JZ EXIT
MOV DX,0
JMP D2
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
15. 从键盘输入20 个有符号数,将它们排序并在屏幕上显示。
答:DATA SEGMENT
NUM DW 20 DUP(?) ;存放20 个有符号数
ASC DB 10 DUP(?) ;输出时暂时保存每一个数的ASCII 码
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,20
MOV BX,10
MOV SI,0
MOV BP,0
BEGIN: MOV DX,0 ;输入20 个有符号数(十进制),并
A1: MOV AH,1 ;转化为二进制数存放于NUM 数组
INT 21H
CMP AL,' ' ;判断是否空格
JZ A2
CMP AL,0DH ;是否回车符
JZ A2
CMP AL,'-' ;是否‘-’
JZ A3
JMP A4
A3: MOV BP,1
JMP A1
A4: PUSH AX
MOV AX,DX
MUL BX
MOV DX,AX
POP AX
SUB AL,30H
MOV AH,0
ADD DX,AX
JMP A1
A2: CMP BP,1
JNZ A5
NEG DX ;若为负数,则取负
A5: MOV NUM[SI],DX
MOV BP,0
ADD SI,2
LOOP BEGIN
MOV DL,0DH ;回车换行
MOV AH,2
INT 21H
MOV DL,0AH
INT 21H
MOV BX,0 ;对20 个有符号数按由小到大顺序排序
MOV CX,19 ;采用冒泡法,排序后依然存放于NUM 数组
L1: MOV DX,CX
L2: MOV AX,NUM[BX]
CMP AX,NUM[BX+2]
JLE CONT1
XCHG AX,NUM[BX+2]
MOV NUM[BX],AX
CONT1: ADD BX,2
LOOP L2
MOV CX,DX
MOV BX,0
LOOP L1
MOV CX,20 ;将20 个有符号数(二进制)转换为十进制数
MOV SI,0 ;再转换为ASCII 码并输出屏幕
D1: MOV AX,NUM[SI]
ADD SI,2
TEST AX,1000H
JZ D4
PUSH AX
MOV DL,'-'
MOV AH,2
INT 21H
POP AX
NEG AX
D4:
展开阅读全文