MASM 字符串反转

2024-04-28

好吧,我正在讨论这个问题,可能是一个非常复杂的解决方案,但这是我脑海中浮现的第一件事。

我需要编写一个汇编语言程序来反转“源”字符串,而不使用“目标”字符串(临时变量)..这是我的尝试。

INCLUDE Irvine32.inc
.data
source BYTE "This is the source string", 0
count DWORD ? 

.code
main PROC

 mov ecx, LENGTHOF source 

L1: 
 mov count, ecx     ; save our outer loop count
 mov al,[source+0]    ; get the first character in the string

 mov ecx,LENGTHOF source  ; set out inner loop count
 mov esi, OFFSET source
 inc esi
L2:


 mov bl,[esi]
 dec esi
 mov [esi],bl
 add esi, 2
 loop L2

 mov ecx, count
 loop L1


 mov  edx,OFFSET source
 call WriteString

 exit
main ENDP

END main

现在......这个“算法”基本上是这样的:从字符串中取出第一个字符,将所有其他字符在字符数组中向下移动一个空格,将第一个取出的字符放入数组的后面。现在,我已经到了这太复杂的地步了。事实上,我如何到达数组的后面..我想我需要另一个循环?我当然不需要三个循环,甚至不想处理它。

也许我走在正确的道路上,只是自己不知道而已。任何建议、技巧、代码或不同的算法都会有帮助!


You could按照你的方式做两个循环。完成第一个循环后,您必须再次执行该循环,但长度减少一个,以便当前的第一个(最初是第二个)字符被放置在最后第二位置,保留当前最后一个(最初是第一个)字符。然后继续下去,直到长度降至零。

But that's pretty inefficient since you have the nested loops, O(n2). Here's a better algorithm that uses just one loop, O(n):

set spointer to point to the first character
set epointer to point to the last character
while epointer is greater than spointer:
    save away [spointer] (the character pointed to by spointer) somewhere
    copy [epointer] to [spointer]
    copy the saved character to [epointer]
    add one to spointer
    subtract one from epointer

它基本上维护一个开始和结束指针,最初交换第一个和最后一个字符,然后指针向彼此移动。

因此,第二次循环时,交换第二个和倒数第二个字符,第三次交换第三个和倒数第三个字符,依此类推。

当指针相等(对于奇数长度字符串)或起始指针大于结束指针(对于偶数长度字符串)时,此过程停止。

由于这可能是家庭作业(无论如何,您似乎都在加快 x86 的速度),因此您应该执行将其转换为汇编程序的练习。


如果结果是not作为家庭作业,您可以使用下面的 masm32 代码作为基准。请不要试图将其冒充为您自己的教育工作,因为您几乎肯定会被抓住。你会学到更多东西(作为家庭作业or非家庭作业)如果您自己解决转换问题,我只是提供一些后备代码(如果您在解决问题时遇到困难)。

.586
.model flat

.data
source byte "This is the source string", 0

.code
_main proc
    mov     esi, offset source   ; load up start pointer.

    mov     edi, offset source   ; set end pointer by finding zero byte.
    dec     edi
find_end:
    inc     edi                  ; advance end pointer.
    mov     al, [edi]            ; look for end of string.
    cmp     al, 0
    jnz     find_end             ; no, keep looking.
    dec     edi                  ; yes, adjust to last character.

swap_loop:
    cmp     esi, edi             ; if start >= end, then we are finished.
    jge     finished

    mov     bl, [esi]            ; swap over start and end characters.
    mov     al, [edi]
    mov     [esi], al
    mov     [edi], bl

    inc     esi                  ; move pointers toward each other and continue.
    dec     edi
    jmp     swap_loop

finished:
    int     3                    ; trap to enter debugger and check string.
                                 ; replace with whatever you need.
