各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..
发布网友
发布时间:2022-04-26 21:44
我来回答
共2个回答
热心网友
时间:2023-11-06 20:39
DSEG SEGMENT
msgi db "please input a string:$";显示信息,提示输入一串字符
buf db 100,0,100 p (?);输入字符串缓冲区
digit db 100 p (?);数字字符缓冲区
leter db 100 p (?);字母字符缓冲区
other db 100 p (?);其它字符缓冲区
dn db ?;数字字符个数
ln db ?;字母字符个数
on db ?;其它字符个数
msgd db 0dh,0ah,"digits are:$";显示信息,提示数字字符显示
msgl db 0dh,0ah,"leters are:$";显示信息,提示字母字符显示
msgo db 0dh,0ah,"others are:$";显示信息,提示其它字符显示
msgdn db 0dh,0ah,"digits:$";显示信息,提示数字字符个数显示
msgln db 0dh,0ah,"leter :$";显示信息,提示字母字符个数显示
msgon db 0dh,0ah,"other:$";显示信息,提示其它字符个数显示
DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG
MAIN PROC FAR ;主程序入口
mov ax, dseg
mov ds, ax
lea dx,msgi;显示信息,提示输入一串字符
mov ah,9
int 21h
lea dx,buf;输入字符串
mov ah,0ah
int 21h
lea si,buf
mov cl,[si+1];输入字符实际个数存入CX中
mov ch,0
add si,2;输入字符起始地址存入SI
lea bx,digit;数字字符起始地址存入BX
lea di,leter;字母字符起始地址存入DI
lea bp,other;其它字符起始地址存入BP
fenlei:
mov al,[si];取出一个字符
cmp al,30h;判断该字符是否为数字
jb oth
cmp al,39h
ja ulet
mov [bx],al;若为数字字符,则存入相应缓冲区
inc bx
inc dn;并将数字字符个数加1
jmp next
ulet:
cmp al,41h;判断该字符是否为大写字母
jb oth
cmp al,5ah
ja llet
mov [di],al;若为大写字母字符,则存入相应缓冲区
inc di
inc ln;并将字母字符个数加1
jmp next
llet:
cmp al,61h;判断该字符是否为小写字母
jb oth
cmp al,7ah
ja oth
mov [di],al;若为小写字母字符,则存入相应缓冲区
inc di
inc ln;并将字母字符个数加1
jmp next
oth:
mov ds:[bp],al;为其它字符,则存入相应缓冲区
inc bp
inc on;并将其它字符个数加1
next:
inc si;调整地址,指向下一个字符
loop fenlei;循环次数为实际输入字符个数
mov byte ptr [bx],'$';在数字字符串末尾加'$',目的用9号中断显示该串
mov byte ptr [di],'$';在字母字符串末尾加'$',目的用9号中断显示该串
mov byte ptr ds:[bp],'$';在其它字符串末尾加'$',目的用9号中断显示该串
lea dx,msgd;显示数字字符
mov ah,9
int 21h
lea dx,digit
mov ah,9
int 21h
lea dx,msgl;显示字母字符
mov ah,9
int 21h
lea dx,leter
mov ah,9
int 21h
lea dx,msgo;显示其它字符
mov ah,9
int 21h
lea dx,other
mov ah,9
int 21h
lea dx,msgln;显示数字字符个数
mov ah,9
int 21h
mov bl,dn
call disp;以十进制形式显示个数
lea dx,msgln;显示字母字符个数
mov ah,9
int 21h
mov bl,ln
call disp
lea dx,msgon;显示其它字符个数
mov ah,9
int 21h
mov bl,on
call disp
mov ah,1;按任意键退出
int 21h
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
MAIN ENDP
disp proc near
mov ch,2
rotate:
mov cl,4
rol bl,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
ret
disp endp
CSEG ENDS
END MAIN
热心网友
时间:2023-11-06 20:39
DSEG SEGMENT
msgi db "please input a string:$";显示信息,提示输入一串字符
buf db 100,0,100 p (?);输入字符串缓冲区
digit db 100 p (?);数字字符缓冲区
leter db 100 p (?);字母字符缓冲区
other db 100 p (?);其它字符缓冲区
dn db ?;数字字符个数
ln db ?;字母字符个数
on db ?;其它字符个数
msgd db 0dh,0ah,"digits are:$";显示信息,提示数字字符显示
msgl db 0dh,0ah,"leters are:$";显示信息,提示字母字符显示
msgo db 0dh,0ah,"others are:$";显示信息,提示其它字符显示
msgdn db 0dh,0ah,"digits:$";显示信息,提示数字字符个数显示
msgln db 0dh,0ah,"leter :$";显示信息,提示字母字符个数显示
msgon db 0dh,0ah,"other:$";显示信息,提示其它字符个数显示
DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG
MAIN PROC FAR ;主程序入口
mov ax, dseg
mov ds, ax
lea dx,msgi;显示信息,提示输入一串字符
mov ah,9
int 21h
lea dx,buf;输入字符串
mov ah,0ah
int 21h
lea si,buf
mov cl,[si+1];输入字符实际个数存入CX中
mov ch,0
add si,2;输入字符起始地址存入SI
lea bx,digit;数字字符起始地址存入BX
lea di,leter;字母字符起始地址存入DI
lea bp,other;其它字符起始地址存入BP
fenlei:
mov al,[si];取出一个字符
cmp al,30h;判断该字符是否为数字
jb oth
cmp al,39h
ja ulet
mov [bx],al;若为数字字符,则存入相应缓冲区
inc bx
inc dn;并将数字字符个数加1
jmp next
ulet:
cmp al,41h;判断该字符是否为大写字母
jb oth
cmp al,5ah
ja llet
mov [di],al;若为大写字母字符,则存入相应缓冲区
inc di
inc ln;并将字母字符个数加1
jmp next
llet:
cmp al,61h;判断该字符是否为小写字母
jb oth
cmp al,7ah
ja oth
mov [di],al;若为小写字母字符,则存入相应缓冲区
inc di
inc ln;并将字母字符个数加1
jmp next
oth:
mov ds:[bp],al;为其它字符,则存入相应缓冲区
inc bp
inc on;并将其它字符个数加1
next:
inc si;调整地址,指向下一个字符
loop fenlei;循环次数为实际输入字符个数
mov byte ptr [bx],'$';在数字字符串末尾加'$',目的用9号中断显示该串
mov byte ptr [di],'$';在字母字符串末尾加'$',目的用9号中断显示该串
mov byte ptr ds:[bp],'$';在其它字符串末尾加'$',目的用9号中断显示该串
lea dx,msgd;显示数字字符
mov ah,9
int 21h
lea dx,digit
mov ah,9
int 21h
lea dx,msgl;显示字母字符
mov ah,9
int 21h
lea dx,leter
mov ah,9
int 21h
lea dx,msgo;显示其它字符
mov ah,9
int 21h
lea dx,other
mov ah,9
int 21h
lea dx,msgln;显示数字字符个数
mov ah,9
int 21h
mov bl,dn
call disp;以十进制形式显示个数
lea dx,msgln;显示字母字符个数
mov ah,9
int 21h
mov bl,ln
call disp
lea dx,msgon;显示其它字符个数
mov ah,9
int 21h
mov bl,on
call disp
mov ah,1;按任意键退出
int 21h
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
MAIN ENDP
disp proc near
mov ch,2
rotate:
mov cl,4
rol bl,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
ret
disp endp
CSEG ENDS
END MAIN
热心网友
时间:2023-11-06 20:40
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code,es:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Enter_Chr endp
; -----------------------------------------
; 功能:输出回车换行
Enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Enter_CTLF endp
; -----------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
POP CX
POP BX
POP AX
RET
GetCursor EndP
; -----------------------------------------
; 功能:置光标位置
; 入口:DH=行号,DL=列号
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 p(?)
Dec_ASCII EndP
; -----------------------------------------
prompt_Str db 'Please input a string: $' ;提示输入字符串
DIGIT_Str db 13,10,13,10,'Digit are: $' ;显示数字字符串
LETER_Str db 13,10,'Letter are: $' ;显示字母字符串
OTHER_Str db 13,10,'Other are: $' ;显示其它字符字符串
DIGIT db ? ;<数字字符个数>
LETER db ? ;<字母字符个数>
OTHER db ? ;<其它字符个数>
Cursor_Posi dw 3 p(?) ;分类显示字符串光标位置
DIGIT_Num db 13,10,13,10,'DIGIT: $' ;提示显示数字字符数
LETER_Num db 13,10,'LETER: $' ;提示显示字母字符数
OTHER_Num db 13,10,'OTHER: $' ;提示显示其它字符字符数
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
Output prompt_Str ;提示输入一串字符
lea dx,Temp_Str ;字符串缓冲区地址
mov ah,0ah
int 21h
Output DIGIT_Str ;数字字符串
call GetCursor ;取光标位置
mov Cursor_Posi,dx ;保存显示数字字符串光标位置
Output LETER_Str ;字母字符串
call GetCursor ;取光标位置
mov Cursor_Posi[2],dx ;保存显示字母字符串光标位置
Output OTHER_Str ;其它字符串
call GetCursor ;取光标位置
mov Cursor_Posi[4],dx ;保存显示其它字符串光标位置
cld ;清方向标志,使变址寄存器增值
lea si,Temp_Str[1] ;实际输入的字符数地址
lodsb ;实际输入的字符数
xor ah,ah
mov cx,ax
Class: lodsb ;当前字符→AL
mov ah,al ;al→ah,用于判断
and ah,0dfh ;屏蔽第5位,按大写字母处理
cmp ah,'Z' ;当前字符>'Z'?
ja Other_Chr ;大于,转去按其它字符处理
cmp ah,'A' ;当前字符<'A'?
jb Digit0_9 ;小于,转去判断是否数字
inc LETER ;字母字符计数
lea bx,Cursor_Posi[2] ;字母字符串光标位置在光标位置地址表中的偏移量
jmp Store_Chr
Digit0_9: cmp al,'9' ;当前字符>'9'?
ja Other_Chr ;大于,转去按其它字符处理
cmp al,'0' ;当前字符<'0'?
jb Other_Chr ;小于,转去按其它字符处理
inc DIGIT ;数字字符计数
lea bx,Cursor_Posi ;数字字符串光标位置在光标位置地址表中的偏移量
jmp Store_Chr
Other_Chr: inc OTHER ;其它字符计数
lea bx,Cursor_Posi[4] ;其它字符串光标位置在光标位置地址表中的偏移量
Store_Chr: mov dx,[bx] ;取对应分类字符串显示位置
call SetCursor ;置光标位置
mov dl,al
call Enter_Chr ;显示一个字符
inc byte ptr [bx] ;对应分类字符串显示位置列号增1
loop Class
mov dx,Cursor_Posi[4]
call SetCursor ;置光标位置
Output DIGIT_Num ;提示显示数字字符数
mov al,DIGIT ;取数字字符数
cbw
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Output LETER_Num ;提示显示字母字符数
mov al,LETER ;取数字字符数
cbw
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Output OTHER_Num ;提示显示其它字符字符数
mov al,OTHER ;取其它字符数
cbw
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Temp_Str db 100,0
Code ENDS
END Start ;编译到此结束
热心网友
时间:2023-11-06 20:40
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code,es:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Enter_Chr endp
; -----------------------------------------
; 功能:输出回车换行
Enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Enter_CTLF endp
; -----------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
POP CX
POP BX
POP AX
RET
GetCursor EndP
; -----------------------------------------
; 功能:置光标位置
; 入口:DH=行号,DL=列号
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 p(?)
Dec_ASCII EndP
; -----------------------------------------
prompt_Str db 'Please input a string: $' ;提示输入字符串
DIGIT_Str db 13,10,13,10,'Digit are: $' ;显示数字字符串
LETER_Str db 13,10,'Letter are: $' ;显示字母字符串
OTHER_Str db 13,10,'Other are: $' ;显示其它字符字符串
DIGIT db ? ;<数字字符个数>
LETER db ? ;<字母字符个数>
OTHER db ? ;<其它字符个数>
Cursor_Posi dw 3 p(?) ;分类显示字符串光标位置
DIGIT_Num db 13,10,13,10,'DIGIT: $' ;提示显示数字字符数
LETER_Num db 13,10,'LETER: $' ;提示显示字母字符数
OTHER_Num db 13,10,'OTHER: $' ;提示显示其它字符字符数
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
Output prompt_Str ;提示输入一串字符
lea dx,Temp_Str ;字符串缓冲区地址
mov ah,0ah
int 21h
Output DIGIT_Str ;数字字符串
call GetCursor ;取光标位置
mov Cursor_Posi,dx ;保存显示数字字符串光标位置
Output LETER_Str ;字母字符串
call GetCursor ;取光标位置
mov Cursor_Posi[2],dx ;保存显示字母字符串光标位置
Output OTHER_Str ;其它字符串
call GetCursor ;取光标位置
mov Cursor_Posi[4],dx ;保存显示其它字符串光标位置
cld ;清方向标志,使变址寄存器增值
lea si,Temp_Str[1] ;实际输入的字符数地址
lodsb ;实际输入的字符数
xor ah,ah
mov cx,ax
Class: lodsb ;当前字符→AL
mov ah,al ;al→ah,用于判断
and ah,0dfh ;屏蔽第5位,按大写字母处理
cmp ah,'Z' ;当前字符>'Z'?
ja Other_Chr ;大于,转去按其它字符处理
cmp ah,'A' ;当前字符<'A'?
jb Digit0_9 ;小于,转去判断是否数字
inc LETER ;字母字符计数
lea bx,Cursor_Posi[2] ;字母字符串光标位置在光标位置地址表中的偏移量
jmp Store_Chr
Digit0_9: cmp al,'9' ;当前字符>'9'?
ja Other_Chr ;大于,转去按其它字符处理
cmp al,'0' ;当前字符<'0'?
jb Other_Chr ;小于,转去按其它字符处理
inc DIGIT ;数字字符计数
lea bx,Cursor_Posi ;数字字符串光标位置在光标位置地址表中的偏移量
jmp Store_Chr
Other_Chr: inc OTHER ;其它字符计数
lea bx,Cursor_Posi[4] ;其它字符串光标位置在光标位置地址表中的偏移量
Store_Chr: mov dx,[bx] ;取对应分类字符串显示位置
call SetCursor ;置光标位置
mov dl,al
call Enter_Chr ;显示一个字符
inc byte ptr [bx] ;对应分类字符串显示位置列号增1
loop Class
mov dx,Cursor_Posi[4]
call SetCursor ;置光标位置
Output DIGIT_Num ;提示显示数字字符数
mov al,DIGIT ;取数字字符数
cbw
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Output LETER_Num ;提示显示字母字符数
mov al,LETER ;取数字字符数
cbw
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Output OTHER_Num ;提示显示其它字符字符数
mov al,OTHER ;取其它字符数
cbw
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Temp_Str db 100,0
Code ENDS
END Start ;编译到此结束