
code segment
assume cs:code
main proc far
start:
push ds
sub ax,ax
push ax
mov cl,0
again: mov ah,01
int 21h
inc cl
cmp al,'0'
jl step
cmp al,'9'
jg step
inc cl
step: cmp al,13
jne again
exit: dec cl
ret
main endp
code ends
end start
datas SEGMENT
data DB 100 DUP() ;定义数据段,这里定义了一个字节变量空间data ,100字节,从后面
datas ENDS
codes SEGNENT;代码段
ASSUME CS:codes, DS:datas;这里定义了各个段的名字,注意:并没有初始化各个变量的值
start: MOV AX,datas ;初始化
MOV DS,AX;由于不能直接对段寄存器直接给值,要先用到AX
LEA DI ,data;获得data段内偏移量
LOOP1:
MOV AH,01H;输入一个字符
INT 21H;软中断
MOV [DI] ,AL
INC DI;地址指针寄存器,每执行一次,地址加一
CMP AL,0DH; ODH表示回车
JNE LOOP1;JNE(不等于转移)=jump on not equal 如果AL 不等于回车则跳转到
;LOOP1(也就是重新获取输入字符,重新比对)
MOV AH,4CH;这个你懂的,返回DOS
INT 21H
codes ENDS
END start
dat segment
data db 10 dup(0)
input db 'input:$'
output db 'output:$'
enter db 0dh,0ah,'$'
dat ends
cod segment
assume ds:dat,cs:cod
;-----------------------主程序
start:
mov ax,dat
mov ds,ax ;数据段寄存器赋值
lea si,data ;SI指向DATA数组首单元
mov cl,4
ppp:
mov bx,0 ;BX清零
lea dx,input ;这三行调用INT 21H中断例程的9号功能输出DS:DX指向的字符串,以'$'结尾
mov ah,9 ;以下代码若有类似的三句,实现功能类似
int 21h ;显示输入提示
;-----------------------开始输入十六进制数
get:
mov ah,1 ;这两行调用INT 21H中断例程1号功能,等待用户输入一个字符,保存入AL中
int 21h
;以下6对代码依次比较输入字符,并跳转到相应 *** 作
cmp al,''
jz kkk ;输入''号,退出程序
cmp al,0dh ;0DH是回车键对应的字符
jz mess ;输入回车,跳出get循环(get循环:实现输入十六进制数并保存到BX的功能)
cmp al,30h ;这4行判断是否是'0'~'9'
jb get
cmp al,39h
jbe num
cmp al,'A' ;这4行判断是否是'A'~'F'
jb get
cmp al,'F'
jbe big
cmp al,'a' ;这4行判断是否是'a'~'f'
jb get
cmp al,'f'
jbe big
jmp get
num: ;对数字进行处理
and al,0fh ;al高4位清零,保留低4位
jmp next
big: ;对大写字母或者小写字母进行处理
sub al,7
and al,0fh
next:
shl bx,cl ;BX左移4位
add bl,al ;将数字保存到BL的低4位中
jmp get
;-----------------------
mess:
lea dx,enter
mov ah,9
int 21h ;回车、换行
lea dx,output
mov ah,9
int 21h ;显示输出提示
mov dx,0
mov ax,bx
mov bx,10 ;进制数
again:
call buf
cmp ax,0 ;商如果为0,表示该十六进制数对应的十进制数的每一个数位的值都存入了DATA数组
jnz again
mov ah,2 ;INT 21H的2号功能:将DL中保存的ASCII码对应的字符输出
ttt:
dec si
mov dl,[si] ;取数据
int 21h ;显示
cmp si,0
jnz ttt ;判断是否取完DATA数组的所有元素,来控制循环
lea dx,enter
mov ah,9
int 21h ;回车、换行
jmp ppp ;开始下一轮输入、转换和输出
kkk:
mov ah,4ch ;退出程序的 *** 作
int 21h
;--------------------子程序
;传入参数:BX,进制数10;DX、AX,表示一个32位16进制数
;返回值:AX
;功能:
;1 将DX、AX表示的16进制数除以10,得到余数(余数在0~9之间,即对应十进制无符号数的个位数字)
;2 将其转换为对应字符的ASCII码(即1转换为'1'),并保存到SI指向的DATA数组元素的位置
;3 SI指向DATA数组的下一个元素
buf proc
div bx
add dl,30h
mov [si],dl
mov dl,0
inc si
ret
buf endp
cod ends
end start
;总结:这段程序实现的功能
;1 十六进制输入一个数,输入回车表示输入结束,输入''表示退出程序,保存到寄存器中
;2 十六进制数转换为十进制无符号数,使用了类似于栈的 *** 作的方法
;3 十进制无符号数转换为对应字符的ASCII码(2和3由子程序buf完成)
;4 ASCII码对应字符的输出的功能
请参考
;本来准备写的,发现网上 有就直接copy了!输出的地方你要改改!
STACK SEGMENT PARA STACK 'Stack'
DW 32 DUP(0)
STACK ENDS
;--------------------------------------------
DATASEG SEGMENT PARA 'Data'
mess1 db 'please input a number n(>2):',0ah,0dh,'$'
mess2 db 'yes,it is',13,10,'$'
mess3 db 'no,it is not',13,10,'$'
num dw
DATASEG ENDS
;--------------------------------------------
CODESEG SEGMENT PARA 'Code'
MAIN PROC FAR
ASSUME SS:STACK,DS:DATASEG,CS:CODESEG
mov ax,dataseg
mov ds,ax
start:
lea dx,mess1
call prompt
call putin
and ax,000fh;由于输入的数字,返回值在AL低4位中,所以
mov num,ax
cmp num,2 ;判断是否小于2
jle start
dec ax ;直接在AX中减1即可;如果是num-1,将得到错误的结果!
mov cx,ax;给CX循环次数
mm:
cmp cx,1
je isss
mov dx,0 ;开始求余
mov ax,num
mov bx,cx
div bx
cmp dx,0
je notss
loop mm
isss:
lea dx,mess2
call prompt
jmp _out ;判断出结果了就要跳出
notss:
lea dx,mess3
call prompt
jmp _out ;判断出结果了就要跳出
prompt proc;输出处理
mov ah,09h
int 21h
ret
prompt endp
putin proc;数字输入
mov ah,1
int 21h
ret ;执行到这,也要有RET
putin endp
_out:
mov ax,4c00h ;程序得有正常的结束吧
int 21h
MAIN ENDP;
CODESEG ENDS;
END MAIN;
;呵呵,如此高分,也来凑热闹。
;运行示范如下
;C:\R
;HXGSFHSDG736RU3GRH32867VF847TBF47EHF78CGY4RCY4M8CEW7YDNRG
;GRNDY7WEC8M4YCR4YGC87FHE74FBT748FV76823HRG3UR637GDSHFSGXH
;C:\
;用MASM50编译通过
DATA SEGMENT
DB 512 DUP('$') ;定义可输入的字符个数
BUF DB '$'
CRLF DB 0DH,0AH,24H ;回车换行符
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET BUF ;指针指向待显示字符串尾部
AGAIN:
MOV AH,01 ;输入字符
INT 21H
CMP AL,0DH ;是回车吗
JE DISP ;是,转显示
DEC BX ;指针减1
MOV [BX],AL ;存入输入的字符
JMP AGAIN ;继续输入
DISP:
MOV AH,09 ;显示
MOV DX,OFFSET CRLF ;回车换行
INT 21H
MOV DX,BX ;定位待显示字符串首地址
MOV AH,09
INT 21H ;显示
MOV AH,4CH ;DOS返回
INT 21H
CODE ENDS
END START
以上就是关于求:汇编语言程序实现:从键盘上输入字符,按回车键时退出,同时统计出输入字符中数字字符的个数,并存CL全部的内容,包括:求:汇编语言程序实现:从键盘上输入字符,按回车键时退出,同时统计出输入字符中数字字符的个数,并存CL、汇编设计。求高手给出设计程序:键盘输入字符(ASCII)最后键入“回车”成“空格”成“ODH”来结束程、8086汇编语言疑问,求教高手等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)