- 请任意输入一个字符串,将其中A换成CC,并将结果显示在屏幕上。
DATAS SEGMENT
buf db 100
db ?
db 100 dup(?)
replace db 'C'
output db 100 dup(?)
Stop db '$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H ;输入字符串
lea si,buf+1 ;si指向字符串长度
mov cx,[si]
mov ch,0
lea di,output ;di指向输出空间
repeat_loop: ;依次读取字符,判断字符是否为A
mov al,[si+1] ;si指向字符串首字符
cmp cx,0
je end_loop
cmp al,'A'
jne copy_char
mov bl,replace ;将A替换为CC
mov [di],bl
inc di
mov [di],bl
jmp oo
copy_char: ;复制字符
mov [di],al;
oo:
inc si
inc di
loop repeat_loop
end_loop: ;结束循环,输出
mov bl,Stop
mov [di],bl
lea dx,output
mov ah,09H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 请任意输入一个字符串,将其中大写字母换成小写字母,并将结果显示在屏幕上。
DATAS SEGMENT
buf db 100
db ?
db 100 dup(?)
output db 100 dup(?)
Stop db '$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf ; 输入字符串
mov ah,0AH
int 21H
lea si,buf+1 ;si指向字符串长度
mov cx,[si]
mov ch,0
lea di,output ;di指向输出空间
repeat_loop: ;依次读取字符,判断字符是否为A
mov al,[si+1] ;si指向字符串首字符
cmp cx,0
je end_loop
cmp al,40H
jbe copy_char
cmp al,5BH
jae copy_char
mov bl,al ;将大写字母替换为小写字母
add bl,20H
mov [di],bl
jmp next_char
copy_char: ;复制字符
mov [di],al;
next_char:
inc si
inc di
loop repeat_loop
end_loop: ;结束循环,输出
mov bl,Stop
mov [di],bl
lea dx,output
mov ah,09H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 请任意输入一个字符串,将其中的英文字母全部删除,并将结果显示在屏幕上。
DATAS SEGMENT
buf db 100
db ?
db 100 dup(?)
output db 100 dup(?)
Stop db '$'
cr_1 db 0ah,0dh,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf ; 输入字符串
mov ah,0AH
int 21H
lea dx,cr_1
mov ah,09h
int 21h
lea si,buf+1 ;si指向字符串长度
mov cx,[si]
mov ch,0
lea di,output ;di指向输出空间
repeat_loop: ;依次读取字符,判断字符是否为英文字母
mov al,[si+1] ;si指向字符串首字符
cmp cx,0
je end_loop
cmp al,'A' ;41判断小于A(非字母)
jb copy_char
cmp al,'z' ;7A判断大于z(非字母)
ja copy_char
cmp al,'Z' ;5A判断小于Z(字母)
jbe next_char
cmp al,'a' ;61判断大于a(字母)
ja next_char
jmp copy_char
next_char:
inc si
cmp cx,1
je end_loop
loop repeat_loop
copy_char: ;复制字符
mov [di],al
inc si
inc di
cmp cx,1
je end_loop
loop repeat_loop
end_loop:
mov bl,Stop
mov [di],bl
lea dx,output
mov ah,09H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 现有一组字符串为data,name,time,file,code,path,user,exit,quit,text,请编写程序从键盘输入4个字符的字符串,若存在将其修改为disk, 并将结果在显示器上显示。
DATAS SEGMENT
buf db 5
db ?
db 5 dup(?)
sign db 0dH,0aH
data_str db 'data'
name_str db 'name'
time_str db 'time'
file_str db 'file'
code_str db 'code'
path_str db 'path'
user_str db 'user'
exit_str db 'exit'
quit_str db 'quit'
text_str db 'text'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
lea dx,buf ;输入字符串
mov ah,0AH
int 21H
mov cx,10 ;计数器
mov ch,0
lea bx,data_str ;bx取第一个单词首地址
waixxunhuan:
push cx ;循环CX入栈
mov cx,4 ;设置内循环CX
mov ch,0
mov si,bx ;si指向每个单词首地址
lea di,buf+2 ;di始终指向被查单词首地址
repz cmpsb ;长度为4进行串查找
jz modify_string ;相等跳到更改程序modify_string
add bx,4 ;更改bx使其指向下一个单词首地址
pop cx ;循环CX出栈
cmp cx,1
je end_loop
loop waixxunhuan
modify_string:
sub si,4 ;cmpsb后si自动加4,所以要减4
mov al,'d'
mov [si],al
mov al,'i'
mov [si+1],al
mov al,'s'
mov [si+2],al
mov al,'k'
mov [si+3],al
end_loop:
mov al,'$'
lea si,text_str
add si,4 ;将$存进单词末尾
mov [si],al
lea si,data_str
mov dx,si ;此时bx变了,但si没变,仍指向此次循环单词末尾
mov ah,09H ;输出单词
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 现有一组字符串为data,name,time,file,code,path,user,exit,quit,text,请编写程序从键盘输入4个字符的字符串,若存在将其删除, 并在显示器上显示。
DATAS SEGMENT
buf db 5
db ?
db 5 dup(?)
output db 50 dup(?)
data_str db 'data';003C
name_str db 'name'
time_str db 'time'
file_str db 'file'
code_str db 'code'
path_str db 'path'
user_str db 'user'
exit_str db 'exit'
quit_str db 'quit'
text_str db 'text'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
lea dx,buf ;输入字符串
mov ah,0AH
int 21H
mov cx,10 ;计数器
mov ch,0
lea si,data_str ;bx取第一个单词首地址
lea ax,output ;ax取输出缓冲区output首地址
waixunhuan:
push cx ;循环CX入栈
mov cx,4 ;设置内循环CX
mov ch,0
mov dx,si ;用dx保存当次单词首地址
lea di,buf+2 ;di始终指向被查单词首地址
repz cmpsb ;长度为4进行串查找
jnz copy_letter ;不相等就将字符串搬到output中
pop cx ;循环CX出栈
cmp cx,1
jbe end_loop
loop waixunhuan
copy_letter:
mov si,dx ;由于执行cmpsb,si已不再指向单词首地址,用之前存的dx使si重新指向首地址
pop cx ;由于跳转,使第50行未执行,补上一遍
push cx ;存上外循环次数
mov cx,4
mov ch,0
mov di,ax
rep movsb ;字符串移动,si自动加4
add ax,4 ;只需要改output地址
pop cx ;即将loop,让cx出来
cmp cx,1
jbe end_loop
loop waixunhuan
end_loop:
mov al,'$'
lea si,output
cmp cx,1
je add2 ;如果cx=1,说明没有相同单词,所以output中存了10个单词(40个字母)
jne add1 ;如果cx>1,说明有相同单词,所以output中存了9个单词(36个字母)
add1:
add si,36
jmp end3
add2:
add si,40
jmp end3
end3:
mov [si],al ;将$存进单词末尾
lea si,output ;取output首地址
mov dx,si
mov ah,09H ;输出单词
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入一个十进制数(字类型),以十六进制的形式输出。
DATAS SEGMENT
buf dw 6
dw ?
dw 6 dup(?)
mulnum dw 10000,1000,100,10,1
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H
lea si,buf+1
mov cx,[si]
mov ch,0
lea si,buf+2
change_num: ;将字符转为数字
mov ax,[si]
sub ax,30H
mov [si],ax
inc si
loop change_num
lea si,buf+1
mov cx,[si] ;计数器重置
mov ch,0
lea si,buf+2 ;si指向字符串
lea di,mulnum ;因输入位数不同对di进行操作
add di,10
mov al,cl
mov bl,2
mul bl
sub di,ax ;使di指向相应位数对应的位置
mov bx,0 ;bx置零用于存累加结果
mov ax,0
multi_num: ;乘法得到字符串代表的值
push bx
mov ax,[si]
mov ah,0
mov dx,0
mov bx,[di]
mul bx ;乘法结果存到dx中
pop bx
add bx,ax ;将乘法结果累加到bx中
add si,1
add di,2
loop multi_num
shuchu:
;输出回车换行
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
;输出第1个数字
mov cx,4
mov ch,0
mov dh,bh
shr dh,cl ;得到高8位中的高位
and dh,0FH
cmp dh,09H
jbe shuzi1
ja zimu1
shuzi1:
add dh,30H
jmp shuchu1
zimu1:
add dh,37H
jmp shuchu1
shuchu1:
mov dl,dh
mov ah,02H ;输出高8位中的高位
int 21H
;输出第2个数字
mov dh,bh
and dh,0FH ;得到高8位中的低位
cmp dh,09H
jbe shuzi2
ja zimu2
shuzi2:
add dh,30H
jmp shuchu2
zimu2:
add dh,37H
jmp shuchu2
shuchu2:
mov dl,dh
mov ah,02H ;输出高8位中的低位
int 21H
;输出第3个数字
mov dl,bl
shr dl,cl ;得到低8位中的高位
and dl,0FH
cmp dl,09H
jbe shuzi3
ja zimu3
shuzi3:
add dl,30H
jmp shuchu3
zimu3:
add dl,37H
jmp shuchu3
shuchu3:
mov ah,02H ;输出低8位中的高位
int 21H
;输出第4个数字
mov dl,bl
and dl,0FH ;得到低8位中的低位
cmp dl,09H
jbe shuzi4
ja zimu4
shuzi4:
add dl,30H
jmp shuchu4
zimu4:
add dl,37H
jmp shuchu4
shuchu4:
mov ah,02H ;输出低8位中的低位
int 21H
mov dl,48H
mov ah,02H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入一个十进制数(字类型),以二进制的形式输出。
DATAS SEGMENT
buf dw 6
dw ?
dw 6 dup(?)
mulnum dw 10000,1000,100,10,1
num dw 4 dup(?)
divider db 2
output db 16 dup(?),'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H
lea si,buf+1
mov cx,[si]
mov ch,0
lea si,buf+2
change_num: ;将字符转为数字
mov ax,[si]
sub ax,30H
mov [si],ax
inc si
loop change_num
lea si,buf+1
mov cx,[si] ;计数器重置
mov ch,0
lea si,buf+2 ;si指向字符串
lea di,mulnum ;因输入位数不同对di进行操作
add di,10
mov al,cl
mov bl,2
mul bl
sub di,ax ;使di指向相应位数对应的位置
mov bx,0 ;bx置零用于存累加结果
mov ax,0
multi_num: ;乘法得到字符串代表的值
push bx
mov ax,[si]
mov ah,0
mov dx,0
mov bx,[di]
mul bx ;乘法结果存到dx中
pop bx
add bx,ax ;将乘法结果累加到bx中
add si,1
add di,2
loop multi_num
shuchu:
;输出回车换行
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
;得到第1个数字
lea si,num
mov cx,4
mov ch,0
mov dh,bh
shr dh,cl ;得到高8位中的高位
and dh,0FH
mov [si],dh
;得到第2个数字
add si,2
mov dh,bh
and dh,0FH ;得到高8位中的低位
mov [si],dh
;得到第3个数字
add si,2
mov dl,bl
shr dl,cl ;得到低8位中的高位
and dl,0FH
mov [si],dl
;得到第4个数字
add si,2
mov dl,bl
and dl,0FH ;得到低8位中的低位
mov [si],dl
mov ax,0
mov bx,0
mov dx,0
mov cx,4 ;计数器重置
mov ch,0
lea si,num ;si指向字符串,一次+2
lea di,output ;di指向输出output,一次+1
add di,3 ;di指向第13位
mov ax,[si]
;存16-13位
erjinzhi1:
push di
lea di,divider
mov bh,[di] ;di指向除数2
div bh
pop di
cmp al,0
je Atiaozhuan1
ja Atiaozhuan2
Atiaozhuan1:
mov [di],ah ;存余数
dec di
cmp cx,1
je zhongji1
loop erjinzhi1
Atiaozhuan2:
mov [di],ah
dec di
mov ah,0 ;存余数
cmp cx,1
je zhongji1
loop erjinzhi1
zhongji1:
mov ax,0
mov bx,0
mov dx,0
mov cx,4 ;计数器重置
mov ch,0
add si,2
add di,8
mov ax,[si]
;存12-9位
erjinzhi2:
push di
lea di,divider
mov bh,[di] ;di指向除数2
div bh
pop di
cmp al,0
je Btiaozhuan1
ja Btiaozhuan2
Btiaozhuan1:
mov [di],ah ;存余数
dec di
cmp cx,1
je zhongjie2
loop erjinzhi2
Btiaozhuan2:
mov [di],ah
dec di
mov ah,0
cmp cx,1
je zhongjie2
loop erjinzhi2
zhongjie2:
mov ax,0
mov bx,0
mov dx,0
mov cx,4 ;计数器重置
mov ch,0
add si,2
add di,8
mov ax,[si]
;存8-5位
erjinzhi3:
push di
lea di,divider
mov bh,[di] ;di指向除数2
div bh
pop di
cmp al,0
je Ctiaozhuan1
ja Ctiaozhuan2
Ctiaozhuan1:
mov [di],ah ;存余数
dec di
cmp cx,1
je zhongji3
loop erjinzhi3
Ctiaozhuan2:
mov [di],ah
dec di
mov ah,0
cmp cx,1
je zhongji3
loop erjinzhi3
zhongji3:
mov ax,0
mov bx,0
mov dx,0
mov cx,4 ;计数器重置
mov ch,0
add si,2
add di,8
mov ax,[si]
;存4-1位
erjinzhi4:
push di
lea di,divider
mov bh,[di] ;di指向除数2
div bh
pop di
cmp al,0
je Dtiaozhuan1
ja Dtiaozhuan2
Dtiaozhuan1:
mov [di],ah ;存余数
dec di
cmp cx,1
je zhongji4
loop erjinzhi4
Dtiaozhuan2:
mov [di],ah
dec di
mov ah,0
cmp cx,1
je zhongji4
loop erjinzhi4
zhongji4:
lea si,output
mov cx,16
mov ch,0
zhuanshuzi:
mov al,[si]
add al,30H
mov [si],al
inc si
loop zhuanshuzi
lea si,output
mov dx,si;输出
mov ah,09H
int 21H
mov dl,42H
mov ah,02H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入一个二进制数(字类型),以十六进制的形式输出。
DATAS SEGMENT
buf dw 17
dw ?
dw 17 dup(?)
mulnum dw 32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H
lea si,buf+1
mov cx,[si]
mov ch,0
lea si,buf+2
change_num: ;将字符转为数字
mov ax,[si]
sub ax,30H
mov [si],ax
inc si
loop change_num
lea si,buf+1
mov cx,[si] ;计数器重置
mov ch,0
lea si,buf+2 ;si指向字符串
lea di,mulnum ;输入位数固定为16位
;add di,10
;mov al,cl
;mov bl,2
;mul bl
;sub di,ax ;使di指向相应位数对应的位置
mov bx,0 ;bx置零用于存累加结果
mov ax,0
multi_num: ;乘法得到字符串代表的值
push bx
mov ax,[si]
mov ah,0
mov dx,0
mov bx,[di]
mul bx ;乘法结果存到dx中
pop bx
add bx,ax ;将乘法结果累加到bx中
add si,1
add di,2
loop multi_num
shuchu:
;输出回车换行
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
;输出第1个数字
mov cx,4
mov ch,0
mov dh,bh
shr dh,cl ;得到高8位中的高位
and dh,0FH
cmp dh,09H
jbe shuzi1
ja zimu1
shuzi1:
add dh,30H
jmp shuchu1
zimu1:
add dh,37H
jmp shuchu1
shuchu1:
mov dl,dh
mov ah,02H ;输出高8位中的高位
int 21H
;输出第2个数字
mov dh,bh
and dh,0FH ;得到高8位中的低位
cmp dh,09H
jbe shuzi2
ja zimu2
shuzi2:
add dh,30H
jmp shuchu2
zimu2:
add dh,37H
jmp shuchu2
shuchu2:
mov dl,dh
mov ah,02H ;输出高8位中的低位
int 21H
;输出第3个数字
mov dl,bl
shr dl,cl ;得到低8位中的高位
and dl,0FH
cmp dl,09H
jbe shuzi3
ja zimu3
shuzi3:
add dl,30H
jmp shuchu3
zimu3:
add dl,37H
jmp shuchu3
shuchu3:
mov ah,02H ;输出低8位中的高位
int 21H
;输出第4个数字
mov dl,bl
and dl,0FH ;得到低8位中的低位
cmp dl,09H
jbe shuzi4
ja zimu4
shuzi4:
add dl,30H
jmp shuchu4
zimu4:
add dl,37H
jmp shuchu4
shuchu4:
mov ah,02H ;输出低8位中的低位
int 21H
mov dl,48H
mov ah,02H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入一个二进制数(字类型),以十进制的形式输出。
DATAS SEGMENT
buf dw 17
dw ?
dw 17 dup(?)
mulnum dw 32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
divnum dw 10000,1000,100,10,1
output db 5 dup(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H
lea si,buf+1
mov cx,[si]
mov ch,0
lea si,buf+2
change_num: ;将字符转为数字
mov ax,[si]
sub ax,30H
mov [si],ax
inc si
loop change_num
lea si,buf+1
mov cx,[si] ;计数器重置
mov ch,0
lea si,buf+2 ;si指向字符串
lea di,mulnum ;输入位数固定为16位
mov bx,0 ;bx置零用于存累加结果
mov ax,0
multi_num: ;乘法得到字符串代表的值
push bx
mov ax,[si]
mov ah,0
mov dx,0
mov bx,[di]
mul bx ;乘法结果存到dx中
pop bx
add bx,ax ;将乘法结果累加到bx中
add si,1
add di,2
loop multi_num
;输出回车换行
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
mov ax,bx ;将乘法结果存到ax中
mov bx,0
mov dx,0
mov cx,5
mov ch,0
lea si,divnum
lea di,output
;按位输出
xunhuan:
mov bx,[si] ;bx为除数
div bx
add ax,30H ;转为输出用数字
mov [di],al
mov ax,0
mov ax,dx
mov dx,0
add si,2
inc di
loop xunhuan
mov cx,5
mov ch,0
lea si,output
shuchu:
mov dl,[si]
cmp dl,30H ;看output当前第一位是否是0,若是判断下一位,若不是进行输出
ja step2
je nextshu
nextshu:
inc si
cmp cx,1 ;若output为0,直接输出0
je zero
loop shuchu
step2:
mov dl,[si]
mov ah,02H
int 21H
inc si
cmp cx,1 ;若输出到最后一位,直接结束
je jieshu
loop step2
zero:
mov dl,30H
mov ah,02H
int 21H
jieshu:
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入一个十六进制数(字类型),以十进制的形式输出。
- 键盘输入一个十六进制数(字类型),以二进制的形式输出。(在一起)
DATAS SEGMENT
buf dw 5
dw ?
dw 5 dup(?)
erjinzhi dw 16 dup(?),'$'
mulnum dw 32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
divnum dw 10000,1000,100,10,1
output db 5 dup(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H
lea si,buf+1
mov cx,[si]
mov ch,0
lea si,buf+2
change_num: ;将字符转为数字
mov al,[si]
mov ah,0
cmp ax,39H
jbe tiaozhuan1
ja tiaozhuan2
tiaozhuan1: ;小于等于9
sub ax,30H
jmp tiaozhuan3
tiaozhuan2: ;大于等于A
sub ax,37H
jmp tiaozhuan3
tiaozhuan3:
mov [si],al
inc si
loop change_num
;转二进制
mov ax,0
mov dx,0
mov bx,0
mov cx,4
lea si,buf
add si,2 ;si指向16进制buf
lea di,erjinzhi ;di指向2进制输出空间erjinzhi
add di,3
zhuan_2:
push cx
mov cx,4
mov al,[si]
mov bl,2
chufa:
div bl
mov [di],ah
mov ah,0
dec di
loop chufa
pop cx
inc si
add di,8
loop zhuan_2
mov cx,16 ;计数器重置
mov ch,0
lea si,erjinzhi ;si指向字符串
lea di,mulnum ;输入位数固定为16位
mov dx,0
mov bx,0 ;bx置零用于存累加结果
mov ax,0
multi_num: ;乘法得到字符串代表的值
push bx
mov ax,[si]
mov ah,0
mov dx,0
mov bx,[di]
mul bx ;乘法结果存到dx中
pop bx
add bx,ax ;将乘法结果累加到bx中
add si,1
add di,2
loop multi_num
;输出回车换行
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
mov ax,bx ;将乘法结果存到ax中
mov bx,0
mov dx,0
mov cx,5
mov ch,0
lea si,divnum
lea di,output
;按位输出
xunhuan:
mov bx,[si] ;bx为除数
div bx
add ax,30H ;转为输出用数字
mov [di],al
mov ax,0
mov ax,dx
mov dx,0
add si,2
inc di
loop xunhuan
mov cx,5
mov ch,0
lea si,output
shuchu:
mov dl,[si]
cmp dl,30H ;看output当前第一位是否是0,若是判断下一位,若不是进行输出
ja step2
je nextshu
nextshu:
inc si
cmp cx,1 ;若output为0,直接输出0
je zero
loop shuchu
step2:
mov dl,[si]
mov ah,02H
int 21H
inc si
cmp cx,1 ;若输出到最后一位,直接结束
je jieshu
loop step2
zero:
mov dl,30H
mov ah,02H
int 21H
jieshu:
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea si,erjinzhi
mov cx,16
mov ch,0
zhuan01:
mov bl,[si]
add bl,30H
mov [si],bl
inc si
loop zhuan01
lea dx,erjinzhi
mov ah,09H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入下列两组十进制数,求其和,并将结果显示在屏幕上
35789418
46531425
DATAS SEGMENT
buf1 db 9
db ?
db 9 dup(?)
buf2 db 9
db ?
db 9 dup(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf1
mov ah,0AH
int 21H
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,buf2
mov ah,0AH
int 21H
mov cx,8
mov ch,0
lea si,buf1
add si,2
zhuanshuzi1:
mov al,[si]
sub al,30H
mov [si],al
inc si
loop zhuanshuzi1
lea si,buf2
add si,2
mov cx,8
mov ch,0
zhuanshuzi2:
mov al,[si]
sub al,30H
mov [si],al
inc si
loop zhuanshuzi2
mov ax,0
mov bx,0
mov dx,0
mov cx,8
mov ch,0
lea si,buf1
lea di,buf2
add si,2
add di,2
changjiafa:
mov ah,[si]
mov al,[di]
add ah,al
mov [si],ah
inc si
inc di
loop changjiafa
lea si,buf1
add si,9 ;指向末尾
mov bh,0 ;bh作为进位标志
mov cx,8
mov ch,0
panduan:
mov bl,[si]
add bl,bh
cmp bl,10
jae tiaozheng
jb budong
tiaozheng:
sub bl,10
mov [si],bl
mov bh,1
dec si
cmp cx,1
je end_loop
loop panduan
budong:
mov [si],bl
mov bh,0
dec si
cmp cx,1
je end_loop
loop panduan
end_loop:
lea si,buf1
add si,2
mov cx,8
mov ch,0
shuchu:
mov dl,[si]
add dl,30H
mov [si],dl
inc si
loop shuchu
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea si,buf1
add si,10
mov dl,[si]
mov dl,'$' ;将回车换为dollar
mov [si],dl
lea dx,buf1
add dx,2
mov ah,09H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 输入一个字符串,判断该字符串是否为回文串。如果是回文串,输出yes,否则输出no。回文串就是正读和反读都一样的字符串,如level和noon。
DATAS SEGMENT
buf db 100
db ?
db 100 dup(?)
Yes db 'yes$'
No db 'no$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H
mov ax,0
mov bx,0
mov dx,0
lea si,buf
mov al,[si+1]
mov dh,2
div dh
lea si,buf+1 ;取字符串长度
mov bl,[si]
lea di,buf+2
lea si,buf+2 ;取字符串首地址
add di,bx
dec di ;取字符串尾地址
mov cx,0
add cl,ah
add cl,al ;设定循环次数
cmp ah,0
je oushu
jne jishu
oushu:
mov al,[si]
mov bl,[di]
cmp al,bl
jnz butong
inc si
dec di
cmp cx,1
je xiangtong
loop oushu
jishu:
mov al,[si]
mov bl,[di]
cmp al,bl
jnz butong
inc si
dec di
cmp cx,1
je xiangtong
loop jishu
xiangtong:
mov dl,13
mov ah,02H
int 21H
mov dl,10
mov ah,02H
int 21H
lea si,Yes
mov dx,si
mov ah,09H
int 21H
jmp jieshu
butong:
mov dl,13
mov ah,02H
int 21H
mov dl,10
mov ah,02H
int 21H
lea si,No
mov dx,si
mov ah,09H
int 21H
jmp jieshu
jieshu:
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 从键盘输入一串可显示字符(以回车符结束),并按字母、数字、空格分类计数,然后显示出这三类统计的结果。
已完成
- 将一组有符号数中的负数求和,并统计负数的个数,并在屏幕上以十进制的形式显示结果。
38H,4AH,0C5H,83H,9CH,0B4H,7FH,0C4H,05H,0F5H
DATAS SEGMENT
num db 50
db ?
db 50 dup(?)
nozero_num db 20 dup(?)
fushu db 20 dup(?)
fushugeshu db 10
code_2 db 12 dup(0) ;二进制数临时存放
divnum dw 10000,1000,100,10,1
output db 5 dup(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ES,AX
lea dx,num
mov ah,0AH
int 21H
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea si,num
inc si
mov cx,[si]
mov ch,0
inc si
change_num: ;将字符转为数字
mov bl,[si]
cmp bl,0DH ;判断回车
je tiaozhuan3
cmp bl,20H ;判断空格
je tiaozhuan3
cmp bl,39H
jbe tiaozhuan1
ja tiaozhuan2
tiaozhuan1: ;小于等于9
sub bx,30H
jmp tiaozhuan3
tiaozhuan2: ;大于等于A
sub bx,37H
jmp tiaozhuan3
tiaozhuan3:
mov [si],bl
inc si
loop change_num
;删除占位的0与空格
lea di,nozero_num
lea si,num
inc si
mov bx,0
mov cx,[si]
mov ch,0
inc si
delete_0:
mov bl,[si]
push si
cmp bl,20H ;判断空格
je endloop
cmp bl,0 ;判断占位0
jne nextletter1
je zhongji
zhongji:
add si,2
mov bl,[si]
cmp bl,20H
je nextletter2
jne endloop
nextletter1:
mov [di],bl
inc di
jmp endloop
nextletter2:
sub si,2
mov bl,[si]
mov [di],bl
inc di
jmp endloop
endloop:
pop si
inc si
loop delete_0
;删除正数
mov cx,10
mov ch,0
lea si,nozero_num
lea di,fushugeshu
mov dl,[di] ;dl为负数计数器
mov bx,0
mov ax,0
delete_zheng:
mov al,[si]
cmp al,8
jb bianling
add si,2
jmp jieshu
bianling:
mov al,0
mov [si],al
inc si
mov al,[si]
mov al,0
mov [si],al
inc si
dec dl
jieshu:
loop delete_zheng
mov [di],dl ;将负数的个数存到fushugeshu中
;第二次删除占位的0
lea si,nozero_num
mov cx,20
mov ch,0
lea di,fushu
delete_0_1:
mov bl,[si]
cmp bl,0 ;判断占位0
je nextchar
mov [di],bl
inc di
nextchar:
inc si
loop delete_0_1
;将字符转成16进制数并累加求和
lea di,fushugeshu
mov cl,[di]
mov ch,0
mov ax,0
mov bx,0 ;bx为累加和
mov dx,0
lea si,fushu
qiuhe:
push bx
push cx
mov cl,4
mov al,[si] ;al存高位
shl ax,cl
inc si
mov dl,[si] ;dl存低位
add ax,dx ;加和结果存到ax中
pop cx
pop bx
neg al ;转绝对值
add bx,ax ;累加到bx中
inc si
loop qiuhe
mov dl,2DH ;输出负号
mov ah,02H
int 21H
mov ax,bx ;将乘法结果存到ax中
mov bx,0
mov dx,0
mov cx,5
mov ch,0
lea si,divnum
divide:
mov bx,[si]
div bx
cmp ax,0
jne shuchu
je xiayiwei
shuchu:
push dx
mov dx,ax
add dl,30H
mov ah,02H
int 21H
pop dx
xiayiwei:
mov ax,dx
mov dx,0
add si,2
loop divide
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入十个数,分别统计0到9,10到99,100以上的数的个数,并显示结果。
DATAS SEGMENT
n1 db 6
db ?
db 6 dup(?)
n2 db 6
db ?
db 6 dup(?)
n3 db 6
db ?
db 6 dup(?)
n4 db 6
db ?
db 6 dup(?)
n5 db 6
db ?
db 6 dup(?)
n6 db 6
db ?
db 6 dup(?)
n7 db 6
db ?
db 6 dup(?)
n8 db 6
db ?
db 6 dup(?)
n9 db 6
db ?
db 6 dup(?)
n10 db 6
db ?
db 6 dup(?)
address db 10 dup(?)
yiweishu db '0-9:$'
liangweishu db '10-99:$'
dayusanweishu db '100-65535:$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,n1
mov ah,0AH
int 21H
lea di,address
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n2
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n3
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n4
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n5
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n6
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n7
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n8
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n9
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n10
mov ah,0AH
int 21H
mov [di],dl
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
mov ax,0
mov bx,0 ;bh记一位数,bl记两位数
mov cx,10
mov ch,0
mov dx,0 ;dh记两位数以上,后变为ah
lea si,address
chashu:
mov ah,0
mov al,[si]
inc al
mov di,ax
mov dl,[di]
cmp dl,1
je yiwei
cmp dl,2
je liangwei
ja sanwei
yiwei:
inc bh
inc si
cmp cx,1
je shuchu
loop chashu
liangwei:
inc bl
inc si
cmp cx,1
je shuchu
loop chashu
sanwei:
inc dh
inc si
cmp cx,1
je shuchu
loop chashu
shuchu:
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
mov ah,dh
push ax
lea dx,yiweishu
mov ah,09H
int 21H
add bh,30H
mov dl,bh
mov ah,02H
int 21H
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,liangweishu
mov ah,09H
int 21H
add bl,30H
mov dl,bl
mov ah,02H
int 21H
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,dayusanweishu
mov ah,09H
int 21H
pop ax
add ah,30H
mov dl,ah
mov ah,02H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 键盘输入一串二进制数1ah ,7ch,0bah,3ah,45h,63h求其和,并将结果显示在屏幕上。
DATAS SEGMENT
n1 db 13
db ?
db 13 dup(?)
n2 db 13
db ?
db 13 dup(?)
n3 db 13
db ?
db 13 dup(?)
n4 db 13
db ?
db 13 dup(?)
n5 db 13
db ?
db 13 dup(?)
n6 db 13
db ?
db 13 dup(?)
code_2 db 12 dup(0)
address db 6 dup(?)
mulnum dw 2048,1024,512,256,128,64,32,16,8,4,2,1
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ES,AX
lea dx,n1
mov ah,0AH
int 21H
lea di,address
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n2
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n3
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n4
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n5
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,n6
mov ah,0AH
int 21H
mov [di],dl
inc di
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
;转二进制数字
mov cx,6
mov ch,0
mov ax,0
mov bx,0
mov dx,0
lea si,address
turn_num:
push cx
mov al,[si]
mov di,ax
inc di ;di指向字符串长度
mov cl,[di] ;cx计数字符串长度
inc di ;di指向字符串首地址
xunhuan1:
mov bl,[di]
sub bl,30H
mov [di],bl
inc di
loop xunhuan1
pop cx
inc si
loop turn_num
;补齐12位
mov cx,6
mov ch,0
mov ax,0
mov bx,0
mov dx,0
lea di,address
move_char:
push di
push cx
mov al,[di]
mov si,ax
inc si ;si指向字符串长度
mov cl,[si] ;cx计数字符串长度
mov ch,0
inc si ;si指向字符串首地址
lea di,code_2 ;di指向code_2首地址
cmp cx,8
jne zhongji2 ;判断位数,位数为8补4个0,位数为12不补0
add di,4
zhongji2:
rep movsb
;转为16进制数
mov cx,12
mov ch,0
lea di,code_2 ;di指向code_2首地址
lea si,mulnum
leijia:
push bx
mov bl,[di] ;bx存2进制数
mov bh,0
mov ax,[si] ;ax存2进制乘数
mul bx
pop bx
add bx,ax ;累加结果在bx中
inc di
add si,2
loop leijia
pop cx
pop di
inc di
loop move_char
mov ax,0
mov dx,0
shuchu:
;输出回车换行
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
;输出第1个数字
mov cx,4
mov ch,0
mov dh,bh
shr dh,cl ;得到高8位中的高位
and dh,0FH
cmp dh,09H
jbe shuzi1
ja zimu1
shuzi1:
add dh,30H
jmp shuchu1
zimu1:
add dh,37H
jmp shuchu1
shuchu1:
mov dl,dh
mov ah,02H ;输出高8位中的高位
int 21H
;输出第2个数字
mov dh,bh
and dh,0FH ;得到高8位中的低位
cmp dh,09H
jbe shuzi2
ja zimu2
shuzi2:
add dh,30H
jmp shuchu2
zimu2:
add dh,37H
jmp shuchu2
shuchu2:
mov dl,dh
mov ah,02H ;输出高8位中的低位
int 21H
;输出第3个数字
mov dl,bl
shr dl,cl ;得到低8位中的高位
and dl,0FH
cmp dl,09H
jbe shuzi3
ja zimu3
shuzi3:
add dl,30H
jmp shuchu3
zimu3:
add dl,37H
jmp shuchu3
shuchu3:
mov ah,02H ;输出低8位中的高位
int 21H
;输出第4个数字
mov dl,bl
and dl,0FH ;得到低8位中的低位
cmp dl,09H
jbe shuzi4
ja zimu4
shuzi4:
add dl,30H
jmp shuchu4
zimu4:
add dl,37H
jmp shuchu4
shuchu4:
mov ah,02H ;输出低8位中的低位
int 21H
mov dl,48H
mov ah,02H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 一个有符号字数组以0为结束标志,编程求这个数组的最大值、 最小值、平均值。
- 在BUFFER中定义了的十个带符号字,将其中的负数变成绝对值,并以十进制方式输出。
- 已知数组A包含20个互不相等的字型整数,数组B包含30个互不相等的字型整数,试编制一程序把在A中而不在B中出现的整数放于数组C中。
大作业4:
DATAS SEGMENT
buf db 100
db ?
db 100 dup(?)
letter db 'The number of letter is:$'
words db 'The number of word is:$'
sentence db 'The number of sentence is:$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0Ah
int 21h
lea di,buf
inc di
mov cx,[di]
mov ch,0
inc di
mov ax,0;ah为单词计数器,al为字母计数器
mov bx,0;bh为句子计数器,bl为字母数据寄存器
mov dx,0;dl临时存字符
panduan:
mov dl,[di]
cmp dl,2EH
je juzi
cmp dl,'A'
jb nextchar
cmp dl,'z'
ja nextchar
cmp dl,'Z'
jbe zimu
cmp dl,'a'
jae zimu
jmp nextchar
juzi:
inc bh
jmp nextchar
zimu:
inc bl
jmp nextloop
nextchar:;碰到回车或非字母字符时,字母或句子结束
cmp bl,1
je zhongji1
ja zhongji2
jb nextloop
zhongji1:
inc al
mov bl,0
jmp nextloop
zhongji2:
inc ah
mov bl,0
jmp nextloop
nextloop:
inc di
loop panduan
;输出
mov bl,ah;将单词计数转移到bl中
push bx
push ax
mov dl,0DH;回车换行
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,letter;输出字母数量
mov ah,09H
int 21H
pop ax
add al,30H
mov dl,al
mov ah,02H
int 21H
mov dl,0DH;回车换行
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,words;输出单词数量
mov ah,09H
int 21H
pop bx
add bl,30H
mov dl,bl
push bx
mov ah,02H
int 21H
mov dl,0DH;回车换行
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
lea dx,sentence;输出句子数量
mov ah,09H
int 21H
pop bx
add bh,30H
mov dl,bh
mov ah,02H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START