_main endp
end _main
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MASM 字符串反转 的相关文章

  • 字符串数组初始化

    这是另一个的延续question https stackoverflow com questions 7834294 string array conversion I have 考虑以下代码 char hi hello char arra
  • 从 Kotlin 中的字符串中删除字符

    我正在尝试创建一个使用 Kotlin 中的字符串的 Android 计算器 如果逗号 或负数 已经包含一个 我不知道如何删除它 这是我的代码 它正确添加逗号 但如果用户再次单击则不会删除它 if buClickValue contains
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 添加反斜杠而不转义[重复]

    这个问题在这里已经有答案了 我需要逃离 字符串中的 字符 问题是每当我string string replace 结果是 添加额外的反斜杠来转义原始反斜杠 如何删除这个多余的反斜杠 结果 仅显示 实际上字符串是 gt gt gt str g
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • C# 中将一个字符串拆分为另一个字符串

    我一直在使用Split 分割字符串的方法 但这似乎仅在您按字符分割字符串时才有效 有没有办法分割一个string 另一个字符串是按参数分割的 我尝试将拆分器转换为字符数组 但没有成功 换句话说 我想分割string THExxQUICKxx
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • 自动将变量名称添加到列表的元素[重复]

    这个问题在这里已经有答案了 我有一个模型列表 为了使代码更易于维护 因此可以方便地添加和删除模型 我希望有一个地方来存储它们及其名称 为此 我必须解决以下命名问题 上游 我生成模型的方式比以下方式效率低 如果是这样压缩的 我会assign他
  • 将 C++ 字符串发送到 C# 字符串。互操作性

    我是进程间通信的新手 需要一些帮助 我希望能够将字符串从 C 程序发送到 C 程序 我的问题是生成的字符串是乱码 这是我的代码 发送程序 C void transmitState char myStr HWND hWnd FindWindo
  • 从剪贴板获取文本后将一个字符串插入另一个字符串所需的建议

    简介及相关信息 我有一个edit control只需要接受带符号的十进制数 类似于 12 35 我决定通过以下方式实现这一点subclassing The WM CHAR处理程序似乎运行良好 我需要处理其他几条消息以完全保护用户免于输入无效
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 如何将动态格式字符串与格式一起使用!宏?

    我想使用format 宏与String作为第一个参数 但因为宏需要字符串文字 所以我无法传递任何与它不同的内容 我想这样做是为了将字符串动态添加到当前字符串中 以便在视图引擎中使用 如果有更好的方法 我愿意接受建议 let test Str
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • 检查多个变量java中的替换空值

    我试图找到一种简单的方法来在 Java 中的多个变量中执行多个 null 检查 替换 我有一个包含大约 20 个字符串变量的对象 在构造函数中 我想检查是否有任何变量值为空 如果它们为空 我想用空字符串替换它们 我可以执行一系列 if 语句
  • 在 Python 中对非英语文本进行分词

    我有一个波斯语文本文件 其中包含如下几行 6 7 10 11 我想从这一行生成一个单词列表 对我来说 单词边框是数字 比如上面一行中的 6 7 等 还有 特点 所以列表应该是 我想在 Python 3 3 中执行此操作 最好的方法是什么 我
  • ToUpperInvariant() – MSDN 的建议是否错误?

    In 在 NET Framework 中使用字符串的最佳实践 https msdn microsoft com en us library dd465121 v vs 110 aspx 字符串比较OrdinalIgnoreCase http
  • 如何将 Python 字典序列化为字符串,然后再序列化回字典?

    如何将 Python 字典序列化为字符串 然后再序列化回字典 字典中将包含列表和其他字典 这取决于您想用它做什么 如果您只是想保存它 您应该使用pickle https docs python org 3 library pickle ht
  • 通过删除连续的重复项来减少字符串长度

    我有一个包含 2 个字段的 R 数据框 ID WORD 1 AAAAABBBBB 2 ABCAAABBBDDD 3 我想通过仅保留字母而不是重复中的重复项来简化具有重复字母的单词 e g AAAAABBBBB应该给我AB and ABCAA
  • 如何在 C++ 中对静态缓冲区执行字符串格式化?

    我正在处理一段对性能要求非常高的代码 我需要执行一些格式化的字符串操作 但我试图避免内存分配 甚至是内部库的内存分配 在过去 我会做类似以下的事情 假设是 C 11 constexpr int BUFFER SIZE 200 char bu
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString

