欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

汇编程序—将一个全是字母,以0结尾的字符串,转化为大写

发布时间:2025/3/15 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 汇编程序—将一个全是字母,以0结尾的字符串,转化为大写 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

程序思路

我们有一个现成的指令jcxz 可以判断cx寄存器中是否0,可以将data段的数据一个一个放到cx中,紧接着调用jcxz指令,如果cx为0 跳出子程序,如果不为0进行大写转化!
这里为了方便展示,将转换前后的字符串都放到屏幕中进行展示,代码中有一定的注释。

程序代码

assume cs:code,ss:stackdata segmentdb 'laymond',0 data ends stack segmentdb 128 dup(0) stack endscode segmentmain:mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axcall init_regcall clear_screencall show_1wordmov ax,4c00Hint 21H ;------------------------------ show_1word:mov si,0 ;si 为源字符串的位置mov di,160*10+40*2 ;显示在第10行中间位置call show_string call to_upper ;si to_upper参数,要转换字符串的起始位置mov di,160*11+40*2 ;di show_string参数,显示的地址,将其显示到下一行call show_string ret ;------------------------------ ;子程序功能 将字符串转换为大写 ;参数寄存器 si 转换字符串的起始地址 to_upper:push cxpush si toUpper:mov cx,0mov cl,ds:[si] jcxz upperRetand byte ptr ds:[si],11011111Binc sijmp toUpper upperRet:pop sipop cxret ;------------------------------ ;子程序功能 显示指定位置的字符串 ;参数寄存器 si 源字符串的位置 ;参数寄存器 di 字符串显示的位置 show_string:;将使用到的寄存器变量通过栈保存,使用完毕将可通过弹栈数据还原push axpush cxpush espush dspush dipush simov ax,0B800Hmov es,ax showLetter:mov cx,0mov cl,ds:[si]jcxz showRetmov al,ds:[si] ;内存单元之间不能直接进行赋值!必须借助寄存器mov es:[di],al inc siadd di,2jmp showLetter showRet:pop sipop dipop dspop espop cxpop axret ;------------------------------ init_reg:mov bx,0B800H ;显存起始位置mov es,bx ret ;------------------------------- clear_screen:mov bx,0mov dx,0700H ;黑底空字符,偶数字节为显示字符,奇数字节放显示方式mov cx,2000 ;每页25行,每行可显示80个字符,2000个字符,循环2000次 clearScreen:mov es:[bx],dxadd bx,2loop clearScreenretcode endsend main

运行结果

题目扩展

如果是多行字符串转换呢?还是一样的,由于我们上面写代码是按功能写的子程序,那么进行扩展就非常方便了!

多行字符串代码

assume cs:code,ss:stackdata segmentdb 'aaaa',0db 'bbbb',0db 'cccc',0db 'dddd',0 data ends stack segmentdb 128 dup(0) stack endscode segmentmain:mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axcall init_regcall clear_screencall show_4wordmov ax,4c00Hint 21H ;------------------------------ show_4word:mov di,160*10+40*2 ;dos显存 每页2580字符/行,每个字符2个字节,从第10行开始显示mov si,0mov cx,4 show_word:call show_string call to_uppercall show_UpperStringadd di,160 ;显示到下一行,每行160字节add si,5 ;si 为to_upper参数 下一个字符串的起始位置loop show_wordret show_UpperString:push diadd di,20 ;di 为show_string参数 将大写后的字符串显示到 源字符串的后面call show_string pop diret ;------------------------------ ;子程序功能 将字符串转换为大写 ;参数寄存器 si 转换字符串的起始地址 to_upper:push cxpush si toUpper:mov cx,0mov cl,ds:[si] jcxz upperRetand byte ptr ds:[si],11011111Binc sijmp toUpper upperRet:pop sipop cxret ;------------------------------ ;子程序功能 显示指定位置的字符串 ;参数寄存器 si 源字符串的位置 ;参数寄存器 di 字符串显示的位置 show_string:;将使用到的寄存器变量通过栈保存,使用完毕将可通过弹栈数据还原push axpush cxpush espush dspush dipush simov ax,0B800Hmov es,ax showLetter:mov cx,0mov cl,ds:[si]jcxz showRetmov al,ds:[si] ;内存单元之间不能直接进行赋值!必须借助寄存器mov es:[di],al inc siadd di,2jmp showLetter showRet:pop sipop dipop dspop espop cxpop axret ;------------------------------ init_reg:mov bx,0B800H ;显存起始位置mov es,bx ret ;------------------------------- clear_screen:mov bx,0mov dx,0700H ;黑底空字符,偶数字节为显示字符,奇数字节放显示方式mov cx,2000 ;每页25行,每行可显示80个字符,2000个字符,循环2000次 clearScreen:mov es:[bx],dxadd bx,2loop clearScreenretcode endsend main

多行字符串运行结果

新人创作打卡挑战赛发博客就能抽奖!定制产品红包拿不停!

总结

以上是生活随笔为你收集整理的汇编程序—将一个全是字母,以0结尾的字符串,转化为大写的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。