求:汇编语言程序实现:从键盘上输入字符,按回车键时退出,同时统计出输入字符中数字字符的个数,并存CL

求:汇编语言程序实现:从键盘上输入字符,按回车键时退出,同时统计出输入字符中数字字符的个数,并存CL,第1张

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字节,从后面

;的程序可以看出是用来存储输入字符AL的

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汇编语言疑问,求教高手等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10070626.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存