第1题:只能输入数字的程序。
;程序如下:
data segment
msg1 db 'Input Number:0~9',0ah,0dh,'$'
msg2 db 'Error!',0ah,0dh,'$'
data ends
code segment
assume cs:code
start:
mov ax,data
mov ds,ax
lea dx,msg1
mov ah,9h
int 21h ;显示第一个字符串
lp: mov ah,01h
int 21h ;接收字符
cmp al,'0'
jb again ;ASCII码小于'0'则显示跳到标号again处
cmp al,'9'
ja again ;ASCII码大于'9'则显示跳到标号again处
jmp short quit ;在0~9之间则跳出循环
again: lea dx,msg2
mov ah,9h
int 21h ;显示第二个字符串"Error!"
jmp short lp ;跳到标号lp处
quit: mov ax,4c00h
int 21h
code ends
end start
============================================
第2题:输入一个字符串(最大长度为10),统计出现字母A的个数。
;程序如下:
data segment
str db 10,13,'input a string',10,13,'$'
strb db 10,13,'the number of A is ',10,13,'$'
buf db 10
db ?
db 10 dup(?)
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
lea dx,str
mov ah,9
int 21h
lea dx,buf
mov ah,0ah
int 21h
xor cx,cx
xor si,si ;存放A的个数[不能使用al进行]
mov cl,buf+1 ;改为cl,否则操作数类型不一致
lea bx,buf+2
;mov dl,'A'
lp: cmp byte ptr [bx],'A'
jne next
inc si
next: inc bx
loop lp
lea dx,strb
mov ah,9
int 21h
xor dx,dx
mov dx,si
add dl,30h ;使dl成为可显示的阿拉伯数字
mov ah,2
int 21h
mov ah,4ch
int 21h
code ends
end start
==========================================
第3题:计算12+22+32+42+……,计算前N项的和,使和大于1000。编写程序求解N。
;程序如下:
assume cs:code,ds:data
data segment
count db 0 ;计数器
sum dw 0 ;sum中存放和
data ends
code segment
main:
mov ax,data
mov ds,ax
and ax,0
mov al,12 ;将al的值初始为12
lea bx,sum
s: add byte ptr [bx],al
adc byte ptr [bx+1],ah
;以上两步做累加和
add al,10
inc count
cmp sum,1000
jae quit ;当和大于1000时,则退出循环
jmp short s
quit: ;sub sum,ax
mov ax,4c00h
int 21h
code ends
end main
==================================================
第4题:已知在数组A中包含15个互不相同的数据;数组B中包含20个互不相同的数据;编写程序,把在数组A和数组B中都出现的数据放在数组C中。
;程序如下:
data segment
a dw 1,2,3,4,78,54,12,65,123,654,741,1231,333,18,19
b dw 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
c dw 15 dup(?) ;可能a中的数据都在b中,所以定义15个。
data ends
code segment
assume cs:code,ds:data
main:
mov ax,data
mov ds,ax
and ax,0
lea si,a
lea di,b
lea bx,c
mov cx,15 ;外循环15次
s2:
mov ax,[si] ;取数组a中的数据放入ax
push cx ;cx入栈,防止内循环影响外循环
mov cx,20 ;内循环20次
s1:
cmp ax,[di] ;将其与数组b中的数据比较
jne next ;不相等则数组b的下标递增
mov [bx],ax ;如果该数据在数组a和b中都存在,则放入数组c
add bx,2
next: add di,2
loop s1
pop cx ;cx出栈,为外循环做准备
lea di,b ;将数组b重新定位到首地址
add si,2 ;将数组a的下标移到下一个数据处
loop s2
mov ax,4c00h
int 21h
code ends
end main
=========================================
第5题:程序的要求是从键盘输入一个字符串,存在strn里
data segment
strn db 80 ;缓冲区最大字符数
db ? ;实际输入的字符数
db 80 dup(?) ;从此单元开始接收输入的字符串
data ends
然后删除该字符串中重复的字符串并显示出来
比如说输入aabbccddee
显示abcde
输入aadae
显示ade
;程序如下:
data segment
strn db 80 ;缓冲区最大字符数
db ? ;实际输入的字符数
db 80 dup(?) ;从此单元开始接收输入的字符串
data ends
code segment
assume cs:code,ds:data
main:
mov ax,data
mov ds,ax
lea dx,strn
mov ah,0ah
int 21h ;键盘输入到字符串
lea bx,strn+2
lea si,strn+3
lea di,strn+3
mov ch,0
mov cl,byte ptr [strn+1]
dec cx
s2: push cx
mov cx,di
sub cx,bx
s1: mov al,[si]
cmp al,[bx]
je nextchar ;若相等则直接进行下一个字符的循环比较
inc bx
loop s1
mov [di],al
inc di
nextchar: lea bx,strn+2 ;将bx重定位至字符串首地址
inc si ;以使下一个字符比较时又从头开始比较
pop cx
loop s2
mov byte ptr [di],'$' ;为显示处理后的字符串调用中断做准备
mov dh,1
mov dl,0
mov ah,2 ;将光标置为第1行第0列[行、列都从0开始]
int 10h
lea dx,strn+2
mov ah,09
int 21h ;显示处理后的字符串
mov ax,4c00h
int 21h
code ends
end main
=================================
第6题:
1题目:分类统计字符个数COUNT_CHAR
2实验要求:程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字、及其它字符分类计数,然后将结果存入以letter,dight,other为名的存储单元中。
;程序如下:
data segment
letter db 0 ;字母计数器
digit db 0 ;数字计数器
other db 0 ;其它字符计数器
str db 80 ;缓冲区最大字符数
db ? ;实际输入的字符数
db 80 dup(?) ;从此单元开始接收输入的字符串
data ends
code segment
assume cs:code,ds:data
main:
mov ax,data
mov ds,ax
lea dx,str
mov ah,0ah ;输入字符串至缓冲区
int 21h
lea bx,str+2
mov ch,0
mov cl,[str+1]
s: mov al,[bx]
cmp al,'0' ;当扫描字符为数字时
jb small_ltr
cmp al,'9'
ja small_ltr
inc digit ;是数字时则数字计数器加1
jmp short next ;直接检查下一个字符
small_ltr: ;当扫描字符为小写字母时
cmp al,'a'
jb big_ltr
cmp al,'z'
ja big_ltr
inc letter ;是小写字母时则字母计数器加1
jmp short next ;直接检查下一个字符
big_ltr: ;当扫描字符为大写字母时
cmp al,'A'
jb others
cmp al,'Z'
ja others
inc letter ;是大写字母时也将字母计数器加1
jmp short next ;直接检查下一个字符
others: inc other ;是其它字符时则将其它字符计数器加1
next: inc bx
loop s
mov ah,4ch
int 21h
code ends
end main