设计一个程序,将所有的小写字母转换为大写字母
汇编语言程序设计实验
实验内容
设计一个程序,将所有的小写字母转换为大写字母,此程序不能改变除字母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,因为A的ASCII码是0100 0001, a的ASCII码是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
如果对你有帮助的话,请为我点个赞吧❤