masm - 字母大小写转换
Posted darkchii
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了masm - 字母大小写转换相关的知识,希望对你有一定的参考价值。
其实这个我自己出给自己的练习题现在都还没做对。。。虽然看得懂一点汇编指令,但我还是不理解寄存器以及对它们正确的使用,断断续续的学汇编,进步超缓慢。。而且一段时间不写,连指令作用都忘了。
最早电脑装了 gcc,用的nasm,但后来不想用 gcc 了,一直在用 msvc,然后 nasm 无法与 msvc 链接生成 exe 文件(可能我太菜了,没找到正确姿势),但用微软自带的汇编器 ml 也不错,虽然语法稍有些不同,但指令都差不多,不过就很恼火的是一直无法调用 printf / scanf 。。。只能用win32api MessageBox 或 WriteFile 代替输出,但输入呢?
这是我的错误解决方案(鬼知道我用反汇编调了多少次,才稍微明白了一点汇编逻辑,如今 crack me 还是只会字节修补(捂脸)):
extrn MessageBoxA: PROC extrn ExitProcess: PROC .data ti db ‘result‘, 0 msg db ‘phahhb‘, 0 .code main proc sub rsp, 28h mov eax, offset msg ;lea edx, [eax+1] loc_401086: mov cl, [eax] cmp cl, 0 jmp loc_401B12 inc eax cmp cl, 61h jl short loc_401086 ;test cl, cl sub cl, 20h mov [eax], cl jmp loc_401086 loc_401B12: mov rcx, 0 ; hWnd = HWND_DESKTOP lea rdx, [eax] ; LPCSTR lpText lea r8, ti ; LPCSTR lpCaption mov r9d, 0 ; uType = MB_OK call MessageBoxA add rsp, 28h mov ecx, eax ; uExitCode = MessageBox(...) call ExitProcess main endp End
虽然我知道 mov [eax], cl 那里是不对的,应该写入另一个寄存器,但我竟然蠢到不知道该写到哪个寄存器里面才能改变 eax 的对应位置上的字符。。。
下面是我自己写的 bat,以方便运行汇编小项目,可以改改做模板用:
@echo off call "C:Program Files (x86)Microsoft Visual Studio2019CommunityCommon7ToolsVsDevCmd.bat" d: cd D:AssembleProjectshelloml64 "D:AssembleProjectshellohello.asm" /link /subsystem:windows /DYNAMICBASE "C:Program Files (x86)Windows Kits10Lib10.0.18362.0umx64kernel32.lib" "C:Program Files (x86)Windows Kits10Lib10.0.18362.0umx64user32.lib" /LARGEADDRESSAWARE:NO /OUT:"D:AssembleProjectshellohello.exe" /entry:main "D:AssembleProjectshellohello.exe" pause
以上是关于masm - 字母大小写转换的主要内容,如果未能解决你的问题,请参考以下文章
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试