#2
Valenciax2020-05-05 06:28
简单题目简单的写,输出方式可以参考Output_ax子程序
程序代码: DATA SEGMENT OutStr db 0dh,0ah ;回车 Output db '0',4 dup (20h),0dh,0ah,'$' ;输出字串含回车 DATA ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX mov bx,0 ;初始化计数 next: mov ah,1 ;输入,显示字符 int 21h cmp al,'$' ;比较结束符 jz Count ;输入$跳 cmp al,0dh ;是否enter,也视作结束输入 jz Count cmp al,'0' ;比较'0' jb @f ;不是数字符跳 cmp al,'9' ;比较'9' jbe next ;输入数字符,不计,重新输入 @@: inc bx ;累加计数 jmp short next ;重新输入 Count: mov ax,bx ;取值 lea di,OutPut ;指向结果字串 call Output_AX ;调用程序将ax转为ASCII字串 lea dx,OutStr ;指向输出字串 mov ah,9 ;输出 int 21h MOV AH,4CH INT 21H ;---------------------------------------------------------------------------- ;将ax值转为ascii数字,存入es:di Output_AX: mov cx,0 ;清0 mov bx,10 ;除法准备 @@: mov dx,0 ;清0 div bx ;ds:ax /10 ,若1234 ,除10后,dl得余数4, push dx ;保存, ax=1234,依次保存4,3,2,1 inc cx ;累加个数 or ax,ax ;是否已除尽 jnz @b ;不是,再除 mov bl,cl ;存个数 @@: pop ax ;后入先出,先印出第一数,然后第二.... or al,30h ;转ascii stosb ;存入字串缓冲 loop @b ;回圈,下一个 ret ;---------------------------------------------------------------------------- CODES ENDS END START |
程序段如下:
DSEG SEGMENT
BUFF DB 50 DUP('')
COUNT DW 0
DSEG ENDS
BEGIN: LEA BX, BUFF
MOV COUNT, 0
INPUT: MOV AH, 01 ;从键盘输入一个字符的功能调用
INT 21H
MOV [BX], AL
INC BX
CMP AL, ‘$’ ;是$结束符吗?
JNZ INPUT ;不是,继续输入
LEA BX, BUFF ;对非数字字符进行计数
NEXT: MOV CL, [BX]
INC BX
CMP CL, ‘$’ ;是$结束符,则转去显示
JZ DISP
CMP CL, 30H ;小于0是非数字字符
JB NEXT
CMP CL, 39H ;大于9是非数字字符
JA NEXT
INC COUNT ;个数+1
JMP NEXT
DISP: ┇ ;16进制数显示程序段(省略)
此题省略了16进制数显示程序段,此段代码,不懂怎么编写