DATA SEGMENT
inbuf DB 100 可能输入的最大字符数
db 0 实际输入字符数
db 100 DUP('$') 输入缓冲
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
mov di,OFFSET inbuf
输入字符串
MOV AH,0AH
MOV DX,di
INT 21H
xor cx,cx
mov cl,[di+1] 循环次数(输入字符数)
lea si,[di+2] 输入串起始地址
循环比较
next1:
cmp byte ptr [si],'A'
jb skip1
cmp byte ptr [si],'Z'
ja skip1
or byte ptr [si],20h 转小写
skip1:
inc si
loop next1
MOV DL,0AH
MOV AH,02H
INT 21H
输出字符串
lea DX,[di+2]
MOV AH,09H
INT 21H
mov cl,[di+1] 循环次数(输入字符数)
lea si,[di+2] 输入串起始地址
next2:
cmp byte ptr [si],'a'
jb skip2
cmp byte ptr [si],'z'
ja skip2
xor byte ptr [si],20h 转大写
skip2:
inc si
loop next2
输出字符串
MOV DL,0AH
MOV AH,02H
INT 21H
lea DX,[di+2]
MOV AH,09H
INT 21H
MOV AH,0
INT 16H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
大写字母向小写字母的转换类似
十进制数向十六进制数的转换,先将十进制数转2进制,再将2进制转十六进制
data segmentstring1 db 'Please input a letter:',0dh,0ah,'$'
string2 db 0dh,0ah,'Please intput again:',0dh,0ah,'$'
string2 db 0dh,0ah,'SUSSESS QUIT',0dh,0ah,'$'
data ends
code segment
assume cs:code,ds:data
main proc
start: mov ax,data
mov ds,ax
call transform
mov ah,4ch 结束
int 21h
main endp 主程序结束
transform proc 子程序开始
lea dx,string1
mov ah,09h
int 21h
again: mov ah, 01h
int 21h键盘接收一个字符并显示
cmp al,35h
je quit
cmp al, 41h
jb wrong 小于41h说明输入的不是字母,显示出错,
cmp al,5ah 判断是否落在大写字母范围内
ja next没落在大写字母范围内,就需要继续判断是否在小写字母范围内
add al,20h 若是大写字母,则改成小写字母
jmp display显示
next: cmp al,61h 跟61h比较如果小于则不是字母,显示出错
jb wrong
cmp al,7ah再跟7ah比较,看是否落在小子字母范围内
ja wrong
sub al,20h 将小写字母变成大写字母
jmp display
wrong: lea dx,string2
mov ah,9
int 21h
jmp again
display:
mov ah,02h 显示
mov dl,al
int 21h
jmp again
quit: lea dx,string3
mov ah,09h
int 21h
ret
transform endp
code ends
end start
codes segment
assume cs:code
START:
mov bx,0
loop1:
mov ah,1h
int 21h
cmp al,0dh 比较是不是回车键
je print 如果是表示输入完毕
cmp al,'0'
jz rotate
stc 此指令设置cf为1
rotate:
rcl bx,1 带进位左移
jmp loop1
print:
mov dl,0dh 指令打印回车
mov ah,2h
int 21h
mov dl,0ah 打印换行
mov ah,2h
int 21h
mov cl,4 将BX中的二进制数每4位划成一组
mov ch,4
loop2:
rol bx,cl
mov dl,bl
and dl,0fh 按组求对应的ASCII码送显示器
add dl,30h
cmp dl,3ah
jb loop3
add dl,7hA的ASCII码值比9的大7
loop3:
mov ah,2h
int 21h
dec ch
jnz loop2
exit:mov ah,4ch
int 21h
codes end
end start
code segment
main proc far
assume cs:code
start:
call A116进制转换成2进制
call crlf 换行
call binidec 2进制转换成10进制
call crlf
jmp main光标等待下一个输入
ret
main endp
A1 proc near
mov bx,0 设置BX初始值为0
char:
mov ah,01h 从键盘输入
int 21h
sub al,30h 从ASCII码转换为2进制
jl exit
cmp al,10d 判断是数字还是字母
jl A2 小于(数字)转移到A2
sub al,27h 判断输入的是否'a'-':'之间的字符
cmp al,0Ah
jl exit
cmp al,10h
jge exit
A2:叠加
mov cl,4
shl bx,cl 逻辑左移4位
mov ah,0
add bx,ax
jmp char
exit:
ret
A1 endp
binidec proc near二进制转换成是进制(除10取余)
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov cx,100d
call dec_div
mov cx,1000d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
dec_div proc near ;求余运算
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h ;转换成ASCII码
mov ah,02h
int 21h
ret
dec_div endp
crlf proc near
mov dl,0Ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
ret
crlf endp
code ends
end start
有C语言源代码,要将之转换为可执行的应用软件方法如下:
1、准备一个C语言的编译器,比如TC2.0等等
2、运行编译器TC2.0
3、加载源代码
4、按Alt-F9。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)