815历年真题程序总结
2007.编写程序,将一个32位数扩大16倍。(DX:AX)
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,0020H
MOV AX,1010H
MOV CX,4
L1: SHL AX,1
RCL DX,1
LOOP L1
MOV AH,4CH
INT 21H
CODE ENDS
END START
2008.设计程序,统计AX中1的个数。
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
mov ax,0fh
mov cx,10H
MOV BX,00H
L1: rcr ax,1
adc Bx,00h
LOOP L1
MOV AH,4CH
INT 21H
CODE ENDS
END START
2009.假设内存单元中有三个字节变量啊a、b和c,编写程序,判断它们是否构成一个三角形,若能,CF=1,否则,CF为0。
DATA SEGMENT
a db 03h;定义变量
b db 04h
c db 05h
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
mov al,a;暂存数据
mov bl,b
mov cl,c
mov dl,al;cmp1 c<a+b?
add dl,bl
cmp cl,dl
JNC ENDA ;c>a+b 则无借位
mov dl,Bl;cmp2 a<b+c?
add dl,Cl
cmp Al,Dl
JNC ENDA
mov dl,al;cmp3 b<a+c?
add dl,Cl
cmp Bl,dl
JNC ENDA
mov dl,59h;屏幕输出Y
MOV ah,02h
int 21h
MOV AH,4CH
INT 21H
ENDA:
mov dl,4eh;屏幕输出N
MOV ah,02h
int 21h
MOV AH,4CH
INT 21H
CODE ENDS
END START
2010A.将ELEMS中的100个字节的数据位置颠倒过来(即第一个字节的第100个字节的内容交换,第二个字节和第9个字节的内容交换……)
DATA SEGMENT
elems db 50 dup(01h),50 dup(02h)
b db 04h
c db 05h
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
lea si,elems
mov di,si
add di,99;指向最后一个单元
mov cx,50
again:
mov al,[si];al作桥梁
xchg al,[di]
xchg al,[si]
inc si
dec di
loop again
ENDA:
MOV AH,4CH
INT 21H
CODE ENDS
END START
2010B.将STRING中的字符串反序。方法一:
DATA SEGMENT
elems db 'ABCDEFG$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
lea si,elems
mov di,si
add di,7
mov cx,4
again:
mov al,[si]
xchg al,[di]
xchg al,[si]
inc si
dec di
loop again
ENDA:
mov dl,elems
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
2011A.试编一个程序,求出2~65535之内的所有能被8整除的数。
DATA SEGMENT
ELEMS DW 10000 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,ELEMS ;获取ELEMS地址
mov cx,0ffffh ;最大范围
mov ax,0
L1: add ax,8 ;能被8整除,也就是8的整数倍
cmp ax,cx ;即小于65535的倍数,所以每次+8
jle L2 ;只要比65535小的数被存到ELEMS
JG ENDA ;跳转结束
L2: MOV [SI],AX ;将刚才满足范围内的数存入
ADD SI,2 ;si+2为下一次存放做准备
JMP L1 ;回到程序
ENDA: ;结束
MOV AH,4CH
INT 21H
CODE ENDS
END START
2011B.试编一个程序,求出2~65535之内的所有能被16整除的数。
DATA SEGMENT
ELEMS DW 10000 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,ELEMS ;获取ELEMS地址
mov cx,0ffffh ;最大范围
mov ax,0
L1: add ax,10h ;能被16整除,也就是16的整数倍
cmp ax,cx ;即小于65535的倍数,所以每次+8
jle L2 ;只要比65535小的数被存到ELEMS
JG ENDA ;跳转结束
L2: MOV [SI],AX ;将刚才满足范围内的数存入
ADD SI,2 ;si+2为下一次存放做准备
JMP L1 ;回到程序
ENDA: ;结束
MOV AH,4CH
INT 21H
CODE ENDS
END START
2012.编写一个程序,它以二进制形式显示EAX中的32位数据。
DATA SEGMENT
ELEMS DW 10000 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
mov eax,0f0f0H;
MOV cX,10H
L1: shL eax,1
JC dis1
mov dl,30H
jmp dis2
dis1: mov dl,31H
dis2: MOV AH,02H
INT 21H
loop L1
enda: MOV AH,4CH
INT 21H
CODE ENDS
END START
2014.编写程序,计算如下函数值:
DATA SEGMENT
x db 6
S dw ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
mov al,x
cmp al,0
jl x1
cmp al,0AH
jle x2
mov cl,4
enda: imul cl
mov S,ax
MOV AH,4CH
INT 21H
x1: mov cl,2
jmp enda
x2: mov cl,3
jmp enda
CODE ENDS
END START
2015.编写一个程序,先提示“Input Number:0-9”,然后下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error”,继续等待输入数字。
DATA SEGMENT
STRING db 'Input Number:0~9',0AH,'$'
errora db 'Error',0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
lea DI,STRING
MOV DX,DI
MOV AH,09H
INT 21H
l1: mov ah,01h
int 21h
cmp al,30h
jb x
cmp al,39h
ja x
enda: MOV AH,4CH
INT 21H
x: lea DI,errora
MOV DX,DI
MOV AH,09H
INT 21H
jmp l1
CODE ENDS
END START
2016.编写一个程序,从键盘读取键值并把键盘数据存储到数组BUF,直到回车键按下为止。按下回车键后,将政哥哥字符串加上“$”符,然后使用DOS中观的09H功能调用在屏幕上显示字符串。
DATA SEGMENT
BUF db ?
ENDF DB '$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DI,BUF
L1: mov ah,01h
int 21h
cmp AL,0DH
je DIS
MOV [DI],AL
inc DI
JMP L1
DIS:MOV AL,24H
MOV [DI],AL
LEA DI,BUF
MOV DX,DI
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
2018.有一首地址为BUP的字数组,长度为10,试编写完整程序,球盖数组最大数与最小数之差,结果存F-TOTAL单元中。
DATA SEGMENT
BUP DW 0,1,2,3,4,5,6,7,8,9
TOTAL DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DI,BUP
MOV DX,[DI]
MOV AX,[DI]
MOV CX,10
M1: MOV BX,[DI+2];MAX
CMP AX,BX
JAE M2
MOV AX,BX
ADD DI,2
M2: LOOP M1
MOV CX,9
M3: MOV BX,[SI+2];min
CMP DX,BX
JBE M4
MOV DX,BX
ADD DI,2
M4: LOOP M3
ENDA:
SUB AX,DX
LEA SI,TOTAL
MOV [SI],AX
;TEST:测试程序已注释掉
; ADD AL,30H
; MOV DL,AL
; MOV AH,02H
; INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
2019.计算一个数组中负数的个数。设数组中第一个元素是数据的个数,第二个元素用来存放计算结果,即负数的个数,数组中的数据从第三个元素开始存放。
DATA SEGMENT
buf db 81h,0ah,81h,0ah,81h,0ah,81h,0ah,81h,0ah
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
lea si,buf
mov di,si
mov bl,10 ;元素个数
mov dl,0 ;负数的个数
mov cx,10
L1: mov al,[si]
INC SI
SHL Al,1
jnc L2
inc dl
L2: loop L1
mov cx,10
L3: mov al,[si-2]
mov [si],al
dec si
LOOP L3
mov [di],bl
mov [di+1],dl
; mov al,24h 测试代码
; mov [di+12],al
; mov dx,di
; mov ah,09h
; int 21h
MOV AH,4CH
INT 21H
CODE ENDS
END START