题目要求:
实现代码:
DATAS SEGMENT
;此处输入数据段代码
MIN DW 15
MAX DW 40
shi db 10
asc db ?
geshu db ?
int1 DW ?
shuru DB 'Please input a string(15 <= string <= 40):$'
len DB 'The length of the string is :$'
error DB 'Warning error!$'
num DB 'The number of non letters in the string :$'
largest DB 'The largest ASCII in the string :$'
dao DB 'String output in reverse order is :$'
daoxu DB 'Please enter an int :$'
buf DB 30h
DB 0
DB 30H DUP(0)
DATAS ENDS
enterline macro ;宏定义,完成回车换行
mov dl,13;回车
mov ah,2
int 21h
mov dl,10;换行
mov ah,2
int 21h
endm
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov dx,offset shuru
mov ah,9
int 21h ;输出开头
mov dx,offset buf
mov ah,10
int 21h ;输入字符串
enterline
xor dx,dx
mov bl,buf+1
mov geshu,bl
;bl里面放的是字符串长度的数值
mov dl,geshu
cmp dx,MIN ;判断溢出
jb stop
cmp dx,MAX
ja stop
mov dx,offset len
mov ah,9
int 21h
;将bl里面的数值转为ascii
;子程序输出位数
call weishu ;位数子程序
enterline
mov dx,offset num
mov ah,9
int 21h
call panduan ;判断里面非字母的个数
;输出非字母的个数 在dl里面
mov bl,dl
call weishu
enterline;输出最大ascii
mov dx,offset largest
mov ah,9
int 21h
mov dl,asc
mov ah,2
int 21h
;倒序
enterline
mov dx,offset dao
mov ah,9
int 21h
mov bl,geshu
mov si,bx
mov cx,bx;cx里面放的int和个数
next4:
mov dl,buf[si+1]
mov ah,2
int 21h
dec si
dec cx
cmp cx,0
jne next4
;int输入倒序
enterline
mov dx,offset daoxu
mov ah,9
int 21h
enterline
xor bx,bx
input: ;输入字符 转为 数字
mov ah,1H ;在al里面
int 21H
cmp al,13 ;与空格比较如果
jz next5 ;输入结束
SHL bx,1 ;bx = bx *2
mov cx,bx
SHL cx,1
SHL cx,1 ;cx = bx *2*2*2
add bx,cx ;bx = bx *10 完成bx * 10
XOR cx,cx ;清零cx
mov cl,al
sub cl,30H
add bx,cx ;num存在bx里面
jmp input
next5:
mov cx,bx;cx里面放的int和个数
mov bl,geshu
mov si,bx
next6:
mov dl,buf[si+1]
mov ah,2
int 21h
dec si
dec cx
cmp cx,0
jne next6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
jmp stop1
;子程序
weishu proc;位数子程序
xor ax,ax
mov al,bl
div shi ;/10
xor dx,dx
mov dl,al ;商
mov dh,ah ;余数放到dh,防止被破坏
add dl,30h
mov ah,2
int 21h;十位
mov dl,dh
add dl,30h
mov ah,2
int 21h;个位
ret
weishu endp
;子程序2——判断
panduan proc
xor cx,cx
mov dl,0 ;dl里面是非字母的个数
mov cl,geshu;cl是放总共的字符串的个数的
mov si,0 ;si跟dh比较
mov asc,0 ;找asc最大的
next:
mov bl,buf[si+2]
cmp asc,bl;找最大的asc
jae next2
mov asc,bl;asc小于bl
next2:
cmp bl,40h
jb dljia
cmp bl,5bh
jb dlbujia
cmp bl,60h
jb dljia
cmp bl,7bh
jb dlbujia
dljia:inc dl
dlbujia:
inc si
cmp si,cx
jnz next
ret
panduan endp ;;panduan end
stop:
mov dx,offset error
mov ah,9
int 21h ;输出错误提示
stop1:
MOV AH,4CH
INT 21H
CODES ENDS
END START
示例
如果喜欢我的文章就给我点赞吧
(以后还会不定时更新汇编语言,java,数字结构的题目的哦!)