随机推荐

  • 更新 mtl 后找不到模块“Control.Monad.State”

    我想用Control Monad Except模块 但结果发现我有一个过时的 mtl 包 它导致了导入错误 我有一个过时的模块Control Monad Error 所以我做了 sudo cabal install mtl 并且安装了2 2
  • 使用 Flutter 确认购买

    扑动的in app purchase插件已更新至版本0 3 0 将 Google Play 库迁移到2 0 3 根据 Google Play Library v2 所有购买都必须在 3 天内 测试订单为 5 分钟 内得到确认 否则将被自动取
  • 让 std::complex 通过 std::is_floating_point 测试

    我想要类型double float complex
  • 多处理:为什么与子进程共享 numpy 数组,而复制列表?

    我用过这个script https stackoverflow com questions 13121790 using multiprocessing manager list instead of a real list makes t
  • 如何反编译混淆的java程序以避免类/包名称冲突

    我想反编译一个java程序并重新编译派生的 混淆的 源代码 我解压了 jar 存档并得到了如下目录结构 com com foo A com foo A A class com foo A B Class com foo B A class
  • 如何在 asp.Net 中的脚本标记上使用 runat="server"

    我不一定需要在服务器上运行它 但是 我想使用 js somefile js syntax 以前 我只是使用绝对路径设置所有内容并将我的项目设置为根级别 所以 我只需声明我所有的样式表 背景图像和 javascript 文件 例如 css s
  • 红宝石 Rspec。获取所有测试的列表

    我对 Rspec 进行了一些测试 如下所示 describe description do before each do do before end it something 1 do end it something 2 do end e
  • 从 python-rq 获取*所有*当前作业

    我正在使用 python rq 来管理基于 Redis 的作业 并且我想确定我的工作人员当前正在处理哪些作业 python rq 提供 get current job 函数来查找连接的 当前作业 但是 我无法让它发挥作用 并且 我真的想要一
  • 奇怪的问题,除非单击鼠标,否则按钮不会重新启用

    我的应用程序是使用 WPF 中的 MVVM 模式编写的 我的所有按钮都使用命令绑定来执行模型中的代码 所有命令在 CanExecute 中都有代码来确定绑定按钮的启用状态 该逻辑工作完美 但在所有情况下 GUI 都会保持禁用状态 除非我单击
  • 更改故事板中默认后退按钮的文本颜色

    如何更改故事板中默认后退按钮的文本颜色 通过故事板和以编程方式 显示的默认颜色是蓝色 This https stackoverflow com questions 12886274 storyboard uinavigation contr
  • 支持 Javascript 链式关系运算符吗?

    我只是尝试了一些 JS 核心原则 发现引擎评估链式关系运算符时不会抛出错误 相反 他们以一种我自己无法理解的方式进行评估 console log 1 lt 2 lt 3 lt 4 lt 5 true expected console log
  • bash:ssh-host-config:找不到命令

    有谁有任何想法可能导致此问题 我使用的是 win 7 我已经使用本教程成功设置了所有内容 http www kgx net nz 2010 03 cygwin sshd and windows 7 http www kgx net nz 2
  • 向回调函数添加附加参数

    我正在 Node js 中构建一个系统 该系统应该查找文件夹数组中的所有文件 统计它们 然后使用该信息执行一些其他工作 我使用 fs readdir 从每个文件夹同步获取所有文件 我的代码如下所示 for i 0 max paths len
  • JFace DialogCellEditor:如何使按钮始终出现?

    我用的是JFaceDialogCellEditor在 JFace 的一行单元格中显示一个按钮TableViewer激活时会触发一个对话框 此行为适用于以下代码 但仅当显式选择托管按钮的表的单元格时才会显示该按钮 public class C
  • Mongoose VersionError:保存文档时找不到 id 的匹配文档

    通过 sync API 请求同步用户购物车时 我反复看到以下错误 每当用户更改购物车的内容时就会调用此函数 VersionError 找不到 id 的匹配文档 2y4b1hq601cd013e0af25e32 版本4修改路径 购物车 car
  • firebase 崩溃报告上传的符号文件错误

    当崩溃上传到 firebase 仪表板时 它总是显示消息Upload symbol file to symbolicate future stack traces for UUID 不过 我确实通过查看 符号文件 选项卡确保符号文件已上传
  • MVC 4 中的运行时动态捆绑和缩小

    我想知道是否有人可以帮助我使用 MVC 4 附带的新优化命名空间进行捆绑和缩小 我有一个多租户应用程序 我想在其中决定应根据每个用户的设置加载哪些 js 文件 一种方法是预先创建所有包并根据用户的设置更改resolvebundleurl的虚
  • 黄瓜使用标签自动重新运行失败的场景?

    在我们的构建中 某些场景会由于我们无法控制的原因或需要很长时间才能正确调试而失败 诸如异步javascript之类的东西 无论如何 重点是有时它们工作 有时不工作 所以我认为最好向场景添加一个标签 例如 rerun on failure 或
  • Find和FindNext复制所有匹配对应的数据

    我想在工作表 BD 的第 5 列中搜索与工作表 Plan1 上名为 alocacao 的值匹配的所有条目 然后将第 2 列上的值复制到名为 tecnico1 的单元格 其他单元格称为 tecnico2 tecnico3 和 tecnico4
  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour