当前位置: 首页 > news >正文

设计一个程序,将所有的小写字母转换为大写字母

汇编语言程序设计实验

实验内容

设计一个程序,将所有的小写字母转换为大写字母,此程序不能改变除字母a~z外的任何其它字符。

实验分析

实现的功能是将所有的小写字母转换为大写字母,此程序不能改变除字母a~z外的任何其它字符。可以分为以下几个步骤:

(1)定义一个字节型数据变量,初始化为一个字符串,这个字符串里面要有大写字母也有小写字母和其他的字符。

(2)对字符串的字母或字符依次处理:判断是不是小写字母,若是则转换,不是则继续扫描。

3)最后就是把输出的结果用消息框显示。

程序设计

(1)数据段:首先定义一个字节型变量szMessage,初始化为字符串 "Hello Tom001!",以 0 作为字符串结束标志。这个字符串就是需要进行转换大写字母的字符串。再定义一个字节型变量szTitle,初始化为字符串 "Uppercase Conversion",这个是用于弹出的消息框标题。

    .data

    szMessage db "Hello World!", 0

szTitle db "Uppercase Conversion", 0

(2)代码段:将szMessage字符串的偏移地址加载到esi寄存器中,esi的作用是字符串操作的源指针。将计数字符串的长度的计数器ecx初始化为-1。要对字符串的字母进行处理,需要写一个循环代码:增加计数器ecx的值,将esi加上当前计数器ecx所指向的内存位置的字节加载到al寄存器中,之后的循环ecx会再增加,这样就实现了对字母或其他字符的依次处理。首先要考虑边界问题,在这个程序中,有可能字符串被扫描完了,因此需要先对al寄存器进行测试,如果为 0,则设置零标志位,字符串结束,跳转到done标签,结束循环。然后比较al寄存器中的字符与小写字母a、z,若不是小写字母,则跳转到not_lowercase标签(其中的代码是:跳转到循环标签,继续循环,也就是不对非小写字母进行处理)。依照ASCII码表,如果字符是小写字母,将其减去32(十六进制为20H,因为AASCII码是0100 0001, aASCII码是0110 0001),转换为大写字母。然后将转换后的字符存储回原来的内存位置。最后显示到消息框里即可。

.code

图1 字符串转换前

图2 字符串转换后

完整代码

.386
.model flat, stdcall
option casemap :none   ; case sensitiveinclude \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.incincludelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib.dataszMessage db "Hello Tom001!", 0szTitle db "Uppercase Conversion", 0.code
main procinvoke MessageBox, NULL, ADDR szMessage, ADDR szTitle, MB_OKmov esi, OFFSET szMessagemov ecx, -1convert_loop:inc ecxmov al, [esi+ecx]test al, aljz donecmp al, 'a'jl not_lowercasecmp al, 'z'jg not_lowercasesub al, 20hmov [esi+ecx], alnot_lowercase:jmp convert_loopdone:invoke MessageBox, NULL, ADDR szMessage, ADDR szTitle, MB_OKinvoke ExitProcess, 0
main endp
end main老师提供的:
.686
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
includelib kernel32.lib.data
szString db 'abcdefghijklmnopqrstuvwxyz', 0  ; 添加结束符
szOut db 1 dup(?)  ; 定义输出缓冲区
bytesWritten dd ?  ; 用于存储实际写入的字节数.code
start:lea esi, szStringmov ecx, sizeof szString - 1  ; 减去结束符cldagain:lodsb  ; 加载下一个字节到 ALcmp al, 'a'jb eecmp al, 'z'ja eesub al, 20H  ; 将小写字母转换为大写mov [szOut], al  ; 将结果存储到 szOutinvoke WriteConsole, GetStdHandle(STD_OUTPUT_HANDLE), szOut, 1, addr bytesWritten, 0jmp againee:invoke ExitProcess, 0
end start

如果对你有帮助的话,请为我点个赞吧❤

 

http://www.xdnf.cn/news/539857.html

相关文章:

  • 打造灵感投掷器:我的「IdeaDice」开发记录
  • sqli-labs第九关—‘时间盲注
  • 虚拟机的三个核心类加载器
  • 注解(Annotation)概述
  • web应用技术第5次课-springboot入门
  • 中科固源Wisdom平台发现NASA核心飞行控制系统(cFS)通信协议健壮性缺陷!
  • 九、异形窗口
  • 有关Groutine无限创建的分析
  • YOLO模型使用jupyterlab的方式进行预测/推理(示例)
  • Linux配置SSH密钥认证
  • 程序化 SEO 全攻略:如何高效提升网站排名?
  • 【python】返回所有匹配项的第一个元素、第二个元素。。。
  • 龙芯中科2024年度业绩说明会:企稳向好,布局未来!
  • 贵州某建筑物挡墙自动化监测
  • Dolphinscheduler执行工作流失败,后台报duplicate key错误
  • 如何通过生成式人工智能认证(GAI认证)提升自己的技能水平?
  • C++经典库介绍
  • PH热榜 | 2025-05-18
  • 微服务项目->在线oj系统(Java版 - 5)
  • 《Building effective agents》学习总结
  • C++中聚合类(Aggregate Class)知识详解和注意事项
  • 深入理解动态规划:从斐波那契数列到最优子结构
  • YoloV9改进策略:卷积篇|风车卷积|即插即用
  • 【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍历、推导式与嵌套实战
  • C++容器适配器
  • DAPO:用于指令微调的直接偏好优化解读
  • 【idea 报错:java: 非法字符: ‘\ufeff‘】
  • 第二十一次博客打卡
  • 【C语言内存函数】--memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用
  • 1 asyncio模块